侧边栏壁纸
  • 累计撰写 44 篇文章
  • 累计创建 86 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

使用小度音箱+巴法云控制ESP01S实现智能开关

Even
2023-02-03 / 0 评论 / 0 点赞 / 3461 阅读 / 6884 字

记录如何使用Arduino IDE对ESP-01s与继电器控制进行编程,通过巴法云做出一个可以用智能音响开关灯的例子。

ESP-01s和ESP-01区别

ESP8266-01简称ESP-01;ESP8266-01s简称ESP-01s。

1、外观区别

  1. ESP01模块上电和信号传输在天线区域右下角有2个LED灯,红色LED上电的时候闪烁,串口通讯的时候蓝色LED闪烁;
  2. ESP01s整个模块上只有一个蓝色LED,上电和串口通讯都是蓝色LED闪烁。
  3. 如图左边是ESP01s,右边是ESP01(图片来源https://www.cnblogs.com/easyidea/p/11525197.htm)
  1. ESP01s模块背面有引脚说明,ESP01背面没有。

2、电路区别

  1. ESP01s内部电路相较于ESP01做了优化,

  2. LED灯的管脚发生变化,由ESP01的TXD0变成ESP01s的GPIO2引脚;

  3. ESP01s模块的IO0、RST、EN引脚上加了上拉电阻,也就是说在连接了3v3引脚后这三个引脚也自动连接上高电平,无需再EN引脚上外接高电平。

在这里插入图片描述

ESP-01s模式

  1. 下载模式

该模式下,esp01s不会运行烧录的程序,,使用arduinoIDE对其直接编程,并烧录程序。
接线,如下

RX --> TX
TX --> RX
IO0 --> GND
IO2 --> VCC
GND --> GND
3v3 --> VCC
RST --> VCC
EN --> VCC
  1. 运行模式

该模式,与下载模式接线的区别是,IO0 外接低电平,此时,esp01s不能烧录程序,,模块会直接运行已经烧录好的程序。
接线,如下

RX --> TX
TX --> RX
IO0 --> VCC
IO2 --> VCC
GND --> GND
3v3 --> VCC
RST --> VCC
EN --> VCC

注册巴法云账号

搜索巴法云官网,或直接进入 https://cloud.bemfa.com/user/index.html
如下图,点击“微信登录”,扫码直接登录注册,然后直接进入“控制台

巴法云

创建主题

登录后,会直接跳转到巴法云云平台的个人控制台

如下图,选中TCP创客云,输入主题名“light002”,点击新建主题,便可以创建一个名为light002的主题,之后我们就可以对这个主题进行订阅或发布了。主题以002为后缀,表示该主题为灯的类型

巴法创客云

接入小度音箱支持介绍

巴法云物联网平台默认接入小度,仅支持以下类型的设备:插座、灯泡、开关、窗帘、风扇、空调

用户可以自主选择是否接入小度,根据主题名字判定。

当主题名字后三位是001时为插座设备。

当主题名字后三位是002时为灯泡设备。

当主题名字后三位是003时为风扇设备。

当主题名字后三位是004时为传感器设备。

当主题名字后三位是005时为空调设备。

当主题名字后三位是006时为开关设备。

当主题名字后三位是009时为窗帘设备。

当主题名字为其他时,默认为普通主题节点,不会同步到小度音箱app。

接入小度音响

  1. 可以参考巴法云官方文档 小度音箱支持

  2. 小度app点击右上角添加设备按钮,

  3. 搜索巴法

  4. 登录巴法云账号则会自动同步设备

Arduino完整代码

程序烧录后,修改接线,切换至运行模式,通电,正常运行,可有在Arduino IDE上看到返回结果

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
 
const char* host = "bemfa.com";          // 网络服务器地址
const int httpPort = 8344;               // http端口80
 
// WiFi连接信息
const char*  WiFi_SSID = "热点名";
const char*  WiFi_Password = "热点密码";

//bemfa 用户信息
String uid = "你的巴法云的uid";
String topic = "设备主题";

//心跳发送频率
int heart_rate = 3000;
int heart_count = 0;

ESP8266WiFiMulti wifiMulti;              // 建立ESP8266WiFiMulti对象
WiFiClient client;                       // 建立WiFi客户端对象,对象名称client

//单片机LED引脚值
const int LED_Pin = 0;// GPOI2  LED

void setup(){
  Serial.begin(115200);

  //设置LED
  pinMode(LED_Pin, OUTPUT);
  digitalWrite(LED_Pin, HIGH);
  
  // 设置ESP8266为无线终端模式
  WiFi.mode(WIFI_STA);                      
  // 添加 热点名 以及 密码
  wifiMulti.addAP(WiFi_SSID, WiFi_Password); 
  Serial.println("Connecting ..."); 
 
  // 尝试进行wifi连接,知道连接成功
  int i = 0;  
  while (wifiMulti.run() != WL_CONNECTED) { 
    delay(1000);
    Serial.print(i++); Serial.print(' ');
  }
  
  // WiFi连接成功后将通过串口监视器输出连接成功信息 
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(WiFi.SSID());              // WiFi名称
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());           // IP

  //连接巴法云
  client.connect(host, httpPort);
  Serial.print("conneted bamfa!\n");
  //订阅主题test
  client.print("cmd=1&uid="+uid+"&topic="+topic+"\r\n");
}


void loop(){
  // 判断登录状态
  if(not client.connected()){
    
    //判断wifi热点是否断开
    if (WiFi.status() != WL_CONNECTED){
       // 尝试进行wifi连接,知道连接成功
      int i = 0;  
      while (wifiMulti.run() != WL_CONNECTED) { 
        delay(1000);
        Serial.print(i++); Serial.print(' ');
      } 
    }
   
    //连接巴法云
    client.connect(host, httpPort);
    Serial.print("reconneted bamfa!\n");
    //订阅主题test
    client.print("cmd=1&uid="+uid+"&topic="+topic+"\r\n");
  }
  

  //输出结果
  while (client.connected() || client.available()){ 
      if (client.available()){
        String line = client.readStringUntil('\n');
        Serial.println(line);
        //开关控制
         if ((line.indexOf("&topic=light002") > 0))
          {
            if ((line.indexOf("&msg=on") > 0))
            {
              digitalWrite(LED_Pin, LOW); //打开
              Serial.println("on");
            } 
            else if ((line.indexOf("&msg=off") > 0))
            {
              digitalWrite(LED_Pin, HIGH);//关闭
              Serial.println("off");
            }
          }
      }

      //定时发送心率
      if(heart_count++ >= heart_rate){
        //发送心跳
        client.print("ping\r\n");
        Serial.println("ping");
        //计数清零
        heart_count = 0;
      }
    
      delay(10);
    }
}

Arduino IDE 搭建 ESP8266 开发环境及项目演示

0

评论区