First init.

This commit is contained in:
2025-10-12 09:13:56 +02:00
commit 1548aeaf9b
458 changed files with 118808 additions and 0 deletions

View File

@@ -0,0 +1,190 @@
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <avr/wdt.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)
// 21 characters wide
// 6 down (plus half)
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 enableWatchdog() {
cli();
wdt_reset();
MCUSR = WDRF;
WDTCSR |= (1 << WDCE) | (1 << WDE);
WDTCSR = (1 << WDIE) | (1 << WDP3) | (1 << WDP0); // Interrupt every 8 seconds
sei();
}
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
enableWatchdog(); // Enable watchdog timer
display.display();
delay(2000);
display.clearDisplay();
}
void loop() {
wdt_reset(); // Reset watchdog timer
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);
// Validate temperature readings
if (isValidTemperature(temperatureC1)) {
// Display temperatures on the screen in Celsius with one decimal place
display.setCursor(0, 0);
display.print("TempClt1: ");
display.print(temperatureC1, 1);
display.print(" C");
} else {
display.setCursor(0, 0);
display.print("TempClt1: Invalid");
}
if (isValidTemperature(temperatureC2)) {
display.setCursor(0, 10);
display.print("TempClt2: ");
display.print(temperatureC2, 1);
display.print(" C");
} else {
display.setCursor(0, 10);
display.print("TempClt2: Invalid");
}
// 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
float averageTemperature = getAverageTemperature(temperatureC1, temperatureC2);
if (isValidTemperature(averageTemperature)) {
display.setCursor(0, 20);
display.print("Temp avg: ");
display.print(averageTemperature, 1);
display.print(" C");
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;
}
} else {
display.setCursor(0, 20);
display.print("Temp avg: Invalid");
}
}
// Display FAN status
display.setCursor(0, 30);
display.print("FAN1: ");
display.print(fan1Active || overrideFan1 ? "ON" : "OFF");
display.setCursor(64, 30);
display.print("FAN2: ");
display.print(fan2Active || overrideFan2 ? "ON" : "OFF");
display.setCursor(45, 55);
display.print("PRNDL21");
// Update the display
display.display();
// Delay for a while
delay(2000);
}
float getAverageTemperature(float temp1, float temp2) {
// Calculate average temperature
if (isValidTemperature(temp1) && isValidTemperature(temp2)) {
return (temp1 + temp2) / 2.0;
} else if (isValidTemperature(temp1)) {
return temp1;
} else if (isValidTemperature(temp2)) {
return temp2;
} else {
return -127.0; // Invalid temperature
}
}
bool isValidTemperature(float temp) {
// Check if temperature is within a reasonable range
return temp > -100.0 && temp < 150.0;
}
ISR(WDT_vect) {
// Watchdog Timer interrupt service routine
// You can add additional handling here if needed
}