#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
#define TRIG_PIN D0
#define ECHO_PIN D1
#define KEY_LIGHT D2
#define KEY_TH D3
#define KEY_TOGGLE D5
#define LED_PIN D4
LiquidCrystal_I2C lcd(0x27, 16, 2);
int simLightVal = 500;
int threshold = 500;
int dist = 0;
bool hasPerson = false;
unsigned long keyLightPressTime = 0;
bool keyLightPressed = false;
unsigned long keyThPressTime = 0;
bool keyThPressed = false;
int readDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long time = pulseIn(ECHO_PIN, HIGH, 30000);
return time * 0.034 / 2;
}
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(KEY_LIGHT, INPUT_PULLUP);
pinMode(KEY_TH, INPUT_PULLUP);
pinMode(KEY_TOGGLE, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Light:500");
lcd.setCursor(0,1);
lcd.print("Th:500 P:N OFF");
delay(1000);
}
void loop() {
// 光照按键(保留显示功能)
if (digitalRead(KEY_LIGHT) == LOW) {
if (!keyLightPressed) {
keyLightPressed = true;
keyLightPressTime = millis();
}
if (millis() - keyLightPressTime > 400) {
simLightVal -= 50;
if (simLightVal < 0) simLightVal = 0;
delay(150);
}
} else {
if (keyLightPressed) {
if (millis() - keyLightPressTime <= 400) {
simLightVal += 50;
if (simLightVal > 1023) simLightVal = 1023;
}
keyLightPressed = false;
}
}
// 阈值按键(保留)
if (digitalRead(KEY_TH) == LOW) {
if (!keyThPressed) {
keyThPressed = true;
keyThPressTime = millis();
}
if (millis() - keyThPressTime > 400) {
threshold -= 50;
if (threshold < 0) threshold = 0;
delay(150);
}
} else {
if (keyThPressed) {
if (millis() - keyThPressTime <= 400) {
threshold += 50;
if (threshold > 1023) threshold = 1023;
}
keyThPressed = false;
}
}
// ====================== 超声波人体检测 ======================
dist = readDistance();
hasPerson = (dist > 0 && dist <= 200); // 200cm内有人
// ====================== 核心逻辑:有人亮、无人灭 ======================
if (hasPerson) {
digitalWrite(LED_PIN, HIGH); // 有人 → 亮
} else {
digitalWrite(LED_PIN, LOW); // 无人 → 灭
}
// ====================== LCD 显示 ======================
lcd.setCursor(0,0);
lcd.print("Light:");
lcd.print(simLightVal);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Th:");
lcd.print(threshold);
lcd.print(" P:");
lcd.print(hasPerson ? "Y" : "N");
if (hasPerson) {
lcd.print(" ON ");
} else {
lcd.print(" OFF");
}
delay(30);
}