本次博客知识来自于韦东山老师的7天物联网课程。

一、预期功能

运用ESP8266模块,使单片机与手机微信的小程序进行通信,实现手机控制LED的亮灭。并且,单片机可以远程控制微信小程序中模拟的门铃开启和关闭。

二、硬件设置

本次实验采用STM32F103C8T6,用到了以下单片机的以下功能。

GPIO_PA0,用作外部中断0,并且连接一个按键,使用按键向手机发送数据。

GPIO_PA1,连接LED灯,手机APP控制LED的亮灭。

USART2,使用串口2与ESP8266模块连接,并启用串口中断,当接收到ESP8266的信息(手机的信息)时,发送串口中断。

因为要开启调试模式,所以在SYS中要把Debug设置为Serial Wire。

三、发送程序编写

所有函数记得声明

1、定义静态变量

static uint8_t rx_data = 0;            //接收的字符
static uint8_t rx_len = 0;             //接收的长度
static uint8_t usart_rx_buf[200] = {0};//保存接收的数据

2、调用HAL库接收函数,等待接收数据,这样可以在程序一开始就启用接受中断。每次接受一个字节大小的数据。在usart.c中编写。

void USART_StartRx(void)
{HAL_UART_Receive_IT(&huart2, (uint8_t*)&rx_data, 1);
}

3、USART中断回调函数,保存接收的数据并启动下一次接收。每接收到一个字节的数据,发送一次中断,调用一次中断回调函数,把接受的一个字节的数据存储到usart_rx_buf[]中。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{usart_rx_buf[rx_len%200]= rx_data;rx_len++;HAL_UART_Receive_IT(&huart2, (uint8_t*)&rx_data, 1);
}

4、获取接收的数据。可以调用这个函数获取接受的数据。

uint8_t USART2_Receive(uint8_t *rx_data)
{memcpy(rx_data, (uint8_t*)usart_rx_buf, rx_len);return rx_len;
}

5、UASRT2发送数据。这里调用的时HEL库的函数。

void USART2_Transmit(uint8_t *pdata, uint16_t len, uint16_t tt)
{HAL_UART_Transmit(&huart2, pdata, len, tt);
}

6、清除接收的数据,运用memset把usart_rx_buf[]清空。

void USART2_ClearBuf(void)
{rx_len = 0;memset((uint8_t*)usart_rx_buf, 0, 200);
}

7、向ESP8266发送数据,要向每个命令加入换行符才能执行。

uint8_t ESP8266_SendCommand(char *cmd, char *reply, uint16_t timeout)
{//1.保存传入的指令char buf[256] = {0};strcat(buf, cmd); //strcpy //2.处理AT指令(添加换行)if (strstr(buf, "\r\n") == 0){strcat(buf, "\r\n");}//3.清理前面接收的bufUSART2_ClearBuf();   //4.发送数据USART2_Transmit((uint8_t *)buf, strlen(buf), 500);//5.接收数据memset(buf, 0, 256); //buf清空while(timeout != 0)  //超时控制{if (USART2_Receive((uint8_t *)buf)) //接收数据{//检查结果if (strstr(buf, reply)) {printf("%s Send ok!\r\n", cmd);//发送成功return 0;}else{timeout--;HAL_Delay(1);}}    }printf("%s Send error!\r\n", cmd);//发送失败return 1;
}

8、获取ESP8266的IP,因为返回的结果不一样,所以这里要重新写一个接受IP的函数。

uint8_t ESP8266_GetIP(void)
{uint16_t timeout = 500;//1.准备发送的指令 AT+CIFSRchar buf[256] = {0};strcat(buf, "AT+CIFSR\r\n");//2.清理前面接收的bufUSART2_ClearBuf();   //4.发送数据USART2_Transmit((uint8_t *)buf, strlen(buf), 500);//5.接收数据memset(buf, 0, 256); //buf清空while(timeout != 0)  //超时控制{if (USART2_Receive((uint8_t *)buf)) //接收数据{//检查结果if (strstr(buf, "OK")) {printf("%s", buf); //打印IPreturn 0;}else{timeout--;HAL_Delay(1);}}  }printf("Get IP Failed! \r\n"); //获取失败return 1;
}

