#include <Wire.h>
#include <RTClib.h> // 用于DS1307 RTC模块
#include <Adafruit_SSD1306.h> // 用于OLED显示屏
#include <OneWire.h> // 用于DS18B20温度传感器
#include <DallasTemperature.h> // DallasTemperature库,依赖OneWire
#define SCREEN_WIDTH 128 // OLED显示屏宽度
#define SCREEN_HEIGHT 64 // OLED显示屏高度
#define TEMP_PIN 2 // DS18B20温度传感器引脚
#define WATER_LEVEL_PIN A0 // 水位传感器引脚
#define BUZZER_PIN 8 // 蜂鸣器引脚
#define HEATER_PIN 9 // 加热模块继电器引脚
#define LID_SWITCH_PIN 7 // 盖子开关引脚
// OLED显示屏对象,I2C地址为0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
OneWire oneWire(TEMP_PIN);
DallasTemperature sensors(&oneWire);
RTC_DS1307 rtc; // RTC对象
float targetTemperature = 32.0; // 默认目标温度
bool heaterStatus = false; // 加热模块状态
void setup() {
Serial.begin(9600);
// 初始化OLED显示屏
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
// 初始化温度传感器
sensors.begin();
// 初始化RTC模块
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // 设置初始时间为编译时间
}
// 设置引脚模式
pinMode(WATER_LEVEL_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(HEATER_PIN, OUTPUT);
pinMode(LID_SWITCH_PIN, INPUT_PULLUP); // 使用上拉电阻检测盖子开关
// 启动传感器并清屏
display.display();
delay(2000);
}
void loop() {
DateTime now = rtc.now();
// 读取温度
sensors.requestTemperatures();
float currentTemp = sensors.getTempCByIndex(0);
// 读取水位传感器数据
int waterLevel = analogRead(WATER_LEVEL_PIN);
// 读取盖子开关状态
bool lidClosed = digitalRead(LID_SWITCH_PIN) == LOW;
// 显示当前温度和目标温度
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Current Temp: ");
display.print(currentTemp);
display.println(" C");
display.print("Target Temp: ");
display.print(targetTemperature);
display.println(" C");
// 显示时间
display.setCursor(0, 20);
display.print("Time: ");
display.print(now.hour());
display.print(':');
display.print(now.minute());
display.print(':');
display.print(now.second());
// 显示水位状态
display.setCursor(0, 30);
if (waterLevel > 500) {
display.println("Water Level: OK");
} else {
display.println("Water Level: LOW");
heaterStatus = false; // 如果水位过低,加热模块关闭
}
// 处理加热模块的逻辑
if (currentTemp < targetTemperature && lidClosed && waterLevel > 500) {
digitalWrite(HEATER_PIN, HIGH); // 启动加热模块
heaterStatus = true;
} else {
digitalWrite(HEATER_PIN, LOW); // 关闭加热模块
heaterStatus = false;
}
// 显示加热状态
display.setCursor(0, 40);
display.print("Heater: ");
display.println(heaterStatus ? "ON" : "OFF");
// 检测蜂鸣器逻辑,特定时间触发蜂鸣器
if (now.hour() == 8 && now.minute() == 0) {
digitalWrite(BUZZER_PIN, HIGH); // 8:00时触发蜂鸣器
} else {
digitalWrite(BUZZER_PIN, LOW); // 其他时间关闭蜂鸣器
}
display.display();
delay(1000); // 延迟1秒
}