当前位置:   article > 正文

Arduino使用8266连接物联网云平台(防遗忘版)_arduino如何接入云平台

arduino如何接入云平台

Arduino Uno、esp8266 01s、下载器(左2、4短接)、传感器若干

8266代码

  1. #include <ESP8266WiFi.h>
  2. #include <PubSubClient.h>
  3. #define BUILTIN_LED 2
  4. char P_NAME[] = "309_b"; //设置热点名称
  5. char P_PSWD[] = "309666666"; //设置热点密码
  6. char sub[] = "Sub/100432"; //设置设备SUB名称
  7. char pub[] = "Pub/100432"; //设置设备PUB名称
  8. const char *ssid = P_NAME;
  9. const char *password = P_PSWD;
  10. const char *mqtt_server = "easyiothings.com";
  11. String reStr;
  12. WiFiClient espClient;
  13. PubSubClient client(espClient);
  14. unsigned long lastMsg = 0;
  15. #define MSG_BUFFER_SIZE (50)
  16. char msg[MSG_BUFFER_SIZE];
  17. int value = 0;
  18. void setup_wifi()
  19. {
  20. delay(10);
  21. WiFi.mode(WIFI_STA);
  22. WiFi.begin(ssid, password);
  23. while (WiFi.status() != WL_CONNECTED)
  24. {
  25. delay(500);
  26. }
  27. randomSeed(micros());
  28. }
  29. void callback(char *topic, byte *payload, unsigned int length)
  30. {
  31. for (int i = 0; i < length; i++)
  32. {
  33. Serial.print((char)payload[i]);
  34. }
  35. Serial.println();
  36. }
  37. void reconnect()
  38. {
  39. while (!client.connected())
  40. {
  41. String clientId = "ESP8266Client";
  42. clientId += String(random(0xffff), HEX);
  43. if (client.connect(clientId.c_str()))
  44. {
  45. client.publish(pub, "{\"State\":\"OnLine\"}");
  46. client.subscribe(sub);
  47. }
  48. else
  49. {
  50. Serial.print(client.state());
  51. delay(5000);
  52. }
  53. }
  54. }
  55. void setup()
  56. {
  57. pinMode(BUILTIN_LED, OUTPUT);
  58. Serial.begin(9600);
  59. setup_wifi();
  60. client.setServer(mqtt_server, 1883);
  61. client.setCallback(callback);
  62. digitalWrite(BUILTIN_LED, HIGH);
  63. }
  64. void loop()
  65. {
  66. if (!client.connected())
  67. {
  68. reconnect();
  69. }
  70. client.loop();
  71. if (Serial.available() > 0)
  72. {
  73. reStr = Serial.readStringUntil('\n');
  74. //检测json数据是否完整
  75. int jsonBeginAt = reStr.indexOf("{");
  76. int jsonEndAt = reStr.lastIndexOf("}");
  77. if (jsonBeginAt != -1 && jsonEndAt != -1)
  78. {
  79. reStr = reStr.substring(jsonBeginAt, jsonEndAt + 1);
  80. int str_len = reStr.length() + 1;
  81. char char_array[str_len];
  82. reStr.toCharArray(char_array, str_len);
  83. client.publish(pub, char_array);
  84. }
  85. }
  86. }

