e5cb4afcc5ca9f80a553ef7d46df005.png (92.75 KB, 下載次數: 154)
下載附件
下位機原理圖
2021-4-1 16:00 上傳
單片機源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "adc.h"
- #include "timer.h"
- #include "usart1.h"
- #include "LCD1602.h"
- #include "string.h"
- #include "stdio.h"
- #include "dht11.h"
- void Change_data_handle(void);
- void SHOW_AND_BAOJING_Handle(void);
- u8 KEY_SCAN(void); //按鍵函數
- u8 key,PPM,Temperature,HUM;
- u16 PPM_MAX=60,Temperature_MAX=40,HUM_MAX=70;//煙霧溫濕度上限初始值
- unsigned char Alarm_Buf[16]="Warning";
- char buf[30];
- extern unsigned char RxCounter,Usart1RecBuf[64];
- extern char bUsart1RecFlag;
- //ESP8266相關函數
- #define ESP_RECV_PTYPE_NULL 0
- #define ESP_RECV_PTYPE_DATA 1
- unsigned char cur_conn_id;
- char *strx=0;
- void Clear_Buffer(void)//清空緩存
- {
- u8 i;
- for(i=0;i<64;i++)
- Usart1RecBuf[i]=0;//緩存
- RxCounter=0;
- }
- void esp_ap_mode(void)
- {
- Clear_Buffer();
- Uart1_SendStr("AT+CWMODE=2\r\n"); ////<mode>:1-Station模式,2-AP模式,3-AP兼Station模式
- strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
- while(strx == NULL)
- {
- Clear_Buffer();
- Uart1_SendStr("AT+CWMODE=2\r\n");
- delay_ms(500);
- strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
- }
-
- /*
- <ssid>:字符串參數,接入點名稱
- <pwd>:字符串參數,密碼最長64字節,ASCII
- <chl>:通道號
- < ecn >:0-OPEN,1-WEP,2-WPA_PSK,3-WPA2_PSK,4-WPA_WPA2_PSK
- */
- Clear_Buffer();
- Uart1_SendStr("AT+CWSAP=\"TEST\",\"12345678\",1,3\r\n");
- strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
- while(strx == NULL)
- {
- Clear_Buffer();
- Uart1_SendStr("AT+CWSAP=\"TEST\",\"12345678\",1,3\r\n");
- delay_ms(500);
- strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
- }
-
- /*
- AT+CIPMUX=1
- OK
- */
- Clear_Buffer();
- Uart1_SendStr("AT+CIPMUX=1\r\n");
- strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
- while(strx == NULL)
- {
- Clear_Buffer();
- Uart1_SendStr("AT+CIPMUX=1\r\n");
- delay_ms(500);
- strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
- }
- /*
- AT+CIPMUX=1時才能開啟服務器;關閉server模式需要重啟?
- AT+CIPSERVER=1,8080
- OK
- */
- Clear_Buffer();
- Uart1_SendStr("AT+CIPSERVER=1,8080\r\n");
- strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
- while(strx == NULL)
- {
- Clear_Buffer();
- Uart1_SendStr("AT+CIPSERVER=1,8080\r\n");
- delay_ms(500);
- strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
- }
- }
- void esp8266_init()
- {
- Usart1_Init(115200);
- Uart1_SendStr("ESP8266 Init\r\n");
- Uart1_SendStr("AT\r\n"); //模塊測試
- strx = strstr((const char*)Usart1RecBuf,(const char*)"OK");
- while(strx == NULL)
- {
- Clear_Buffer();
- Uart1_SendStr("AT\r\n");
- delay_ms(500);
- strx=strstr((const char*)Usart1RecBuf,(const char*)"OK");
- }
-
- esp_ap_mode();
- }
- void esp_send_buf(unsigned char conn_id, char * buf, unsigned char len)
- {
-
- printf("AT+CIPSEND=%d,%d\r\n",cur_conn_id,len);
- strx = strstr((const char*)Usart1RecBuf,(const char*)">");
- delay_ms(200);
- if(strx==NULL)
- {
- return;
- }
-
- Uart1_SendStr(buf);
- strx = strstr((const char*)Usart1RecBuf,(const char*)"SEND OK");
- delay_ms(100);
- if(strx==NULL)
- {
- return;
- }
-
- }
- int main(void)
- {
- u16 test,test_adc;
-
- delay_init(); //延時函數初始化
- NVIC_Configuration(); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
- KEY_IO_Init();
- TIM2_Int_Init(1000-1,72-1); //定時器初始化,定時1MS
- //Tout = ((arr+1)*(psc+1))/Tclk ; 72000/72=1000us
- //Tclk:定時器輸入頻率(單位MHZ)
- //Tout:定時器溢出時間(單位us)
- delay_ms(300);
- DHT11_Init(); //DHT11初始化
- RELAY_Init();//繼電器初始化
- BEEP_DISENABLE(); //蜂鳴器初始化
- LCD_Init(); // 1602初始化
- Adc_Init(); //ADC初始化
- esp8266_init();//ESP8266初始化
- while(1)
- {
- test_adc = Get_Adc_Average(ADC_Channel_9,20);//讀取通道9的AD值,讀取20次的平均值
- PPM = test_adc*99/4096;//12位AD,把AD值轉換成百分比0~99
- PPM = PPM >= 99? 99: PPM;//最大值不能超過99
- DHT11_Read_Data(&Temperature,&HUM);//讀取溫濕度值
- SHOW_AND_BAOJING_Handle();
- Change_data_handle();//按鍵調節
- if(test++>20)//ESP8266延時一段時間,發送一次數據
- {
- esp_send_buf(0,buf,27);
- test = 0;
- }
- delay_ms(1);
- }
- }
- extern u8 FLICKER;
- void SHOW_AND_BAOJING_Handle(void)
- {
- unsigned char show_buf[16];//顯示緩存區
-
- if(Temperature >= Temperature_MAX)//溫度超限
- {
- memcpy(buf,Alarm_Buf,8);//把Alarm_Buf里的字符串拷貝到buf中
- buf[7] = '!';
- if(FLICKER)//超標顯示閃爍
- {
- LCD_Write_String(0,0," ");
- }
- else
- {
- sprintf(show_buf,"TEMP:%02dC",(u16)Temperature);//轉換顯示格式為TEMP:00C
- LCD_Write_String(0,0,show_buf);//顯示
- }
- }
- else
- {
- sprintf(show_buf,"TEMP:%02dC",(u16)Temperature);//轉換顯示格式為TEMP:00C
- LCD_Write_String(0,0,show_buf);//顯示
- memcpy(buf,show_buf,8);//將溫度顯示字符拷貝到buf中
- }
- buf[8] = ',';
- if(HUM >= HUM_MAX)//濕度超限
- {
- memcpy(buf+9,Alarm_Buf,8);//把Alarm_Buf里的字符串拷貝到buf中
- if(FLICKER)//超標顯示閃爍
- {
- LCD_Write_String(9,0," ");
- }
- else
- {
- sprintf(show_buf,"HUM:%02d%%",(u16)HUM);//轉換顯示格式為HUM:00%
- LCD_Write_String(9,0,show_buf);//顯示
- }
- }
- else
- {
- sprintf(show_buf,"HUM:%02d%%",(u16)HUM);//轉換顯示格式為HUM:00%
- LCD_Write_String(9,0,show_buf);
- memcpy(buf+9,show_buf,7);//將濕度顯示字符拷貝到buf中
- }
- buf[16] = ',';
- if(PPM >= PPM_MAX)//煙霧超限
- {
- memcpy(buf+17,Alarm_Buf,7);
- buf[24] = '!';
- buf[25] = '!';
- if(FLICKER)//超標顯示閃爍
- {
- LCD_Write_String(0,1," ");
- }
- else
- {
- sprintf(show_buf,"SMOKE:%02d%%",PPM);//轉換顯示格式為SMOKE:00%
- LCD_Write_String(0,1,show_buf);
- }
- }
- else
- {
- sprintf(show_buf,"SMOKE:%02d%%",PPM);//轉換顯示格式為SMOKE:00%
- LCD_Write_String(0,1,show_buf);
- memcpy(buf+17,show_buf,9);
- }
- buf[26] = '\r';
- buf[26] = '\n';
- if(Temperature >= Temperature_MAX || HUM >= HUM_MAX || PPM >= PPM_MAX)//溫度濕度煙霧超限
- {
- RELAY = 1;//繼電器開啟
- BEEP_ENABLE(); //蜂鳴器報警
- }
- else
- {
- RELAY = 0;
- BEEP_DISENABLE();
- }
- }
- u8 KEY_SCAN(void)
- {
- u8 res = 0;
- if(!KEY1)
- {
- delay_ms(10);
- if(!KEY1)
- {
- while(!KEY1);//卡死
- res = 1;
- }
- }
- if(!KEY2)
- {
- delay_ms(10);
- if(!KEY2)
- {
- while(!KEY2);//卡死
- res = 2;
- }
- }
- if(!KEY3)
- {
- delay_ms(10);
- if(!KEY3)
- {
- while(!KEY3);//卡死
- res = 3;
- }
- }
- return res;
- }
- void Change_data_handle(void)
- {
- u8 key;
- static u8 MODE = 0;
- key = KEY_SCAN();//讀取按鍵值
- if(key == 1)//按鍵1按下
- {
- MODE++;
- LCD_Clear();//清屏
- delay_ms(100);
- }
- while(MODE)
- {
- key = KEY_SCAN();
- switch(MODE)
- {
- case 1: //設置溫度
- //顯示
- LCD_Write_String(0,0,"Set the TEMP ");
- LCD_Write_String(0,1,"max:");
- LCD_Write_Char(8,1,0xdf);
- LCD_Write_Char(9,1,'C');
- if(key == 2 && Temperature_MAX < 99) Temperature_MAX++;//按鍵2按下,值加1
- if(key == 3 && Temperature_MAX > 0) Temperature_MAX--;//按鍵3按下,值減1
- LCD1602_write_long(6,1,Temperature_MAX,2);//顯示值
- delay_ms(10);
- break;
- case 2: //設置濕度
- //顯示
- LCD_Write_String(0,0,"Set the HUM ");
- LCD_Write_String(0,1,"max:");
- LCD_Write_String(8,1,"%");
- if(key == 2 && HUM_MAX < 99) HUM_MAX += 1;//按鍵2按下,值加1
- if(key == 3 && HUM_MAX > 0) HUM_MAX -= 1;//按鍵3按下,值減1
- LCD1602_write_long(6,1,HUM_MAX,2);
- delay_ms(10);
- break;
- case 3: //設置煙霧
- //顯示
- LCD_Write_String(0,0,"Set the SMOKE ");
- LCD_Write_String(0,1,"max:");
- LCD_Write_String(10,1,"% ");
- if(key == 2 && PPM_MAX < 99) PPM_MAX += 1;//按鍵2按下,值加1
- if(key == 3 && PPM_MAX > 0) PPM_MAX -= 1;//按鍵3按下,值減1
- LCD1602_write_long(8,1,PPM_MAX,2);
- delay_ms(10);
- break;
- default: break;
- }
- if(key == 1)
- {
- MODE++;
- LCD_Clear();
- if(MODE == 4)//按下次數等于4退出設置
- {
- MODE = 0;
- }
- }
- }
-
- }
復制代碼 代碼:
程序.7z
(204.99 KB, 下載次數: 510)
2021-4-1 18:55 上傳
點擊文件名下載附件
下位機程序 下載積分: 黑幣 -5
|