本章實(shí)驗(yàn)的目的是將手機(jī)連接上ESP8266提供的WIFI網(wǎng)絡(luò),打開自定義的app連接ESP8266的ip地址及端口號(hào),實(shí)現(xiàn)app與ESP8266模塊的通信,進(jìn)而達(dá)到app控制32開發(fā)板的目的,并將開發(fā)板上面的數(shù)據(jù)返回到app上顯示出來。
??關(guān)于stm32與esp8266之間的通信,在前面的文章中已經(jīng)介紹得差不多了,本文章主要介紹的是app inventor的制作,然后生成app二維碼,最后在手機(jī)端下載app,進(jìn)而實(shí)現(xiàn)通過WIFI局域網(wǎng)控制stm32開發(fā)板,當(dāng)然關(guān)于stm32與esp8266之間的一些東西也會(huì)粗略講一下。
本章所用到的器件如下:
STM32F103ZET6最小系統(tǒng)板
ESP8266-01S模塊
USB轉(zhuǎn)microUSB數(shù)據(jù)線
四根杜邦線
連接如下:
32板3.3v----------->ESP8266的3.3v
32板GND---------->ESP8266的GND
32板的PA2-------->ESP8266的RX
32板的PA3-------->ESP8266的TX
stm32與esp8266通信
??先附上32程序的主代碼:
#include "stdio.h"
#include "delay.h"
#include "led.h"
#include "usart.h"
#include "serial.h"
#include "esp8266.h"
/* AT指令返回值的結(jié)尾沒有\(zhòng)r\n這樣的回車換行符,
* 而在串口調(diào)試助手中,需要MCU輸出\r\n給串口調(diào)試助手才能刷新緩沖區(qū)把字符顯示出來,
* 同時(shí)這個(gè)\r\n還起到回車換行的目的*/
/* AT指令的結(jié)尾處必須是\r\n*/
/* serial.h中的usart1_send_usart2函數(shù)用于沒有USB轉(zhuǎn)TLL模塊的人使用,
* 此函數(shù)作用是利用串口1發(fā)送AT指令給串口2,串口2將AT指令發(fā)送給ESP8266,實(shí)現(xiàn)對(duì)ESP8266的AT指令配置,
* 當(dāng)然,如果你有USB轉(zhuǎn)TTL模塊的話,可以直接將ESP8266與USB轉(zhuǎn)TTL模塊直連,然后在串口調(diào)試助手里面直接配置AT指令*/
extern u8 esp_sipsend1[];
extern u8 esp_sipsend2[];
int main(void)
{
delay_init(); //延時(shí)函數(shù)初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
uart_init(115200); //串口1初始化為115200
Uart2_Init(115200); //串口2初始化為115200
LED_Init(); //初始化與LED連接的硬件接口
Esp8266_Init();
while(1)
{
usart1_send_usart2(); //利用串口1發(fā)送AT指令給串口2,從而達(dá)到配置ESP8266的目的,并且讓模塊的返回值在串口1打印出來
if(Data_Compare((u8 *)"LEDK")) //點(diǎn)亮板上的led
{
led(1);
Clear_Buf();
Uart_SendStr(USART1, (u8 *)"led is open\r\n");
Uart_SendStr(USART2, esp_sipsend1); //利用串口2給esp8266發(fā)送AT+CIPSEND指令,告訴它下一次將發(fā)送具體數(shù)據(jù)
Usart2_Receive_Data(USART1); //將串口2接收到的AT+CIPSEND指令返回的數(shù)據(jù)顯示在串口1上
Uart_SendStr(USART2, (u8 *)"led is open\r\n"); //發(fā)送具體數(shù)據(jù)給esp8266,讓他轉(zhuǎn)發(fā)到app上
}
else if(Data_Compare((u8 *)"LEDG")) //關(guān)閉板上的led
{
led(0);
Clear_Buf();
Uart_SendStr(USART1, (u8 *)"led is close\r\n");
Uart_SendStr(USART2, esp_sipsend2); //利用串口2給esp8266發(fā)送AT+CIPSEND指令,告訴它下一次將發(fā)送具體數(shù)據(jù)
Usart2_Receive_Data(USART1); //將串口2接收到的AT+CIPSEND指令返回的數(shù)據(jù)顯示在串口1上
Uart_SendStr(USART2, (u8 *)"led is close\r\n"); //發(fā)送具體數(shù)據(jù)給esp8266,讓他轉(zhuǎn)發(fā)到app上
}
}
}
??此代碼中的serial.h包含幾個(gè)自定義函數(shù),其函數(shù)的作用見其右邊的注釋,代碼如下所示:
#ifndef __SERIAL_H
#define __SERIAL_H
#include "stdio.h"
#include "sys.h"
#include "delay.h"
#include "string.h"
#include "usart.h"
#define tbuf 100
void Uart2_Init(u32 bound); //初始化串口2
void Clear_Buf(void); //清除緩沖區(qū)數(shù)據(jù)
void Uart_SendStr(USART_TypeDef* USARTx, u8 *s); //往某一個(gè)串口發(fā)送指定字符串
void Usart2_Receive_Data(USART_TypeDef* USARTx); //將串口2返回的數(shù)據(jù)發(fā)送給串口1進(jìn)行顯示
u8 Data_Compare(u8 *p); //指定字符串與緩存數(shù)組數(shù)據(jù)進(jìn)行數(shù)據(jù)比較
void usart1_send_usart2(void); //利用串口1發(fā)送AT指令給串口2,從而達(dá)到配置ESP8266的目的,并且讓模塊的返回值在串口1打印出來
#endif
??其中Usart2_Receive_Data函數(shù)是用于接收esp8266返回的數(shù)據(jù)并在串口1進(jìn)行顯示,因?yàn)榇?是與esp8266進(jìn)行連接的,只要串口2正確發(fā)送AT指令給esp8266,esp8266都會(huì)返回響應(yīng)值,由于手頭上沒有USB轉(zhuǎn)TTL模塊,只能用這種方法來觀察esp8266模塊的返回值。
??而usart1_send_usart2函數(shù)的作用是利用串口調(diào)試助手發(fā)送AT指令給串口1,串口1接收到數(shù)據(jù)之后,將數(shù)據(jù)通過串口2發(fā)送給esp8266模塊,達(dá)到通過串口調(diào)試助手發(fā)送AT指令配置esp8266模塊的目的,之所以用這種方式,其原因是手頭上沒有USB轉(zhuǎn)TTL模塊,才出此下策。
??假如手頭上有USB轉(zhuǎn)TTL模塊,上面的兩個(gè)函數(shù)大可不必要,直接將USB轉(zhuǎn)TTL直連上esp8266模塊,然后USB端插在電腦上,利用串口調(diào)試助手即可直接發(fā)送AT指令去配置esp8266模塊以及顯示模塊的返回值。
??主函數(shù)中的Esp8266_Init函數(shù)是對(duì)esp8266進(jìn)行一系列的配置,使得能夠被app客戶端所連接上,其詳細(xì)代碼如下所示:
#include "esp8266.h"
u8 esp_at[] = "AT\r\n"; //握手連接指令,返回"OK"
u8 esp_cifsr[] = "AT+CIFSR\r\n"; //本機(jī)IP地址查詢指令
u8 esp_cipsend[] = "AT+CIPSEND=6\r\n"; //設(shè)置發(fā)送數(shù)據(jù)長(zhǎng)度
u8 esp_test[] = "sunny\r\n"; //數(shù)據(jù)內(nèi)容
u8 esp_rst[] = "AT+RST\r\n"; //軟件復(fù)位
u8 esp_cwmode[] = "AT+CWMODE=2\r\n"; //設(shè)置ESP8266的工作模式2(AP模式,WIFI模塊作為熱點(diǎn)),返回"OK"或者"no change"
u8 esp_cwsap[] = "AT+CWSAP=\"ESP8266_TEST\",\"1234567890\",1,4\r\n";//設(shè)置WIFI的名稱、密碼、通道號(hào)、加密方式(4-WPA_WPA2_PSK)
u8 esp_cipmux[] = "AT+CIPMUX=1\r\n"; //打開多連接
u8 esp_cipserver[] = "AT+CIPSERVER=1,8080\r\n"; //建立TCP服務(wù)器,開放端口8080,端口號(hào)可以改成其他的例如8086等等
u8 esp_cipsto[] = "AT+CIPSTO=2880\r\n"; //設(shè)置服務(wù)器超時(shí)時(shí)間為2880s,也就是連接服務(wù)器過程中可以等待的時(shí)間
extern u8 RX_num; //接收計(jì)數(shù)變量
extern u8 RX_buffer[tbuf];
void Esp8266_Init(void)
{
Uart_SendStr(USART2, esp_cwmode); //設(shè)置ESP8266的工作模式2 AP,返回"OK"或者"no change"
Usart2_Receive_Data(USART1); //將串口2收到的數(shù)據(jù)發(fā)送給串口1進(jìn)行顯示
Uart_SendStr(USART1, (u8 *)"\r\nOK,set mode as AP with ESP8266!\r\n----------\r\n");
Uart_SendStr(USART2, esp_rst); //設(shè)置ESP8266的工作模式后需要復(fù)位以生效該模式
Usart2_Receive_Data(USART1); //復(fù)位后可能會(huì)返回一堆亂碼
Uart_SendStr(USART1, (u8 *)"\r\nOK,set RST success!\r\n----------\r\n");
Uart_SendStr(USART2, esp_cwsap); //設(shè)置WIFI的名稱及密碼
Usart2_Receive_Data(USART1); //將串口2收到的數(shù)據(jù)發(fā)送給串口1進(jìn)行顯示
Uart_SendStr(USART1, (u8 *)"\r\nOK,set cwsap success!\r\n----------\r\n");
Uart_SendStr(USART2, esp_cipmux); //設(shè)置多連接(多路連接模式)
Usart2_Receive_Data(USART1); //將串口2收到的數(shù)據(jù)發(fā)送給串口1進(jìn)行顯示
Uart_SendStr(USART1, (u8 *)"\r\nOK,set cipmux success!\r\n----------\r\n");
Uart_SendStr(USART2, esp_cipserver); //設(shè)置wifi模塊為TCP服務(wù)器模式,并配置端口為8080
Usart2_Receive_Data(USART1); //將串口2收到的數(shù)據(jù)發(fā)送給串口1進(jìn)行顯示
Uart_SendStr(USART1, (u8 *)"\r\nOK,set server success!\r\n----------\r\n");
Uart_SendStr(USART2, esp_cipsto); //設(shè)置服務(wù)器超時(shí)時(shí)間為2880s
Usart2_Receive_Data(USART1); //將串口2收到的數(shù)據(jù)發(fā)送給串口1進(jìn)行顯示
Uart_SendStr(USART1, (u8 *)"\r\nOK,set cipsto success!\r\n----------\r\n");
Uart_SendStr(USART2, esp_cifsr); //獲取本機(jī)IP地址
Usart2_Receive_Data(USART1); //將串口2收到的數(shù)據(jù)發(fā)送給串口1進(jìn)行顯示
Uart_SendStr(USART1, (u8 *)"\r\nOK,get ip address success!\r\n----------\r\n");
}
??至于其中的AT指令,網(wǎng)上隨便找一下都有一大堆關(guān)于AT指令的詳細(xì)解釋,這里就不再過多解釋,而其他的函數(shù),也沒有什么好講的,至此,stm32代碼部分就到這里了。文章來源:http://www.zghlxwxcb.cn/news/detail-410778.html
移動(dòng)端app制作、生成、控制
??接著進(jìn)行app的設(shè)計(jì),本章app的設(shè)計(jì)采用的是app inventor。
??APP INVENTOR由谷歌實(shí)驗(yàn)室開發(fā),后移交麻省理工學(xué)院,是一款可視化編程環(huán)境,采用搭積木的方式快速建立應(yīng)用程序,并且可以結(jié)合AI伴侶,極其便利的在手機(jī)上進(jìn)行測(cè)試和應(yīng)用。
??APP INVENTOR是完全基于網(wǎng)頁的在線編程工具,國(guó)內(nèi)外都有一些可用的服務(wù)器。
麻省理工學(xué)院的服務(wù)器登錄地址:http://appinventor.mit.edu/explore/
廣州服務(wù)器登錄地址:http://app.gzjkw.net/login
推薦使用國(guó)內(nèi)的廣州服務(wù)器。
??可以用QQ登錄,登錄后創(chuàng)建項(xiàng)目就可以進(jìn)入編程界面。
??中間顯示的就是手機(jī)屏幕,通過拖拽工具到手機(jī)屏幕,就可以開始編程了,目前只支持Android手機(jī)。
??為了便于編程調(diào)試可以在手機(jī)上安裝AI伴侶,下載地址可以通過點(diǎn)擊菜單欄 幫助->AI伴侶信息 打開下載幫助頁。
??通過手機(jī)掃描圖中二維碼即可下載AI伴侶,在程序調(diào)試時(shí),在服務(wù)器端選擇菜單欄 連接->AI伴侶 彈出連接二維碼和6位編碼,在對(duì)應(yīng)的手機(jī)AI伴侶中輸入6位編碼,或掃描二維碼,就可以與服務(wù)器建立連接,開始調(diào)試程序了,同時(shí)只要你的網(wǎng)頁端app界面改變,相應(yīng)的在手機(jī)端AI伴侶上的界面也會(huì)相應(yīng)實(shí)時(shí)更新。
??而在此WIFI通信app的設(shè)計(jì)過程中,需要用到tcp連接插件,也就是一個(gè)擴(kuò)展插件,需要導(dǎo)入到app inventor中才能使用tcp連接到esp8266模塊上提供的wifi,此插件的鏈接如下:app inventor擴(kuò)展插件
??上圖中所創(chuàng)建的app界面都是用左邊那些基本的控件以及擴(kuò)展插件,其邏輯設(shè)計(jì)圖如下所示:
??此邏輯設(shè)計(jì)也非常簡(jiǎn)單,只是利用左邊的一些功能塊進(jìn)行拼湊而來的,關(guān)于更多詳細(xì)的app inventor語法,網(wǎng)上搜索也是一大堆,這里就不再過多介紹。至此,app的設(shè)計(jì)基本完成,之后就要進(jìn)行app的生成了,點(diǎn)擊菜單欄的打包apk->打包apk并顯示二維碼,此時(shí)會(huì)生成此app的一個(gè)二維碼,通過打開手機(jī)上的AI伴侶app,然后利用AI伴侶上面的掃描二維碼去掃描生成的app二維碼,掃描后會(huì)自動(dòng)跳到默認(rèn)游覽器去安裝此app,安裝并打開此app,通過在新app上面輸入ESP8266的ip地址及端口號(hào)(ip地址可通過執(zhí)行esp8266初始化函數(shù)時(shí)在串口調(diào)試助手上面打印出來,而端口號(hào)則是前面AT+CIPSERVER=1,8080中的8080端口號(hào)),然后進(jìn)行連接,連接成功后,在發(fā)送區(qū)域輸入:LEDK后點(diǎn)擊send!,此時(shí)會(huì)將字符串“LEDK”發(fā)送到ESP8266模塊上,模塊收到信息后通過串口2返回給MCU,MCU接到數(shù)據(jù)后與程序中設(shè)定的字符串進(jìn)行比較,如果一致則執(zhí)行相應(yīng)的操作指令,并將MCU上的數(shù)據(jù)返回到app上面顯示出來。
附上app inventor制作的app項(xiàng)目鏈接:app_inventor項(xiàng)目
附上整個(gè)stm32項(xiàng)目通信代碼鏈接:stm32+app inventor+esp8266通信代碼
代碼要的下方留言郵箱我會(huì)第一時(shí)間發(fā)給你們的,有什么問題也可以下面評(píng)論!文章來源地址http://www.zghlxwxcb.cn/news/detail-410778.html
到了這里,關(guān)于利用stm32+app inventor與esp8266通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!