STM32F4+esp8266 WiFi模塊采集溫濕度數(shù)據(jù)對接PC端

項(xiàng)目需要在stm32上開發(fā)MQTT址否,同時(shí)MQTT協(xié)議基于TCP/IP協(xié)議,因此先在探索者開發(fā)板上調(diào)通基于TCP的WiFi通信,同時(shí)采集溫濕度數(shù)據(jù)霎肯,上傳至PC端的網(wǎng)絡(luò)調(diào)試助手服務(wù)端趾痘,為后面開發(fā)MQTT做準(zhǔn)備慢哈。

1、準(zhǔn)備工作

1.1.STM32F4開發(fā)板

image

1.2.DHT11溫濕度傳感器

DHT11是一款有已校準(zhǔn)數(shù)字信號輸出的溫濕度傳感器永票。 其精度濕度±5%RH卵贱, 溫度±2℃,量程濕度20-90%RH侣集, 溫度0~50℃键俱。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC測溫元件,并與一個(gè)高性能8位單片機(jī)相連接世分。每個(gè)DHT11傳感器都在極為精確的濕度校驗(yàn)室中進(jìn)行校準(zhǔn)编振。校準(zhǔn)系數(shù)以程序的形式存在OTP內(nèi)存中,傳感器內(nèi)部在檢測信號的處理過程中要調(diào)用這些校準(zhǔn)系數(shù)臭埋。單線制串行接口踪央,使系統(tǒng)集成變得簡易快捷。

image

1.3.esp8266 WiFi模塊

esp8266模塊采用串口與MCU進(jìn)行通信瓢阴,內(nèi)置TCP/IP協(xié)議棧畅蹂,能夠?qū)崿F(xiàn)串口與WiFi之間的轉(zhuǎn)換,模塊支持串口轉(zhuǎn)WiFi STA炫掐、串口轉(zhuǎn)AP和WiFi STA+WiFiAP的模式魁莉,從而快速構(gòu)建串口-WiFi數(shù)據(jù)傳輸方案。

image

2. esp8266模塊使用

2.1 esp8266模塊使用介紹

esp8266模塊使用方便募胃,開發(fā)過程中可使用AT指令對模塊進(jìn)行操作旗唁,及可使用stm32的串口發(fā)送相關(guān)AT指令控制模塊。模塊作為TCP連接客戶端時(shí)使用的AT指令如下所示:

AT:測試模塊是否工作正常

AT+RST:復(fù)位模塊狀態(tài)

設(shè)置客戶端模式

AT+CWMODE=1:客服端 Station

AT+CWMODE=2:用戶端 AP

AT+CWMODE=3:雙端Station+AP

AT+CWJAP="wifi名","密碼":連接指定WiFi

TCP連接:AT+CIPSTART="TCP","目標(biāo)IP",目標(biāo)端口號 如:AT+CIPSTART="TCP","192.168.1.1",8080

開啟傳透模式:AT+CIPMODE=1 關(guān)閉穿透模式:AT+CIPMODE=0

開啟透傳后痹束,使用AT+CIPSEND開啟數(shù)據(jù)發(fā)送

TCP發(fā)送數(shù)據(jù)到服務(wù)器全流程如下:

1.  AT 檢測模塊是否工作正常
2.  AT+CIPMODE=0 關(guān)閉透傳
3.  AT+CWMODE=1 客服端STA模式
4.  AT+CWJAP="wifi","password"
5.  AT+CIPSTART="TCP","目標(biāo)ip地址",目標(biāo)端口
6.  AT+CIPMODE=0 開啟透傳
發(fā)送數(shù)據(jù)有兩種方法
一  1.   AT+CIPSEND (開啟傳輸數(shù)據(jù))
    2.  >  (這個(gè)符號代表等待輸入,回車發(fā)送,在程序里用\r\n轉(zhuǎn)義發(fā)送)
    3.  +++  (發(fā)送+++代表退出發(fā)送,串口助手里需要關(guān)閉發(fā)送新行才能關(guān)閉發(fā)送,程序里用+++\r\n關(guān)閉)
二  1.  AT+CIPSEND=num (指定發(fā)送數(shù)據(jù)長度,由于指定長度,達(dá)到長度后會自動(dòng)發(fā)送,并退出發(fā)送)
    2.  >  (這個(gè)符號代表等待輸入,回車發(fā)送,在程序里用\r\n轉(zhuǎn)義發(fā)送)

2.2 STM32操作esp8266模塊

在實(shí)際使用中检疫,STM32通過串口發(fā)送相關(guān)的AT指令給模塊進(jìn)行相應(yīng)的操作。芯片上電后祷嘶,首先進(jìn)行串口3的初始化屎媳,初始化中波特率設(shè)置為115200夺溢,同時(shí)配置一個(gè)100ms的定時(shí)器中斷,用于判斷數(shù)據(jù)接收的連續(xù)性烛谊。這里也編寫了相應(yīng)的串口3中斷服務(wù)函數(shù)风响,用于接收WiFi模塊收到的數(shù)據(jù)。串口3中斷服務(wù)函數(shù)如下:

