整体图(最后有视频演示)
设备功能说明
检测床内温度,检测婴儿状态,配置RTC实时时间,电机PWM按键三档调速,自动开关加热器,发送温度到手机终端,把所有要呈现的状态通过OLED屏幕显示
元件清单
主控 stm32f103c8t6
导线 若干根
OLED显示屏 一个
VCC-3.3/5V GND-GND SCL-单片机SCL脚 SDA-单片机SDA脚
轻触按键 三个
对脚连接 一脚接GND 一脚接VCC
一路5v继电器模块 一个
上面口VCC-5V GND-GND PIN-单片机信号脚
下面口选择常开/常闭连接负载
L298N电机驱动板模块 一个
接法如下 由于不用配置正反转可以四个口随便接 只是用来驱动电机的作用(需要与单片机共地)
MAX声音传感模块 一个
VCC接5VGND-GND OUT接信号脚
Jdy-311蓝牙模块
接法 VCC GND接5V的源 TXD接单片机RXD RXD接单片机TXD
DS18b20传感器 一个
从左到右 GND OUT VCC 连接单片机
4.7K贴片电阻 一个
四针排组两个
三针排组一个
四针弯形弯型排组一个(小器件不配图)
程序部分 (附带注释)
main.c函数
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(DHT11_Init())
// {
// 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 \r\n", 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);
}
所有代码加群分享 QQ群号为721421120
下面进行视频展示
基于stm32f103的智能婴儿车设备
转载:https://blog.csdn.net/lllmeimei/article/details/116852724
查看评论