找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1733|回复: 1
打印 上一主题 下一主题
收起左侧

除臭!杀菌等多功能智能健康鞋柜设计,APP无线控制(app源码+MCU控制源码+设计说明)

[复制链接]
跳转到指定楼层
楼主
ID:419075 发表于 2019-9-9 11:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*******************************************************************************
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);               
               
               
        }                               
}






分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-9-9 21:58 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表