ESP8266-01 + stm32单片机 + app开发实现无限距离控制

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

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

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

    esp8266-01 u转串模块
    VCC-----------3.3
    GND----------GND
    GPIO0--------GND
    CH_PD--------3.3
    RX-------------TX
    TX-------------Rx
    ESP8266-01 + stm32单片机 + app开发实现无限距离控制_第1张图片

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

首先点击网站获取自己的IP和端口号 http://tcp.doit.am/
打开后你会看到这样的页面,页面里的IP地址和端口号需要记下来,一会在esp8266的编程中需要用到。
ESP8266-01 + stm32单片机 + app开发实现无限距离控制_第2张图片

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

开始用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接入平台后,会有掉线的情况,并且他自己发现不了,所以加进了一分钟连接一次,这样亲测稳定可靠。

  1. 以上是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了。

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

ESP8266-01 + stm32单片机 + app开发实现无限距离控制_第3张图片
这个呢,是部分代码区。
ESP8266-01 + stm32单片机 + app开发实现无限距离控制_第4张图片
到这里,教程就差不多结束了。由于本人是第一次写帖子,写的不好的大家请提意见。能写完这个帖子,也是参考了很多大神的帖子才搞出来的。这这里向他们表示致谢。

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

你可能感兴趣的:(ESP8266-01 + stm32单片机 + app开发实现无限距离控制)