#include #include #include #include #include #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); }