#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <dht11.h>
#include "DFRobot_Heartrate.h"

// 硬件配置
#define DHT11_PIN 4      // 温湿度传感器
#define HEART_RATE_PIN A1
#define PIR_SENSOR A3    // 人体红外
#define LED_PIN 2        // 感应灯
#define ALERT_LED 13     // 报警灯
#define SERVO_PIN 9      // 舵机
#define BUZZER_PIN 7     // 蜂鸣器

// 对象初始化
LiquidCrystal_I2C lcd(0x20, 16, 2); // LCD地址需确认
Servo myservo;
dht11 DHT;
DFRobot_Heartrate heartrate(DIGITAL_MODE);

// 全局变量
int servoPos = 0;
unsigned long lastEnvUpdate = 0;
bool systemAlert = false;

void setup() {
  Serial.begin(115200);
  
  // 初始化引脚
  pinMode(PIR_SENSOR, INPUT);
  pinMode(LED_PIN, OUTPUT);
  pinMode(ALERT_LED, OUTPUT);
  
  // 执行器初始化
  myservo.attach(SERVO_PIN);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.print("Initializing...");
  
  delay(1000);
}

void loop() {
  // 1. 传感器数据采集
  uint8_t heartRate = readHeartRate();
  bool humanDetected = checkMotion();
  float temp = 0, humidity = 0;
  
  // 每2秒更新一次温湿度（避免传感器过热）
  if(millis() - lastEnvUpdate > 2000) {
    int chk = DHT.read(DHT11_PIN);
    if(chk == DHTLIB_OK) {
      temp = DHT.temperature;
      humidity = DHT.humidity;
    }
    lastEnvUpdate = millis();
  }

  // 2. 系统状态判断
  systemAlert = checkAlertConditions(heartRate, humanDetected, temp, humidity);

  // 3. 执行控制
  controlLED(humanDetected);
  controlServo();
  controlAlarm(systemAlert);
  updateLCD(heartRate, humanDetected, temp, humidity);
  
  delay(200); // 主循环延迟
}

// 心率读取（带数据校验）
uint8_t readHeartRate() {
  static uint8_t lastValidRate = 0;
  heartrate.getValue(HEART_RATE_PIN);
  uint8_t rate = heartrate.getRate();
  
  // 过滤异常值（正常心率范围30-200）
  if(rate >= 30 && rate <= 200) {
    lastValidRate = rate;
    return rate;
  }
  return lastValidRate;
}

// 人体移动检测（带去抖）
bool checkMotion() {
  static unsigned long lastTrigger = 0;
  int val = analogRead(PIR_SENSOR);
  
  if(val > 150) {
    lastTrigger = millis();
    return true;
  }
  // 检测到信号后维持2.5秒状态
  return (millis() - lastTrigger < 2500); 
}

// 综合报警条件判断
bool checkAlertConditions(uint8_t hr, bool motion, float temp, float humidity) {
  // 心率异常
  if(hr > 100 || hr < 50) return true;
  
  // 环境异常（示例阈值）
  if(temp > 30.0 || humidity > 80.0) return true;
  
  // 持续移动报警
  static unsigned long motionStart = 0;
  if(motion) {
    if(motionStart == 0) motionStart = millis();
    else if(millis() - motionStart > 10000) return true;
  } else {
    motionStart = 0;
  }
  
  return false;
}

// 灯光控制（人体感应+报警状态）
void controlLED(bool detected) {
  static bool keepLight = false;
  
  if(detected) {
    digitalWrite(LED_PIN, HIGH);
    keepLight = true;
  } 
  else if(keepLight) {
    digitalWrite(LED_PIN, HIGH);
    delay(2500);
    keepLight = false;
  } 
  else {
    digitalWrite(LED_PIN, LOW);
  }
  
  // 报警LED（红色）
  digitalWrite(ALERT_LED, systemAlert ? HIGH : LOW);
}

// 舵机扫描控制（报警时停止扫描）
void controlServo() {
  if(systemAlert) {
    myservo.write(90);  // 报警时固定位置
    return;
  }
  
  servoPos = (servoPos + 5) % 180; // 加快扫描速度
  myservo.write(servoPos);
  delay(50);
}

// LCD信息显示（两行优化布局）
void updateLCD(uint8_t hr, bool motion, float temp, float humidity) {
  lcd.clear();
  
  // 第一行：心率 + 温度
  lcd.setCursor(0, 0);
  lcd.print("HR:");
  lcd.print(hr);
  lcd.print(" T:");
  lcd.print(temp, 1);
  lcd.print((char)223); // 度符号
  lcd.print("C");
  
  // 第二行：湿度 + 状态
  lcd.setCursor(0, 1);
  lcd.print("H:");
  lcd.print(humidity, 1);
  lcd.print("% ");
  lcd.print(motion ? "MOTION " : "       ");
  if(systemAlert) lcd.print("!");
}

// 蜂鸣器报警（不同模式）
void controlAlarm(bool alert) {
  static unsigned long lastBeep = 0;
  
  if(!alert) {
    noTone(BUZZER_PIN);
    return;
  }
  
  // 间歇报警模式（0.5秒响，0.5秒停）
  if(millis() - lastBeep > 1000) lastBeep = millis();
  if(millis() - lastBeep < 500) {
    tone(BUZZER_PIN, 2000); 
  } else {
    noTone(BUZZER_PIN);
  }
}
现在代码有什么问题，显示在lcd上的数据一直在跳。我希望稳定显示而不是一会正常一会0