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.
415 lines
10 KiB
415 lines
10 KiB
#include "led.h" |
|
#include "delay.h" |
|
#include "sys.h" |
|
#include "usart.h" |
|
#include "wifi.h" |
|
#include "lcd1602.h" |
|
#include "adc.h" |
|
#include "timer.h" |
|
#include "string.h" |
|
#include "ds18b20.h" |
|
#include "Lcd_Driver.h" |
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include "DS1302.h" |
|
#include "oled.h" |
|
#include "key.h" |
|
#include "usart2.h" |
|
|
|
struct UserInfo userInfo; |
|
struct timing nowTime; |
|
|
|
int change = 0; |
|
|
|
// 函数声明 |
|
void Sys_Init(void); |
|
void DisplayTask(void); |
|
void TaskProcessing(void); |
|
void DataProcessing(void); |
|
|
|
|
|
|
|
void Init() |
|
{ |
|
userInfo.water_temp_up = 30; |
|
userInfo.target_water_level = 1; |
|
userInfo.water_temp_down = 10; |
|
userInfo.timer = 1; |
|
userInfo.timerFlag = 1; |
|
userInfo.HotFlag = 1; |
|
userInfo.CoolFlag = 0; |
|
} |
|
|
|
|
|
/** |
|
* @description: main函数 |
|
* @param {*} |
|
* @return {*} |
|
*/ |
|
int main(void) |
|
{ |
|
char data[5] = {0xAA, 0x13, 0x01, 0x01, 0xD4}; |
|
Init(); |
|
Sys_Init(); |
|
BEEP = 0; |
|
delay_ms(1000); |
|
BEEP = 1; |
|
printf("start\r\n"); |
|
uart2_send(data, sizeof(data)); |
|
while(1) |
|
{ |
|
TaskProcessing(); |
|
DataProcessing(); |
|
DisplayTask(); |
|
} |
|
} |
|
|
|
/** |
|
* @description: 系统初始化 |
|
* @param {*} |
|
* @return {*} |
|
*/ |
|
void Sys_Init(void) |
|
{ |
|
delay_init(); |
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); |
|
uart_init(115200); |
|
uart2_Init(9600); |
|
TIM3_Int_Init(4999,7199); |
|
LED_Init(); |
|
DS18B20_Init(); |
|
Adc_Init(); |
|
OLED_Init(); |
|
Key4x4_GPIO_Config(); |
|
OLED_Clear(); |
|
} |
|
|
|
/** |
|
* @description: 显示 |
|
* @param {*} |
|
* @return {*} |
|
*/ |
|
void DisplayTask(void) |
|
{ |
|
char str[80]; |
|
if(!userInfo.setModel){ |
|
if(userInfo.control_mode == 0) sprintf(str,"%0.2f, %0.2fcm, %d %d Manual ", userInfo.water_temp, \ |
|
userInfo.water_level, (int)userInfo.water_quality, userInfo.target_water_level); |
|
else sprintf(str,"%0.2f, %0.2fcm, %d %d AUTO ", userInfo.water_temp, \ |
|
userInfo.water_level, (int)userInfo.water_quality, userInfo.target_water_level); |
|
|
|
OLED_ShowString(0, 0, str, 16); |
|
sprintf(str,"U:%d,D:%d, %d, %d ", userInfo.water_temp_up, userInfo.water_temp_down, userInfo.timer,userInfo.timerFlag); |
|
OLED_ShowString(0, 4, str, 16); |
|
}else{ |
|
sprintf(str,"U:%d,D:%d %d %d %d ",userInfo.water_temp_up, userInfo.water_temp_down, userInfo.timer, userInfo.target_water_level, change); |
|
OLED_ShowString(0, 0, str, 16); |
|
} |
|
}; |
|
|
|
/** |
|
* @description: 报警 |
|
* @param {*} |
|
* @return {*} |
|
*/ |
|
void Warning(){ |
|
BEEP = 0; |
|
delay_ms(50); |
|
BEEP = 1; |
|
} |
|
|
|
/** |
|
* @description: 改变值 |
|
* @param {int} Value |
|
* @return {*} |
|
*/ |
|
void ChangeValue(int Value){ |
|
if(userInfo.setModel != 1) return; |
|
switch(change){ |
|
case 0: |
|
if(userInfo.water_temp_up < 100) userInfo.water_temp_up = userInfo.water_temp_up * 10 + Value; |
|
break; |
|
case 1: |
|
if(userInfo.water_temp_down < 100) userInfo.water_temp_down = userInfo.water_temp_down * 10 + Value; |
|
break; |
|
case 2: |
|
if(userInfo.timer < 1000) userInfo.timer = userInfo.timer * 10 + Value; |
|
break; |
|
case 3: |
|
userInfo.target_water_level = Value; |
|
if(userInfo.target_water_level > 3) userInfo.target_water_level = 3; |
|
else if(userInfo.target_water_level <= 0) userInfo.target_water_level = 1; |
|
break; |
|
} |
|
} |
|
|
|
|
|
/** |
|
* @description: 删除键 * |
|
* @param {*} |
|
* @return {*} |
|
*/ |
|
void DeleteValue() |
|
{ |
|
if(userInfo.setModel != 1) return; |
|
switch(change){ |
|
case 0: |
|
userInfo.water_temp_up /= 10; |
|
break; |
|
case 1: |
|
userInfo.water_temp_down /= 10; |
|
break; |
|
case 2: |
|
userInfo.timer /= 10; |
|
break; |
|
case 3: |
|
userInfo.target_water_level /= 10; |
|
break; |
|
} |
|
} |
|
|
|
/** |
|
* @description: 按键处理 |
|
* @param {*} |
|
* @return {*} |
|
*/ |
|
void keyHandling(){ |
|
int key = Key_Scan(); |
|
char data[] = {0xAA, 0x08, 0x0B, 0x02, 0x2F, 0x30, 0x30, 0x30, 0x30, 0x34, 0x2A, 0x4D, 0x50, 0x33, 0xDC}; |
|
switch (key) |
|
{ |
|
case 12: |
|
if(userInfo.setModel == 0) userInfo.setModel = 1; |
|
else userInfo.setModel = 0; |
|
change = 0; |
|
break; |
|
case 13: |
|
change++; |
|
if(change >= 4) change = 0; |
|
break; |
|
case 14: |
|
userInfo.control_mode++; |
|
if(userInfo.control_mode >= 2) userInfo.control_mode = 0; |
|
break; |
|
case 15: |
|
if(userInfo.timerFlag == 0) userInfo.timerFlag = 1; |
|
else userInfo.timerFlag = 0; |
|
break; |
|
case 11: |
|
DeleteValue(); |
|
break; |
|
default: |
|
if(!userInfo.setModel){ |
|
if(key == 1){ |
|
if(userInfo.HotFlag == 0) userInfo.HotFlag =1; |
|
else userInfo.HotFlag = 0; |
|
}else if(key == 2){ |
|
if(userInfo.CoolFlag == 0) userInfo.CoolFlag =1; |
|
else userInfo.CoolFlag = 0; |
|
}else if(key == 3){ |
|
if(userInfo.cupLidFlag == 0) userInfo.cupLidFlag =1; |
|
else userInfo.cupLidFlag = 0; |
|
} |
|
} |
|
if(!userInfo.setModel || key == 16) break; |
|
if(key < 10) ChangeValue(key); |
|
break; |
|
} |
|
if(key != 16) { |
|
Warning(); |
|
OLED_Clear(); |
|
} |
|
if(key == 10) uart2_send(data, sizeof(data)); |
|
} |
|
|
|
|
|
/** |
|
* @description: 解析数据 |
|
* @param {*} |
|
* @return {*} |
|
*/ |
|
int getValue(void) |
|
{ |
|
int target1 = 0, target2 = 0,i = 0; |
|
int result = 0; |
|
target1 = (char *)strstr((const char *)USART_RX_BUF, "(") - (char *)USART_RX_BUF; |
|
target2 = (char *)strstr((const char *)USART_RX_BUF, ")") - (char *)USART_RX_BUF; |
|
result = 0; |
|
for(i = target1 + 1; i < target2; i++){ |
|
result = result * 10 + (*(USART_RX_BUF + i) - 0x30); |
|
} |
|
return result; |
|
} |
|
|
|
/** |
|
* @description: 接收数据 |
|
* @param {*} |
|
* @return {*} |
|
*/ |
|
void DataProcessing(void) |
|
{ |
|
// 接受到数据 |
|
if(USART_RX_STA&0x8000){ |
|
if(strstr((const char*)USART_RX_BUF, "getInfo") != NULL){ |
|
printf("Water_temp:%0.2f, TDS:%d, water_level:%0.2fcm, target_level:%d, Hot:%d, Cool:%d", userInfo.water_temp, (int)userInfo.water_quality, userInfo.water_level, \ |
|
userInfo.target_water_level, (int)userInfo.HotFlag, userInfo.CoolFlag); |
|
} |
|
// 模式切换 |
|
if(strstr((const char*)USART_RX_BUF, "Model") != NULL){ |
|
userInfo.control_mode++; |
|
if(userInfo.control_mode >= 2) userInfo.control_mode = 0; |
|
if(userInfo.control_mode == 0) printf("Manual\r\n"); |
|
else printf("AUTO\r\n"); |
|
} |
|
if(strstr((const char*)USART_RX_BUF, "Hot") != NULL){ |
|
if(userInfo.HotFlag == 0) userInfo.HotFlag =1; |
|
else userInfo.HotFlag = 0; |
|
if(userInfo.HotFlag == 0) printf("Close Hot!\r\n"); |
|
else printf("Open Hot!\r\n"); |
|
} |
|
if(strstr((const char*)USART_RX_BUF, "Cool") != NULL){ |
|
if(userInfo.CoolFlag == 0) userInfo.CoolFlag =1; |
|
else userInfo.CoolFlag = 0; |
|
if(userInfo.CoolFlag == 0) printf("Close Cool!\r\n"); |
|
else printf("Open Cool!\r\n"); |
|
} |
|
|
|
if(strstr((const char*)USART_RX_BUF, "Up") != NULL){ |
|
userInfo.water_temp_up = getValue(); |
|
printf("setUp OK!\r\n"); |
|
} |
|
|
|
if(strstr((const char*)USART_RX_BUF, "Down") != NULL){ |
|
userInfo.water_temp_down = getValue(); |
|
printf("setDown OK!\r\n"); |
|
|
|
} |
|
|
|
if(strstr((const char*)USART_RX_BUF, "cupLid") != NULL){ |
|
if(userInfo.cupLidFlag == 0) userInfo.cupLidFlag = 1; |
|
else userInfo.cupLidFlag = 0; |
|
if(userInfo.cupLidFlag == 0) printf("Close cupLid\r\n"); |
|
else printf("Open cupLid\r\n"); |
|
} |
|
|
|
if(strstr((const char*)USART_RX_BUF, "Timer") != NULL){ |
|
userInfo.timer = getValue(); |
|
printf("setTimer OK!\r\n"); |
|
} |
|
|
|
if(strstr((const char*)USART_RX_BUF, "timerFlag") != NULL){ |
|
if(userInfo.timerFlag == 0) userInfo.timerFlag = 1; |
|
else userInfo.timerFlag = 0; |
|
if(userInfo.timerFlag == 0) printf("Close Timer\r\n"); |
|
else printf("Open Timer\r\n"); |
|
} |
|
memset(USART_RX_BUF, 0, sizeof(USART_RX_BUF)); |
|
USART_RX_STA = 0x00; |
|
} |
|
} |
|
|
|
/** |
|
* @description: 任务处理 |
|
* @param {*} |
|
* @return {*} |
|
*/ |
|
void TaskProcessing() |
|
{ |
|
static int send_flag = 0; |
|
float TDS=0.0,TDS_voltage; |
|
float compensationCoefficient=1.0;//温度校准系数 |
|
float compensationVolatge; |
|
float kValue=1.0; |
|
float TDS_value=0.0,voltage_value; |
|
static int attr1 = 0; |
|
int water_up = 0, water_down = 0; |
|
|
|
int flag = 0, temp; |
|
|
|
char data[] = {0xAA, 0x08, 0x0B, 0x02, 0x2F, 0x30, 0x30, 0x30, 0x30, 0x34, 0x2A, 0x4D, 0x50, 0x33, 0xDC}; |
|
u16 num; |
|
userInfo.water_temp = DS18B20_Get_Temp() / 10; |
|
num = Get_Adc_Average(ADC_Channel_0,10); |
|
userInfo.water_level = (float)num * (4.0 / 4096); |
|
|
|
num = Get_Adc_Average(ADC_Channel_1,10); |
|
TDS_voltage = (float)num * (3.3/4096); |
|
compensationCoefficient=1.0+0.02*((userInfo.water_temp/10)-25.0); |
|
compensationVolatge=TDS_voltage/compensationCoefficient; |
|
|
|
TDS_value=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - \ |
|
255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5*kValue; |
|
|
|
if((TDS_value<=0)){TDS_value=0;} |
|
if((TDS_value >1400)){TDS_value=1400;} |
|
userInfo.water_quality = TDS_value; |
|
|
|
keyHandling(); |
|
|
|
if(userInfo.timerFlag){ |
|
if(userInfo.timer == 0){ |
|
uart2_send(data, sizeof(data)); |
|
LED0 = 1, LED1 = 1, LED2 = 1; |
|
Warning(); |
|
delay_ms(100); |
|
LED0 = 0, LED1 = 0, LED2 = 0; |
|
userInfo.timerFlag = 0; |
|
} |
|
} |
|
|
|
LED0 = 0; |
|
LED1 = 0; |
|
LED2 = 0; |
|
if(userInfo.water_temp < userInfo.water_temp_down) LED1 = 1; |
|
if(userInfo.water_temp > userInfo.water_temp_up) LED0 = 1; |
|
if(userInfo.water_temp >= userInfo.water_temp_down && userInfo.water_temp <= userInfo.water_temp_up) LED2 = 1; |
|
|
|
if(userInfo.target_water_level == 1) water_up = 2, water_down = 1; |
|
else if (userInfo.target_water_level == 2) water_up = 3, water_down = 2; |
|
else if (userInfo.target_water_level == 3) water_up = 4, water_down = 3; |
|
|
|
if(userInfo.water_level < water_down || userInfo.water_level > water_up){ |
|
if(attr1 < 20) { |
|
Warning(); |
|
attr1++; |
|
} |
|
if(userInfo.water_level < water_down){ |
|
waterPump = 1; |
|
}else waterPump = 0; |
|
} |
|
if(userInfo.water_level >= water_down && userInfo.water_level <= water_up) { |
|
attr1 = 0; |
|
} |
|
|
|
if(userInfo.water_level >= water_down) flag = 1; |
|
// 手动模式 |
|
if(userInfo.control_mode == 0){ |
|
if(flag){ |
|
HOT = userInfo.HotFlag; |
|
COOL = userInfo.CoolFlag; |
|
cupLid = userInfo.cupLidFlag; |
|
}else HOT = 0, COOL = 0; |
|
}else{ |
|
if(userInfo.water_temp > userInfo.water_temp_up){ |
|
if(flag) COOL = 1; |
|
else COOL = 0; |
|
} |
|
else COOL = 0; |
|
if(userInfo.water_temp < userInfo.water_temp_down){ |
|
if(flag) HOT = 1; |
|
else HOT = 0; |
|
} |
|
else HOT = 0; |
|
} |
|
|
|
temp = userInfo.water_temp > userInfo.water_temp_up ? userInfo.water_temp - userInfo.water_temp_up : 0; |
|
if(temp > 5 && userInfo.water_level < water_down){ |
|
if(send_flag == 0) printf("temp:%0.2f, Automatic shutdown Heating failure, please manually shut down", userInfo.water_temp); |
|
send_flag = 1; |
|
}else{ |
|
send_flag = 0; |
|
} |
|
} |
|
|
|
|
|
|