#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <RTClib.h>
#include <OneWire.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Pin definitions
const int Fan = 2; // Digital pin connected to the relay
const int TempSensor = 32; // Digital pin connected to the DHT sensor
const int Lights = 33; // Digital pin connected to lights
const int Hum = 18; // Digital pin connected to Humidifier
// Define Sensor
#define DHTTYPE DHT22
DHT dhtTemperature(TempSensor, DHTTYPE);
// RTC instance
RTC_DS3231 rtc;
// Global variables
unsigned long startTime = 0;
boolean lightState = false;
boolean fanState = false;
boolean humidifierState = false; // Track humidifier state
unsigned long humidifierStartTime = 0; // Track humidifier start time
void setup() {
Serial.begin(115200);
dhtTemperature.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
delay(2000);
display.clearDisplay();
display.setTextColor(WHITE);
// Initialize Pins
pinMode(Fan, OUTPUT);
pinMode(Lights, OUTPUT);
pinMode(Hum, OUTPUT);
// Initialize the RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1) {} // Halt if RTC not found
}
//replace below wiht deisred time
//rtc.adjust(DateTime(2024, 11, 29, 8, 47, 0)); // comment out this line after initial load and reload to keep time
}
void loop() {
delay(5000);
// Read temperature and humidity
float tf = dhtTemperature.readTemperature();
int hf = dhtTemperature.readHumidity(); // Convert humidity to int
// Convert temperature to Fahrenheit
float ff = tf * 1.8 + 32;
if (isnan(ff) || isnan(tf) || isnan(hf)) {
Serial.println("Failed to read from Temperature sensor!");
}
// Get current time
DateTime now = rtc.now();
// Control lights based on time
if (now.hour() >= 6 && now.hour() < 18) {
digitalWrite(Lights, HIGH);
startTime = millis(); // Record the start time
lightState = true;
} else {
digitalWrite(Lights, LOW);
lightState = false;
}
// Control Fan based on time
if (now.hour() >= 9 && now.hour() < 19) {
digitalWrite(Fan, HIGH); // Activate relay
fanState = true;
} else {
digitalWrite(Fan, LOW); // Deactivate relay
fanState = false;
}
// Control Humidifier
if (hf < 70 && !humidifierState) {
digitalWrite(Hum, HIGH); // Activate humidifier
humidifierState = true;
humidifierStartTime = millis(); // Record the start time
} else if (humidifierState && millis() - humidifierStartTime >= 15000) {
digitalWrite(Hum, LOW); // Deactivate humidifier
humidifierState = false;
}
// Clear display
display.clearDisplay();
// Display "New Beginnings" and Time
display.setCursor(67, 0);
display.print(now.hour() % 12);
display.print(":");
display.print(now.minute() < 10 ? "0" : ""); // Print "0" if minutes are less than 10
display.print(now.minute(), DEC);
display.print(now.hour() >= 12 ? " PM" : " AM");
display.setTextSize(1);
display.setCursor(0, 22);
display.print("New Beginnings");
// Display Temperature
display.setTextSize(1.75);
display.setCursor(0, 32);
display.print("Temp: ");
display.setTextSize(1.75);
display.setCursor(29, 32);
display.print(int(ff));
display.print(" ");
display.setTextSize(1.75);
display.cp437(true);
display.write(167);
display.setTextSize(1.75);
display.print("F");
// Display Humidity
display.setTextSize(1.75);
display.setCursor(0, 42);
display.print("Humidity: ");
display.setTextSize(1.75);
display.setCursor(55, 42);
display.print(hf);
display.print("%");
// Display Fan Status
display.setTextSize(1.75);
display.setCursor(0, 52);
display.print("Fan: ");
display.setTextSize(1.75);
display.setCursor(25, 52);
display.print(fanState ? "ON" : "OFF");
// Display Light Status
display.setTextSize(1.75);
display.setCursor(65, 52);
display.print("Lts: ");
display.setTextSize(1.75);
display.setCursor(90, 52);
display.print(lightState ? "ON" : "OFF");
display.display();
// Print temperature and humidity to serial monitor
Serial.print("Temperature: ");
Serial.print(int(ff)); // Print temperature without decimals
Serial.println("%");
Serial.print(" Humidity: ");
Serial.print(hf);
Serial.println("%");
}Loading
esp32-devkit-c-v4
esp32-devkit-c-v4
Loading
ssd1306
ssd1306