#include "delay.h" #include "sys.h" #include "OLED.h" #include "dht11.h" #include "esp8266.h" #include "Timer.h" #include "Key.h" #include "stmflash.h" #include "Usart.h" #include "control.h" #include "adc.h" #include "HC_SR505.h" #include "su_03t.h" //C¿â #include <string.h> #include "stdio.h" #include "math.h" extern unsigned char esp8266_buf[buf_len]; //×Ô¶¨Ò庯Êý void show_wendu_shidu(void); void show_title(void); void show_mode(void); void show_final_keranqiti_ppm(void); u16 Light_Check(void); void show_light(void); void show_people(void); void page1(void); void page2(void); void page3(void); u8 mode=2; //×Ô¶¯Ä£Ê½=1£¬ÊÖ¶¯Ä£Ê½=2 int page=1; //½çÃæÑ¡Ôñ int page2_index = 1; //½çÃæ2Çл»Ñ¡Ôñ int page3_index = 1; //½çÃæ3Çл»Ñ¡Ôñ //ãÐÖµ struct Set_data { u16 temp_h; u16 humi_h; u16 light_l; u16 co2_l; }; struct Set_data Out_data={35,75,50,500};//³õʼ»¯ãÐÖµ //°´¼üÏà¹ØµÄ±äÁ¿ u8 key_num=0; //wifi±äÁ¿ char TIMER_IT=0,WiFiInit_time,Flagout=1; //oledÏà¹Ø±äÁ¿ u8 oled_Fill_flag=1;//OLEDÇåÆÁ±êÖ¾ char oled_str[100];//OLEDÏÔʾ»º´æ char date[200];//esp8266·¢ËÍ»º´æ u8 buff[30];//²ÎÊýÏÔʾ»º´æÊý×é //¶¨Ê±ÖжÏÊýÊý int beep_flag = 0; int beep_NUM = 0; // ÔÚÈ«¾Ö±äÁ¿ÇøÓòÌí¼Ó±ê־λ u8 alarm_sent = 0; // ±¨¾¯Ðźŷ¢Ëͱê־λ //dht11Ìí¼Ó±äÁ¿ DHT11_Data_TypeDef DHT11_Data; //ÑÌÎíŨ¶È u16 keranqiti_ppm; //ÑÌÎíŨ¶È float final_keranqiti_ppm; //¹âÃô¼à²â u16 light = 0; //ÈËÌå¼ì²â int REN_value; int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÖжϿØÖÆÆ÷·Ö×éÉèÖà Key_Init(); OLED_Init(); OLED_Clear(0); DHT11_Init(); //DHT11³õʼ»¯ Timer_Init(); Adc_Init(); HC_SR505_Init(); //renti´«¸ÐÆ÷³õʼ»¯ beep_init(); led_init(); My_TIM3_Init(19999,71); fan_init(); SU_03T_Iint(9600); //ÓïÒô²¥±¨ Serial_Iint(9600); do { key_num=KEY_Scan(0);//°´¼üɨÃè if(key_num==1)//ÐèÒªÁªÍø { OLED_Clear(0); ESP8266_Init(115200); //´®¿Ú2£¬Çý¶¯wifiÄ£¿éÓà Timer_Init(); break; } OLED_ShowCHinese(0, 0,1);//ÊÇ OLED_ShowCHinese(18,0,2);//·ñ OLED_ShowCHinese(36,0,3);//Ðè OLED_ShowCHinese(52,0,4);//Òª OLED_ShowCHinese(68,0,5);//Áª OLED_ShowCHinese(84,0,6);//Íø OLED_ShowCHinese(100,0,7);//£¿ OLED_ShowString(8,4,"1.",16); OLED_ShowCHinese(24,4,1);//ÊÇ OLED_ShowString(62,4,"2.",16); OLED_ShowCHinese(78,4,2);//·ñ }while(key_num!=2); OLED_Clear(0); while(1) { /*********************************Êý¾Ý´¦ÀíÇø**************************************************/ /*******************¶ÁÈ¡ÎÂʪ¶ÈÊý¾Ý***************************************/ Read_DHT11(&DHT11_Data); /************************¿ÉÈ¼ÆøÌåÊý¾Ý***********************************************/ keranqiti_ppm = Get_Adc_Average(0,1); final_keranqiti_ppm = (keranqiti_ppm/4096.0*3.3)*210+ 10; //¶ÁÈ¡ ¹âÕÕ Êý¾Ý light = Light_Check(); /*******************¶ÁÈ¡ÈËÌåºìÍâÊý¾Ý***************************************/ REN_value=Get_HC_SR505_Value(); /*******************Ïò°Í·¨ÔÆ·¢ËÍÊý¾Ý***************************************/ if(TIMER_IT && Flagout==0) { TIMER_IT=0; sprintf(date,"cmd=2&uid=%s&topic=data&msg=#%d#%d.%d#%d.%d#%d#%d#%.1f#\r\n",\ BEMFA_ID, mode, DHT11_Data.temp_int,DHT11_Data.temp_deci,DHT11_Data.humi_int,DHT11_Data.humi_deci, REN_value,light,final_keranqiti_ppm); ESP8266_SendData((unsigned char *)date);//ESP8266·¢ËÍÊý¾Ý } printf("#ζÈ:%d#ʪ¶È:%d#ÈËÌå¼ì²â:%d#¹âÕÕ:%d#ÑÌÎí:%.1f#\r\n",DHT11_Data.temp_int,DHT11_Data.humi_int,REN_value,light,final_keranqiti_ppm); /*********************************ÈË»ú½»»¥Çø**************************************************/ key_num=KEY_Scan(0);//°´¼üɨÃè if(key_num==1) { page+=1; OLED_Clear(0); if(page == 4) //¸ù¾Ý×î´ó½çÃæ½øÐÐÉèÖà page = 1; } if(page == 1) //ÏÔʾÊý¾Ý { page1(); } if(page == 2) { page2(); } if(page == 3) { page3(); } /*********************************ģʽ¿ØÖÆÇø**************************************************/ //appģʽÇл» if(strstr((const char *)esp8266_buf,"ZD")!=0 ) //Çл»Ê±Òª¹Ø±ÕËùÓÐ { mode=1; fan = 0; led = 1; TIM_SetCompare1(TIM3,1500); } else if(strstr((const char *)esp8266_buf,"SD")!=0 ) { mode=2; fan = 0; led = 1; TIM_SetCompare1(TIM3,1500); } if(mode==1)//×Ô¶¯Ä£Ê½ { //¿ØÖÆÎ¶Èʪ¶ÈÑÌÎí if(DHT11_Data.temp_int > Out_data.temp_h || DHT11_Data.humi_int > Out_data.humi_h||final_keranqiti_ppm > 200) { fan = 1; if(final_keranqiti_ppm > 200) { if(beep_flag == 0) { beep_NUM = 0; beep_flag = 1; if(Flagout == 0) { sprintf(date,"cmd=2&uid=%s&topic=control&msg=YanWu\r\n", BEMFA_ID); ESP8266_SendData((unsigned char *)date);//ESP8266·¢ËÍÊý¾Ý sprintf(date,"cmd=2&uid=%s&topic=control&msg=delay\r\n", BEMFA_ID); ESP8266_SendData((unsigned char *)date);//ESP8266·¢ËÍÊý¾Ý } } } if(DHT11_Data.temp_int > Out_data.temp_h || DHT11_Data.humi_int > Out_data.humi_h) { if(Flagout == 0) { sprintf(date,"cmd=2&uid=%s&topic=control&msg=wenshidu\r\n", BEMFA_ID); ESP8266_SendData((unsigned char *)date);//ESP8266·¢ËÍÊý¾Ý sprintf(date,"cmd=2&uid=%s&topic=control&msg=delay\r\n", BEMFA_ID); ESP8266_SendData((unsigned char *)date);//ESP8266·¢ËÍÊý¾Ý } } } else if(DHT11_Data.temp_int <= Out_data.temp_h && DHT11_Data.humi_int <= Out_data.humi_h) { fan = 0; } //¿ØÖƹâÕÕ if(light < Out_data.light_l && REN_value == Have_body) { led = 0; TIM_SetCompare1(TIM3,500); } else { led = 1; TIM_SetCompare1(TIM3,1500); } } if(mode==2)//ÊÖ¶¯Ä£Ê½ { //APP¿ØÖÆ if(strstr((const char *)esp8266_buf,"KDG")!=0) { led = 0; } else if(strstr((const char *)esp8266_buf,"GDG")!=0) { led = 1; } else if(strstr((const char *)esp8266_buf,"KFS")!=0) { fan = 1; } else if(strstr((const char *)esp8266_buf,"GFS")!=0) { fan = 0; } else if(strstr((const char *)esp8266_buf,"KCH")!=0) { TIM_SetCompare1(TIM3,500); } else if(strstr((const char *)esp8266_buf,"GCH")!=0) { TIM_SetCompare1(TIM3,1500); } } /*********************************Êý¾Ý½ÓÊÕÇø**************************************************/ char *tw_ptr = strstr((char *)esp8266_buf, "wd"); if (tw_ptr != NULL && sscanf(tw_ptr + 2, "=%hu", &Out_data.temp_h) == 1) { ESP8266_Clear(); } char *jj_ptr = strstr((char *)esp8266_buf, "sd"); if (jj_ptr != NULL && sscanf(jj_ptr + 2, "=%hu", &Out_data.humi_h) == 1) { ESP8266_Clear(); } char *gz_ptr = strstr((char *)esp8266_buf, "gz"); if (gz_ptr != NULL && sscanf(gz_ptr + 2, "=%hu", &Out_data.light_l) == 1) { ESP8266_Clear(); } } } void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) { TIMER_IT=1; beep_NUM++; if(beep_flag == 1) { if(beep_NUM <= 6) { if(beep == 1) beep = 0; else beep = 1; } if(beep_NUM >= 7) { beep = 1; beep_flag = 0; } } TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } void show_title(void) { // OLED_ShowCHinese(10, 0,108); OLED_ShowCHinese(26, 0,109); OLED_ShowCHinese(26+16, 0,110); OLED_ShowCHinese(26+32, 0,111); OLED_ShowCHinese(26+48, 0,92); OLED_ShowCHinese(26+48+16, 0,93); } void show_wendu_shidu(void) { sprintf(oled_str,"T:%d.%dC H:%d%% ",DHT11_Data.temp_int,0,DHT11_Data.humi_int); OLED_ShowString (0,0,(u8 *)oled_str,16); } void show_final_keranqiti_ppm(void) { //ÑÌÎí OLED_ShowCHinese(0, 2,22); OLED_ShowCHinese(16, 2,23); sprintf((char*)buff, ":%.1fppm ",final_keranqiti_ppm); OLED_ShowString(32,2,buff,16); } u16 Light_Check(void) { u16 light;float light_AD; light_AD=4096-Get_Adc_Average(1,1); light=light_AD/4095*100; return light; } void show_light(void) { OLED_ShowCHinese(0, 4, 24);// OLED_ShowCHinese(16, 4, 25);// OLED_ShowCHinese(32, 4, 26);// OLED_ShowCHinese(48, 4, 27);// sprintf((char*)buff, ":%d%% ",light); OLED_ShowString(64,4,buff,16); } void show_people(void) { OLED_ShowCHinese(0, 6,28); OLED_ShowCHinese(16, 6,29); OLED_ShowCHinese(32, 6,30); OLED_ShowCHinese(48, 6,31); OLED_ShowString(64, 6,(u8*)":",16); if(REN_value==Have_body) // { OLED_ShowCHinese(72, 6,32); } else if(REN_value==No_body) { OLED_ShowCHinese(72, 6,33); } } void show_mode(void) { if(mode ==1) { OLED_ShowString(110, 6,(u8*)"ZD",16); } else if(mode ==2) { OLED_ShowString(110, 6,(u8*)"SD",16); } } void page1(void) { show_wendu_shidu(); show_final_keranqiti_ppm(); show_light(); show_people(); show_mode(); if(key_num == 4) //Çл»ÊÖ×Ô¶¯Ä£Ê½£¬Í¬Ê±Òª¹Ø±ÕËùÓеĶ«Î÷ { if(mode == 1) { mode = 2; fan = 0; led = 1; TIM_SetCompare1(TIM3,1500); } else { mode = 1; fan = 0; led = 1; TIM_SetCompare1(TIM3,1500); } } } void page2(void) //Èý¸ö { //¿ª¹ØÉèÖà OLED_ShowCHinese(16+15, 0,38); OLED_ShowCHinese(16+15+16,0,39); OLED_ShowCHinese(16+15+32,0,10); OLED_ShowCHinese(16+15+48,0,11); //µÆ¹â OLED_ShowCHinese(0, 2,40); OLED_ShowCHinese(16,2,41); OLED_ShowChar(32,2,':',16); if(led == 0) OLED_ShowCHinese(40,2,38); else OLED_ShowCHinese(40,2,39); //fan OLED_ShowCHinese(0, 4,42); OLED_ShowCHinese(16,4,43); OLED_ShowChar(32,4,':',16); if(fan == 1) OLED_ShowCHinese(40,4,38); else OLED_ShowCHinese(40,4,39); //´°»§ OLED_ShowCHinese(0, 6,44); OLED_ShowCHinese(16,6,45); OLED_ShowChar(32,6,':',16); if(TIM_GetCapture1(TIM3) == 500) OLED_ShowCHinese(40, 6,38); else if(TIM_GetCapture1(TIM3) == 1500) OLED_ShowCHinese(40, 6,39); if(mode == 2) { if(key_num == 2) { page2_index +=1; if(page2_index ==4) //¸ù¾ÝÐèÒªÉèÖõÄãÐÖµ¸öÊý½øÐÐÅäÖà page2_index = 1; } if(page2_index == 1) { OLED_ShowChar(80,2,'<',16); OLED_ShowChar(80,4,' ',16); OLED_ShowChar(80,6,' ',16); if(key_num ==3) { led = 0; } else if(key_num ==4) { led = 1; } } if(page2_index == 2) { OLED_ShowChar(80,2,' ',16); OLED_ShowChar(80,4,'<',16); OLED_ShowChar(80,6,' ',16); if(key_num ==3) { fan = 1; } else if(key_num ==4) { fan = 0; } } if(page2_index == 3) { OLED_ShowChar(80,2,' ',16); OLED_ShowChar(80,4,' ',16); OLED_ShowChar(80,6,'<',16); if(key_num ==3) { TIM_SetCompare1(TIM3,500);// ´ò¿ª } else if(key_num ==4) { TIM_SetCompare1(TIM3,1500); } } } } void page3(void) //Èý¸ö { //ãÐÖµÉèÖà OLED_ShowCHinese(16+15, 0,8); OLED_ShowCHinese(16+15+16,0,9); OLED_ShowCHinese(16+15+32,0,10); OLED_ShowCHinese(16+15+48,0,11); //ζÈÏÂÏÞ OLED_ShowCHinese(0, 2,12); OLED_ShowCHinese(16, 2,13); OLED_ShowCHinese(32, 2,34); OLED_ShowCHinese(48, 2,35); OLED_ShowCHinese(64, 2,21); sprintf((char*)buff, ":%d ",Out_data.temp_h); OLED_ShowString(72,2,buff,16); //ʪ¶ÈÉÏÏÞ OLED_ShowCHinese(0, 4,14); OLED_ShowCHinese(16, 4,13); OLED_ShowCHinese(32, 4,34); OLED_ShowCHinese(48, 4,35); OLED_ShowCHinese(64, 4,21); sprintf((char*)buff, ":%d ",Out_data.humi_h); OLED_ShowString(72,4,buff,16); //¹âÕÕÏÂÏÞ OLED_ShowCHinese(0, 6,24); OLED_ShowCHinese(16, 6,25); OLED_ShowCHinese(32, 6,36); OLED_ShowCHinese(48, 6,37); OLED_ShowCHinese(64, 6,21); sprintf((char*)buff, ":%d ",Out_data.light_l); OLED_ShowString(72,6,buff,16); if(key_num == 2) { page3_index +=1; if(page3_index ==4) //¸ù¾ÝÐèÒªÉèÖõÄãÐÖµ¸öÊý½øÐÐÅäÖà page3_index = 1; } if(page3_index == 1) { OLED_ShowChar(100,2,'<',16); OLED_ShowChar(100,4,' ',16); OLED_ShowChar(100,6,' ',16); if(key_num ==3) Out_data.temp_h+=1; else if(key_num ==4) Out_data.temp_h-=1; } if(page3_index == 2) { OLED_ShowChar(100,2,' ',16); OLED_ShowChar(100,4,'<',16); OLED_ShowChar(100,6,' ',16); if(key_num ==3) Out_data.humi_h+=5; else if(key_num ==4) Out_data.humi_h-=5; } if(page3_index == 3) { OLED_ShowChar(100,2,' ',16); OLED_ShowChar(100,4,' ',16); OLED_ShowChar(100,6,'<',16); if(key_num ==3) Out_data.light_l+=5; else if(key_num ==4) Out_data.light_l-=5; } }
时间: 2025-05-28 18:49:08 浏览: 37
这段代码是一个基于STM32微控制器的智能环境监控系统,集成了温湿度传感器(DHT11)、人体红外传感器(HC-SR505)、光敏电阻、可燃气体传感器以及ESP8266 Wi-Fi模块。以下是代码中的一些关键点和可能的改进建议:
### 关键点解释
1. **初始化部分**:
- 初始化了多个外设,如按键、OLED显示屏、DHT11温湿度传感器、定时器、ADC等。
- 通过按键选择是否需要联网。
2. **数据采集与处理**:
- 定期读取温湿度、光强、人体检测、可燃气体浓度等数据。
- 数据通过ESP8266发送到云端。
3. **模式控制**:
- 支持自动模式和手动模式。
- 自动模式下根据设定的阈值控制风扇、LED灯等设备。
- 手动模式下通过APP远程控制。
4. **页面显示**:
- 提供三个页面分别显示数据、控制状态和设置阈值。
### 可能的问题及改进建议
1. **代码结构问题**:
- 代码较长且复杂,建议将功能模块化,每个模块单独封装成函数或类。
- 使用面向对象的设计思想可以提高代码的可维护性和可扩展性。
2. **错误处理**:
- 缺乏对传感器读取失败的处理机制。
- ESP8266通信失败时没有重试机制。
3. **优化建议**:
- 使用中断方式处理按键输入,避免轮询带来的延迟。
- 对于长时间运行的任务,考虑使用RTOS(实时操作系统)来管理任务优先级。
以下是改进后的部分代码示例,展示如何将功能模块化:
```cpp
class SensorManager {
public:
void init() {
DHT11_Init();
Adc_Init();
HC_SR505_Init();
}
void readData(DHT11_Data_TypeDef &dhtData, u16 &light, int &REN_value, float &keranqiti_ppm) {
Read_DHT11(&dhtData);
light = Light_Check();
REN_value = Get_HC_SR505_Value();
keranqiti_ppm = (Get_Adc_Average(0, 1) / 4096.0 * 3.3) * 210 + 10;
}
};
class DisplayManager {
public:
void showPage1(DHT11_Data_TypeDef dhtData, float keranqiti_ppm, u16 light, int REN_value, u8 mode) {
show_wendu_shidu(dhtData);
show_final_keranqiti_ppm(keranqiti_ppm);
show_light(light);
show_people(REN_value);
show_mode(mode);
}
private:
void show_wendu_shidu(DHT11_Data_TypeDef dhtData) {
sprintf(oled_str, "T:%d.%dC H:%d%% ", dhtData.temp_int, 0, dhtData.humi_int);
OLED_ShowString(0, 0, (u8 *)oled_str, 16);
}
void show_final_keranqiti_ppm(float ppm) {
OLED_ShowCHinese(0, 2, 22);
OLED_ShowCHinese(16, 2, 23);
sprintf((char*)buff, ":%.1fppm ", ppm);
OLED_ShowString(32, 2, buff, 16);
}
void show_light(u16 light) {
OLED_ShowCHinese(0, 4, 24);
OLED_ShowCHinese(16, 4, 25);
sprintf((char*)buff, ":%d%% ", light);
OLED_ShowString(64, 4, buff, 16);
}
void show_people(int REN_value) {
OLED_ShowCHinese(0, 6, 28);
if (REN_value == Have_body) {
OLED_ShowCHinese(72, 6, 32);
} else {
OLED_ShowCHinese(72, 6, 33);
}
}
void show_mode(u8 mode) {
if (mode == 1) {
OLED_ShowString(110, 6, (u8 *)"ZD", 16);
} else if (mode == 2) {
OLED_ShowString(110, 6, (u8 *)"SD", 16);
}
}
};
SensorManager sensorManager;
DisplayManager displayManager;
int main(void) {
sensorManager.init();
while (1) {
DHT11_Data_TypeDef dhtData;
u16 light;
int REN_value;
float keranqiti_ppm;
sensorManager.readData(dhtData, light, REN_value, keranqiti_ppm);
displayManager.showPage1(dhtData, keranqiti_ppm, light, REN_value, mode);
}
}
```
阅读全文
相关推荐



















