使用ESP8266實作STM32連網(USART實作)(巴法云物聯網)
- 1、使用硬體
- 程式思路(基于正點原子的測驗程式)
- 在巴法云物聯網創建的主題
- ESP8266初始化代碼(比較簡陋)
- 主函式代碼
- 如果想用串口助手除錯,接線方法如下:
1、使用硬體
我這里使用的是正點原子家的STM32開發板(精英版)和ESP8266模塊,剛開始準備做一個LORA網關的,但是后面因為比賽的原因就沒有搞了,就搞了LORA的通信和WIFI上云(巴法云物聯網)的代碼:
-
正點原子家的STM32開發板(精英版)

-
ESP8266模塊
-

程式思路(基于正點原子的測驗程式)
第一步:stm32單片機配置兩個串口,(USART1和USART3), USART1主要用來單片機向電腦的串口發送資料,方便我們除錯,USART3主要用來連接WIFi模塊,和它通信,
第二步:通過USART3串口配置ESP8266模塊,
第三步:接收云平臺的資訊和發送心跳包
單片機訂閱云平臺的主題:
cmd=1&uid=005dd80adf61d7df35bb4e2cbbf1bf9f&topic=chishi
單片機把訊息推送到云平臺:
cmd=2&uid=005dd80adf61d7df35bb4e2cbbf1bf9f&topic=chishi&msg=RELAY1_OPEN
單片機的心跳包(60s之內必須發一次,否則單片機會掉線):
cmd=0&msg=ping
在巴法云物聯網創建的主題

