光敏电阻模块

元器件
传感器
库存 2000

介绍

光敏电阻传感器模块,采用GL5516/GL5528光敏电阻+LM393比较器,检测环境光照强度。数字开关量输出(DO,阈值可调)+ 模拟量输出(AO,光照越强电压越高),3.3-5V供电,4线接口。广泛用于自动路灯、光线检测、遮光报警等场景。

规格参数

参数
PCB尺寸约32mm x 14mm
指示灯电源(红) + DO触发(绿)
暗电阻~0.5MΩ(GL5516) / ~1MΩ(GL5528)
比较器LM393
工作电压3.3V-5V DC
检测方式分压+比较器,电位器调节阈值
输出接口DO(数字开关量) + AO(模拟电压)
亮电阻(10Lux)5-10kΩ(GL5516) / 10-20kΩ(GL5528)
光敏电阻型号GL5516 / GL5528

代码例程

光敏电阻传感器模块代码例程.md

# 光敏电阻传感器模块代码例程

## 1. STM32 HAL 库驱动

```c
// ldr_sensor.h
#ifndef __LDR_SENSOR_H
#define __LDR_SENSOR_H

#include "main.h"

/* 按实际接线修改 */
#define LDR_DO_PORT     GPIOB
#define LDR_DO_PIN      GPIO_PIN_2    // 数字输出
#define LDR_DO_CLK_EN() __HAL_RCC_GPIOB_CLK_ENABLE()

/* ADC 用于 AO 引脚 */
#define LDR_AO_ADC      hadc1          // 使用 ADC1
#define LDR_AO_CH       ADC_CHANNEL_0  // PA0

void LDR_Init(void);
uint8_t LDR_IsDark(void);              // 数字量:1=暗,0=亮
uint16_t LDR_ReadAO(void);             // 模拟量:值越大光照越强
float LDR_GetLux(uint16_t adc_val);    // 近似Lux(需标定)

#endif
```

```c
// ldr_sensor.c
#include "ldr_sensor.h"

static ADC_HandleTypeDef *adc_handle;

void LDR_Init(void) {
    // GPIO 初始化(DO 数字输入)
    LDR_DO_CLK_EN();
    GPIO_InitTypeDef gpio = {
        .Pin = LDR_DO_PIN, .Mode = GPIO_MODE_INPUT,
        .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_LOW
    };
    HAL_GPIO_Init(LDR_DO_PORT, &gpio);

    // 假设 ADC 已在 main 中初始化
    adc_handle = &LDR_AO_ADC;
}

/* 数字量:DO 为低电平时表示暗 */
uint8_t LDR_IsDark(void) {
    return (HAL_GPIO_ReadPin(LDR_DO_PORT, LDR_DO_PIN) == GPIO_PIN_RESET) ? 1 : 0;
}

/* 模拟量:读取 ADC 原始值 */
uint16_t LDR_ReadAO(void) {
    HAL_ADC_Start(adc_handle);
    HAL_ADC_PollForConversion(adc_handle, 10);
    return HAL_ADC_GetValue(adc_handle);
}

/* 近似光照度转换(需根据实际标定) */
float LDR_GetLux(uint16_t adc_val) {
    // 以 12bit ADC (0-4095) 为例,3.3V 供电
    float voltage = adc_val * 3.3f / 4095.0f;
    // 经验公式:Lux ≈ k × (V / (VCC - V))  需标定 k 值
    float ratio = voltage / (3.3f - voltage);
    return 100.0f * ratio;  // 粗略值,仅供参考
}
```

## 2. STM32 自动夜灯示例

```c
#include "ldr_sensor.h"
#include <stdio.h>

#define LED_PORT  GPIOB
#define LED_PIN   GPIO_PIN_10

int main(void) {
    HAL_Init();
    SystemClock_Config();

    LDR_Init();

    // LED 控制引脚
    GPIO_InitTypeDef led = {
        .Pin = LED_PIN, .Mode = GPIO_MODE_OUTPUT_PP,
        .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_LOW
    };
    HAL_GPIO_Init(LED_PORT, &led);

    char msg[64];

    while (1) {
        uint16_t ao = LDR_ReadAO();

        if (LDR_IsDark()) {
            // 暗 → 开灯
            HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
            sprintf(msg, "DARK!  AO=%d → LED ON\r\n", ao);
        } else {
            // 亮 → 关灯
            HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
            sprintf(msg, "LIGHT  AO=%d → LED OFF\r\n", ao);
        }
        printf("%s", msg);
        HAL_Delay(200);
    }
}
```

## 3. Arduino 例程

### 基础读取

```cpp
#define DO_PIN 2    // 数字输出
#define AO_PIN A0   // 模拟输出

void setup() {
    Serial.begin(9600);
    pinMode(DO_PIN, INPUT_PULLUP);
}

void loop() {
    int do_val = digitalRead(DO_PIN);
    int ao_val = analogRead(AO_PIN);   // 0-1023 (10bit ADC)

    Serial.print("DO: ");
    Serial.print(do_val == LOW ? "DARK" : "LIGHT");
    Serial.print("  |  AO: ");
    Serial.println(ao_val);

    delay(200);
}
```

### 自动夜灯(带滞回,防抖动)

```cpp
#define DO_PIN   2
#define LED_PIN  13
#define HYST     50    // 滞回区间

int threshold = 512;   // ADC 阈值(10bit: 0-1023)
bool light_on = false;

void setup() {
    pinMode(DO_PIN, INPUT_PULLUP);
    pinMode(LED_PIN, OUTPUT);
    Serial.begin(9600);
}

void loop() {
    int ao = analogRead(A0);

    if (!light_on && ao < threshold - HYST) {
        // 暗到一定程度 → 开灯
        light_on = true;
        digitalWrite(LED_PIN, HIGH);
        Serial.println("Light ON");
    } else if (light_on && ao > threshold + HYST) {
        // 亮到一定程度 → 关灯
        light_on = false;
        digitalWrite(LED_PIN, LOW);
        Serial.println("Light OFF");
    }

    Serial.print("AO: "); Serial.println(ao);
    delay(200);
}
```

## 4. 关键说明

| 要点 | 说明 |
|------|------|
| **DO 逻辑** | 一般暗=低电平,但需实测确认(与比较器接法有关) |
| **AO 非线性** | 模拟值与 Lux 非正比,精确应用需查表或拟合 |
| **滞回处理** | DO 阈值附近可能抖动,建议软件加滞回区间 |
| **ADC 参考电压** | 5V 供电模块接 3.3V MCU 的 ADC 时注意电平匹配 |
| **响应延迟** | 光敏电阻有惯性,状态变化后等待 50ms 再读取 |

参考资料

暂无参考文献