ESP32 项目| 人体感应灯(简版),附python C++源码

一 ESP32 项目简介:

本程序结合ESP32、SR602人体感应模块、LED灯做一个简单的人体感应灯,理解人体感应灯的原理,做为升级版人体感应灯的学习基础。

二 硬件说明:

  1. ESP32-S3开发板 1个
  2. LED灯 1个
  3. 220欧电阻 1个
  4. SR602人体感应模块 1个
  5. 面包板 1块
  6. 公对母杜邦线 5根

三 ESP32 Python人体感应灯接线图

四 ESP32 Python人体感应灯源代码

# 导入 time 模块,用于获取系统时间、延时等操作
import time

# 从 machine 模块导入 Pin 类,用于控制 GPIO 引脚
from machine import Pin

# 定义 LED 连接的引脚:GPIO4,设置为输出模式(OUT)
LED = Pin(4, Pin.OUT)

# 定义 PIR(人体红外传感器)连接的引脚:GPIO5,设置为输入模式(IN)
PIR = Pin(5, Pin.IN)

# 初始化一个变量 lefttime,用于记录“LED 应该保持点亮的截止时间”
# 初始值为 0,表示一开始没有触发,LED 应熄灭
lefttime = 0

# 主循环:程序将无限重复执行以下逻辑
while True:
    # 读取 PIR 传感器当前的输出值(0 或 1)
    # pir_val = 1 表示检测到人体移动;pir_val = 0 表示未检测到
    pir_val = PIR.value()
    
    # 如果 PIR 检测到人体(pir_val 为真,即非零)
    if pir_val:
        # 更新 lefttime:设置为当前时间 + 10 秒
        # 即:从现在起,LED 将持续亮 10 秒
        lefttime = time.time() + 10
    
    # 判断当前系统时间是否还在“应点亮”的时间段内
    if time.time() < lefttime:
        # 如果是,则打开 LED
        LED.on()
    else:
        # 否则,关闭 LED
        LED.off()
    
    # 短暂休眠 10 毫秒,避免 CPU 占用过高,同时保证响应速度
    # 不加这句会导致主循环运行过快,浪费资源
    time.sleep_ms(10)
Python

五 ESP32 C++人体感应灯源代码

// 定义LED连接的引脚编号为4
const int LED_PIN = 4;

// 定义PIR人体红外传感器连接的引脚编号为5
const int PIR_PIN = 5;

// 用于记录LED应该关闭的时间点(单位:毫秒,从程序启动开始计时)
unsigned long lightOffTime = 0;

void setup() {
  // 设置LED引脚为输出模式
  pinMode(LED_PIN, OUTPUT);

  // 设置PIR传感器引脚为输入模式
  pinMode(PIR_PIN, INPUT);

  // 初始关闭LED(输出低电平)
  digitalWrite(LED_PIN, LOW);

  // 初始化串口通信,波特率为115200,用于调试输出
  Serial.begin(115200);
}

void loop() {
  // 读取PIR传感器的状态(HIGH表示检测到人体移动,LOW表示未检测到)
  int motion = digitalRead(PIR_PIN);

  // 如果检测到人体移动(motion == HIGH)
  if (motion == HIGH) {
    // 将LED关闭时间设定为当前时间 + 10000毫秒(即10秒后关闭)
    lightOffTime = millis() + 10000;
  }

  // 如果当前系统时间还没到设定的关闭时间
  if (millis() < lightOffTime) {
    // 打开LED
    digitalWrite(LED_PIN, HIGH);
    // 通过串口打印“亮”
    Serial.println("亮");
  } else {
    // 否则关闭LED
    digitalWrite(LED_PIN, LOW);
    // 通过串口打印“无人,灭”
    Serial.println("无人,灭");
  }

  // 延迟10毫秒,避免串口输出过于频繁,同时降低CPU占用
  delay(10);
}
C++

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注