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

首页 » 物联网 » 【物联网】Arduino Uno开发板连接阿里云实现云端远程控制LED灯开关

文章目录

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

1 思维图概览

需要实现的有

  • ESP8266通过wifi与阿里云进行通信
  • ESP8266与Arduino Uno开发板的通信
  • Arduino Uno开发板与LED灯的通信

wifi

物理连接

物理连接

ESP8266

阿里云物联网平台

ArduinoUno开发板

LED灯

【物联网】Arduino Uno开发板连接阿里云实现云端远程控制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://www.arduino.cc/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     //JOSN字符串库
#include 
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 
//  if(Json_Left >= espjson.length() - 1){return "ERRER";}
//  else{
//    for(Json_Right = Json_Left + 1;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 
//      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为临时控制下语音播放模块
StaticJsonDocument200> 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):tt");
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 == "norn"){
Serial.println("non不连接服务器 将启用部分功能 请尽快连接服务器n");
return -1;
}s_AT = "";
}
}
Serial.println("yesn开始连接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;
}

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

4 ArduinoUno开发板—>LED灯 部分

  • 硬件部分自行配置,详细参考Arduino教程
    【物联网】Arduino Uno开发板连接阿里云实现云端远程控制LED灯开关

5 云端体验控制

  • 在阿里云物联网控制台的在线调试中修改灯泡的开关即可, 数据会以物模型的形式发送到ESP8266,然后经过Arduino代码解析json,提取有用的信息,控制硬件实现LED灯的开关。
    【物联网】Arduino Uno开发板连接阿里云实现云端远程控制LED灯开关
本文章来源于互联网,如有侵权,请联系删除!

相关推荐: 《阿凡达:探索潘多拉》沉浸式主题展将亮相上海迪士尼;欧文斯科宁广德工厂二线正式投产 | 美通企业日报…

美通社要闻摘要: 欧文斯科宁广德工厂二线正式投产。华为云宣布全面建设全球初创生态。《阿凡达:探索潘多拉》主题展将在上海迪士尼向游客开放。阿尔斯通Coradia iLint行驶1175公里期间未补充氢燃料。麦格纳开发并试行”最后一公里”自动驾驶道路配送解决方案。…