题目二 多点温度无线监测系统的设计
(1) 任务
设计制作一个多点温度无线监测系统,实现多点温度的实时无线监测。
(2)要求
- 测温点数:>=2个;
- 测温范围:-10~+45℃;
- 精度:±0.5℃;
- 监控距离:>=5m;
- 电路制作时,必须注明本组成员学号与姓名。
(3)核心元器件(供参考)
部分接线说明
步进电机:
IN1:PB12、IN2:PB13、IN3:PB14、IN4:PB15、
VCC:5V,GND:GND
继电器:
VCC: 5V GND: GND 输入端:PA4
由于继电器是高电平触发,故把PA4改为高电平点亮灯
特别说明:
两个设备都是一样的,都是感知控制节点,但步进电机、OLED显示屏和继电器只有一个,也就只能如下图这样了。
功能实现
1. 本地控制:
- 单击按键S1(PB0),开启或关闭风扇(开启时继电器常开触点吸合)
- 双击按键S1,进入或退出自动控制模式
- 长按按键S1,进入或退出本地控制模式
- 第1次按下S2(PB1)按键,窗户全开,即步进电机右转1圈(独占CPU)
- 第2次按下S2(PB1)按键,窗户全关,即步进电机左转1圈(独占CPU)
以此轮流切换
本地控制是必须的,万一远程控制出了故障,也可以使用本地控制 - OLED显示屏依次显示(中文)
当前温度:带两位小数
风扇状态:开启/关闭(红灯亮表示开启)
窗户状态:全开/全关/半开
本地控制状态:开启/关闭
2. 手机远程监控
由图可知,使用的ONENET云平台,在手机APP上实现的功能有:
- 远程监测到温度数据
- 设备的运行情况,如风扇是否开启,窗户是否全关
- 设置温度阈值,用于自动控制
- 远程控制风扇的开启/关闭
- 远程控制窗户的开启/关闭,可以随意调节窗户开启的大小
- 设置电机的转速,也就是窗户关闭/开启时的速度,转速越慢力矩越大
- 远程开启/关闭自动控制
- 最下面的数据流切换框是用来切换不同设备的
4. 串口助手
- 显示温度数据
- 显示下发指令的内容
程序源码:
代码有点多,所以就只发一部分的代码。
//C库
#include <string.h>
//单片机头文件
#include "sys.h"
//网络协议层
#include "onenet.h"
//网络设备
#include "esp8266.h"
//硬件驱动
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "ds18b20.h"
#include "oled.h"
#include "exti.h"
#include "key.h"
//#include "motor.h"
#include "step_motor.h"
float temper; //温度变量
u8 TEMPER = 30; //温度阈值
u8 MKEY=180; //窗户进程开关
u8 Auto_Control = 1; //自动控制标志,1开启,0关闭
u8 Local_Control = 0; //本地控制标志
u8 MS = 0; //窗帘标志
u8 Speed =3; //转速
char oledBuf[20]; //OLED显示屏数据缓冲区
u8 LedR_Flag = 0; //风扇标志
//硬件初始化
void Hardware_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
delay_init(); //延时函数初始化
Usart1_Init(115200); //串口1初始化为115200
Usart2_Init(115200); //串口2,驱动ESP8266用
LED_Init(); //LED初始化
KEY_Init(); //按键初始化
EXTIX_Init(); //外部中断初始化,按键PB1中断
STEP_MOTOR_Init(); //步进电机初始化
//Motor_Init(); //步进电机初始化函数
OLED_Init(); //OLED初始化
OLED_ColorTurn(0); //0正常显示,1 反色显示
OLED_DisplayTurn(0); //0正常显示 1 屏幕翻转显示
OLED_Clear();
//DS18B20_Init();
while(DS18B20_Init())
{
printf("DS18B20检测失败,请插好!\r\n");
delay_ms(1000);
}
printf("DS18B20检测成功!\r\n");
}
//网络初始化
void Net_Init()
{
ESP8266_Init(); //初始化ESP8266
while(OneNet_DevLink()) //接入OneNET
delay_ms(500);
LEDG = LED_ON1; //入网成功
}
int main(void)
{
unsigned char *dataPtr = NULL;
unsigned short timeCount = 300; //发送间隔变量
Hardware_Init(); //初始化外围硬件
Net_Init(); //网络初始化
while(1)
{
delay_ms(10);
timeCount ++;
//按键处理函数Key_Handle,单击:启动/关闭风扇,长按:进入/退出本地控制,双击:进入/退出自动控制
//Key_Handle1,本地控制窗户开关
Key_Handle(); //PB0按键
Key_Handle1(); //PB1按键
if(timeCount >= 300) //发送间隔 3S
{
temper=DS18B20_GetTemperture();
if(temper<0)
{
printf("检测的温度为:-");
sprintf(oledBuf,"Temp:-%.2f C",temper);
}
else
{
printf("检测的温度为: ");
sprintf(oledBuf,":%.2fC",temper);
}
printf("%.2f°C\r\n",temper);
OLED_Show(); //OLED显示
/*自动控制if-else如下*/
if(Auto_Control==1&&Local_Control==0) //若开启了自动控制且未开启本地控制就执行下面语句
{
if(temper>(float)TEMPER)
{
LEDR = 1; //开风扇,红灯亮起
LedR_Flag = 1;
}
else
{
LEDR = 0;
LedR_Flag = 0;
}
}
OneNet_SendData(); //发送数据
timeCount = 0;
ESP8266_Clear();
}
dataPtr = ESP8266_GetIPD(0);
if(dataPtr != NULL)
{
OneNet_RevPro(dataPtr);
}
}
}
最后:
需要代码的可以自行下载。下载链接
下载操作: