当前位置:   article > 正文

stm32学习之esp8266连接阿里云_stm32 esp8266连接阿里云

stm32 esp8266连接阿里云

文章内容仅个人的理解,如有错误还请各位多多包涵

参考:b站:海创电子工作室,漫天飞羽zz

硬件

单片机:stm32f103c8t6、esp8266模块

一、首先,让esp8266作为客户端,连接上WiFi。

        (这里使用手机开热点,注意热点设置AP频段选择2.4Ghz,否则连接不上)

        1.1先用串口调试助手(xcom)进行调试

硬件连接

在串口调试助手输入相关AT指令,发送时记得勾选 换新行

除了第二步返回的是redy,其他成功都是返回ok的。这样就完成了

        1.2通过单片机发送指令给esp8266,连接上WiFi

首先要明白,回车换行,相当于串口调试助手勾选新行

想相关代码(后续会附上所有代码)

要知道 \ 转义符的使用,print(“        ”)括号里只能有一个引号,如果要有多个引号要在引号前加转义符 \,例如print(“    \"  \"    ”)这样就不会出错

  1. void WIFI_config()
  2. {
  3. printf ("AT\r\n");//会去执行接收中断,执行完之后才会继续下一个代码
  4. end_wait(3);
  5. u2_printf ("1 End wait\r\n");
  6. printf ("AT+CWMODE=1\r\n");//配置WiFi模式
  7. end_wait(3);
  8. u2_printf ("2 End wait\r\n");
  9. printf ("AT+RST\r\n");//重启
  10. end_wait(3);
  11. u2_printf ("3 End wait\r\n");
  12. printf("AT+CWJAP=\"%s\",\"%s\"\r\n","aaaa","123456789");//连接WiFi
  13. end_wait(3);
  14. u2_printf ("5 End wait\r\n");
  15. }

二、esp8266连接阿里云

        2.1先串口调试发送AT指令连接

自己在阿里云创建产品,设备,设备点击查看就知道用户名和密码了

相关AT指令

        2.2通过单片机发送指令连接阿里云

相关代码 

  1. void WIFI_connect_aliyun(void)
  2. {
  3. printf("AT+CIPSNTPCFG=1,8,\"%s\"\r\n", "ntpl.aliyun.com");
  4. end_wait(3);
  5. u2_printf ("4 End wait\r\n");
  6. printf("AT+MQTTUSERCFG=0,1,\"%s\",\"%s\",\"%s\",0,0,\"%s\"\r\n","NULL","esp88266&k14s6MVFIVB","d8fb3900cdb6cd8415042b418ff2171626448bd45e4626465ebbd0b76fce0bc3","");
  7. end_wait(3);
  8. u2_printf ("6 End wait\r\n");
  9. printf("AT+MQTTCLIENTID=0,\"%s\"\r\n", "k14s6MVFIVB.esp88266|securemode=2\\,signmethod=hmacsha256\\,timestamp=1713436406272|");
  10. end_wait(3);
  11. u2_printf ("7 End wait\r\n");
  12. printf("AT+MQTTCONN=0,\"%s\",1883,1\r\n","iot-06z00bu1jeo8uwc.mqtt.iothub.aliyuncs.com");
  13. end_wait(3);
  14. u2_printf ("8 End wait\r\n");
  15. printf("AT+MQTTSUB=0,\"%s\",1\r\n","/k14s6MVFIVB/esp88266/user/get");
  16. end_wait(3);
  17. u2_printf ("9 End wait\r\n");
  18. }

三、单片机成功连接上阿里云后

        3.1发送数据给阿里云

  1. void send_mcu_aliyun(char *wifi_data)
  2. {
  3. printf("AT+MQTTPUB=0,\"/k14s6MVFIVB/esp88266/user/update\",\"%s\",1,0\r\n", wifi_data);
  4. end_wait(3);
  5. u2_printf ("10 End wait\r\n");
  6. }

        3.2接收云端传来的数据,通过回车换行,能够判断数据是否传输完整

  1. /* 参考整点原子
  2. 云端返回数据的格式: asdfgdghjh...(0x0d)(ox0a)结尾
  3. */
  4. u8 USART_RX_BUF[USART_REC_LEN];
  5. u16 USART_RX_STA=0;
  6. void judge_receive_end()
  7. {
  8. u8 Res;
  9. if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  10. {
  11. Res =USART_ReceiveData(USART1); //读取接收到的数据
  12. if((USART_RX_STA&0x8000)==0)//接收未完成
  13. {
  14. if(USART_RX_STA&0x4000)//接收到了0x0d
  15. {
  16. if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
  17. else USART_RX_STA|=0x8000; //接收完成了
  18. }
  19. else //还没收到0X0D
  20. {
  21. if(Res==0x0d)USART_RX_STA|=0x4000;
  22. else
  23. {
  24. USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
  25. USART_RX_STA++;
  26. if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
  27. }
  28. }
  29. }
  30. }
  31. }

四、使用

  1. 1.显示接收从云端接收到的数据
  2. for(t=0;t<len;t++)
  3. {
  4. USART_SendData(USART2,USART_RX_BUF[t]);
  5. while (USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//等待发送结束
  6. }
  7. 2.判断云端数据
  8. if(USART_RX_STA&0x8000)
  9. {
  10. len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
  11. if(strstr((const char*)USART_RX_BUF,"on"))
  12. {
  13. u2_printf("ture");
  14. }
  15. 3.使用接收函数记得将
  16. USART_RX_STA=0;标志为清零
  17. memset (USART_RX_BUF,0,USART_REC_LEN);上次所得数据清零

五、esp8266.h和esp8266.c,usart.h在另一个文章

  1. #ifndef _WIFI_H
  2. #define _WIFI_H
  3. #include "stm32f10x.h"
  4. #include "delay.h"
  5. #include "usart.h"
  6. #include "string.h"
  7. #define USART_REC_LEN 200 //定义最大接收字节数 200
  8. extern u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
  9. extern u16 USART_RX_STA; //接收状态标记
  10. void WIFI_config(void);//esp8266连上wifi
  11. void WIFI_connect_aliyun(void);//连接上aliyun
  12. void send_mcu_aliyun(char *wifi_data);//发送数据到云端
  13. void send_dht11_to_aliyun(int t,int h);//发送温湿度数据给阿里云
  14. void end_wait(int t);//等待串口发送后esp8266再返回数据
  15. void judge_receive_end(void);//将云端发来的字符串存在USART_RX_BUF里
  16. #endif

.c

  1. #include "wifi.h" // Device header
  2. void WIFI_config()
  3. {
  4. printf ("AT\r\n");//会去执行接收中断,执行完之后才会继续下一个代码
  5. end_wait(3);
  6. u2_printf ("1 End wait\r\n");
  7. printf ("AT+CWMODE=1\r\n");//配置WiFi模式
  8. end_wait(3);
  9. u2_printf ("2 End wait\r\n");
  10. printf ("AT+RST\r\n");//重启
  11. end_wait(3);
  12. u2_printf ("3 End wait\r\n");
  13. printf("AT+CWJAP=\"%s\",\"%s\"\r\n","aaaa","123456789");//连接WiFi
  14. end_wait(3);
  15. u2_printf ("5 End wait\r\n");
  16. }
  17. void WIFI_connect_aliyun(void)
  18. {
  19. printf("AT+CIPSNTPCFG=1,8,\"%s\"\r\n", "ntpl.aliyun.com");
  20. end_wait(3);
  21. u2_printf ("4 End wait\r\n");
  22. printf("AT+MQTTUSERCFG=0,1,\"%s\",\"%s\",\"%s\",0,0,\"%s\"\r\n","NULL","esp88266&k14s6MVFIVB","d8fb3900cdb6cd8415042b418ff2171626448bd45e4626465ebbd0b76fce0bc3","");
  23. end_wait(3);
  24. u2_printf ("6 End wait\r\n");
  25. printf("AT+MQTTCLIENTID=0,\"%s\"\r\n", "k14s6MVFIVB.esp88266|securemode=2\\,signmethod=hmacsha256\\,timestamp=1713436406272|");
  26. end_wait(3);
  27. u2_printf ("7 End wait\r\n");
  28. printf("AT+MQTTCONN=0,\"%s\",1883,1\r\n","iot-06z00bu1jeo8uwc.mqtt.iothub.aliyuncs.com");
  29. end_wait(3);
  30. u2_printf ("8 End wait\r\n");
  31. printf("AT+MQTTSUB=0,\"%s\",1\r\n","/k14s6MVFIVB/esp88266/user/get");
  32. end_wait(3);
  33. u2_printf ("9 End wait\r\n");
  34. }
  35. void send_mcu_aliyun(char *wifi_data)
  36. {
  37. printf("AT+MQTTPUB=0,\"/k14s6MVFIVB/esp88266/user/update\",\"%s\",1,0\r\n", wifi_data);
  38. end_wait(3);
  39. u2_printf ("10 End wait\r\n");
  40. }
  41. void send_dht11_to_aliyun(int t,int h)
  42. {
  43. printf("AT+MQTTPUB=0,\"/k14s6MVFIVB/esp88266/user/update\",\"{\\\"temperature\\\": %d\\\,\\\"humidity\\\": %d}\",1,0\r\n",t,h);
  44. end_wait(3);
  45. u2_printf ("11 End wait\r\n");
  46. }
  47. void end_wait(int t)
  48. {
  49. int ti=0;
  50. while(!((USART_GetITStatus(USART1, USART_IT_RXNE) == RESET)&&(ti>t)))//不接收消息3秒后再继续,
  51. {
  52. delay_ms(1000);
  53. ti++;
  54. }
  55. }
  56. /* 参考整点原子
  57. 云端返回数据的格式: asdfgdghjh...(0x0d)(ox0a)结尾
  58. */
  59. u8 USART_RX_BUF[USART_REC_LEN];
  60. u16 USART_RX_STA=0;
  61. void judge_receive_end()
  62. {
  63. u8 Res;
  64. if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  65. {
  66. Res =USART_ReceiveData(USART1); //读取接收到的数据
  67. if((USART_RX_STA&0x8000)==0)//接收未完成
  68. {
  69. if(USART_RX_STA&0x4000)//接收到了0x0d
  70. {
  71. if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
  72. else USART_RX_STA|=0x8000; //接收完成了
  73. }
  74. else //还没收到0X0D
  75. {
  76. if(Res==0x0d)USART_RX_STA|=0x4000;
  77. else
  78. {
  79. USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
  80. USART_RX_STA++;
  81. if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
  82. }
  83. }
  84. }
  85. }
  86. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/834189
推荐阅读
相关标签
  

闽ICP备14008679号