四、软件部分
1程序简介
WiFi程序
https://github.com/caiyongsheng-designer/Est_TEST.git
主控MCU程序
https://github.com/caiyongsheng-designer/Intelligent-air-conditioner-box.git
(1)主控MCU程序设计:
主控芯片程序设计使用时间片轮转法,时间片周期为100ms,该周期使用滴答定时器中断来触发。
代码结构如下:

源码运行流程如下:
(2)wifi程序设计:
WiFi程序设计基于乐鑫ESP8266_RTOS_SDK开源代码进行设计。
代码结构如下:
源码运行流程如下:
2具体实现方法介绍
2.1MCU部分介绍
2.1.1 时间片轮询法具体程序架构如下:
Step1.参数初始化:
左右滑动查看完整内容
// 初始化任务结构
typedefstruct _TASK_COMPONENTS
{
uint8_tRun; // 程序运行标记:0-不运行,1运行
uint8_tTimer;// 起始计时器
uint8_tItvTime;// 任务运行间隔时间【AKA计时器初始值值】
void(*TaskHook)(void);// 要运行的任务函数,注意该函数不得传参
} TASK_COMPONENTS;// 任务定义
staticTASK_COMPONENTS TaskComps[] =
{
{0,2,2, WiFi_Uart_Receive_All}, // 间隔200MS运行一次,读WiFi串口数据
{0,3,3, ir_receive_data_output},// 间隔300MS读一下红外接收是否有数据
{0,5,5, WiFi_data_Upload}, // 间隔500ms比较WiFi上传数据变化,变化则上报
{0,10,10, Read_Temperature_Display},// 间隔1S运行一次,温度测量
{0,20,20, rtc_minute_30_read},// 间隔2S,读RTC,间隔30Min获取实时天气并读取室内湿度
{0,50,50,Wifi_state_inquire},// 间隔5S,检查WiFi状态
{0,100,100,WiFi_data_Upload_Timing_Report}//间隔10S进行当前设备状态上报
};
typedefenum _TASK_LIST
{
TASK_WiFi_Uart_Receive_All,
TASK_ir_receive_data_output,
TASK_WiFi_data_Upload,
TASK_Read_Temperature_Display,
TASK_rtc_minute_30_read,
TASK_GET_Wifi_State,
TASK_WiFi_data_Upload_Timing_Report,
TASKS_MAX// 总的可供分配的定时任务数目
} TASK_LIST;
Step2.对滴答定时器开启初始化
左右滑动查看完整内容
/**
*@brief启动系统滴答计时器 SysTick
*@paramIT_frequency: 滴答计时器每秒的中断次数
*@retval无
*/
voidSysTick_Init(uint32_t IT_frequency)
{
/* SystemCoreClock在这里默认为48M
* SystemCoreClock / 1000 1ms中断一次
* SystemCoreClock / 100000 10us中断一次
* SystemCoreClock / 1000000 1us中断一次
*/
IT_Period =SystemCoreClock/ IT_frequency;
uint32_t err =SysTick_Config (IT_Period);
assert(err==0);//capture error
}
Step3.启动滴答定时器中断,并在中断中对来到的任务标志使能
左右滑动查看完整内容
/**
*@briefSysTick的中断服务函数
*@param无
*@retval无
*/
externvoidSysTick_Handler(void);//需要先extern声明一下避免编译器警告
voidSysTick_Handler(void)
{
TaskRemarks();
}
voidTaskRemarks(void)
{
uint8_t i;
for(i=0; i
Step4.
main函数中调用任务函数TaskProcess,判断任务是否启动
左右滑动查看完整内容
voidTaskProcess(void)
{
uint8_t i;
for(i=0; i
2.1.2 DHT11驱动介绍
A
DHT11基本知识介绍
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,内部由一个8位单片机控制一个电阻式感湿元件和一个NTC测温元件。DHT11采用单总线协议,其温度测量范围为0~50℃,误差在±2℃;湿度的测量范围为20%~90%RH(Relative Humidity相对湿度—指空气中水汽压与饱和水汽压的百分比),误差在±5%RH。DHT11电路很简单,只需要将Dout引脚连接单片机的一个I/O即可,不过该引脚需要上拉一个电阻,DHT11的供电电压为3~5.5V。

B
DHT11协议及数据格式
DHT11采用单总线协议与单片机通信,单片机发送一次复位信号后,DHT11从低功耗模式转换到高速模式,等待主机复位结束后,DHT11发送响应信号,并拉高总线准备传输数据。一次完整的数据为40bit,按照高位在前,低位在后的顺序传输数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和,一共5字节(40bit)数据。由于DHT11分辨率只能精确到个位,所以小数部分是数据全为0。校验和为前4个字节数据相加,校验的目的是为了保证数据传输的准确性。DHT11只有在接收到开始信号后才触发一次温湿度采集,如果没有接收到主机发送复位信号,DHT11不主动进行温湿度采集。当数据采集完毕且无开始信号后,DHT11自动切换到低速模式。
C
DHT11操作时序
DHT11操作时序如下所示:

具体操作步骤如下:
步骤一
DHT11上电后(DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令),测试环境温湿度数据,并记录数据,同时DHT11的DATA数据线由上拉电阻拉高一直保持高电平;此时DHT11的DATA引脚处于输入状态,时刻检测外部信号。
步骤二
微处理器的I/O设置为输出同时输出低电平,且低电平保持时间不能小于18ms(最大不得超过 30ms),然后微处理器的I/O设置为输入状态,由于上拉电阻,微处理器的I/O即DHT11的DATA数据线也随之变高,等待DHT11作出回答信号。
发送信号如图所示:

步骤三
DHT11的DATA引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后DHT11的DATA引脚处于输出状态,输出83微秒的低电平作为应答信号,紧接着输出87微秒的高电平通知外设准备接收数据,微处理器的I/O此时处于输入状态,检测到I/O有低电平(DHT11回应信号)后,等待87微秒的高电平后的数据接收,
发送信号如图所示:

步骤四
由DHT11的DATA引脚输出40位数据,微处理器根据I/O电平的变化接收40位数据,位数据“0”的格式为:54微秒的低电平和23-27微秒的高电平,位数据“1”的格式为:54微秒的低电平加68-74微秒的高电平。
位数据“0”、“1”格式信号如图所示:

结束信号:
DHT11的DATA引脚输出40位数据后,继续输出低电平54微秒后转为输入状态,由于上拉电阻随之变为高电平。但DHT11内部重测环境温湿度数据,并记录数据,等待外部信号的到来。
具体程序如下所示:
具体代码参考MCU程序user_DHT11文件夹中文件;
2.1.3 红外收发驱动介绍
红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备。红外遥控的编码目前广泛使用的是:NEC Protocol的PWM(脉冲宽度调制)和 Philips RC-5 Protocol的PPM(脉冲位置调制)。本项目使用的是NEC编码方式。
NEC编码方式特点如下:
8位地址和8位指令长度;
地址和命令2次传输(确保可靠性)
PWM脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;
载波频率为38Khz;
位时间为1.125ms或2.25ms;
NEC码的位定义:
一个脉冲对应560us的连续载波,一个逻辑1传输需要2.25ms(560us脉冲+1680us低电平),一个逻辑0的传输需要1.125ms(560us脉冲+560us低电平)。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑1应该是560us低+1680us高,逻辑0应该是560us低+560us高。NEC遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。


本程序利用输入捕获来测量高电平的脉宽,来解码红外遥控信号,利用两个定时器产生发送信号,一个定时器用于PWM脉冲信号发送时间计时一个定时器用于38K PWM脉冲信号产生。
具体程序如下所示:
发送驱动具体代码参考MCU程序user_ir_send文件夹中文件;
接收驱动具体代码参考MCU程序user_bsp_gpt_pwm文件夹中文件;
2.1.4 NTC读取介绍
采用NTC10K热敏电阻,使用AN008通道进行ADC读取,计算出热敏电阻上的电压,再通过公式法算出当前温度。
公式法如下所示:
NTC热敏电阻温度计算公式:Rt=R*EXP(B*(1/T1-1/T2))
T1和T2指的是K度,即开尔文温度。
Rt是热敏电阻在T1温度下的阻值。
R是热敏电阻在T2常温下的标称阻值。10K的热敏电阻25℃的值为10K(即R=10K)。
T2=(273.15+25)。
EXP(?)是e的?次方。
B值是热敏电阻的重要参数。
通过转换,得到温度T1与电阻Rt的关系:
T1=1/(ln(Rt/R)/B+1/T2)
最终对应的摄氏温度:
Temp=T1-273.15
具体程序如下所示:
驱动具体代码参考MCU程序user_ntc_3950_10k_read文件夹中文件;
2.2WiFi部分介绍
本项目Wifi模块使用的是ESP8266,物联网平台使用的是腾讯物联网平台以及心知天气平台,二者分别使用MQTT和HTTP的方式进行连接,下面对WiFi代码比较关键的地方进行具体说明。
2.2.1 WiFi配网流程介绍
腾讯物联网平台WiFi配网过程如下图所示:

WiFi配网流程如上图所示,下面主要讲解下WiFi UDP连接建立,以及如何通过json字符串获得小程序的token。
WiFi UDP建立步骤如下:
WiFi进入soft AP模式,找到路由进行连接;
连接成功后WiFi建立socket();

绑定UDP bind();

监听UDP是否有数据传输;

小程序通过UDP传输发送的json字符串如下所示:
{"cmdType":1,"ssid":"Home-WiFi","password":"abcd1234",
"token":"6aa11111****23****546****11****d"}
可以通过cjson对字符串进行解析,解析出当前WiFi所需连接路由的ssid,password,以及要发给腾讯物联网平台的token当设备端连接路由器,与腾讯物联网平台建立MQTT连接并订阅后,将token发送到腾讯物联网平台。发送成功后,手机APP、腾讯物联网平台、设备端三者通过token实现绑定,配网完成。
具体程序如下所示:
驱动具体代码参考WiFi程序user_udp_sever文件夹中文件;
2.2.2 WiFi http连接心知天气流程介绍
WiFi连接路由后,建立socket,进行lwip_connect连接知心天气端口,发送get指令获取返回信息。
具体程序如下所示:
驱动具体代码参考WiFi程序user_http_request文件夹中文件;
2.2.3 WiFi mqtt连接腾讯云流程介绍
腾讯物联网三元码动态生成,进行mqtt初始化;
连接腾讯物联网平台,腾讯物联网平台端口为1883;
连接成功后进行订阅;
订阅成功后可以与腾讯物联网平台按照约定的json结构进行数据收发;
具体程序如下所示:
驱动具体代码参考WiFi程序user_mqtt_tcp文件夹中文件;
五、BOM清单


推荐阅读:
券商晨会精华:京沪房价止跌传递积极信号,有望加速房地产市场预期的修复






