/*******************************************************************************
1、本工程是GoKit的最新版本工程;
2、mcu開發者可以關心protocol.h 和 protocol.c這兩個文件;
3、用于傳輸的通用協議(非P0),mcu開發者可以最大程度的復用此工程源碼;
4、mcu開發者重點關注protocol.c中的CmdSendMcuP0和CmdReportModuleStatus這兩個函數(需要控制外設和處理外設狀態);
5、其余通用的通訊流程,可以不做改變或者替換改變;
6、有任何問題可以關注機智云開發者論壇;
*******************************************************************************/
#include <stm32f10x.h>
#include "hal_uart.h"
#include "hal_key.h"
//#include "hal_rgb_led.h"
//#include "hal_motor.h"
#include "hal_temp_hum.h"
#include "protocol.h"
//#include "hal_infrared.h"
#include "led.h"
#include "lcd.h"
#include "adc.h"
#include "ds18b20.h"
#include "chinese.h"
#include "pwm.h"
#include "timer.h"
#include "rtc.h"
uint8_t get_one_package; //判斷是否接收到一個完整的串口數據包
uint8_t uart_buf[256]; //串口緩沖區
uint16_t uart_Count=0; //串口緩沖區數據長度
uint8_t cmd_flag =0;
uint16_t cmd_len =0 ;
uint8_t wait_ack_time;
uint8_t check_status_time;
uint8_t report_status_idle_time;
uint32_t SN;
uint8_t cmd_flag1, cmd_flag2;
uint32_t wait_wifi_status;
pro_commonCmd m_pro_commonCmd; //通用命令,心跳、ack等可以復用此幀
m2w_returnMcuInfo m_m2w_returnMcuInfo; //返回mcu信息幀
m2w_setModule m_m2w_setModule; //配置模塊幀
w2m_controlMcu m_w2m_controlMcu; //控制命令幀
m2w_mcuStatus m_m2w_mcuStatus; //當前最新的mcu狀態幀
m2w_mcuStatus m_m2w_mcuStatus_reported; //上次發送的mcu狀態,當與最新的mcu狀態不同時,需要上報;
w2m_reportModuleStatus m_w2m_reportModuleStatus; //wifi模塊上報狀態幀
pro_errorCmd m_pro_errorCmd; //錯誤命令幀
u8 Cleanliness_Data;
u8 DHT11_Read_Data_temperature;
u8 DHT11_Read_Data_humidity;
u16 DS18B20_Data;
u16 Gas_Data;
float voltage;
float voltage1;
extern vu16 ADC_ConvertedValue[1];
int McuStatusInit()
{
SN = 0;
cmd_flag1 = 0;
cmd_flag2 = 0;
get_one_package = 0;
uart_Count = 0;
cmd_flag = 0;
cmd_len = 0 ;
wait_wifi_status = 0;
memset(uart_buf, 0, 256);
//初始化通用命令幀,命令字和sn需要傳入,校驗和發送前計算,其他信息相同;
memset(&m_pro_commonCmd, 0, sizeof(pro_commonCmd));
m_pro_commonCmd.head_part.head[0] = 0xFF;
m_pro_commonCmd.head_part.head[1] = 0xFF;
m_pro_commonCmd.head_part.len = exchangeBytes(sizeof(pro_commonCmd) - 4);
//初始化返回mcu信息幀,sn和校驗和需要根據實際填寫;
memset(&m_m2w_returnMcuInfo, 0, sizeof(m2w_returnMcuInfo));
m_m2w_returnMcuInfo.head_part.head[0] = 0xFF;
m_m2w_returnMcuInfo.head_part.head[1] = 0xFF;
//長度值不包含包頭和長度字段,所以要減去4個字節;
m_m2w_returnMcuInfo.head_part.len = exchangeBytes(sizeof(m2w_returnMcuInfo) - 4);
m_m2w_returnMcuInfo.head_part.cmd = CMD_GET_MCU_INFO_ACK;
memcpy(m_m2w_returnMcuInfo.pro_ver, PRO_VER, 8);
memcpy(m_m2w_returnMcuInfo.p0_ver, P0_VER, 8);
memcpy(m_m2w_returnMcuInfo.hard_ver, HARD_VER, 8);
memcpy(m_m2w_returnMcuInfo.soft_ver, SOFT_VER, 8);
memcpy(m_m2w_returnMcuInfo.product_key, PRODUCT_KEY, 32);
//binable_time默認0,可以隨時被綁定;
m_m2w_returnMcuInfo.binable_time = 0;
//初始化mcu狀態幀,sn和校驗和需要根據實際填寫;
memset(&m_m2w_mcuStatus, 0, sizeof(m2w_mcuStatus));
m_m2w_mcuStatus.head_part.head[0] = 0xFF;
m_m2w_mcuStatus.head_part.head[1] = 0xFF;
m_m2w_mcuStatus.head_part.len = exchangeBytes(sizeof(m2w_mcuStatus) - 4);
// DHT11_Read_Data((uint8_t *)&(m_m2w_mcuStatus.status_r.temputure), (uint8_t *)&(m_m2w_mcuStatus.status_r.humidity));
// m_m2w_mcuStatus.status_w.motor_speed = 5;
DS18B20_Data=DS18B20_Get_Temp();
//初始化配置wifi模塊幀,sn和校驗和需要根據實際填寫;
memset(&m_m2w_setModule, 0, sizeof(m2w_setModule));
m_m2w_setModule.head_part.head[0] = 0xFF;
m_m2w_setModule.head_part.head[1] = 0xFF;
m_m2w_setModule.head_part.cmd = CMD_SET_MODULE_WORKMODE;
m_m2w_setModule.head_part.len = exchangeBytes(sizeof(m2w_setModule) - 4);
//初始化錯誤命令幀,sn和校驗和需要根據實際填寫;
memset(&m_pro_errorCmd, 0, sizeof(pro_errorCmd));
m_pro_errorCmd.head_part.head[0] = 0xFF;
m_pro_errorCmd.head_part.head[1] = 0xFF;
m_pro_errorCmd.head_part.cmd = CMD_MODULE_CMD_ERROR_ACK;
m_pro_errorCmd.head_part.len = exchangeBytes(sizeof(pro_errorCmd) - 4);
return 0;
}
int main(void)
{
u16 pwm1=175;
u16 pwm4=175;
char i=0;
u8 t=0,t1=0,t2=0,t3=0,t4=0;
short temperature1;
//系統初始化
SystemInit();
UART_Configuration();
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
KEY_GPIO_Init();
TIM3_Int_Init(100,7199); //20ms
TIM4_PWM_Init(199,7200);//PWM頻率=50hz
//應用初始化,包括電機、LED、溫濕度、紅外;
// Motor_Init();
// RGB_LED_Init();
DHT11_Init();
// IR_Init();
LED_Init();
LCD_Init();
Adc_Init();
DS18B20_Init(); //RTC初始化
RTC_Init(); //RTC初始化
TEST_FONT();//中文顯示
LCD_Scan_Dir(0);//橫屏
//初始化各類型數據幀
McuStatusInit();
POINT_COLOR=0X841F;//設置字體顏色
while(1)
{
//處理來自于串口的數據幀
MessageHandle();
//處理來自于按鍵的事件
KeyHandle();
//檢查系統最新狀態
CheckStatus();
// if(t3%10==0)//每100ms讀取一次
// {
// LCD_ShowString(16,250,200,16,16,"Vol: V"); //一個字符占8位
// POWER(&voltage);
// LCD_ShowNum(50,250,voltage,4,16); //顯示正數部分
//// POWER1(&voltage1);
//// LCD_ShowNum(40,270,voltage1,2,16); //顯示小數部分
// if(voltage<3.3)
// {
//
// LED3=1;
//
// }else LED3=0;
//// if(voltage1<3.3)
//// {
//// LED1=0;
////
//// }else LED1=1;
//
// }
// delay_ms(10);
// t3++;
// if(t3==20)
// {
// t=0;
//
// }
if(t%10==0)//每100ms讀取一次
{
LCD_ShowString(0+110+16,150,150,16,16,"C");
LCD_ShowString(0+110+16,170,170,16,16,"% ");
DHT11_Read_Data(&DHT11_Read_Data_temperature,&DHT11_Read_Data_humidity); //讀取溫濕度值
LCD_ShowNum(40+50+16,150,DHT11_Read_Data_temperature,2,16); //顯示溫度
LCD_ShowNum(40+50+16,170,DHT11_Read_Data_humidity,2,16); //顯示濕度
if(DHT11_Read_Data_humidity>43) //濕度
{
JDQ0=1;
} else
if(!(m_w2m_controlMcu.status_w.cmd_byte == 0x00) )
{ if( m_w2m_controlMcu.status_w.cmd_byte == 0x08)
{
if(DHT11_Read_Data_temperature<35)
{
JDQ0=1;
while(DHT11_Read_Data_temperature>40)
break;
} else JDQ0=0;
}
if(m_w2m_controlMcu.status_w.cmd_byte == 0x04)
JDQ0=1;
}else JDQ0=0;
}
delay_ms(10);
t++;
if(t==20)
{
t=0;
}
//*********************DS18B20****************//
LCD_ShowString(24+32+70+16,190,200,16,16,"."); //一個字符占8位
LCD_ShowString(40+32+70+16,190,200,16,16,"%"); //一個字符占8位
if(t1%10==0)//每100ms讀取一次
{
Hal_ReadAirMQxxData(&Gas_Data); //refrigerator_gas_Data=Get_Adc_Average(ADC_Channel_1,10);
LCD_ShowNum(0+40+70+16,190,Gas_Data/10,2,16); //顯示正數部分
LCD_ShowNum(0+64+70+16,190,Gas_Data%10,1,16); //顯示小數部分
if((Gas_Data/10)>2|(m_w2m_controlMcu.status_w.cmd_byte == 0x02))
{
JDQ1=1;
Cleanliness_Data=0;
LCD_ShowString(120,130,200,16,16,"Dirty "); //一個字符占8位
}
else JDQ1=0,Cleanliness_Data=1 ,LCD_ShowString(120,130,200,16,16,"Clean"); //一個字符占8位
}
delay_ms(10);
t1++;
if(t1==20)
{
t1=0;
}
//*********************DS18B20****************//
LCD_ShowString(24+56+40,210,200,16,16,"."); //一個字符占8位
LCD_ShowString(40+56+40,210,200,16,16,"C"); //一個字符占8位
// LCD_ShowString(0,180,200,16,16,"E_TEMP:"); //一個字符占8位
if(t2%10==0)//每100ms讀取一次
{
temperature1=DS18B20_Get_Temp();
if(temperature1<0)
{
LCD_ShowChar(0+56+40,210,'-',16,0); //顯示負號
temperature1=-temperature1; //轉為正數
}else LCD_ShowChar(0+56+40,210,' ',16,0); //去掉負號
LCD_ShowNum(0+64+40,210,temperature1/10,2,16); //顯示正數部分
LCD_ShowNum(0+88+40,210,temperature1%10,1,16); //顯示小數部分
}
delay_ms(10);
t2++;
if(t2==20)
{
t2=0;
}
if(t4!=calendar.sec)
{
// LCD_ShowString(20,270,200,16,16," - - ");
LCD_ShowString(190,0,200,16,12," : : ");
t=calendar.sec;
// LCD_ShowNum(16,270,calendar.w_year,4,16);
// LCD_ShowNum(66,270,calendar.w_month,2,16);
// LCD_ShowNum(96,270,calendar.w_date,2,16);
switch(calendar.week)
{
case 0:
LCD_ShowString(190,12,200,16,12,"Sunday ");
break;
case 1:
LCD_ShowString(190,12,200,16,12,"Monday ");
break;
case 2:
LCD_ShowString(190,12,200,16,12,"Tuesday ");
break;
case 3:
LCD_ShowString(190,12,200,16,12,"Wednesday");
break;
case 4:
LCD_ShowString(190,12,200,16,12,"Thursday ");
break;
case 5:
LCD_ShowString(190,12,200,16,12,"Friday ");
break;
case 6:
LCD_ShowString(190,12,200,16,12,"Saturday ");
break;
}
LCD_ShowNum(190,0,calendar.hour,2,12);
LCD_ShowNum(207,0,calendar.min,2,12);
LCD_ShowNum(225,0,calendar.sec,2,12);
}
// delay_ms(10);
}
}
|