You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
2.7 KiB
140 lines
2.7 KiB
3 years ago
|
#include "led.h"
|
||
|
#include "delay.h"
|
||
|
#include "sys.h"
|
||
|
#include "usart.h"
|
||
|
#include "wifi.h"
|
||
|
#include "dht11.h"
|
||
|
#include "lcd1602.h"
|
||
|
#include "adc.h"
|
||
|
#include "timer.h"
|
||
|
#include "string.h"
|
||
|
#include "ds18b20.h"
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include "motor.h"
|
||
|
|
||
|
|
||
|
|
||
|
// 用户数据的结构体
|
||
|
struct UserInfo{
|
||
|
u8 temp_value; // 温度
|
||
|
u8 temp_threshold;
|
||
|
float smog; // 烟雾
|
||
|
int PoisonousGas; // 有毒气体
|
||
|
float smog_threshold;
|
||
|
int PoisonousGas_threshold;
|
||
|
};
|
||
|
|
||
|
struct UserInfo userInfo;
|
||
|
|
||
|
/**
|
||
|
* @description: 报警
|
||
|
* @param {*}
|
||
|
* @return {*}
|
||
|
*/
|
||
|
void Warning(){
|
||
|
BEEP = 1;
|
||
|
delay_ms(100);
|
||
|
BEEP = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
int getResult(){
|
||
|
int result = 0;
|
||
|
if(userInfo.temp_value > userInfo.temp_threshold) result = 1;
|
||
|
if(userInfo.smog > userInfo.smog_threshold) result = 1;
|
||
|
if(userInfo.PoisonousGas > userInfo.PoisonousGas_threshold) result = 1;
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @description: 数据处理
|
||
|
* @param {*}
|
||
|
* @return {*}
|
||
|
*/
|
||
|
void Data_Deal()
|
||
|
{
|
||
|
u16 adcx;
|
||
|
|
||
|
userInfo.temp_value = DS18B20_Get_Temp() / 10;
|
||
|
|
||
|
adcx = Get_Adc_Average(ADC_Channel_1,10);
|
||
|
userInfo.smog = (float)adcx*(3.3/4096);
|
||
|
|
||
|
adcx = Get_Adc_Average(ADC_Channel_0,10);
|
||
|
userInfo.PoisonousGas = (float)adcx*(3.3/4096);
|
||
|
|
||
|
if(getResult()) Warning();
|
||
|
else BEEP = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @description: 解析数据
|
||
|
* @param {*}
|
||
|
* @return {*}
|
||
|
*/
|
||
|
int getValue()
|
||
|
{
|
||
|
int target1 = 0, target2 = 0,i = 0;
|
||
|
int result = 0;
|
||
|
target1 = strstr((const char*)USART_RX_BUF, "(") - USART_RX_BUF;
|
||
|
target2 = strstr((const char*)USART_RX_BUF, ")") - USART_RX_BUF;
|
||
|
result = 0;
|
||
|
for(i = target1 + 1; i < target2; i++){
|
||
|
result = result * 10 + (*(USART_RX_BUF + i) - 0x30);
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
void Receive_data(void)
|
||
|
{
|
||
|
// 接受到数据
|
||
|
if(USART_RX_STA & 0x8000){
|
||
|
// 模式切换
|
||
|
if(strstr((const char*)USART_RX_BUF, "getInfo") != NULL){
|
||
|
printf("temp:%d, temp_threshold:%d,smog:%0.2f, PoisonousGas%0.2f, smog_threshold:%d, PoisonousGas_threshold:%d", \
|
||
|
userInfo.temp_value,userInfo.temp_threshold, userInfo.smog, userInfo.PoisonousGas, userInfo.smog_threshold, userInfo.PoisonousGas_threshold);
|
||
|
}
|
||
|
if(strstr((const char*)USART_RX_BUF, "setTemp") != NULL){
|
||
|
userInfo.temp_threshold = getValue();
|
||
|
}
|
||
|
if(strstr((const char*)USART_RX_BUF, "setSmog") != NULL){
|
||
|
userInfo.smog_threshold = getValue();
|
||
|
}
|
||
|
if(strstr((const char*)USART_RX_BUF, "setPoisonousGas") != NULL){
|
||
|
userInfo.PoisonousGas_threshold = getValue();
|
||
|
}
|
||
|
memset(USART_RX_BUF, 0, sizeof(USART_RX_BUF));
|
||
|
USART_RX_STA = 0x00;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Sys_Init(void)
|
||
|
{
|
||
|
delay_init();
|
||
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
|
||
|
uart_init(115200);
|
||
|
LED_Init();
|
||
|
DS18B20_Init();
|
||
|
Adc_Init();
|
||
|
}
|
||
|
|
||
|
int main(void)
|
||
|
{
|
||
|
Sys_Init();
|
||
|
BEEP = 1;
|
||
|
delay_ms(1000);
|
||
|
BEEP = 0;
|
||
|
while(1)
|
||
|
{
|
||
|
Data_Deal();
|
||
|
Receive_data();
|
||
|
delay_ms(200);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|