一. 系统概述
本系统基于STM32单片机实现主控功能,集成了温度监测与超限报警、按键控制插座开关、以及蓝牙远程控制功能。插座的开关具备定时设置功能,允许用户设定定时时间,到达设定时间后自动断电,防止意外情况的发生。用户可以通过按键设置定时时间、温度阈值,并直接控制插座开关。
二. 仿真概述
- 进入仿真模式后,OLED显示屏上会展示当前数据,此时系统尚未开始定时,且温度未超出设定范围。
- 使用虚拟串口助手模拟蓝牙APP的数据传输,仿真启动后,蓝牙端将接收到连接成功的提示。虚拟串口助手的界面如下:
- 按下设置按键可以循环切换到下一个可调整的位置,包括温度阈值、定时时间的时、分、秒及插座开关。通过调整插座开关并确认,插座将被打开。同时,发送字符A和B至蓝牙端也可直接控制插座的开关状态。
- 调节DS18B20上的红色按钮以改变实时温度,当温度超过设定阈值时,系统会触发报警提醒。
- 按下设置按键,移动到定时时间设置位置,调整到所需时间后,按下确认键开始定时。插座将在设定时间内保持工作,时间到达后自动断电,并发出声音提示。
三.程序设计
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "DS18B20.h"
#include "Timer.h"
#include "Serial.h"
#include "EXTERN-Key.h"
#include "Key.h"
uint16_t TimeNum;
int16_t limittemp;
uint8_t bian;
uint16_t shi;
uint16_t fen;
uint16_t miao;
uint16_t time;
uint8_t RxData;
char switchkey;
int main(void)
{
OLED_Init();
DS18B20_Init();
Serial_Init();
Externkey_Init();
Key_Init();
uint16_t Temp ;
OLED_ShowString(1, 1, "Temp=");
OLED_ShowString(3, 1, "time:00.00.00");
OLED_ShowString(2, 1, "limittemp=");
OLED_ShowString(4, 1, "switchkey=");
Serial_SendString("ready!");
while (1)
{
//Serial_SendString("ready!");
if(Temp/10%100>=limittemp)
{
GPIO_SetBits(GPIOA, GPIO_Pin_5);
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
}
if(Temp/10%100<limittemp)
{
GPIO_SetBits(GPIOA, GPIO_Pin_4);
}
if (Serial_GetRxFlag() == 1) //检查串口接收数据的标志位
{
RxData = Serial_GetRxData(); //获取串口接收的数据
Serial_SendByte(RxData); //串口将收到的数据回传回去,用于测试
if (RxData =='A')
{
GPIO_SetBits(GPIOA, GPIO_Pin_5);
}
if (RxData == 'B')
{
GPIO_ResetBits(GPIOA, GPIO_Pin_5);
}
}
if(TimeNum == 1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_5);
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
Delay_ms(100);
GPIO_SetBits(GPIOA, GPIO_Pin_4);
}
if(bian == 0)
{
OLED_ShowNum(3, 12, (TimeNum % 3600) % 60, 2);
OLED_ShowNum(3, 9, (TimeNum % 3600) / 60, 2);
OLED_ShowNum(3, 6, TimeNum / 3600, 2);
OLED_ShowNum(2, 11, limittemp, 2);
OLED_ShowChar(4,11,switchkey);
if(DS18B20_Reset()==0)
{
Temp = DS18B20_ReadTemp();
if(flag==1)
{
OLED_ShowString(1, 1, "Temp=-");
OLED_ShowString(1, 10, ".");
OLED_ShowNum(1,7,Temp/10%100,3);
OLED_ShowNum(1,11,Temp%10,1);
}
else
{
OLED_ShowString(1, 1, "Temp=+");
OLED_ShowString(1, 10, ".");
OLED_ShowNum(1,7,Temp/10%100,3);
OLED_ShowNum(1,11,Temp%10,1);
}
}
else
{
OLED_ShowString(1,1,"No sensor ");
Delay_ms(5);
}
}
if(bian == 1)
{
OLED_ShowString(2, 11, " ");
Delay_ms(500);
OLED_ShowNum(2, 11, limittemp, 2);
Delay_ms(500);
}
if(bian == 2)
{
OLED_ShowString(3, 12, " ");
Delay_ms(500);
OLED_ShowNum(3, 12, miao, 2);
Delay_ms(500);
}
if(bian == 3)
{
OLED_ShowString(3, 9, " ");
Delay_ms(500);
OLED_ShowNum(3, 9,fen, 2);
Delay_ms(500);
}
if(bian == 4)
{
OLED_ShowString(3, 6, " ");
Delay_ms(500);
OLED_ShowNum(3, 6, shi, 2);
Delay_ms(500);
}
if(bian == 5)
{
OLED_ShowChar(4,11,switchkey);
Delay_ms(500);
OLED_ShowString(4, 11, " ");
Delay_ms(500);
}
if(bian == 6)
{
if(switchkey =='k')
GPIO_SetBits(GPIOA, GPIO_Pin_5);
if(switchkey =='g')
GPIO_ResetBits(GPIOA, GPIO_Pin_5);
TimeNum =time ;
shi = 0;
fen = 0;
miao = 0;
bian = 0;
}
}
}
24-32f-61