irpas技术客

【物联网】Arduino Uno开发板连接阿里云实现云端远程控制LED灯开关_小哈里_arduino物联网远程控制

irpas 2815

文章目录 1 思维图概览2 阿里云—>ESP8266 部分3 ESP8266—>ArduinoUno开发板 部分4 ArduinoUno开发板—>LED灯 部分5 云端体验控制

1 思维图概览

需要实现的有

ESP8266通过wifi与阿里云进行通信ESP8266与Arduino Uno开发板的通信Arduino Uno开发板与LED灯的通信 #mermaid-svg-ZSpgyxlEdloVmytQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZSpgyxlEdloVmytQ .error-icon{fill:#552222;}#mermaid-svg-ZSpgyxlEdloVmytQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZSpgyxlEdloVmytQ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ZSpgyxlEdloVmytQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZSpgyxlEdloVmytQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZSpgyxlEdloVmytQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZSpgyxlEdloVmytQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZSpgyxlEdloVmytQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZSpgyxlEdloVmytQ .marker.cross{stroke:#333333;}#mermaid-svg-ZSpgyxlEdloVmytQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZSpgyxlEdloVmytQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZSpgyxlEdloVmytQ .cluster-label text{fill:#333;}#mermaid-svg-ZSpgyxlEdloVmytQ .cluster-label span{color:#333;}#mermaid-svg-ZSpgyxlEdloVmytQ .label text,#mermaid-svg-ZSpgyxlEdloVmytQ span{fill:#333;color:#333;}#mermaid-svg-ZSpgyxlEdloVmytQ .node rect,#mermaid-svg-ZSpgyxlEdloVmytQ .node circle,#mermaid-svg-ZSpgyxlEdloVmytQ .node ellipse,#mermaid-svg-ZSpgyxlEdloVmytQ .node polygon,#mermaid-svg-ZSpgyxlEdloVmytQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZSpgyxlEdloVmytQ .node .label{text-align:center;}#mermaid-svg-ZSpgyxlEdloVmytQ .node.clickable{cursor:pointer;}#mermaid-svg-ZSpgyxlEdloVmytQ .arrowheadPath{fill:#333333;}#mermaid-svg-ZSpgyxlEdloVmytQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZSpgyxlEdloVmytQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZSpgyxlEdloVmytQ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ZSpgyxlEdloVmytQ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ZSpgyxlEdloVmytQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZSpgyxlEdloVmytQ .cluster text{fill:#333;}#mermaid-svg-ZSpgyxlEdloVmytQ .cluster span{color:#333;}#mermaid-svg-ZSpgyxlEdloVmytQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZSpgyxlEdloVmytQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} wifi 物理连接 物理连接 ESP8266 阿里云物联网平台 ArduinoUno开发板 LED灯

2 阿里云—>ESP8266 部分

参考昨天的文章

【阿里云】物联网平台配置ESP8266真实设备AT串口连接,支持MQTT协议通信 https://blog.csdn.net/qq_33957603/article/details/124575451

参考的AT指令

AT+RST AT+RESTORE AT+CWMODE=1 AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com" AT+CWJAP="WiFi名字","WiFi密码" AT+MQTTUSERCFG=0,1,"NULL","用户名","密码",0,0,"" AT+MQTTCLIENTID=0,"ClienId" //clientId第二个参数注意每个逗号后加分隔符“\”,例如:t|securemode=3\,signmethod=hmacsha1\, AT+MQTTCONN=0,"连接域名",1883,1 //连接域名中的端口号已经被提到后面了,所以删去“:1883” 3 ESP8266—>ArduinoUno开发板 部分

ArduinoUno软件官网下载

https://`/en/software

串口接受到的云端数据(含物模型格式)

+MQTTSUBRECV:0,"/sys/xxxxxx/xxx/thing/service/property/set",100,{"method":"thing.service.property.set","id":"xxxxx","params":{"powerstate":1},"version":"1.0.0"}

参考代码 AT指令部分请用阿里云连接ESP8266的部分进行替换

