一.系统概述
系统通过STM32单片机进行主控,系统内具有温度检测和超限报警的功能,还具有按键控制插座开关功能和蓝牙端控制开关的功能。另外插座的开关还可以定时设置,到达定时时间插座电源关闭,防止意外发生。通过按键可以设定定时时间和温度阈值以及直接控制插座的开关。
二.仿真概述
1.进入仿真后可以看到OLED显示屏端显示的数据,此时没有开始定时,温度没有超限。
2. 通过虚拟串口助手模拟蓝牙APP的数据收发,当启动仿真后就会在蓝牙端接收到连接成功指令,虚拟串口助手的链接如下所示:波特律动 串口助手 (keysking.com)https://serial.keysking.com/
3. 按下设置按键,每次按下设置按键就会移动到下一个可调节位置,可调节的参数包括温度阈值,定时时间的时分秒以及插座的开关,此时调节下插座开关并按下确认按键就会打开插座。在蓝牙端发送字符A和B也可以直接控制插座的开关。
4. 调节DS18B20的红色按钮就能调节实时温度,当检测到温度超过设定阈值就会报警提醒。
5. 按下设置按键并将设置参数移动到定时时间处,设置合适的时间后按下确认按键开始定时,定时时间内插座工作,定时时间结束自动关闭并响应一声进行提醒。
三.程序设计
#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;
}
}
}