#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <math.h> // 引入數學函式庫
#include <TimerOne.h>
#define BETA 3950 // Beta 系數
#define THERMISTOR_PIN A0 // NTC 感測器連接的腳位
#define RED_LED_PIN 5 // 紅燈
#define YELLOW_LED_PIN 6 // 黃燈
#define GREEN_LED_PIN 7 // 綠燈
#define Button 2
LiquidCrystal_I2C lcd(0x27, 16, 2);
//宣告變數在外面
float celsius = 0.0;
int analogValue;
float maxTemp = -30.0;
float minTemp = 90.0;
volatile bool displayMode = 0; // 顯示模式 (0:即時溫度,1:最大/最小溫度)
void setup() {
lcd.init();
lcd.backlight();//初始化
pinMode(RED_LED_PIN, OUTPUT);
pinMode(YELLOW_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
lcd.setCursor(0, 0);
lcd.print("Temp Monitor");
Timer1.initialize(1000000); // 初始化 Timer1,設置週期為 1 秒 (1000000 微秒)
Timer1.attachInterrupt(timerISR);
pinMode(Button, INPUT_PULLUP);
attachInterrupt( digitalPinToInterrupt(2), my_ISR, FALLING);
}
void loop() {
if (displayMode == 0) {
// 顯示溫度於 LCD
lcd.setCursor(0, 0);
lcd.print("Current Temp: ");//空白覆蓋
lcd.setCursor(0, 1);
lcd.print(celsius);
lcd.print(" C ");//空白覆蓋
} else {
// 模式 2:顯示最大和最小溫度
lcd.setCursor(0, 0);
lcd.print("MaxTemp:");
lcd.print(maxTemp, 1);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("MinTemp:");
lcd.print(minTemp, 1);
lcd.print(" C");
}
// 判斷溫度範圍並控制 LED
if (celsius < 20) {
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(YELLOW_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, LOW);
} else if (celsius >= 20 && celsius < 30) {
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(YELLOW_LED_PIN, HIGH);
digitalWrite(RED_LED_PIN, LOW);
} else {
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(YELLOW_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, HIGH);
}
}
void timerISR() {
{
analogValue = analogRead(THERMISTOR_PIN); // 讀取 ADC 值
celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
if (celsius > maxTemp) {
maxTemp = celsius;
}
if (celsius < minTemp) {
minTemp = celsius;
}
}
}
void my_ISR() {
static unsigned long lastInterruptTime = 0;
unsigned long interruptTime = millis();
// 防止按鈕抖動,設定防抖延遲 200ms
if (interruptTime - lastInterruptTime > 200) {
displayMode = !displayMode; // 切換顯示模式
}
lastInterruptTime = interruptTime;
}