9、ESP8266发送UDP数据,这里使用ESP8266的UDP传输。因为发送的数据是变量,所以要重新写一个函数。

uint8_t ESP8266_Send_UDP(char *data)
{//1.准备发送的指令 AT+CIPSEND=lenchar buf[256] = {0};uint8_t len = strlen(data);sprintf(buf, "AT+CIPSEND=%d\r\n", len); //把格式化的数据写入字符串if (ESP8266_SendCommand(buf, "OK", 500) == 0) //发送指令{ESP8266_SendCommand(data, "SEND OK", 1000); //发送数据return 0;}return 1;
}

四、按键标志位程序编写

//在gpio.c中static uint8_t key_flag = 0;uint8_t Key_GetFlag(void)
{if(key_flag){key_flag = 0;return 1;}elsereturn 0;
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == KEY_Pin){key_flag = 1;}
}

五、主函数编写

1、定义全局变量

  uint8_t rx_data[200] = {0};        // 保存接收数据uint8_t tx_data[200] = "AT\r\n";   // 保存发送数据

2、启动ESP8266模块

  USART_StartRx();   //启动开始接收数据ESP8266_SendCommand("AT+RST", "OK", 500);HAL_Delay(800);ESP8266_SendCommand("AT+CWMODE=1", "OK", 500);ESP8266_SendCommand("AT+CWJAP=\"wife名称\",\"wife密码\"", "OK", 5000);ESP8266_SendCommand("AT+CIPSTART=\"UDP\",\"192.168.50.230\",9999,9999,2", "OK", 500);ESP8266_GetIP();

3、实现按键按下操作手机微信小程序。实现手机微信小程序控制LED灯的亮灭。

  while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///按键按下if (Key_GetFlag()) {ESP8266_Send_UDP("{\"data\":\"doorbell\",\"status\":\"1\"}");}//收到UDP数据if (USART2_Receive(rx_data)){//printf("%s\r\n", rx_data);if (strstr((char *)rx_data, "\"dev\":\"led\",\"status\":\"0\"")) {printf("led off\r\n");printf("%s\r\n",rx_data); HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);USART2_ClearBuf(); //memset(rx_data, 0, 200);}else if (strstr((char *)rx_data, "\"dev\":\"led\",\"status\":\"1\"")){printf("led on\r\n");printf("%s\r\n",rx_data); HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);USART2_ClearBuf(); //memset(rx_data, 0, 200);            }}}

