干翻全岛蛙蛙 发表于 2024-6-11 19:25:06

STM32项目分享:智能台灯体系

目录
一、前言
二、项目简介
1.功能详解
2.主要器件
三、原理图设计
四、PCB硬件设计
1.PCB图 
2.PCB板及元器件图
五、步调设计 
六、实验效果 
七、资料内容
项目分享
一、前言

项目制品图片:
https://img-blog.csdnimg.cn/direct/ca0e3e5e951f403b9148f98009da9c4f.jpeg
哔哩哔哩视频链接:
https://www.bilibili.com/video/BV1kQ4y1p77V/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2

(资料分享见文末) 
二、项目简介

1.功能详解

基于STM32智能台灯体系。
功能如下:

[*]亮度控制:按键控制照明灯的亮度(5挡亮度)
[*]计时功能:按键启动计时,累计台灯运行时间(作息时间)
[*]OLED表现:表现当前模式、环境光强、超声波距离
[*]控制模式:通过按键控制照明灯为手动模式/自动模式
[*]蓝牙APP控制:通过蓝牙APP控制照明灯模式选取、亮度调治、计时等功能
[*]智能调光:自动模式下根据外界光线变化,LED照明灯自动调治亮度
[*]人体姿态提醒:超声波距离近于5cm触发蜂鸣器报警,提醒纠正人体姿态
2.主要器件



[*]STM32F103C8T6最小体系板
[*]OLED表现屏(4针I2C协议)
[*]光敏传感器
[*]大功率LED照明灯模块
[*]HC-SR04超声波传感器
[*]HC-SR501人体红外传感器
[*]蓝牙模块(BT04-A)
[*]蜂鸣器
三、原理图设计

https://img-blog.csdnimg.cn/direct/14c82df7264a425da04544c857d22f10.png​
四、PCB硬件设计

1.PCB图 

​https://img-blog.csdnimg.cn/direct/3901451b52594636a8725bd8517eed18.jpeghttps://img-blog.csdnimg.cn/direct/7c3148b3210647bda10cd5fc79198344.jpeg
2.PCB板及元器件图

https://img-blog.csdnimg.cn/direct/7a9ac868c151456da1c763dd3765ed1a.jpeg​
五、步调设计 

int main(void)
{       

        unsigned char p=" ";

        u8 datatemp;       
        unsigned intSTEP=0;                        //步数临时替换值                       
        _Bool Heart_OK = 0;                                //读取到正确心率标志位
        unsigned char Heart = 0;                //心率值
        short temperature = 0;                                 //温度值
       
        STEPS_DIS = 1;
        delay_init();                                  //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//设置中断优先级分组为组3:2位抢占优先级,2位响应优先级
       
    LED_Init();                                                  //初始化与控制设备连接的硬件接口
        OLED_Init();                                        //OLED初始化
        delay_ms(50);
        OLED_CLS();                                                //清屏
        OLED_ShowCN(32,2,0);                        //万事可期(欢迎使用)
        OLED_ShowCN(32+16,2,1);
        OLED_ShowCN(32+32,2,2);
        OLED_ShowCN(32+32+16,2,3);

        ADXL345_Init();
       
        while(ADXL345_Init())                        //3D加速度传感器初始化       
        {
                OLED_ShowStr(0,0,"ADXL345 Error",2);
                delay_ms(200);
                OLED_ShowStr(0,0,"             ",2);
                delay_ms(200);
        }
        while(DS18B20_Init())        //DS18B20初始化       
        {
                OLED_ShowStr(0,0,"DS18B20 Error",2);
               
                delay_ms(200);
                OLED_ShowStr(0,0,"             ",2);       

                delay_ms(200);
        }
        delay_ms(100);
        while(DS18B20_Get_Temp()==850);        //DS18B20刚上电时候 读取的值是850 这里等待 直到不是850才开始下一步               
        delay_ms(5000);
       
        OLED_CLS();                                                //清屏
        Adc_Init();
        TIM3_Int_Init(1999,71);                        //定时2ms中断
       
        uart_init(9600);                               //串口一初始化为9600
        TIM2_Int_Init(199,7199);                //10Khz的计数频率,计数到500为20ms
        KEY_Init();                                                //IO初始化               
        EXTIX_Init();                                        //外部中断初始化
       
        OLED_CLS();                                                //清屏
        Dis_Init();                                               

        STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE);//flash中读出步数
       
        STEPS = (datatemp-0x30)*10000+(datatemp-0x30)*1000+(datatemp-0x30)*100+(datatemp-0x30)*10+(datatemp-0x30);//读到值转换为步数
        RTC_Init();
       
