#include <LiquidCrystal_I2C.h>
// LCD配置:I2C地址0x27,16列,2行
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
// 引脚定义(和diagram.json接线完全对应)
const int TEMP_SENSOR_PIN = A0; // 模拟温度传感器(电位器)引脚
const int BUTTON_PIN = 4; // 温度单位切换按钮引脚
const int LED_PIN = 7; // 温度超限提醒LED引脚
// 温度控制阈值(可调整)
const float TEMP_ON_THRESHOLD = 30.0; // LED点亮温度阈值
const float TEMP_OFF_THRESHOLD = 25.0; // LED熄灭温度阈值
// 全局变量定义
int buttonState; // 按钮当前状态
int displayMode = 0; // 显示模式:0-摄氏温度,1-华氏温度
float sensorRawValue; // 传感器原始ADC值(0-1023)
float sensorVoltage; // 转换后的电压值(0-5V)
float tempCelsius; // 摄氏温度(℃)
float tempFahrenheit; // 华氏温度(℉)
void setup() {
// 初始化串口通信,波特率9600,用于调试
Serial.begin(9600);
Serial.println("=== 温度测量实验启动 ===");
// 设置引脚模式
pinMode(TEMP_SENSOR_PIN, INPUT); // 模拟输入模式
pinMode(BUTTON_PIN, INPUT); // 按钮输入模式
pinMode(LED_PIN, OUTPUT); // LED输出模式
// 初始化LCD屏幕
lcd.init(); // 启动LCD
lcd.backlight(); // 打开背光(仿真必须开启)
lcd.clear(); // 清屏,保证初始显示干净
lcd.print("IoT Temp Monitor"); // 开机欢迎语
delay(2000); // 停留2秒
lcd.clear();
// 初始状态:LED熄灭
digitalWrite(LED_PIN, LOW);
}
void loop() {
// 阶段1:读取并处理温度传感器数据(模数转换核心)
sensorRawValue = analogRead(TEMP_SENSOR_PIN); // 读取ADC值
sensorVoltage = sensorRawValue * 5.0 / 1023.0; // 转换为0-5V电压
tempCelsius = sensorVoltage / 0.01; // 按10mV/℃换算成摄氏度
tempFahrenheit = tempCelsius * 1.8 + 32; // 摄氏度转华氏度
// 串口打印调试信息,方便观察数据变化
Serial.print("原始值:");
Serial.print(sensorRawValue);
Serial.print(" | 电压:");
Serial.print(sensorVoltage);
Serial.print("V | 温度:");
Serial.print(tempCelsius);
Serial.println("℃");
// 阶段2:读取按钮状态,切换显示模式(带防抖处理)
buttonState = digitalRead(BUTTON_PIN);
if (buttonState == HIGH) { // 模式切换
displayMode++;
if (displayMode >= 2) {
displayMode = 0; // 循环切换:0→1→0
}
delay(250); // 防抖延时,防止误触发
Serial.print("切换显示模式: ");
Serial.println(displayMode == 0 ? "摄氏温度" : "华氏温度");
}
// 阶段3:根据显示模式,更新LCD内容
lcd.clear(); // 每次更新前清屏,避免文字重叠
lcd.setCursor(0, 0);
lcd.print("Temperature:");
if (displayMode == 0) {
// 显示摄氏温度
lcd.setCursor(0, 1);
lcd.print("C: ");
lcd.print(tempCelsius, 1); // 保留1位小数,显示更友好
lcd.print(" C");
} else {
// 显示华氏温度
lcd.setCursor(0, 1);
lcd.print("F: ");
lcd.print(tempFahrenheit, 1); // 保留1位小数
lcd.print(" F");
}
// 阶段4:根据温度控制LED(数模转换应用)
if (tempCelsius >= TEMP_ON_THRESHOLD) {
digitalWrite(LED_PIN, HIGH); // 温度≥30℃,LED点亮
} else if (tempCelsius < TEMP_OFF_THRESHOLD) {
digitalWrite(LED_PIN, LOW); // 温度≤25℃,LED熄灭
}
// 25-30℃之间,LED保持当前状态,不频繁切换
delay(500); // 每0.5秒更新一次数据,降低刷新频率
}