关闭视频

机友分享 | Arduino使用ESP8266连接机智云物联网平台

发表于:2021年05月14日 10:37更新于:2024年05月06日 17:35

前言

 

本文实现Arduino UNO R3通过ESP8266-01模块连接机智云平台,从而实现用手机APP远程点亮LED灯。

 

 

ESP8266模块本地调试

 

当我们参考机智云官网给的教程时,关于Arduino平台主要都是关于机智云官方自己的开发板Gokit的资料。但当我们只使用Arduino UNO R3接入机智云平台,有很多教程通过添加了两个按键来选择airlink和softap模式,其实我们只要在本地给ESP8266配好了网络连接,就不需要每次通过按键切换配网模式。

 

第一步:首先在官网下载机智云固件GAgent,

 
第二步:使用ESP8266下载工具ESPFlashDownloadTool,将固件下载至ESP8266中。

 

第三步:在机智云官网下载机智云串口调试助手,

将ESP8266通过串口转USB工具插在电脑上,安装好驱动,选择中确的驱动后,打开串口,填入在官网申请的product_key和Product Secret后,就能在右边看见数据点了,此时再打开指令界面,点击AirLink命令,ESP8266就进入了自动配网模式;

 

第四步:下载机智云移动端APP

打开APP,点击一键配置,输入家里的WiFi账号及密码,选择乐鑫,因为刚才我们已经将ESP8266设置成AirLink透传模式,现在通过APP就可以将家里的WiFi信息发送给ESP8266,此时APP发现新设备下会出现你的WiFi模组,点击后就会看到你定义的数据点了。

 

 

硬件搭建

 

2.1硬件连接图

LED接上220欧姆电阻,连在Arduino的D4上,ESP8266CH-PD和vcc都接高电平。

 


注意:

  • 在给Arduino烧录程序的时候要断开ESP8266与Arduino的串口连接,否则会有干扰导致代码烧录不成功;

  • ESP8266-01只能供给3.3v电压,5v电压可能会烧坏WiFi模组


 
