高频课设-基于STM32的温度无线监测系统

题目二 多点温度无线监测系统的设计

(1) 任务
设计制作一个多点温度无线监测系统,实现多点温度的实时无线监测。

(2)要求

  1. 测温点数:>=2个;
  2. 测温范围:-10~+45℃;
  3. 精度:±0.5℃;
  4. 监控距离:>=5m;
  5. 电路制作时,必须注明本组成员学号与姓名。

(3)核心元器件(供参考)
在这里插入图片描述
部分接线说明

步进电机:
IN1:PB12、IN2:PB13、IN3:PB14、IN4:PB15、
VCC:5V,GND:GND

继电器:
VCC: 5V GND: GND 输入端:PA4
由于继电器是高电平触发,故把PA4改为高电平点亮灯

特别说明:
两个设备都是一样的,都是感知控制节点,但步进电机、OLED显示屏和继电器只有一个,也就只能如下图这样了。
在这里插入图片描述

功能实现

1. 本地控制:

  1. 单击按键S1(PB0),开启或关闭风扇(开启时继电器常开触点吸合)
  2. 双击按键S1,进入或退出自动控制模式
  3. 长按按键S1,进入或退出本地控制模式
  4. 第1次按下S2(PB1)按键,窗户全开,即步进电机右转1圈(独占CPU)
  5. 第2次按下S2(PB1)按键,窗户全关,即步进电机左转1圈(独占CPU)
    以此轮流切换
    本地控制是必须的,万一远程控制出了故障,也可以使用本地控制
  6. OLED显示屏依次显示(中文)
    当前温度:带两位小数
    风扇状态:开启/关闭(红灯亮表示开启)
    窗户状态:全开/全关/半开
    本地控制状态:开启/关闭

2. 手机远程监控

由图可知,使用的ONENET云平台,在手机APP上实现的功能有:

  1. 远程监测到温度数据
  2. 设备的运行情况,如风扇是否开启,窗户是否全关
  3. 设置温度阈值,用于自动控制
  4. 远程控制风扇的开启/关闭
  5. 远程控制窗户的开启/关闭,可以随意调节窗户开启的大小
  6. 设置电机的转速,也就是窗户关闭/开启时的速度,转速越慢力矩越大
  7. 远程开启/关闭自动控制
  8. 最下面的数据流切换框是用来切换不同设备的

在这里插入图片描述

4. 串口助手

  1. 显示温度数据
  2. 显示下发指令的内容
    在这里插入图片描述

程序源码:

代码有点多,所以就只发一部分的代码。

//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);
		}	
	}
}


最后:
需要代码的可以自行下载。下载链接
下载操作:
在这里插入图片描述

  • 14
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

⁽⁽ଘ晴空万里ଓ⁾⁾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值