//        RTC_Set(2019,8,5,20,43,55);//设置时间
        while(1)
        {       

                if(Timer_Flag==1)                                        //500ms到 读取数据
                {
                        Timer_Flag = 0;                                        //清除标志
                        TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE );                                                 //使能指定的TIM3中断,允许更新中断
                        TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE );                                                 //使能指定的TIM3中断,允许更新中断               
                        temperature=DS18B20_Get_Temp();        //读取温度
                        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );                                                 //使能指定的TIM3中断,允许更新中断
                        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );                                                 //使能指定的TIM3中断,允许更新中断

                        TIM_Cmd(TIM2, ENABLE);                //使能TIMx       
                        if (QS == true)                                        //读取到了心率信号
                        {                       
                                QS = false;                                 //清除标志 等待下一次读取
                                if(BPM>HEART_MIN_ERROR&&BPM<HEART_MAX_ERROR)                //读取到的值再正常心率区间 40-160内
                                {
                                        Heart_OK = 1;                        //标志位置一
                                        Heart = BPM;                        //心率传递给Heart
                                }
                                else
                                {
                                        Heart_OK = 0;                        //标志位清零
                                        Heart = 0;                                //设置为0
                                }       
                        }
                }
                               
                if(ADXL345_FLAG==1)                                        //20ms到?
                {
                        ADXL345_FLAG = 0;                                  //清除标志位
                        step_counter();       
                }
//                printf("三轴加速器: %d \r\n",ADXL345_FLAG);        //串口发送出去

                delay_ms(20);       
                if(STEP!=STEPS)                                                //步数发生改变 存储一次
                {
                        STEP = STEPS;
                        TEXT_Buffer=(u16)STEPS/10000+0x30;
                        TEXT_Buffer=(u16)STEPS%10000/1000+0x30;
                        TEXT_Buffer=(u16)STEPS%10000%1000/100+0x30;
                        TEXT_Buffer=(u16)STEPS%10000%1000%100/10+0x30;
                        TEXT_Buffer=(u16)STEPS%10000%1000%100%10+0x30;

                        STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
                }
                if(calendar.hour==0&&calendar.min==0&&(calendar.sec==0||calendar.sec==1||calendar.sec==2))                //凌晨00:00:00清除步数
                {
                        STEPS = 0;
                        TEXT_Buffer=(u16)STEPS/10000+0x30;
                        TEXT_Buffer=(u16)STEPS%10000/1000+0x30;
                        TEXT_Buffer=(u16)STEPS%10000%1000/100+0x30;
                        TEXT_Buffer=(u16)STEPS%10000%1000%100/10+0x30;
                        TEXT_Buffer=(u16)STEPS%10000%1000%100%10+0x30;

                        STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
                        delay_ms(500);
                       
                }
                Key_set();                                                        //时间设置
       
                if(KEY0==0)                                                        //KEY0切换显示按键
                {
                        while(KEY0==0);                                        //等待松开
                        OLED_CLS();                                                //清屏       
                        if(Dis_mode==0)                                        //如果上一次是显示心率、步数、体温 的 则显示时间
                                Dis_mode = 1;
                        else                                                         //如果上一次不是显示心率、步数、体温 的 则心率、步数、体温
                        {
                                Dis_mode = 0;                               
                                Dis_Init();                                        //显示汉字信息
                        }               
                }
                if(KEY2==0)                                                           //清除步数
                {
                        while(KEY2==0);
                        STEPS = 0;
                        TEXT_Buffer=(u16)'0';
                        TEXT_Buffer=(u16)'0';
                        TEXT_Buffer=(u16)'0';
                        TEXT_Buffer=(u16)'0';
                        TEXT_Buffer=(u16)'0';

                        STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);                //清除后存储一次数据
                }
       
                if(update_flag==1)                                         //2S标志到 发送一次数据到手机APP
                {
                        update_flag = 0;
                        printf("Step:%5d H:%3d T:%4.1f \r\n",STEPS,Heart,(float)temperature/10);        //串口发送出去

                }
       
                switch(Dis_mode)
                {
                        case 0:                                                                                          //显示传感器数据
                                if(STEPS_DIS==1)                                                        //刷新计步
                                {
                                        sprintf((char*)p,":%-5d ",STEPS);                //显示步数
                                        OLED_ShowStr(32,2,p,2);
                                }
                                sprintf((char*)p,":%4.1f    ",(float)temperature/10);
                                OLED_ShowStr(32,4,p,2);                                                //显示温度
                               
                                if(Heart_OK==1)                                                                //读取到正确心率
                                {
                                        sprintf((char*)p,":%3dr/min",Heart);        //显示心率
                                        OLED_ShowStr(32,0,p,2);       
                                }
                                else
                                {
                                        sprintf((char*)p,":---r/min");       
                                        OLED_ShowStr(32,0,p,2);
                                }
                        break;

                        case 1:                                                                                        //显示时间 日期等信息
                                RTC_Display();                                                                //显示时钟
                        break;
                }
               
        }       
}

六、实验效果 

​https://img-blog.csdnimg.cn/direct/c7019f7416bb4475bbee1b7088097e3b.jpeg
​https://img-blog.csdnimg.cn/direct/bd53022e37c2482ebfc4eda8c2d3f71a.jpeg
七、资料内容

https://img-blog.csdnimg.cn/direct/73286180786c44a4b72d74b300213cf2.png​
项目分享


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: STM32项目分享:智能台灯体系