基于stm32的智能台灯 1.利用光敏电阻检测光照强度,在模式(自动,手动,语音)为自动下,自动选择台灯光照强度并语音播报

最近捣鼓了一个基于STM32的智能台灯项目,感觉挺有趣,和大家分享分享。这台灯能通过光敏电阻检测光照强度,并且在自动模式下,能自动选择合适的台灯光照强度,还会语音播报当前光照情况,超酷的有木有!

光敏电阻检测光照强度

光敏电阻是这个项目里检测光照强度的关键角色。它的阻值会随着光照强度的变化而改变,光照越强,阻值越小;光照越弱,阻值越大。我们利用STM32的ADC(模拟数字转换器)功能,将光敏电阻变化的模拟信号转换为数字信号,这样STM32就能“读懂”光照强度啦。

下面来点代码瞧瞧:

// 假设使用的是STM32F10x系列
#include "stm32f10x.h"

// 初始化ADC
void ADC_Init(void) {
    ADC_InitTypeDef ADC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能ADC1和GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);

    // 配置PA1为模拟输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // ADC1配置
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);

    // 使能ADC1
    ADC_Cmd(ADC1, ENABLE);

    // 复位校准
    ADC_ResetCalibration(ADC1);
    // 等待复位校准完成
    while(ADC_GetResetCalibrationStatus(ADC1));
    // 开始校准
    ADC_StartCalibration(ADC1);
    // 等待校准完成
    while(ADC_GetCalibrationStatus(ADC1));
}

// 获取ADC转换值
uint16_t Get_ADC_Value(void) {
    // 选择转换通道PA1
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
    // 启动转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    // 等待转换完成
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    // 返回转换值
    return ADC_GetConversionValue(ADC1);
}

这段代码首先初始化了ADC相关的时钟和GPIO引脚,把PA1配置为模拟输入,用于连接光敏电阻。然后对ADC1进行详细的参数设置,包括工作模式、转换模式、数据对齐等。最后提供了一个函数GetADCValue来获取ADC转换后的数字值,这个值就代表了光敏电阻检测到的光照强度。

自动模式下光照强度选择与语音播报

在自动模式下,我们根据获取到的光照强度值,来决定台灯的亮度。比如光照较弱时,调亮台灯;光照较强时,调暗台灯。同时,利用语音模块播报当前光照强度情况。

基于stm32的智能台灯 1.利用光敏电阻检测光照强度,在模式(自动,手动,语音)为自动下,自动选择台灯光照强度并语音播报

假设我们使用的语音模块是通过串口与STM32通信,发送特定指令来播报不同内容。

// 假设已经初始化好串口USART1用于与语音模块通信
void Voice_Report(uint16_t adc_value) {
    char report[50];
    if (adc_value < 200) {
        // 光照很弱
        sprintf(report, "当前光照很弱");
        // 这里通过串口发送report内容到语音模块,假设发送函数为USART_SendString
        USART_SendString(USART1, report);
        // 调节台灯亮度,假设调节亮度函数为Adjust_Light
        Adjust_Light(100); // 调亮到100%亮度
    } else if (adc_value < 400) {
        // 光照较弱
        sprintf(report, "当前光照较弱");
        USART_SendString(USART1, report);
        Adjust_Light(70); // 调亮到70%亮度
    } else if (adc_value < 600) {
        // 光照适中
        sprintf(report, "当前光照适中");
        USART_SendString(USART1, report);
        Adjust_Light(50); // 亮度50%
    } else {
        // 光照较强
        sprintf(report, "当前光照较强");
        USART_SendString(USART1, report);
        Adjust_Light(30); // 调暗到30%亮度
    }
}

这段代码里的VoiceReport函数,根据传入的ADC值(也就是光照强度),判断光照情况,然后通过串口给语音模块发送对应的播报内容,同时调用AdjustLight函数调节台灯亮度。

通过这些代码和功能的实现,基于STM32的智能台灯就能在自动模式下,根据环境光照强度自动调节亮度,并语音播报光照情况啦。整个项目过程虽然有点小复杂,但看着它一步步实现各种功能,满满的成就感!希望这篇博文能给对类似项目感兴趣的小伙伴一些启发~

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