一.系统简述
本系统采用STM32微控制器作为核心控制单元,集成了温度监测与超限报警的功能。用户可以通过按键直接控制插座的开关,亦可通过蓝牙连接进行远程操作。此外,系统支持定时功能,能够根据预设时间自动切断插座电源,以避免潜在的安全隐患。通过按键,用户可以方便地设置定时参数、温度阈值,并立即开关插座。
二.仿真介绍
- 在仿真模式下,OLED显示屏上将实时展示当前数据。此时系统尚未启动定时功能,且温度处于安全范围内。
- 通过虚拟串口助手模拟蓝牙应用的数据传输,当仿真启动成功后,蓝牙设备将收到连接确认信息。以下是虚拟串口助手的连接状态界面:
- 按下设置键后,系统会逐步切换到下一个可以调整的选项,这些选项包括温度阈值、定时器的小时、分钟和秒,及插座的开关状态。此时,如果调整到插座开关并确认,则插座会被打开。此外,发送字符"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