#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <RTClib.h>
#include <OneWire.h>
#include <DallasTemperature.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 AirTemp = 25; // Digital pin connected to the DHT sensor
const int CircPump = 2; // Digital pin Circulation Pump
const int TankLights = 5; // Digital pin Tank Lights
const int WaterTemp = 26; // Digital pin for DS18B20 temperature sensor
// Define Sensors
#define DHTTYPE DHT22
DHT dhtTemperature(AirTemp, DHTTYPE);
// OneWire and Dallas Temperature instances for DS18B20
OneWire oneWire(WaterTemp);
DallasTemperature waterTempSensor(&oneWire);
// RTC instance
RTC_DS3231 rtc;
// Global variables
unsigned long startTime = 0;
boolean lightState = false;
boolean fanState = false;
unsigned long fanStartTime = 0; // Variable to track fan start time
bool pumpState = false;
unsigned long lastPumpTime = 0;
void setup() {
Serial.begin(115200);
dhtTemperature.begin();
waterTempSensor.begin(); // Initialize the DS18B20 sensor
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
delay(2000);
display.clearDisplay();
display.setTextColor(WHITE);
// Initialize Pins
pinMode(CircPump, OUTPUT);
pinMode(TankLights, OUTPUT);
// Initialize the RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1) {} // Halt if RTC not found
}
//rtc.adjust(DateTime(2024, 11, 10, 19, 55, 0)); // uncomment and set time, comment out after initial load and reload to keep time
}
void loop() {
delay(5000);
// Read temperature and humidity from DHT22
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 DHT22 sensor!");
}
// Read water temperature from DS18B20
waterTempSensor.requestTemperatures();
float waterTempC = waterTempSensor.getTempCByIndex(0);
float waterTempF = waterTempC * 9.0 / 5.0 + 32.0;
if (isnan(waterTempC)) {
Serial.println("Failed to read from DS18B20 sensor!");
}
// Get current time
DateTime now = rtc.now();
unsigned long currentTime = millis();
// Circulation Pump - Run 30 Minutes every 4 hours
if (!pumpState && (currentTime - lastPumpTime) >= 14400000) {
digitalWrite(CircPump, HIGH);
pumpState = true;
lastPumpTime = currentTime;
}
if (pumpState && (currentTime - lastPumpTime) >= 900000) {
digitalWrite(CircPump, LOW);
pumpState = false;
}
// Control lights based on time
if (now.hour() >= 6 && now.hour() < 18) {
digitalWrite(TankLights, HIGH);
startTime = millis(); // Record the start time
lightState = true;
} else {
digitalWrite(TankLights, LOW);
lightState = false;
}
// Clear display
display.clearDisplay();
// Display "Grow UP!!" and Time
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Grow UP!");
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 Air Temperature
display.setTextSize(1);
display.setCursor(0, 16);
display.print("Air T: ");
display.setTextSize(1);
display.setCursor(50, 16);
display.print(int(ff));
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(1);
display.print("F");
// Display Humidity
display.setTextSize(1);
display.setCursor(85, 16);
display.print("H: ");
display.setTextSize(1);
display.setCursor(100, 16);
display.print(hf);
display.print("%");
// Display Water Temperature
display.setTextSize(1);
display.setCursor(0, 26);
display.print("Water T: ");
display.setTextSize(1);
display.setCursor(50, 26);
display.print(int(waterTempF));
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(1);
display.print("F");
//Pump status display
String pumpStatus = pumpState ? "Pump: ON" : "Pump: OFF";
display.setTextSize(1);
display.setCursor(0,36);
display.print(pumpStatus);
display.display();
// Print temperatures and humidity to serial monitor
Serial.print("Air Temperature: ");
Serial.print(int(ff)); // Print temperature without decimals
Serial.println(" F");
Serial.print("Humidity: ");
Serial.print(hf);
Serial.println(" %");
Serial.print("Water Temperature: ");
Serial.print(waterTempF);
Serial.println(" F");
}Loading
ds18b20
ds18b20