/* 连接LOT的AT指令,可修改WIFI和三元组 */ //#define AT_1 "AT+RST" //AT重启指令暂时不用 //#define AT_2 "AT+RESTORE" #define AT_3 "AT+CWMODE=1" #define AT_4 #define AT_5 #define AT_6 #define AT_7 #define AT_8 #include <ArduinoJson.h> //JOSN字符串库 #include <SoftwareSerial.h> SoftwareSerial softSerial1(10,11); //定义软串口1与音乐播放器模块通信 const int LED = 7; //灯的引脚 int Json_isTopic(String espjson); void Serial_Transfer(); int Aliyun_Connect(); String Json_Extraction(String espjson); int Json_Parse(String Json,int* LightSwitch); String espstring; int LightSwitch = 0; void setup() { Serial.begin(9600); //与电脑连接的硬串口一般不建议连接其他设备 softSerial1.begin(9600); //定义为softSerial1串口专门与esp8266连接 "AT+UART_DEF=9600,8,1,0,0"已经把esp8266波特率改成9600 softSerial1.listen(); pinMode(LED,OUTPUT); //小灯泡引脚设置 Aliyun_Connect(); //阿里云连接函数 } void loop() { if(softSerial1.available()){ //注意串口容易丢失数据,要保证loop函数准确 espstring = softSerial1.readString(); //使用.readString()可以直接读取全部串口内容,可以不需要循环了(但是实际上有点不稳定,需要一个循环) Serial.println(espstring); Json_isTopic(espstring); } } int Json_isTopic(String espjson){ int left = 0; for(int i = 0; i < espjson.length(); i++){ if(espjson[i]=='{'){ left = i; break; } } espjson = espjson.substring(left,espjson.length() - 1); Serial.println(espjson); if(espjson == "ERRER"){return -1;} Json_Parse(espjson,&LightSwitch); //读取Json字符串变量 Serial.println(LightSwitch); digitalWrite(LED,LightSwitch); return 0; } /* AT反馈字符串提取JSON字符串函数 */ //String Json_Extraction(String espjson){ //从espjson里提取出Json字符串再return回去赋值,如果错误则出"ERRER" // int Json_Left = 0; int Json_Right = 0; int Json_Bracket = 1; //定义Json字符串的左边界、右边界、括号数量变量 // while(Json_Left < espjson.length() - 1 and espjson[Json_Left] != '{'){Json_Left +=1;} //历遍espjson直到第一个'{'后将位置赋值给Json_Left // if(Json_Left >= espjson.length() - 1){return "ERRER";} // else{ // for(Json_Right = Json_Left + 1;Json_Right < espjson.length();Json_Right++){ //从Json_Left+1开始历遍espjson,到Json_Bracket(括号数量)为0时停止,位置赋值给Json_Right // if(espjson[Json_Right] == '{'){Json_Bracket += 1;} // else if(espjson[Json_Right] == '}'){Json_Bracket -= 1;} // if(Json_Bracket == 0){break;} // } // if(Json_Right < espjson.length()){ // return espjson.substring(Json_Left,Json_Right+1); //.substring(Json_Left,Json_Right+1)提取出可能的JSON字符串并return出 // } // } // return "ERRER"; //} int Json_Parse(String Json,int* LightSwitch){ // Brightness为临时控制下语音播放模块 StaticJsonDocument<200> jsonBuffer; //创建一个名为jsonBuffer的JSON变量 DeserializationError error = deserializeJson(jsonBuffer, Json); //使用Json字符串构建JSON变量并赋值于jsonBuffer if (error){ //构建错误就报错 Serial.print(F("deserializeJson() failed: ")); Serial.println(error.f_str()); return -1; } *LightSwitch = jsonBuffer["params"]["powerstate"]; return 0; } /* 函数AT结果反馈Serial */ void Serial_Transfer(){ //主要用于测试连接结果 简单粗暴! char s_A; while(!softSerial1.available()){} //神技!可以保证信息传输到位 while(softSerial1.available() > 0){ s_A = char(softSerial1.read()); delay(2); //延时很关键,串口读取可能过快 Serial.print(s_A); } return 0; } /* LOT服务器连接代码 */ int Aliyun_Connect(){ // 返回数:yes为0,no为-1 String s_AT = ""; // s_AT只用于判断是否连接LOT服务器 Serial.print("是否开始连接LOT服务器:(yes/no):\t\t"); while(s_AT != "yes"){ //输入(yes/no)判断是否连接服务器,yes只需要保证前三个为yes即可,注意需要/r/n及串口监视器的NL AND CL模式 if(Serial.available() > 0){ s_AT += char(Serial.read()); delay(2); //很关键,串口读取可能过快 }else{ if(s_AT == "no\r\n"){ Serial.println("no\n不连接服务器 将启用部分功能 请尽快连接服务器\n"); return -1; }s_AT = ""; } } Serial.println("yes\n开始连接LOT服务器 请稍等!\n"); softSerial1.println(AT_3); Serial_Transfer(); softSerial1.println(AT_4); Serial_Transfer(); softSerial1.println(AT_5); Serial_Transfer(); Serial_Transfer(); Serial_Transfer(); //连接WIFI时,它有三次不同的回答,注意来三次应对 softSerial1.println(AT_6); Serial_Transfer(); softSerial1.println(AT_7); Serial_Transfer(); softSerial1.println(AT_8); Serial_Transfer(); Serial_Transfer(); //第一次发“+MQTT.....1” 第二次才是OK,这不同步 Serial.println("\nLOT服务器连接完成!\n"); while(softSerial1.read() >= 0){} //最后清理干净各串口 while(Serial.read() >= 0){} return 0; }

4 ArduinoUno开发板—>LED灯 部分 硬件部分自行配置,详细参考Arduino教程 5 云端体验控制 在阿里云物联网控制台的在线调试中修改灯泡的开关即可, 数据会以物模型的形式发送到ESP8266,然后经过Arduino代码解析json,提取有用的信息,控制硬件实现LED灯的开关。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #arduino物联网远程控制 #文章目录1 #思维图概览2 #阿里云ampgtESP8266 #部分3 #部分4