#include <LiquidCrystal_I2C.h>

#define I2C_ADDR    0x27
#define LCD_COLUMNS 20
#define LCD_LINES   4
#define LED_Pin 2
#define PIR_Pin 14
#define NTC_Pin 12
const float BETA = 3950;

LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);

void lcdprintnum(float temperature, int cursor){
  lcd.setCursor(8, cursor);  // 设置光标位置
  lcd.print(temperature);    // 显示温度
}

// 在LCD的指定位置显示文本信息
void lcdprinttext(String s, int cursor){
  lcd.setCursor(7, cursor);  // 设置光标位置
  lcd.print(s);              // 显示文本
}

void setup() {
  Serial.begin(115200);     // 启动串口通信
  pinMode(LED_Pin, OUTPUT); // 设置LED引脚为输出模式
  pinMode(PIR_Pin, INPUT);  // 设置PIR传感器引脚为输入模式
  pinMode(NTC_Pin, INPUT);  // 设置NTC温度传感器引脚为输入模式
  lcd.init();               // 初始化LCD显示屏
  lcd.backlight();          // 打开LCD背光
}

void loop() {
  // 读取温度传感器的模拟值并计算温度
  int analogValue = analogRead(NTC_Pin);
  float celsius = 1 / (log(1 / (4095. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;

  // 读取PIR传感器的状态
  int pirState = digitalRead(PIR_Pin);

  // 如果检测到运动
  if(pirState == HIGH){
    lcdprintnum(celsius, 0);  // 在第0行显示温度
    if(celsius < 10){         // 如果温度低于10度
      digitalWrite(LED_Pin, HIGH); // 打开LED
      lcdprinttext("LED On", 1);   // 在第1行显示LEDOn
    }
  } else {
    // 如果没有检测到运动
    lcd.clear();               // 清空LCD显示
    digitalWrite(LED_Pin, LOW); // 关闭LED
  }
}