问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32智能台灯项目详解:从硬件设计到云端控制

创作时间:
作者:
@小白创作中心

STM32智能台灯项目详解:从硬件设计到云端控制

引用
1
来源
1.
https://m.elecfans.com/article/6481788.html

本文将介绍一个基于STM32的智能台灯项目,该台灯集成了温湿度检测、光照强度检测、人体感应等多种功能,并可通过手机APP进行远程控制。项目使用STM32F103C8T6作为主控芯片,通过ESP8266模块接入机智云平台,实现了数据的云端存储和远程控制。

项目简介

功能详解

STM32智能台灯(机智云)系统具有以下功能:

  1. 检测功能:系统可以检测周围环境的温湿度数据、距离、人体信号、光照强度(Lux)。
  2. 显示功能:将检测到的数据在OLED屏幕上显示。
  3. 控制功能:系统可以通过PWM对台灯进行无极调光。
  4. 手动模式:通过按键控制台灯的亮度。
  5. 自动模式:当环境亮度低于阈值,并且有人时,会自动调节台灯亮度。
  6. 护眼功能:当系统检测到人距离台灯过近时,蜂鸣器会发出报警。
  7. 阈值调节:系统传感器阈值大小可以通过按键或者APP自行设置调节。
  8. 接入云平台:系统通过ESP8266 WIFI模块连接网络,接入机智云服务器。
  9. 远程控制:可以通过APP查看传感器数据,以及远程控制台灯、远程调节阈值。

材料清单

  • STM32F103C8T6核心板
  • DHT11 温湿度传感器
  • OLED屏幕
  • 蜂鸣器模块
  • 超声波模块
  • 热释电人体检测模块
  • LED灯
  • 电池座
  • 独立按键
  • ESP8266-01S wifi模块
  • 云平台机智云

原理图设计

PCB硬件设计

PCB图:

程序设计

int main(void)
{
    ADCX_Init();
    PWM_Init(100 - 1, 720 - 1);
    Timer2_Init(9,14398);
    Uart2_Init(9600);
    Uart1_Init(115200);
    IWDG_Init(); //初始化看门狗
    LDR_Init();
    OLED_Init();
    DHT11_Init();
    LED_Init();
    Key_Init();
    HC_SR501_Init();
    HC_SR04_Init();
    Buzzer_Init();
    MyRTC_Init();
    Sensorthreshold.Illumination_threshold = FLASH_R(FLASH_START_ADDR); //从指定页的地址读FLASH
    Sensorthreshold.Distance_threshold = FLASH_R(FLASH_START_ADDR+2); //从指定页的地址读FLASH
    GENERAL_TIM_Init();
    userInit(); //完成机智云初始赋值
    gizwitsInit(); //开辟一个环形缓冲区
    //GPIO_SetBits(Buzzer_PROT, Buzzer);
    //Delay_ms(1200);

    while (1)
    {
        IWDG_ReloadCounter(); //重新加载计数值 喂狗
        sensorScan(); //获取传感器数据

        switch (menu)
        {
            case display_page:
                MyRTC_ReadTime(); //调用此函数后,RTC硬件电路里时间值将刷新到全局数组
                OLED_Menu_SensorData(); //显示主页面传感器数据、系统模式等内容
                OLED_Menu(); //显示主页面的固定内容
                if (!systemModel)
                {
                    LED_PWM_KEY(); //按键控制LED的PWM
                }
                //切换系统模式
                if (KeyNum == KEY_1)
                {
                    KeyNum = 0;
                    systemModel = ~systemModel;
                    if (systemModel)
                    {
                        currentDataPoint.valueModel = 1;
                    }
                    else
                    {
                        currentDataPoint.valueModel = 0;
                    }
                }
                //判断是否进入阈值设置界面
                if (KeyNum == KEY_Long1)
                {
                    KeyNum = 0;
                    OLED_Clear(); //清屏
                    menu = settingsPage; //跳转到阈值设置界面
                }
                break;
            case settingsPage:
                OLED_SetInterfacevoid(); //显示阈值设置界面的固定内容
                OLED_Option(SetSelection()); //实现阈值设置页面的选择功能
                ThresholdModification(SetSelection()); //实现阈值调节功能
                //判断是否退出阈值设置界面
                if (KeyNum == KEY_2)
                {
                    KeyNum = 0;
                    OLED_Clear(); //清屏
                    menu = display_page; //跳转到主界面
                    //存储修改的传感器阈值至flash内
                    FLASH_W(FLASH_START_ADDR, Sensorthreshold.Illumination_threshold, Sensorthreshold.Distance_threshold);
                    currentDataPoint.valueIllumination_threshold = Sensorthreshold.Illumination_threshold;
                    currentDataPoint.valueDistance_threshold = Sensorthreshold.Distance_threshold;
                }
                break;
            case timeSettingsPage:
                OLED_ThresholdTime(); //显示时间设置界面的内容
                OLED_Time_Option(SetSelection()); //实现间设置界面的选择功能
                TimeModification(SetSelection()); //实现时间调节功能
                //判断是否退出时间设置界面
                if (KeyNum == KEY_2)
                {
                    KeyNum = 0;
                    //将更改的数据赋值回RTC数组中
                    MyRTC_Time[3] = hour;
                    MyRTC_Time[4] = minute;
                    MyRTC_Time[5] = second;
                    MyRTC_SetTime(); //调用此函数后,全局数组里时间值将刷新到RTC硬件电路
                    OLED_Clear(); //清屏
                    menu = settingsPage; //回到阈值设置界面
                }
                break;
        }
        //判断上位机是否更改阈值,如更改则保存至flash中
        if (valueFlashflag)
        {
            valueFlashflag = 0;
            //存储修改的传感器阈值至flash内
            FLASH_W(FLASH_START_ADDR, Sensorthreshold.Illumination_threshold, Sensorthreshold.Distance_threshold);
        }
        userHandle(); //更新机智云数据点变量存储的值
        gizwitsHandle((dataPoint_t *)¤tDataPoint); //数据上传至机智云
    }
}

实验效果

通过上述设计和实现,智能台灯可以实现预期的功能。用户可以通过手机APP实时查看环境数据,并对台灯进行远程控制。同时,台灯的本地控制功能也十分完善,可以满足不同场景下的使用需求。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号