婴儿床监测主要有以下功能:
床内温度;检测婴儿状态;配置RTC实时时间;电机PWM按键三档调速;自动开关加热器;发送温度到手机终端;把所有要呈现的状态通过OLED屏幕显示。
感兴趣的小伙伴还可以加入更多的功能。
# 硬件元件清单 #
主控为STM32F103C8T6,使用最小系统板:
OLED显示屏1个,连接方式:VCC-3.3/5V;GND-GND;SCL-单片机SCL脚;SDA-单片机SDA脚
轻触按键3个,连接方式:对脚连接;一脚接GND;一脚接上拉电阻至电源、及IO口引脚
一路5v继电器模块 1个,连接方式:上面口:VCC-5V;GND-GND;PIN-单片机信号脚下面口:选择常开/常闭连接负载
L298N电机驱动板模块 1个,连接方式如下:
由于不用配置正反转可以四个口随便接 只是用来驱动电机的作用(需要与单片机共地)。
MAX声音传感模块 1个,连接方式:VCC接5V,GND-GND,OUT接信号脚
Jdy-311蓝牙模块,连接方式:VCC、GND接5V的源,TXD接单片机RXD,RXD接单片机TXD
DS18b20传感器 1个,连接方式:从左到右,GND OUT VCC 连接单片机
int main(void)
{
u8 ccc=99;//测试值
u8 a;
u8 key=0;
u16 led0pwmval=0;
u8 dir=1;
u8 t=0;
short temperature;
u8 humidity;//以上都为用作判断的变量定义
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 LED_Init();
//delay_ms(8000);
uart_init(9600);//串口初始化 波特率为9600
OLED_Init(); //初始化OLED
OLED_Clear(); //清屏
KEY_Init(); //按键初始化
TIM3_PWM_Init(899,0);//定时器3PWM初始化
LED_Init();//io口初始化
usmart_dev.init(SystemCoreClock/1000000); //初始化USMART
RTC_Init();//时钟初始化
ADC_Configuration1();//adc配置
TIM_SetCompare2(TIM3,500);//占空比设置
OLED_ShowCHinese(0,0,1);//oled显示文字
OLED_ShowCHinese(18,0,15);
OLED_ShowCHinese(36,0,16);
OLED_ShowCHinese(54,0,17);
OLED_ShowCHinese(110,0,6);
OLED_ShowCHinese(0,2,11);
OLED_ShowCHinese(18,2,12);
OLED_ShowCHinese(36,2,13);
OLED_ShowCHinese(54,2,14);
OLED_ShowCHinese(0,4,18);
OLED_ShowCHinese(18,4,19);
OLED_ShowCHinese(36,4,20);
OLED_ShowCHinese(54,4,21);
//OLED_ShowCHinese(32,6,22);
//OLED_ShowCHinese(60,6,23);
OLED_ShowCHinese(108,4,26);
while(DS18B20_Init())//等待ds18b20初始化完成
{
delay_ms(200);
delay_ms(200);
delay_ms(200);
}
while(1)
{
if(t%10==0) //每100ms读取一次
{
temperature=DS18B20_Get_Temp();
OLED_ShowNum(70,0,temperature/10,2,16); //显示温度
//USART_SendData(USART1,ccc);
printf("%d",temperature);//把温度通过串口发出
if(temperature/10<23)//温度低于23摄氏度 打开加热器
GPIO_ResetBits(GPIOB,GPIO_Pin_7);
if(temperature/10>=30)//温度高于等于30摄氏度 关闭加热器
GPIO_SetBits(GPIOB,GPIO_Pin_7);
//
OLED_ShowString(85,0,".",16);
OLED_ShowNum(90,0,temperature%10,2,16);
}
delay_ms(10);
t++;
if(t==20)
{
t=0;
}
if(a!=calendar.sec)//RTC实时时间显示
{
a=calendar.sec;
// LCD_ShowNum(60,130,calendar.w_year,4,16);
OLED_ShowNum(0,6,calendar.w_year,4,16);
OLED_ShowString(30,6,".",16);
OLED_ShowString(30,6,".",16);
// LCD_ShowNum(100,130,calendar.w_month,2,16);
OLED_ShowNum(33,6,calendar.w_month,1,16);
OLED_ShowString(50,6,".",16);
// LCD_ShowNum(123,130,calendar.w_date,2,16);
// OLED_ShowString(72,6,".",16);
OLED_ShowNum(53,6,calendar.w_date,2,16);
// LCD_ShowNum(60,162,calendar.hour,2,16);
OLED_ShowString(70,6,".",16);
OLED_ShowNum(73,6,calendar.hour,2,16);
// LCD_ShowNum(84,162,calendar.min,2,16);
OLED_ShowNum(93,6,calendar.min,2,16);
OLED_ShowString(88,6,".",16);
// LCD_ShowNum(108,162,calendar.sec,2,16);
OLED_ShowString(108,6,".",16);
OLED_ShowNum(113,6,calendar.sec,2,16);
// LED0=!LED0;
}
delay_ms(10);
AD_value = ADC_ConvertedValue;
AD_value = (AD_value/4096)*3.3;//算法得到电压值
// printf("The current Sound AD value = %4.2fV rn", AD_value);
if(AD_value>=2)//通过转化而来电压值判断婴儿状态
{
OLED_ShowCHinese(90,2,31);
OLED_ShowCHinese(108,2,32);
delay_ms(200);
}
if(AD_value<2)
{
OLED_ShowCHinese(90,2,29);
OLED_ShowCHinese(108,2,30);
}