//Fish Tank Controller 8-channel relay
//Written by Nativ1Services with help from randonnerdturtorials.com and Gemini
//Libraries
#include <RTClib.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <DHT.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 pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
//Pin Designations
const int Relay1 = 32;
const int Relay2 = 33;
const int Relay3 = 25;
const int Relay4 = 26;
const int Relay5 = 27;
const int Relay6 = 14;
const int Relay7 = 12;
const int Relay8 = 13;
const int TempSensor = 4;
// 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;
unsigned long fanStartTime = 0; // Variable to track fan 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);
// Initalize Pins
pinMode(Relay1, OUTPUT);
pinMode(Relay2, OUTPUT);
pinMode(Relay3, OUTPUT);
pinMode(Relay4, OUTPUT);
pinMode(Relay5, OUTPUT);
pinMode(Relay6, OUTPUT);
pinMode(Relay7, OUTPUT);
pinMode(Relay8, OUTPUT);
// Initialize the RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1) {} // Halt if RTC not found
}
// Set the current time (optional)
rtc.adjust(DateTime(2024, 9, 3, 11, 07, 0)); // Replace with desired 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();
//Controls
// Relay 1 Control
if (now.hour() >= 8 && now.hour() < 19)
{
digitalWrite(Relay1, HIGH);
}
else
{
digitalWrite(Relay1, LOW);
}
// Relay 2 Control
if ( now.hour() >= 8 && now.hour() < 19)
{
digitalWrite(Relay2, HIGH);
} else {
digitalWrite(Relay2, LOW);
}
// Relay 3 control
if ( now.hour() >= 8 && now.hour() < 19)
{
digitalWrite(Relay3, HIGH);
} else {
digitalWrite(Relay3, LOW);
}
// Relay 4 control
if ( now.hour() >= 8 && now.hour() < 19)
{
digitalWrite(Relay4, HIGH);
} else {
digitalWrite(Relay4, LOW);
}
//Test code for extra pin 13 for Testing
digitalWrite(Relay8, HIGH);
delay(2500);
digitalWrite(Relay8, LOW);
delay(2500);
// Clear display
display.clearDisplay();
// Display "Nativ 1 Services" and Time
display.setTextSize(1);
display.setCursor(0, 0);
display.print("N1S");
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 Temperature
display.setTextSize(1.75);
display.setCursor(0, 16);
display.print("Temp: ");
display.setTextSize(1.75);
display.setCursor(29, 16);
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, 34);
display.print("Humidity: ");
display.setTextSize(1.75);
display.setCursor(55, 34);
display.print(hf);
display.print("%");
// Print current time to serial monitor
Serial.print("Temperature: ");
Serial.print(int(ff)); // Print temperature without decimals
Serial.println("%");
Serial.print(" Humidity: ");
Serial.print(hf);
Serial.println("%");
}