概述:基于平台开发连接Baffa云的教程门户 实验准备硬件 软件简介 实验流程 照明实验 发送温湿度指令 升级概述 关于Bfa Cloud是开源、智能制造、专注创新和分享。
Arduino教程传送门??????
基于Arduino IDE平台开发ESP8266连接巴法云 1.简介 2.实验准备 2.1 硬件 2.2 软件 3.实验步骤 3.1 TCP Lighting实验 3.2 使用 MQTT 发送温度和湿度 3.3 升级 OTA 命令 4. 摘要
关于巴法云专注开源、智造、创新、共享。 我们专注于硬件和创新,致力于突破技术界限并迈向未来。 倡导开源,探索未知。 ————巴法科技
1.简介
文中讲解了ESP8266-NodeMCU的环境配置。 开始在 Baffa Cloud 上进行物联网开发! ???
设计目标
实现esp8266的自动网络配置。 ESP8266 通过 TCP 协议连接巴法云的 TCP 创客云,通过串口发送指令来控制 LED 的亮灭。 使 ESP8266 通过 MQTT 协议连接到 Baffa Cloud 中的 MQTT 设备。 准备云。 串口发送命令控制LED开/关,同时还实现了DHT11温湿度数据的采集,并将数据上传到Baffa云平台进行在线查看。 基于前两次实验,我们通过Baffa云平台实现了ESP8266的OTA命令升级。 2.实验准备本次需要进行三个实验:TCP点亮实验、MQTT发送温湿度实验、OTA命令升级。 准备工作还包括硬件。 还有软件???
2.1 硬件
要实现三个Baffa Cloud实验,需要准备以下材料✨✨✨
ESP8266-NodeMCU 微控制器(和 Android 数据线);DHT11 温度和湿度传感器;3 根母对母杜邦电缆。
硬件连接:ESP8266- NodeMCU 硬件连接非常简单,只需将 DHT11 数据线连接到 D6 引脚即可。 这组连接对于所有三个实验都是通用的。 具体连接如下???
ESP8266-NodeMCU -----> USBVCC ----- > 3.3V 接地 ----[k4 ]> 接地输出 -----> D2
2.2 软件 Arduino IED 1.8.5 或更高版本(越高越好)。 使用浏览器登录Baffa云平台。 3、实验流程首先搭建Baffa云平台,创建产品相关主题,发现相关数据流,上传固件,方便后期开发程序端口发送指令。 ???
3.1 TCP Lighting 实验登录Baffa Cloud IoT 平台,选择控制台,点击TCP Maker Cloud,新建一个light002 主题。 Bfa Cloud TCP 是否已配置? 有四个程序用于编程:bemfa02、TCP、motion 和 update。 其中之一是: 文件名 功能 bemfa02 程序初始化调用和主程序调用。 TCP向TCP服务器发送数据,初始化WiFi连接,初始化与服务器的连接。 Motion 检查数据、发送心跳并检查 WiFi。 更新固件升级功能。
bemfa02.ino
/* * 智能语言控制,支持同时控制天猫、小爱、小度、谷歌助手 * 时间:20211127 * 作者:2345VOR * 项目示例:开关指令灯开关* 参考:https://bbs.bemfa.com/84/last */#include #include #define server_ip "bemfa.com" //巴法云默认服务器地址为#define server_port "8344" //服务器端口,tcp Maker Cloud端口8344 //************************需要修改的部分* * *****************//#define wifi_name "J09 502" //WIFI名称,区分大小写,不要写错 #define wifi_password "qwertyuiop111" //WIFI密码字符串 UID = "e8882ae28d5bde39766c330ea913fd46"; // 用户私钥。 你可以在控制台获取并修改为你自己的UIDString。 TOPIC = "light002"; //可以在控制台中创建的主题名称 const int LED_Pin = D4; //MCU LED 引脚值,D2 是 NodeMcu 引脚的命名方式。 其他esp8266型号将D2改为自己的引脚。 String upUrl = "http://bin.bemfa.com/b/3BcZTg4ODJhZTI4ZDViZGUzOTc2NmMzMzBlYTkxM2ZkNDY=light002.bin";//固件链接复制粘贴到此处 //******* * ****** **************************** ********////最大字节数#define MAX_PACKETSIZE 512//设置心跳值为30秒 #define KEEPALIVEATIME 30*1000//Tcp客户端相关初始化,默认为WiFiClient TCPclient;String TcpClient_Buff = "";//用于从服务器接收数据初始化 string unsigned int TcpClient_BuffIndex = 0;unsigned long TcpClient_preTick = 0;unsigned long preHeartTick = 0;//心跳 unsigned long preTCPStartTick = 0;//Connect bool preTCPConnected = false;//相关函数初始化//连接WIFI void doWiFiTick() ;void startSTA() ;//TCP初始化连接无效 doTCPClientTick();void startTCPClient();void sendtoTCPServer(String p);//LED控制函数,具体函数内容见下文#defineturnOnLed()digitalWrite(LED_Pin,LOW);#defineturnOffLed()digitalWrite(LED_Pin ,HIGH) ) ;//初始化,相当于主函数 void setup() { Serial.begin(115200); pinMode(LED_Pin,OUTPUT); 数字写入(LED_Pin,HIGH);}//循环 void Loop() { doWiFiTick(); ; }
TCP.ino
/* *发送数据到TCP服务器*/void sendtoTCPServer(String p){ if (!TCPclient.connected()) { Serial.println("客户端未就绪"); }/* *初始化 Wi-Fi 连接 */voidstartSTA(){ WiFi.mode(WIFI_STA); WiFi.begin(wifi_name, wifi_password);}/* *初始化并与服务器建立连接:style="value.online?"在线":"没有订阅设备"" color:#9A9A9A;*/void startTCPClient(){ if(TCPclient.connect(server_ip, atoi(server_port))){ Serial.print("/n连接到服务器:"); Serial.printf("%s:%d/r/n",server_ip,atoi(server_port)); //初始化字符串 tcpTemp = "cmd=1&uid="+UID+"&topic="+TOPIC+"/r/n"; //构建订阅步骤 sendtoTCPServer(tcpTemp); //发送订阅命令 tcpTemp="";//清除/* //如果需要订阅多个主题,再次发送订阅命令 可以发送 tcpTemp = "cmd =1&uid="+UID+"&topic="+topic 2 +"/r/n"; // 构建订阅指令 sendtoTCPServer(tcpTemp); //发送订阅指令 tcpTemp="";//清除*/ preTCPConnected = true; preHeartTick = Milis(); TCPclient.setNoDelay(true); } else{ Serial.print("连接失败oserver:"); Serial.println(server_ip); TCPclient.stop(); preTCPConnected = false; } preTCPStartTick = millis();}
motion.ino
/* *检查数据并心跳发送 */ void doTCPClientTick(){ //检查是否断开,断开后重新连接 if(WiFi.status() != WL_CONNECTED) return; if (!TCPclient.connected()) {//断开连接并重新连接 if(preTCPConnected == true){ preTCPStartTick = millis(); Serial.println("TCP 客户端断开连接。") ; ; } else if(millis() - preTCPStartTick > 1*1000)//重新连接 startTCPClient(); } else { if (TCPclient.available()) {//收到数据 char c =TCPclient_BuffIndex++; (TcpClient_BuffIndex>=MAX_PACKETSIZE - 1){ TcpClient_BuffIndex = MAX_PACKETSIZE-2; TcpClient_preTick = TcpClient_preTick - 200; preHeartTick = millis(); if(millis() - preHeartTick >= KEEPALIVEATIME){// 保持心跳 preHeartTick = println(); "--Keepalive:"); sendtoTCPServer("ping/r/n"); //发送心跳。 该命令必须以 /r/n 结尾。 请参阅访问文档以获取更多信息。 } } if((TcpClient_Buff.length() >= 1) && (millis() - TcpClient_preTick>=200) ) { TCPclient.flush(); ); //删除第一个空格 Serial.println(TcpClient_Buff); //输出接收到的消息 String getTopic = ""; String getMsg = ""; if(TcpClient_Buff.length() > 15){// TcpClient_Buff只是上面初始化的一个字符串,请注意有。 String TcpClient_Buff = ""; //此时我们将收到推送的命令。 这可能是 cmd=2&uid=xxx&topic=light002&msg=off int topicIndex = TcpClient_Buff.indexOf("&topic=")+7; //C语言字符串查找,查找&topic=位置并移动7位。 不知道的就百度搜索C语言字符串 int msgIndex = TcpClient_Buff.indexOf("&msg=");//C语言字符串查找,find&msg=location getTopic = TcpClient_Buff.substring(topicIndex,msgIndex ); // C语言字符串截取,截取到正题,不懂的话百度C 可以使用语言字符串拦截 getMsg = TcpClient_Buff.substring(msgIndex+5);//C语言字符串拦截,拦截消息 Serial.print("topic:----[ k4][k4 ]"); Serial.println(getTopic); //打印截获的topic值 Serial.print("msg: --------"); //输出截获的消息值 } if (getMsg == "on"){ //如果指令on==打开灯,则turnOnLed() }else if(getMsg == "off"){ //如果收到指令 off==关灯 TurnOffLed(); }else if(getMsg == "update"){ //如果收到更新指令 updateBin();//升级执行函数 } TcpClient_Buff=""; }}/************************************ ******************************************************** W.I. -FI ************************************************** * * *********************************//* WiFiTick 检查 WiFi 是否需要初始化。 请检查 WiFi 是否已连接。 如果连接成功,则启动TCP客户端控制指示灯* /void doWiFiTick(){ static bool startSTAFlag = false static boolean task start = false; if (!startSTAFlag) { startSTAFlag; (); } //1秒未连接则重新连接 if ( WiFi.status() != WL_CONNECTED ) { if (millis() - lastWiFiCheckTick > 1000) { lastWiFiCheckTick = millis(); } } //连接建立成功 else { if (taskStarted == false) { taskStarted = true; r/n获取IP地址: "); Serial.println(WiFi.localIP()); startTCPClient(); } }}
update.ino
/** * 固件升级功能* 在需要升级的地方添加。 该功能可以:、 updateBin() 等添加到设置中。 * 原理:通过http请求获取远程固件,实现升级 */void updateBin(){ Serial.println("start update"); t_httpUpdate_return ret = ESPhttpUpdate.update(UpdateClient , upUrl) ; { case HTTP_UPDATE_FAILED: //如果升级失败 Serial.println("[update] 更新 failed."); Destroy; case HTTP_UPDATE_NO_UPDATES: //如果没有升级 Serial.println("[update] Update no Update."); Destroy; case HTTP_UPDATE_OK: //如果升级成功 Serial.println("[ update ] 更新成功。"); Break; }}
bemfa02 主要支持 Wi-Fi 和 Baffa Cloud 参数 改变程序。 您可以暂时保留 upUrl 参数不变。 实验3再次改变。
编译程序,上传esp8266,观察esp8266和Bfa Cloud TCP Console。
实验结果:在订阅的“light002”主题中可以看到,当打开或关闭发送时,esp8266上的板载灯分别打开和关闭。 ??????
3.2 MQTT发送温湿度
登录Baffa Cloud物联网平台,选择控制台,点击MQTT设备云,新建LED002控制终端和temp004状态创建终端主题,然后Baffa Cloud MQTT 设备云已配置?
编程,程序有四个部分:dht11_led_OTA1.0、OTA(update)PubSubClient.cpp、PubSubClient.h。 其中:??
文件名 函数 dht11_led_OTA1.0 程序初始化调用和主程序调用、自动连接目标Wi-Fi、重连、LED002回调函数的处理。 OTA(更新)固件升级功能。
dht11_led_OTA1.0.ino
/* 时间:20211127 作者:2345VOR 项目示例:通过MQTT协议发送控制开关,上传温度、湿度到Baffa云 参考:https://www.cnblogs.com /bemfa/p/14590133.html*/#include //默认,WIFI标头 加载文件 #include "PubSubClient.h" //默认,加载MQTT库文件 #include //自动升级库 https://bbs .bemfa.com/84#include //dht11库文件 String upUrl = "http://bin.bemfa.com/b/1BcZTg4ODJhZTI4ZDViZGUzOTc2NmMzMzBlYTkxM2ZkNDY=led002.bin";const char* ssid = "J09 502"; // 更改为 root WIFI 名称 const char* password = "qwertyuiop111"; 更改密码 const char* mqtt_server = "bemfa.com"; //默认,MQTT 服务器地址 const int mqtt_server_port = 9501; //默认,MQTT 服务器端口 #defineID_MQTT "e8882ae28d5bde39766c330ea913fd46" //将 mqtt 客户端 ID 更改为开发者密钥 const char* topic = "led002"; //LED 主题名称。 您可以在 Baffa Cloud 控制台中自行创建一个。 名字是任意的。 const char * dhttopic = "temp004"; //可在巴法云mqtt控制台中创建的温湿度主题名称 int pinDHT11 = D2; //dht11传感器引脚输入 int B_led = D4; // Value = 3 * 1000; //传感器上传时间间隔,默认为3秒 #define LEDstatus !digitalRead(B_led); // LED 状态默认 0long lastMsg = 0; // 时间戳 SimpleDHT11 dht11(pinDHT11);// dht11 初始化 WiFiClient espClient;PubSubClient client(espClient);//mqtt 初始化//灯光函数和引脚定义 #defineturnOnLed( )digitalWrite( B_领导, LOW);#defineturnOffLed() digitalWrite(B_led , HIGH);//自动连接目标wifivoid setup_wifi() {delay(10); Serial.println(); Serial.println(ssid); ); WiFi.开始(SSID,密码); while(WiFi.status()!= WL_CONNECTED){ 延迟(500); Serial.println(“”); Serial.println(“WiFi已连接”); println("IP 地址: "); Serial.println(WiFi.localIP());}//重新连接 void reconnect() { // 循环直到重新连接 while (!client.connected()) { print("尝试中。 MQTT 连接..." ); // 尝试连接 if (client.connect(ID_MQTT)) {//连接 mqtt Serial.println("connected "); client.subscribe(topic);//更改主题} else { Serial.print("失败, rc="); Serial.print(client.state()); Serial.println(" 5秒后重试 ); / / 等待 5 秒后再重试 } }}void setup() { pinMode(B_led, OUTPUT) ; Serial.begin(115200); client.setServer(mqtt_server, m)qtt_server_port); client.setCallback(callback); digitalWrite(B_led, HIGH);}void Loop() { if (!client.connected()) {//判断 mqtt 是否已连接 reconnect() ; //mqtt client long now = millis();//获取当前时间戳 if (now - lastMsg > timeval) {//如果达到
评论前必须登录!
注册