133 lines
3.9 KiB
C++
133 lines
3.9 KiB
C++
#include <Wire.h>
|
|
#include <Adafruit_GFX.h>
|
|
#include <Adafruit_SH110X.h>
|
|
#include <OneWire.h>
|
|
#include <DallasTemperature.h>
|
|
|
|
#define i2c_Address 0x3C // Change this if your OLED has a different I2C address
|
|
#define SCREEN_WIDTH 128
|
|
#define SCREEN_HEIGHT 64
|
|
#define OLED_RESET -1
|
|
#define ONE_WIRE_BUS1 2 // D2 pin for the first DS18B20 sensor
|
|
#define ONE_WIRE_BUS2 7 // D7 pin for the second DS18B20 sensor
|
|
#define FAN1_PIN 3 // D3 pin for FAN1
|
|
#define FAN2_PIN 4 // D4 pin for FAN2
|
|
#define OVERRIDE_FAN1_PIN 5 // D5 pin for overriding FAN1 (pulled to ground to activate)
|
|
#define OVERRIDE_FAN2_PIN 6 // D6 pin for overriding FAN2 (pulled to ground to activate)
|
|
|
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
|
OneWire oneWire1(ONE_WIRE_BUS1);
|
|
OneWire oneWire2(ONE_WIRE_BUS2);
|
|
DallasTemperature sensors1(&oneWire1);
|
|
DallasTemperature sensors2(&oneWire2);
|
|
|
|
bool fan1Active = false;
|
|
bool fan2Active = false;
|
|
|
|
void setup() {
|
|
Serial.begin(9600);
|
|
|
|
pinMode(FAN1_PIN, OUTPUT);
|
|
pinMode(FAN2_PIN, OUTPUT);
|
|
pinMode(OVERRIDE_FAN1_PIN, INPUT_PULLUP);
|
|
pinMode(OVERRIDE_FAN2_PIN, INPUT_PULLUP);
|
|
|
|
if (!display.begin(i2c_Address)) {
|
|
Serial.println(F("SH110X allocation failed"));
|
|
for (;;);
|
|
}
|
|
|
|
sensors1.begin(); // Initialize the first DS18B20 sensor
|
|
sensors2.begin(); // Initialize the second DS18B20 sensor
|
|
|
|
display.display();
|
|
delay(2000);
|
|
display.clearDisplay();
|
|
}
|
|
|
|
void loop() {
|
|
display.clearDisplay();
|
|
|
|
// Set text size and color
|
|
display.setTextSize(1);
|
|
display.setTextColor(SH110X_WHITE);
|
|
|
|
// Read temperatures from both DS18B20 sensors
|
|
sensors1.requestTemperatures();
|
|
sensors2.requestTemperatures();
|
|
float temperatureC1 = sensors1.getTempCByIndex(0);
|
|
float temperatureC2 = sensors2.getTempCByIndex(0);
|
|
|
|
// Display temperatures on the screen in Celsius with one decimal place
|
|
display.setCursor(10, 10);
|
|
display.print("Temp1: ");
|
|
display.print(temperatureC1, 1);
|
|
display.print(" C");
|
|
|
|
display.setCursor(10, 20);
|
|
display.print("Temp2: ");
|
|
display.print(temperatureC2, 1);
|
|
display.print(" C");
|
|
|
|
// Calculate average temperature
|
|
float averageTemperature = (temperatureC1 + temperatureC2) / 2.0;
|
|
|
|
// Display average temperature on the screen
|
|
display.setCursor(10, 30);
|
|
display.print("Avg Temp: ");
|
|
display.print(averageTemperature, 1);
|
|
display.print(" C");
|
|
|
|
// Check for override inputs
|
|
bool overrideFan1 = digitalRead(OVERRIDE_FAN1_PIN) == LOW; // Pulled to ground to activate (active LOW)
|
|
bool overrideFan2 = digitalRead(OVERRIDE_FAN2_PIN) == LOW; // Pulled to ground to activate (active LOW)
|
|
|
|
// Control FANs based on override inputs and temperature thresholds
|
|
if (overrideFan2) {
|
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
|
digitalWrite(FAN2_PIN, HIGH); // Turn ON FAN2
|
|
fan1Active = true;
|
|
fan2Active = true;
|
|
} else if (overrideFan1) {
|
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
|
fan1Active = true;
|
|
fan2Active = false; // Deactivate FAN2 if FAN1 override is active
|
|
} else {
|
|
// Control FANs based on average temperature threshold
|
|
if (averageTemperature >= 99.0 && !fan1Active) {
|
|
digitalWrite(FAN1_PIN, HIGH); // Turn ON FAN1
|
|
fan1Active = true;
|
|
}
|
|
|
|
if (averageTemperature >= 106.0 && !fan2Active) {
|
|
digitalWrite(FAN2_PIN, HIGH); // Turn ON FAN2
|
|
fan2Active = true;
|
|
}
|
|
|
|
if (averageTemperature <= 95.0) {
|
|
digitalWrite(FAN1_PIN, LOW); // Turn OFF FAN1
|
|
fan1Active = false;
|
|
}
|
|
|
|
if (averageTemperature <= 99.0) {
|
|
digitalWrite(FAN2_PIN, LOW); // Turn OFF FAN2
|
|
fan2Active = false;
|
|
}
|
|
}
|
|
|
|
// Display FAN status
|
|
display.setCursor(10, 40);
|
|
display.print("FAN1: ");
|
|
display.print(fan1Active || overrideFan1 ? "ON" : "OFF");
|
|
|
|
display.setCursor(10, 50);
|
|
display.print("FAN2: ");
|
|
display.print(fan2Active || overrideFan2 ? "ON" : "OFF");
|
|
|
|
// Update the display
|
|
display.display();
|
|
|
|
// Delay for a while
|
|
delay(2000);
|
|
}
|