ESP8266初始化代碼(比較簡陋)
#include "esp8266.h"
#include "common.h"
#include "stdlib.h"
#include "led.h"
u8 atk_8266_apsta_test(void)
{
atk_8266_send_cmd("AT","OK",50);
atk_8266_send_cmd("AT+CWMODE=3","OK",50);
atk_8266_send_cmd("AT+CWJAP=\"zhouyong\",\"23456789\"","WIFI GOT IP",1000);
delay_ms(1000);//這里的延時是等待模塊重啟,具體延時多久是看模塊的重啟時間
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
atk_8266_send_cmd("AT+CIPMODE=1","OK",200);
atk_8266_send_cmd("AT+CIPSTART=\"TCP\",\"bemfa.com\",8340","OK",200);
atk_8266_send_cmd("AT+CIPSEND","OK",200);
atk_8266_send_cmd("cmd=1&uid=005dd80adf61d7df35bb4e2cbbf1bf9f&topic=chishi","cmd=1&res=1",200);
atk_8266_send_cmd("cmd=0&msg=ping","cmd=0&res=1",200);
//atk_8266_send_cmd函式的第一個引數是要發送的訊息
//第二個引數是回傳的訊息
//第三個引數是等待的時間
}
atk_8266_send_cmd函式的代碼
//向ATK-ESP8266發送命令
//cmd:發送的命令字串
//ack:期待的應答結果,如果為空,則表示不需要等待應答
//waittime:等待時間(單位:10ms)
//回傳值:0,發送成功(得到了期待的應答結果)
// 1,發送失敗
u8 atk_8266_send_cmd(u8 *cmd,u8 *ack,u16 time)
{
u8 res=0;
USART3_RX_STA=0;
u3_printf("%s\r\n",cmd); //發送命令
if(ack&&time) //需要等待應答
{
while(--time) //等待倒計時
{
delay_ms(10);
if(USART3_RX_STA&0X8000)//接收到期待的應答結果
{
if(atk_8266_check_cmd(ack))
{
printf("ack:%s\r\n",(u8*)ack);
break;//得到有效資料
}
USART3_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
主函式代碼
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "esp8266.h"
#include "key.h"
#include "string.h"
#include "usart3.h"
#include "common.h"
int main(void)
{
u16 rlen=0;//保存接收到的資料長度
char data_tiqu[100];//將接收到的資料保存到該陣列
char data[10];//最終提取的資料
int k=0,s=0;//保存cmd2開頭的資料的下標
int i=0,j=0;
char cmd[]="msg";
int flag=1;//收到正確資料標志位,默認為1,
u8 timex=0;//每200發送1次心跳包的標志位
delay_init(); //延時函式初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設定中斷優先級分組為組2:2位搶占優先級,2位回應優先級
uart_init(115200); //串口初始化為115200
usart3_init(115200);
LED_Init();
relay_Init();//繼電器埠初始化
KEY_Init();
atk_8266_apsta_test();//esp8266初始化
atk_8266_send_cmd("cmd=0&msg=ping","cmd=0&res=1",200);
while(1)
{
timex++;
//atk_8266_send_cmd("cmd=0&msg=ping",NULL,200);//心跳包
//u3_printf("%s\r\n","cmd=2&uid=005dd80adf61d7df35bb4e2cbbf1bf9f&topic=chishi&msg=RELAY1_OPEN");//推送訊息到云平臺
//atk_8266_at_response(1);
if(USART3_RX_STA&0X8000) //接收到一次資料了
{
//USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;
rlen=USART3_RX_STA&0X7FFF; //得到本次接收到的資料長度
USART3_RX_BUF[rlen]=0; //添加結束符
printf("%s",USART3_RX_BUF); //發送到串口
資料提取
if(strncmp(USART3_RX_BUF,"cmd=2",5)==0)
{
for(i=0;i<strlen(USART3_RX_BUF)+1;i++)
{
data_tiqu[s]=USART3_RX_BUF[i];
s++;
}
printf("%s",data_tiqu);
for(i=0;i<strlen(data_tiqu);i++)
{
if(data_tiqu[i]==cmd[0])
{
k=i;
k++;
for(j=1;j<strlen(cmd);j++)
{
if(data_tiqu[k]==cmd[j])
{
k++;
flag=1;
}
else
{
flag=0;
}
}
}
}
s=0;
資料提取結束
if(flag==1)
{
for(i=k+1;i<strlen(data_tiqu)+1;i++)
{
data[s]=data_tiqu[i];
s++;
}
printf("%s",data);
if(data[0]=='R'&&data[1]=='1')
{
GPIO_ResetBits(GPIOE,GPIO_Pin_1);//開繼電器1
}
if(data[0]=='R'&&data[1]=='0')
{
GPIO_SetBits(GPIOE,GPIO_Pin_1);//關繼電器1
}
if(data[2]=='R'&&data[3]=='1')
{
GPIO_ResetBits(GPIOE,GPIO_Pin_2);//開繼電器2
}
if(data[2]=='R'&&data[3]=='0')
{
GPIO_SetBits(GPIOE,GPIO_Pin_2);//關繼電器2
}
if(data[4]=='R'&&data[5]=='1')
{
GPIO_ResetBits(GPIOE,GPIO_Pin_3);//開繼電器3
}
if(data[4]=='R'&&data[5]=='0')
{
GPIO_SetBits(GPIOE,GPIO_Pin_3);//關繼電器1
}
if(data[6]=='R'&&data[7]=='1')
{
GPIO_ResetBits(GPIOE,GPIO_Pin_4);//開繼電器4
}
if(data[6]=='R'&&data[7]=='0')
{
GPIO_SetBits(GPIOE,GPIO_Pin_4);//關繼電器4
}
}
}
if(strncmp(USART3_RX_BUF,"cmd=0&res=1",11)==0)
{
printf("%s",USART3_RX_BUF);
}
USART3_RX_STA=0;
}
if((timex%200)==0)
{
u3_printf("cmd=0&msg=ping");//心跳包
timex=0;
}
}
}
如果想用串口助手除錯,接線方法如下:
| 串口助手 | esp8266 |
|---|---|
| GND | GND |
| VCC | VCC |
| RX | TX |
| TX | RX |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297913.html
標籤:其他
上一篇:wifi修復記錄(8個方法)
下一篇:LoRa模塊獲取光照值
