作者:新紀元 | 更新時間:2016-04-02 | 瀏覽量:3744
應網友要求,奉上自己編寫的一份基于AM2320溫濕度傳感器的源代碼!希望能起到舉一反三的效果。希望各位大神們輕笑、輕拍!
AM2320,我采用的是單總線通信方式,具體電路圖如下:
采用ESP8266的GPIO0管腳 ,打開GPIO0的外部中斷功能,部分代碼如下:
void ICACHE_FLASH_ATTR AM2320_interrupt(void){/*GPIO0管腳 外部中斷處理函數*/ unsigned int tmp = 0xFF; static unsigned int index = 0; static unsigned int timer[1] = {0}; static unsigned int AM2320_index = 0xFF; static unsigned char data[5] = {0,0,0,0,0}; if(!index){ timer[0] = system_get_time(); index ++; }else{ index = system_get_time();/*暫存*/ timer[0] = index - timer[0]; if(__timer_cmp(150,170,timer[0])){ /*響應時間*/ tmp = 3; }else if(__timer_cmp(65,100,timer[0])){ /*0*/ tmp = 0; }else if(__timer_cmp(110,145,timer[0])){ /*1*/ tmp = 1; } timer[0] = index; index = 1; } switch(tmp){ case 3: /*響應*/ AM2320_index = 0; break; case 0: /*0*/ case 1: /*1*/ if(AM2320_index < 0xFF){ __Ecode(data,AM2320_index,tmp); AM2320_index++; if(AM2320_index == 40){ AM2320_index = 0; for(tmp = 0;tmp < 4;tmp++){ AM2320_index += data[tmp]; } if((AM2320_index & 0xFF) == data[4]){ for(tmp = 0;tmp < 5;tmp++) { Sensor_Data[tmp] = data[tmp]; } } AM2320_index = 0xFF; } } break; } } /*獲取數據 刷新函數 通過調用此函數 來觸發一次am2320溫濕度傳感器的通信*/ void ICACHE_FLASH_ATTR AM2320_upData(void){/*獲取溫濕度數據 每隔3毫秒調用一次*/ static unsigned int timer_counter = 0; static unsigned int index = 0; // Read_Sensor(); timer_counter++; if(((timer_counter * AM2320_UPDATA_TIMER) >= AM2320_GETDATA_TIMER) || (index)){ if(!index){ timer_counter = 0; index++; PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);/*使能上拉*/ GPIO_OUTPUT_SET(GPIO_ID_PIN(0), 0); }else{ index = 0; GPIO_OUTPUT_SET(GPIO_ID_PIN(0), 1); GPIO_DIS_OUTPUT(GPIO_ID_PIN(0));/*配置為輸入*/ } } }
本人語言水平有限,就直接奉上源碼了