ESP8266的使用相关推荐

  1. 安装esp8266库_基于ESP8266,DIY低成本智能远程开关灯小装置

    废话不多说,直接开始 首先需要必备的环境arduino ide,Blinker app(应用商店均可下载)以及必备的一些库(aduino ide1.8.7及以上版本,esp8266拓展,blinker ...

  2. esp freertos_如何开始使用FreeRTOS和ESP8266

    esp freertos by Denis Nuțiu 丹尼斯·努尤(Denis Nuțiu) 如何开始使用FreeRTOS和ESP8266 (How to get started with Free ...

  3. 一、ESP8266入门(基于LUA开发)

    序 一入坑便停不下来...  还挺有意思的哈,233,,,,  资料杂,自己一个一个去找确实浪费了不少时间,而且大多还都是英文的,需要硬着头皮看.  这次实践入门,更是对英语的重要确信无疑.Githu ...

  4. 乐鑫esp8266模块MicroPython开发板MQTT物联网人工智能最小系统

    简 介: ※对于购买自网络的基于ESP8266的实验模块进行了初步的测试,它其中的一些示例进行了练习.特别是对于基于ESP8266的特殊的一些外设的测试. 关键词: ESP8266,MicroPyth ...

  5. 基于USR-WiFi模块的 ESP32,ESP8266 Thonny调试器

    简 介: 本文给出了基于WiFi模块 USR-WiFi232 设置无线调试ESP32,ESP8266 MicroPython开发的环境. 关键词: ESP32,ESP8266,Thonny,Micro ...

  6. 利用ESP8266测量模块来设计远距离反射式光电检测 : ITR8307

    简 介: 为了能够使得下一届的智能车竞赛中的节能信标组摆脱磁铁的干扰,可以进行对抗比赛.在现有的节能信标灯的基础上,增加光电反射检测单元.该电路采用了反射式光电检测管,利用单片机的定时ADC转换,可以 ...

  7. ESP32,ESP8266之间WiFi互联实验

    ▌ESP32,ESP8266模块互联 ESP32,ESP8266 模块具有很丰富的功能,便于设计一些现场需要联网的场合.基于此在AI视觉组基于ESP32的裁判系统第一版本设计要求 就使用了ESP32进 ...

  8. ESP8266 D1-UNO-R3开发板的初步测试

    简 介: 测试购买到的基于ESP8266的开发板,但是始终没有能够成功下载程序.问题尚待后期进行测试. 关键词: ESP8266,Arduino #mermaid-svg-6x74Q9rymsvfSg ...

  9. 安装 Arduino IDE 中STM32 软件包,ESP8266软件包

    简 介: 搜集了更多的基于Arduino生态环境的安装和使用方法. 关键词: Arduino,STM32,ESP8266 §01 安装STM32在Arduino IDE软件包 1.参考文献1 参照推文 ...

  10. ESP8266访问网站-urequest get方法

    §01 利用ESP8266访问网站 在制作基于ESP8266的联网的智能门控系统,ESP8266负载将局部的基于人脸识别的门控系统的信息与管理网站之间进行信息的交互.利用了 http 中的 get 方 ...

最新文章

  1. tableau2020.2版本可视化数据分析 新功能介绍
  2. java-final关键字
  3. c语言深度剖析第三版pdf_入门到入坟,蕴含全网最强知识点3283页笔记、pdf教程,活到老,学到老...
  4. eclipse maven打包_Maven 学习
  5. 带有审图号的区位图制作
  6. 黑客攻防技术宝典Web实战篇第2版—第1章Web应用程序安全与风险
  7. keil复制代码乱码_成都控制器开发:容易忽略!用KEIL编码汉字也会有BUG
  8. ajax head带参数两次请求
  9. a算法和a*算法的区别_机器人路径规划算法,全局路径规划与局部路径规划究竟有哪些区别?...
  10. Windows10更新提示语言不同不能保留程序和设置
  11. 力扣题目系列:605. 种花问题
  12. 倒计时1周!聚焦金融科技,Gdevops北京站即将启程
  13. C++ | Qt编译DLL
  14. gitlab设置项目组成员权限
  15. 卧槽!逆天了,Python竟然能打造一款扫描全能王,实现图片纠正!
  16. 图学习(二)K-armed Bandit based Multi-modal Network Architecture Search for Visual Question Answering
  17. 医院私有云存储的规划、配置、调优工程实例
  18. 知识图谱推理:现代的方法与应用
  19. 不填写内容用哪个斜杠代替_反斜杠
  20. oracle 执行计划(F5)详解

热门文章

  1. Charles使用指南Windows
  2. c++,出现 “no default constructor exists for class”的问题
  3. 创建(导入)PCB封装库
  4. Python的准备工作——安装、配置、第一个项目、汉化(可不做)
  5. 控制台窗口(console)
  6. [Go] gorm执行原生sql语句
  7. Mac OS 使用Metal渲染NV12、YUV420、CMSampleBufferRef视频
  8. Hive-SQL与SQL的区别
  9. 做游戏开发必须会的抓包方法
  10. 大型商城系统源码 PC+小程序+APP源码+H5 全套源代码