ESP8266

您所在的位置:网站首页 stm32无线传输 ESP8266

ESP8266

2023-07-30 00:29| 来源: 网络整理| 查看: 265

今天来给大家出一篇 esp8266的无线传输。一开始接触是从淘宝买的跨阵物联 -M1模块,由于次模块管脚较少,不利于开发,所以本人打算利用模块上的esp8266-01,配合这STM32F103ZET6,二者串口通信来拓展管脚。贴出淘宝链接

第一步 搭建esp8266-01开发环境,一开始,以为这个小玩意和蓝牙模块一样,只是一个数据传输的作用,直到自己查阅资料,发现这就是一个功能强大的单片机。 下面摘要两个大神的帖子。大家可以参照下面两个帖子,来搭建好esp8266的开发环境。 http://www.arduino.cn/thread-17895-1-1.html http://www.arduino.cn/thread-17896-1-1.html

第二步就是esp8266-01的硬件接线

esp8266-01 u转串模块 VCC-----------3.3 GND----------GND GPIO0--------GND CH_PD--------3.3 RX-------------TX TX-------------Rx 参照此图片

第三步就是物联平台了,可以给大家推荐几个免费的物联网平台:贝壳物联、酱菜创客等等。之前用过酱菜创客的平台,这个平台虽然免费,但是本人觉得这个平台传输太慢了,点个灯要好几秒。所以果断放弃了这个。之后又接入过阿里云的平台,但是要付钱的,所以也gg了。 最后找到了一个稳定而且免费的物联平台: http://www.doit.am/ 言归正传,我们为什么要找物联平台。 我们的目的是要实现无论在何时何地都可以实现控制。思路是这样的: 要用手机app控制一盏灯,就是要把手机发出数据让单片机接收到,在这中间,需要一个数据转发的过程,所以,我们需要云平台来给我们转发数据。 首先,手机接入云平台,然后发送信息。 其次,云平台收到后,转发给其他接入平台的设备。 最后,esp8266接入云平台,收到转发的数据,通过串口发给单片机,从而实现了控制。 具体接入平台的步骤:

首先点击网站获取自己的IP和端口号 http://tcp.doit.am/ 打开后你会看到这样的页面,页面里的IP地址和端口号需要记下来,一会在esp8266的编程中需要用到。 在这里插入图片描述

准备工作做好后,开始实战。

开始用arduino软件平台进行编写。下面贴出部分代码:

#include const char *ssid = "。。。。。 ";//这里是我的wifi,你使用时修改为你要连接的wifi ssid const char *password = "。。。。。";//你要连接的wifi密码 const char* serverIP = "。。。。";//你再网站上得到的IP int serverPort = 。。。。;//你在网站上得到的端口号 WiFiClient client; char buff[512]; // 最大存512个字符变量 int nm = 0; //记录当前接收的标志位 int nm1 = 0; // 定时连接的标志位 void connect1() //接入 { if (!client.connect(serverIP, serverPort))//如果连接失败 { Serial.println("connection failed"); //esp8266 发送 delay(5000); return; } bConnected = true; Serial.println("connection ok"); } void setup() { delay(100); Serial.begin(115200); //设置波特率 Serial.println("Startup"); WiFi.mode(WIFI_STA);//设置模式为STA //设置模式 STA WiFi.begin(ssid, password); //连接wifi while (WiFi.status() != WL_CONNECTED) {//等待WiFi连接成功 delay(500); Serial.print("."); Serial.println(""); Serial.println("WiFi connected"); //wifi 连接成功 Serial.println("IP address: "); Serial.println(WiFi.localIP()); connect1(); // 开始接入云平台 } void loop() { if (client.available())//如果有数据到达 客户端接收的数据 { //Serial.println("Data is coming"); while (client.available())//接收数据 最大接收数据 512个 { buff[nm++] = client.read(); //读取客户端接受的数据 if (nm >= 511) break; //最大512 } nm=0; switch( buff[0]) { // 添加你自己的处理函数 } client.flush();//丢弃已写入客户端但尚未读取的字节 } if(Serial.available()&&bConnected){ // esp8266 串口接收 size_t len = Serial.available(); uint8_t sbuf[len]; Serial.readBytes(sbuf, len); // 读取8266串口接收到的数据要发送的 //将UART端口数据推送到服务器,实现双向通信 client.write(sbuf, len); // 将8266串口接收到的数据通过客户端向服务器发送 } nm1++; if(nm1==6000) //一分钟重新连接一次云平台 { connect1(); nm1=0; //参数清0 } delay(10); }

以上就是写给8266的函数了,把以上函数烧写进8266就可实现手机与平台之间的互相通信。对于以上代码,简单的就不再多说了,在这里解释一下为什么要一分钟连接一次服务器,通过本人亲测,在8266接入平台后,会有掉线的情况,并且他自己发现不了,所以加进了一分钟连接一次,这样亲测稳定可靠。

以上是esp8266的部分。 现在开始写stm32的接收控制部分。下面贴出代码: 由于本人的开发板 串口1的接收部分有点问题,所以用的串口3 #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "usart.h" #include "dht11.h" void uart_putbuff (USART_TypeDef* USARTx, u8 *buff, u32 len) //发送封装函数 { while(len--) { USART_SendData(USARTx, *buff); buff++; while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);//等待发送结束 USART_ClearFlag(USARTx, USART_FLAG_TC); } } int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中电断分组2:2位抢占优先级,2位响应优先级 uart_ini3(115200); //设置波特率 USART_ClearFlag(USART3, USART_FLAG_TC); //先清除,以免一上发送异常 DHT11_GPIO_Config(); // 温湿度数据传回手机app LED_Init(); //LED端口初始化 while(1); /、、、、 串口3配置函数 、、、、、/ void uart_ini3(u32 bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 USART_InitStructure.USART_BaudRate = bound;//串口波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(USART3, &USART_InitStructure); //初始化串口3 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断 USART_Cmd(USART3, ENABLE); //使能串口3 } /、、、、 串口3中断服务函数 、、、、、/ void USART3_IRQHandler(void) { u8 Res; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) { Res =USART_ReceiveData(USART3); //读取接收到的数据 switch(Res) { 添加你的代码 } }

到这里,stm32的处理部分也就差不多了,大家只要在对应的填写框里写上自己要处理的代码,就可实现想实现的功能。对于8266和单片机的接线部分,大家就把TXD和RXD反接到单片机就OK了。

下面,给大家写出手机app的教程。 因为毕竟不是计算机专业的,所以没有去研究JAVA等语言,在这里,使用的是易安卓软件这个软件开发的,这个软件的语言很简单,对于新手很容易上手。 这个就是我自己做的一个小界面了。可以实现多个手机同时使用此软件,并且保证了数据同时更新。

在这里插入图片描述 这个呢,是部分代码区。 在这里插入图片描述 到这里,教程就差不多结束了。由于本人是第一次写帖子,写的不好的大家请提意见。能写完这个帖子,也是参考了很多大神的帖子才搞出来的。这这里向他们表示致谢。

最后看完此教程如果有什么问题的,请在下方留言。稍后我会把开发软件和全部资料的链接贴出来。 谢谢观看!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3