Arduino代码

  1. /*
  2. 《智慧寝室例程》
  3. 需安装的Arduino库:
  4. ArduinoJson、DHT sensor library
  5. 可实现功能:
  6. 温湿度查看,灯光控制,窗帘控制,火焰检测,空调开关,空调温度设定。
  7. 接线:
  8. 温湿度使用DHT11传感器,接10号引脚;
  9. 窗帘舵机连接9号引脚;
  10. 火焰传感器连接8号引脚;
  11. LED灯连接7号引脚;
  12. 继电器连接6号引脚模拟空调的控制;
  13. 将ESP8266的Rx引脚接在Arduino的Tx上,Tx引脚接在Rx上。但下载代码时需将Rx与Tx的接线移除,否则程序会报错;
  14. */
  15. #include <Arduino.h>
  16. #include <ArduinoJson.h> //导入JSON库,用来封装发送数据的格式
  17. #include <DHT.h> //导入温湿度传感器库
  18. #include <Servo.h> //控制舵机的库
  19. StaticJsonDocument<200> sendJson; // 创建JSON对象,用来存放发送数据
  20. StaticJsonDocument<200> readJson; // 创建JSON对象,用来存放接收到的数据
  21. unsigned long lastUpdateTime = 0; //记录上次上传数据时间
  22. const unsigned long updateInterval = 4000; // 在这里设置数据发送至云平台的时间间隔,单位为毫秒
  23. //定义传感器相关的引脚
  24. #define DHTPIN 10 //定义温湿度传感器引脚为10
  25. #define DHTTYPE DHT11 //定义温湿度传感器型号为DHT11
  26. #define CURTAIN 9 //设定舵机(窗帘)的Arduino引脚为9
  27. #define COPEN 10 //设定舵机的角度,窗帘开启时舵机的角度
  28. #define CCLOSE 100 //窗帘关闭时舵机的角度
  29. #define FIRE 8 //设定火焰传感器连接的Arduino引脚为4
  30. #define LED 7 //设定LED灯引脚为7
  31. #define AIR 6 //设定继电器(空调)的引脚为6
  32. #define Sensor_AO A0 //设定烟雾传感器模拟引脚为 AO
  33. #define Sensor_DO 2 //设定烟雾传感器数字引脚为 2
  34. #define Human 12
  35. //数字量输出:通过板载电位器设定浓度阈值,当检测到环境气体浓度超过阈值时,通过数字引脚DO输出低电平。
  36. //模拟量输出:浓度越高,AO引脚输出的电压值越高,通过ADC采集的模拟值越高
  37. //定义相关的变量
  38. long ID = 1000432; // 定义设备ID号,替换成云平台生成的ID号
  39. float temperature, humidity; // 定义温湿度变量
  40. int lightState,fireState,airState,curtainState; // 定义灯光,火焰,继电器(空调),窗帘状态(0代表无或者关闭,1代表有或者打开)
  41. int airTemperatureSet=26; // 定义空调的设定温度,默认26
  42. DHT dht(DHTPIN, DHTTYPE); //创建dht对象,用于操作温湿度传感器
  43. Servo curtainServo; // 创建舵机对象,用来控制窗帘的舵机
  44. unsigned int smoke = 0; //无符号整形(非负数)
  45. int body = 0;
  46. // Arduino的初始化函数,仅在通电时运行一次
  47. void setup()
  48. {
  49. Serial.begin(9600); //初始化串口,用于和esp8266进行通信,完成数据的接收与上传
  50. pinMode(Sensor_DO, INPUT);//初始化烟雾引脚为输入模式
  51. dht.begin(); //初始化温湿度传感器
  52. curtainServo.attach(CURTAIN); //初始化9号引脚为舵机引脚
  53. pinMode(FIRE, INPUT); //初始化火焰传感器引脚为输入模式
  54. pinMode(LED, OUTPUT); //初始化LED灯引脚为输出模式
  55. pinMode(AIR, OUTPUT); //初始化继电器(空调)引脚为输出模式
  56. pinMode(Human,INPUT); //初始化人体红外传感器引脚为输入模式
  57. // Serial.flush();
  58. }
  59. // Arduino的loop函数,当setup函数执行完毕后进入该函数并一直循环运行
  60. void loop()
  61. {
  62. // 该函数段可完成数据定时上报的功能,并且不会阻塞loop函数的运行
  63. if (millis() - lastUpdateTime > updateInterval)
  64. {
  65. sendJsonData();
  66. lastUpdateTime = millis();
  67. }
  68. // 当用户使用手机控制当前设备时ESP8266会通过串口向Arduino发送指令,该函数段可判断串口有没有接收到消息,并完成对用户消息的解析
  69. while (Serial.available() > 0) { // 判断串口缓冲区是否有消息
  70. String inputString = Serial.readStringUntil('\n'); //从串口缓冲区读入数据,并赋值给inputString变量(String变量为Arduino独有变量类型,可以简化字符串操作)
  71. //检测json数据是否完整,若通过则进行下一步的处理
  72. /*
  73. 云平台向硬件下发JSON的格式为 {"Light":"1"} 类型的字符串,通常叫键值对,C语言中叫做哈希表。
  74. 左边的"Air"为我们在云平台中定义的标识符,右边为具体的指令
  75. */
  76. int jsonBeginAt = inputString.indexOf("{");
  77. int jsonEndAt = inputString.lastIndexOf("}");
  78. if (jsonBeginAt != -1 && jsonEndAt != -1)
  79. {
  80. inputString = inputString.substring(jsonBeginAt, jsonEndAt + 1); //截取字符串,净化json数据
  81. deserializeJson(readJson, inputString); //通过ArduinoJSON库将JSON字符串转换为方便操作的对象
  82. // 判断接收的指令
  83. if (readJson.containsKey("LightState")) //判断云平台下发的消息是否包含Light标识符,如果是则进行下一步处理
  84. {
  85. digitalWrite(LED, (int)readJson["LightState"]); // 根据Light的值来控制小灯,0为关,1为开,由于是char类型,所以我们需要转换为int
  86. delay(100);
  87. lightState = digitalRead(LED); // 及时更新小灯的状态信息,这样云平台才能知道是否控制成功
  88. }
  89. else if(readJson.containsKey("CurtainState")) // 若添加了多个功能,则使用else if隔开
  90. {
  91. //更新curtain的值
  92. curtainState = (int)readJson["CurtainState"];
  93. }
  94. // 空调开关设定
  95. else if(readJson.containsKey("AirState")){
  96. airState = (int)readJson["AirState"]; // 让Arduino中的空调设定值更新为云平台下放的值
  97. }
  98. // 空调温度设定
  99. else if(readJson.containsKey("AirTemperatureSet")){
  100. airTemperatureSet = (int)readJson["AirTemperatureSet"]; // 让Arduino中的空调设定值更新为云平台下放的值
  101. }
  102. delay(500);
  103. sendJsonData(); //向云平台发送最新的信息
  104. }
  105. }
  106. //判读curtainState的值是否为1,是则让舵机转到开启的角度,否则关闭
  107. if(curtainState){
  108. curtainServo.write(COPEN);
  109. }
  110. else{
  111. curtainServo.write(CCLOSE);
  112. }
  113. //判断空调是否为开启的状态
  114. if(curtainState){
  115. // 判断当前室内温度是否低于设定温度,是则触发继电器,否则关闭
  116. if(temperature<airTemperatureSet){
  117. digitalWrite(AIR,HIGH);
  118. }
  119. else{
  120. digitalWrite(AIR,LOW);
  121. }
  122. }
  123. else{
  124. digitalWrite(AIR,LOW);
  125. }
  126. //读取传感器数据
  127. fireState = digitalRead(FIRE); //火焰传感器
  128. // 温湿度传感器
  129. temperature = dht.readTemperature();
  130. humidity = dht.readHumidity();
  131. lightState = digitalRead(LED); //LED灯状态
  132. smoke = analogRead(Sensor_AO);
  133. Serial.print("Sensor AD Value = ");
  134. Serial.println(smoke);
  135. if (digitalRead(Sensor_DO) == LOW)
  136. {
  137. Serial.println("Alarm!");
  138. }
  139. int val = digitalRead(Human);
  140. if (val == 1){
  141. delay(50);
  142. if (val == 1){
  143. body = 1; //反转body值
  144. Serial.println("have people"); //延时10s
  145. }
  146. }
  147. else if (body==1 && val==0){
  148. body = 0;
  149. Serial.println("people left"); //当人离开的时候打印
  150. }
  151. else {
  152. Serial.println("NONE");
  153. }
  154. }
  155. //上传数值
  156. void sendJsonData()
  157. {
  158. // 将数据添加到JSON对象中,左边为在云平台中定义的标识符,右边为变量
  159. sendJson["ID"] = ID;
  160. sendJson["Temperature"] = temperature;
  161. sendJson["Humidity"] = humidity;
  162. sendJson["LightState"] = lightState;
  163. sendJson["AirState"] = airState;
  164. sendJson["CurtainState"] = curtainState;
  165. sendJson["FireState"] = fireState;
  166. sendJson["AirTemperatureSet"] = airTemperatureSet;
  167. sendJson["Smoke"] = smoke;
  168. sendJson["Human"] = body;
  169. //将对象转换成字符串,并向ese8266发送消息
  170. serializeJson(sendJson, Serial);
  171. Serial.print("\n");
  172. }

易连智能云平台:易联智能物联网平台

 

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号