作者:新紀元 | 更新時間: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));/*配置為輸入*/
}
}
} 本人語言水平有限,就直接奉上源碼了