//通過判斷接收連續(xù)2個(gè)字符之間的時(shí)間差不大于100ms來決定是不是一次連續(xù)的數(shù)據(jù).
//如果2個(gè)字符接收間隔超過100ms,則認(rèn)為不是1次連續(xù)數(shù)據(jù).也就是超過100ms沒有接收到
//任何數(shù)據(jù),則表示此次接收完畢.
//接收到的數(shù)據(jù)狀態(tài)
//[15]:0,沒有接收到數(shù)據(jù);1,接收到了一批數(shù)據(jù).
//[14:0]:接收到的數(shù)據(jù)長度
u16 USART3_RX_STA=0;     
void USART3_IRQHandler(void)
{
    u8 res;     
    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到數(shù)據(jù)
    {    
 
    res =USART_ReceiveData(USART3);     
    if((USART3_RX_STA&(1<<15))==0)//接收完的一批數(shù)據(jù),還沒有被處理,則不再接收其他數(shù)據(jù)
    { 
        if(USART3_RX_STA<USART3_MAX_RECV_LEN)       //還可以接收數(shù)據(jù)
        {
            TIM_SetCounter(TIM7,0);//計(jì)數(shù)器清空                       
            if(USART3_RX_STA==0)        
                TIM_Cmd(TIM7, ENABLE);  //使能定時(shí)器7 
            USART3_RX_BUF[USART3_RX_STA++]=res;     //記錄接收到的值    
        }else 
        {
            USART3_RX_STA|=1<<15;                   //強(qiáng)制標(biāo)記接收完成
        } 
    }   
 }                                       
} 

串口3初始化完成后丹禀,通過發(fā)送AT指令進(jìn)行WiFi模塊的初始化状勤,這里編寫了esp8266_init()函數(shù)對模塊進(jìn)行了相關(guān)的配置,代碼如下:

void esp8266_init(void)
{
    u8 *p;
    p=mymalloc(SRAMIN,100); //申請100字節(jié)的內(nèi)存
  atk_8266_quit_trans();
    POINT_COLOR=RED;//設(shè)置字體為紅色 
    LCD_ShowString(30,50,200,16,16,"Wifi Connecting...");   
  while(atk_8266_send_cmd("AT","OK",20));   //檢查WiFi模塊是否在線
    {
        atk_8266_quit_trans();                       //退出透傳
        atk_8266_send_cmd("AT+CIPMODE=0","OK",200);  //關(guān)閉透傳模式       
    }
    while(atk_8266_send_cmd("ATE0","OK",20));//關(guān)閉回顯
    atk_8266_send_cmd("AT+CWMODE=3","OK",50);  //設(shè)置為STA模式
    atk_8266_send_cmd("AT+RST","OK",40);
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
    atk_8266_send_cmd("AT+CWAUTOCONN=0","OK",50);
    sprintf((char*)p,"AT+CWJAP=\"%s\",\"%s\"",wifiap_ssid,wifiap_password);
    atk_8266_send_cmd(p,"OK",800);   //連接AP
    delay_ms(3000);
    delay_ms(2000);
    atk_8266_send_cmd("AT+CIPMUX=0","OK",20);
    sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",(u8*)ip,(u8*)portnum); 
    while(atk_8266_send_cmd(p,"OK",200)){}   //連接服務(wù)端
    Connect_Flag=1;
    atk_8266_send_cmd("AT+CIPMODE=1","OK",200);   //開啟透傳
    myfree(SRAMIN,p); //釋放內(nèi)存
}

其中双泪,服務(wù)器用了PC端的網(wǎng)絡(luò)調(diào)試助手進(jìn)行模擬持搜,WiFi模塊與PC同時(shí)連接同一個(gè)WiFi熱點(diǎn),在PC上開啟網(wǎng)絡(luò)調(diào)試助手作為服務(wù)器焙矛,IP地址為局域網(wǎng)內(nèi)分配給PC的I地址葫盼,端口號自己定義,如下圖所示:


image.png

esp8266模塊配置完成后村斟,當(dāng)需要通過WiFi發(fā)送數(shù)據(jù)時(shí)贫导,調(diào)用串口3發(fā)送函數(shù)即可向服務(wù)器發(fā)送數(shù)據(jù)。串口3發(fā)送數(shù)據(jù)可以使用庫函數(shù)USART_SendData(USART_TypeDef* USARTx, uint16_t Data)蟆盹,這里使用該庫函數(shù)重新封裝了一個(gè)串口發(fā)送函數(shù)脱盲,可以進(jìn)行固定長度的數(shù)據(jù)幀發(fā)送。

 /************串口3的發(fā)送函數(shù)************/
//串口3,printf 函數(shù)
//確保一次發(fā)送數(shù)據(jù)不超過USART3_MAX_SEND_LEN字節(jié)
void u3_printf(char* fmt,...)  
{  
    u16 i,j;
    va_list ap;
    va_start(ap,fmt);
    vsprintf((char*)USART3_TX_BUF,fmt,ap);
    va_end(ap);
    i=strlen((const char*)USART3_TX_BUF);//此次發(fā)送數(shù)據(jù)的長度
    for(j=0;j<i;j++)//循環(huán)發(fā)送數(shù)據(jù)
    {
      while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);  //等待上次傳輸完成 
        USART_SendData(USART3,(uint8_t)USART3_TX_BUF[j]);    //發(fā)送數(shù)據(jù)到串口3 
    }
    
}