2.2项目源码
  1. #include<Gizwits.h>

  2. #include<Wire.h>

  3. #include<SoftwareSerial.h>

  4.  

  5. int ledPin = 13; // LED connected to digital pin 13,it's used for status

  6. int myledPin = 4; // my LED connected to digital pin 4

  7. int sensorValue = 0; // value read from the pot

  8. bool varR_LED_OnOff = 0;

  9. Gizwits myGizwits;

  10.  

  11. #define KEY1 6

  12. #define KEY2 7

  13. #define KEY1_SHORT_PRESS 1

  14. #define KEY1_LONG_PRESS 2

  15. #define KEY2_SHORT_PRESS 4

  16. #define KEY2_LONG_PRESS 8

  17. #define NO_KEY 0

  18. #define KEY_LONG_TIMER 3

  19. unsignedlongLast_KeyTime= 0;

  20.  

  21. unsignedlong gokit_time_s(void)

  22. {

  23. return millis() / 1000;

  24. }

  25.  

  26. char gokit_key1down(void)

  27. {

  28. unsignedlong keep_time = 0;

  29. if(digitalRead(KEY1) == LOW)

  30. {

  31. delay(100);

  32. if(digitalRead(KEY1) == LOW)

  33. {

  34. keep_time = gokit_time_s();

  35. while(digitalRead(KEY1) == LOW)

  36. {

  37. if((gokit_time_s() - keep_time) > KEY_LONG_TIMER)

  38. {

  39. Last_KeyTime= gokit_time_s();

  40. return KEY1_LONG_PRESS;

  41. }

  42. } //until open the key

  43.  

  44. if((gokit_time_s() - Last_KeyTime) > KEY_LONG_TIMER)

  45. {

  46. return KEY1_SHORT_PRESS;

  47. }

  48. return0;

  49. }

  50. return0;

  51. }

  52. return0;

  53. }

  54.  

  55. char gokit_key2down(void)

  56. {

  57. intunsignedlong keep_time = 0;

  58. if(digitalRead(KEY2) == LOW)

  59. {

  60. delay(100);

  61. if(digitalRead(KEY2) == LOW)

  62. {

  63. keep_time = gokit_time_s();

  64. while(digitalRead(KEY2) == LOW) //until open the key

  65. {

  66.  

  67. if((gokit_time_s() - keep_time) > KEY_LONG_TIMER)

  68. {

  69. Last_KeyTime= gokit_time_s();

  70. return KEY2_LONG_PRESS;

  71. }

  72. }

  73.  

  74. if((gokit_time_s() - Last_KeyTime) > KEY_LONG_TIMER)

  75. {

  76. return KEY2_SHORT_PRESS;

  77. }

  78. return0;

  79. }

  80. return0;

  81. }

  82. return0;

  83. }

  84.  

  85. /*******************************************************

  86. * function : gokit_keydown

  87. * Description : check the gokit key1 or key2 event

  88. * return : KEY1_LONG_PRESS KEY1_SHORT_PRESS

  89. * KEY2_LONG_PRESS KEY2_SHORT_PRESS

  90. * 0-no keydown event.

  91. * Add by Alex.lin --2014-12-25

  92. ******************************************************/

  93. char gokit_keydown(void)

  94. {

  95. char ret = 0;

  96. ret |= gokit_key2down();

  97. ret |= gokit_key1down();

  98. return ret;

  99.  

  100. }

  101.  

  102. void KEY_Handle(void)

  103. {

  104. /* Press for over than 3 second is Long Press */

  105. switch(gokit_keydown())

  106. {

  107. case KEY1_SHORT_PRESS:

  108. // Serial.println(F("KEY1_SHORT_PRESS , Production Test Mode "));

  109. myGizwits.setBindMode(WIFI_PRODUCTION_TEST);

  110. break;

  111. case KEY1_LONG_PRESS:

  112. // Serial.println(F("KEY1_LONG_PRESS ,Wifi Reset"));

  113. myGizwits.setBindMode(WIFI_RESET_MODE);

  114. break;

  115. case KEY2_SHORT_PRESS:

  116. // Serial.println(F("KEY2_SHORT_PRESS Soft AP mode"));

  117. myGizwits.setBindMode(WIFI_SOFTAP_MODE);

  118. //Soft AP mode

  119. break;

  120. case KEY2_LONG_PRESS:

  121. // Serial.println(F("KEY2_LONG_PRESS ,AirLink mode"));

  122. digitalWrite(ledPin, HIGH); // sets the LED on

  123. myGizwits.setBindMode(WIFI_AIRLINK_MODE);

  124. //AirLink mode

  125. break;

  126. default:

  127. break;

  128. }

  129. }

  130.  

  131. void setup() {

  132. // put your setup code here, to run once:

  133.  

  134. Serial.begin(9600);

  135.  

  136. pinMode(ledPin, OUTPUT); // sets the digital pin as output

  137. pinMode(myledPin, OUTPUT); // sets the digital pin as output

  138.  

  139. pinMode(KEY1, INPUT_PULLUP);

  140. pinMode(KEY2, INPUT_PULLUP);

  141.  

  142. myGizwits.begin();

  143. }

  144. void wifiStatusHandle()

  145. {

  146. // if(myGizwits.wifiHasBeenSet(WIFI_SOFTAP))

  147. // Serial.println(F("WIFI_SOFTAP!"));

  148. //

  149. // if(myGizwits.wifiHasBeenSet(WIFI_AIRLINK))

  150. // Serial.println(F("WIFI_AIRLINK!"));

  151. //

  152. // if(myGizwits.wifiHasBeenSet(WIFI_STATION))

  153. // Serial.println(F("WIFI_STATION!"));

  154. //

  155. if(myGizwits.wifiHasBeenSet(WIFI_CON_ROUTER))

  156. digitalWrite(ledPin, LOW); // sets the LED off

  157. // Serial.println(F("WIFI_CON_ROUTER!"));

  158. //

  159. // if(myGizwits.wifiHasBeenSet(WIFI_DISCON_ROUTER))

  160. // Serial.println(F("WIFI_DISCON_ROUTER!"));

  161. //

  162. // if(myGizwits.wifiHasBeenSet(WIFI_CON_M2M))

  163. // Serial.println(F("WIFI_CON_M2M!"));

  164. //

  165. // if(myGizwits.wifiHasBeenSet(WIFI_DISCON_M2M))

  166. // Serial.println(F("WIFI_DISCON_M2M!"));

  167. }

  168. void loop() {

  169.  

  170. //Configure network

  171. //if(XXX) //Trigger Condition

  172. //myGizwits.setBindMode(0x02); //0x01:Enter AP Mode;0x02:Enter Airlink Mode

  173. /*

  174. unsigned long varW_ADCValue = 0;//Add Sensor Data Collection

  175. myGizwits.write(VALUE_ADCVALUE, varW_ADCValue);

  176.  

  177.  

  178. bool varR_LED_OnOff = 0;

  179. if(myGizwits.hasBeenSet(EVENT_LED_ONOFF))

  180. {

  181. myGizwits.read(EVENT_LED_ONOFF,&varR_LED_OnOff);//Address for storing data

  182. }

  183.  

  184.  

  185. //binary datapoint handle

  186. */

  187. sensorValue = analogRead(A0);

  188.  

  189. unsignedlong varW_ADCValue = sensorValue;//Add Sensor Data Collection

  190. myGizwits.write(VALUE_ADCVALUE, varW_ADCValue);

  191.  

  192.  

  193.  

  194. if(myGizwits.hasBeenSet(EVENT_led_onoff))

  195. {

  196. myGizwits.read(EVENT_led_onoff,&varR_LED_OnOff);//Address for storing data

  197. }

  198. if(varR_LED_OnOff==1)

  199. {

  200. digitalWrite(myledPin, HIGH); // sets the user LED on

  201. }

  202. else

  203. {

  204. digitalWrite(myledPin, LOW); // sets the user LED off

  205. }

  206.  

  207. KEY_Handle();//key handle , network configure

  208. wifiStatusHandle();//WIFI Status Handle

  209.  

  210. myGizwits.process();

  211. }

 

至此,你的ESP8266模组就成功连接上机智云服务平台了,无论你在任何地方,无论用WiFi和4G都能通过APP来控制LED等的亮灭了,机智云还提供了APP的开源框架,我们可以在此基础上高度自由地定制我们自己的APP接入机智云物联网平台。