3.DHT11溫濕度模塊

3.1 模塊介紹

DHT11與單片機(jī)之間能采用簡單的單總線進(jìn)行通信日缨,僅僅需要一個(gè)I/O口。傳感器內(nèi)部濕度和溫度數(shù)據(jù)40Bit的數(shù)據(jù)一次性傳給單片機(jī)掖看,數(shù)據(jù)采用校驗(yàn)和方式進(jìn)行校驗(yàn)匣距,有效的保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性。


DHT11管腳圖

從DHT11讀取的溫濕度數(shù)據(jù)組成如下所示:


溫濕度數(shù)據(jù)結(jié)構(gòu)

3.2 STM32操作DHT11

檢測DHT11是否正常

//等待DHT11的回應(yīng)
//返回1:未檢測到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)       
{   
    u8 retry=0;
    DHT11_IO_IN();//SET INPUT    
    while (DHT11_DQ_IN&&retry<100)//DHT11會拉低40~80us
    {
        retry++;
        delay_us(1);
    };   
    if(retry>=100)return 1;
    else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后會再次拉高40~80us
    {
        retry++;
        delay_us(1);
    };
    if(retry>=100)return 1;     
    return 0;
}

DHT11讀取溫濕度并校驗(yàn)

//從DHT11讀取一次數(shù)據(jù)
//temp:溫度值(范圍:0~50°)
//humi:濕度值(范圍:20%~90%)
//返回值:0,正常;1,讀取失敗
u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        
    u8 buf[5];
    u8 i;
    DHT11_Rst();
    if(DHT11_Check()==0)
    {
        for(i=0;i<5;i++)//讀取40位數(shù)據(jù)
        {
            buf[i]=DHT11_Read_Byte();
        }
        if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
        {
            *humi=buf[0];
            *temp=buf[2];
        }
    }else return 1;
    return 0;       
}

4.運(yùn)行結(jié)果

配置好DHT11和esp8266模塊后哎壳,在主函數(shù)while(1)中循環(huán)計(jì)時(shí)毅待,定時(shí)讀取溫濕度數(shù)據(jù)并通過WiFi上傳至PC端。

    while(1)
    {               
        if(t%10==0)//每100ms讀取一次
        {                                     
            DHT11_Read_Data(&temperature,&humidity);        //讀取溫濕度值                        
            LCD_ShowNum(30+40,150,temperature,2,16);        //顯示溫度             
            LCD_ShowNum(30+40,170,humidity,2,16);           //顯示濕度
            atk_8266_quit_trans();
            atk_8266_send_cmd("AT+CIPSEND","OK",20);         //開始透傳 
            sprintf((char*)p,"溫度為:%d℃,濕度為:%d %\r\n",temperature,humidity);
            u3_printf("%s",p);
            
        }                  
        delay_ms(100);
        t++;
    }

這里同時(shí)用到了LCD顯示屏在開發(fā)板上顯示溫濕度的數(shù)據(jù)归榕,作為輔助功能尸红,本文就不展開講LCD的配置與使用了。
開發(fā)板上讀取溫濕度的結(jié)果圖如下


image.png

在PC端網(wǎng)絡(luò)調(diào)試助手上也定時(shí)接收到了溫濕度數(shù)據(jù)刹泄。


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末外里,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子特石,更是在濱河造成了極大的恐慌盅蝗,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姆蘸,死亡現(xiàn)場離奇詭異墩莫,居然都是意外死亡芙委,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門狂秦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灌侣,“玉大人,你說我怎么就攤上這事裂问〔嗵洌” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵愕秫,是天一觀的道長慨菱。 經(jīng)常有香客問我,道長戴甩,這世上最難降的妖魔是什么符喝? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮甜孤,結(jié)果婚禮上协饲,老公的妹妹穿的比我還像新娘。我一直安慰自己缴川,他們只是感情好茉稠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著把夸,像睡著了一般而线。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恋日,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天膀篮,我揣著相機(jī)與錄音,去河邊找鬼岂膳。 笑死誓竿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谈截。 我是一名探鬼主播筷屡,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼簸喂!你這毒婦竟也來了毙死?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤喻鳄,失蹤者是張志新(化名)和其女友劉穎规哲,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诽表,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唉锌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年隅肥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袄简。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腥放,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绿语,到底是詐尸還是另有隱情秃症,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布吕粹,位于F島的核電站种柑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏匹耕。R本人自食惡果不足惜聚请,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稳其。 院中可真熱鬧驶赏,春花似錦、人聲如沸既鞠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘱蛋。三九已至蚯姆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洒敏,已是汗流浹背蒋失。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桐玻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓荆萤,卻偏偏與公主長得像镊靴,于是被迫代替她去往敵國和親冷冗。 傳聞我的和親對象是個(gè)殘疾皇子言津,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容