Guten Tag, liebe Gemeinde,
ich unternehme meine ersten Gehversuche mit Arduino&Co und versuche derzeit den Code des Taupunktlüfters aus der Make so umzubauen, dass das Ganze mit SHT31-Sensoren und einem OLED-Display (SH1106, 128x64, auch Clone) funktioniert.
Der Nano-Clone werkelte bereits erfolgreich mit dem Original-Code (LCD+Dht-Sensoren).
Habe den Code zunächst nur bzgl. der SHT-Sensoren umgeschrieben. Das hat funktioniert. Nur das Display will einfach nicht.
Der Beispielcode unter
läuft problemlos. Daher entnehme ich, dass Verdrahtung und Display selbst intakt sind.
Aus dem Beispielcode habe ich mir auch die Initalisierungszeilen rüberkopiert und zwischenzeitlich mit seriellen Ausgaben versehen, um rauszufinden, wo es hängt. Demnach ist er vor display.begin(...) in einer Dauerschleife.
Hat hier jemand eine zündende Idee?
Vielen Dank schonmal
Olaf
Hier der Code:
// Dieser Code benötigt zwingend die folgenden Libraries:
#include <Wire.h>
#include <avr/wdt.h>
#include "Adafruit_SHT31.h"
#include <Adafruit_SH110X.h>
#define i2c_Address 0x3c //initialize with the I2C addr 0x3C Typically eBay OLED's
//#define i2c_Address 0x3d //initialize with the I2C addr 0x3D Typically Adafruit OLED's
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // QT-PY / XIAO
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define RELAIPIN 6 // Anschluss des Lüfter-Relais
Adafruit_SHT31 sht31a = Adafruit_SHT31();
Adafruit_SHT31 sht31b = Adafruit_SHT31();
#define RELAIS_EIN LOW
#define RELAIS_AUS HIGH
bool rel;
// ******* Korrekturwerte der einzelnen Sensorwerte *******
#define Korrektur_t_1 0 // Korrekturwert Innensensor Temperatur
#define Korrektur_t_2 0 // Korrekturwert Außensensor Temperatur
#define Korrektur_h_1 0 // Korrekturwert Innensensor Luftfeuchtigkeit
#define Korrektur_h_2 0 // Korrekturwert Außensensor Luftfeuchtigkeit
//***********************************************************
#define SCHALTmin 5.0 // minimaler Taupunktunterschied, bei dem das Relais schaltet
#define HYSTERESE 1.0 // Abstand von Ein- und Ausschaltpunkt
#define TEMP1_min 10.0 // Minimale Innentemperatur, bei der die Lüftung aktiviert wird
#define TEMP2_min -10.0 // Minimale Außentemperatur, bei der die Lüftung aktiviert wird
//lcd.write('C');
bool fehler = true;
void setup() {
wdt_enable(WDTO_8S); // Watchdog timer auf 8 Sekunden stellen
pinMode(RELAIPIN, OUTPUT); // Relaispin als Output definieren
digitalWrite(RELAIPIN, RELAIS_AUS); // Relais ausschalten
Serial.begin(9600); // Serielle Ausgabe, falls noch kein LCD angeschlossen ist
Serial.println(F("serial.begin"));
delay(250); // wait for the OLED to power up
Serial.println(F("delay250"));
Serial.println(i2c_Address);
display.begin(i2c_Address, true); // Address 0x3C default
Serial.println(F("display.begin"));
//display.setContrast (0); // dim display
display.display();
Serial.println(F("display.display"));
delay(2000);
// Clear the buffer.
display.clearDisplay();
display.setCursor(3,10);
display.println("Teste Sensoren..");
Serial.println("SHT31 test");
if (! sht31a.begin(0x44)) { // first sensor with default address
Serial.println("Couldn't find SHT31 #1");
while (1) delay(1);
}
if (! sht31b.begin(0x45)) { // second sensor with secondary address
Serial.println("Couldn't find SHT31 #2");
while (1) delay(1);
}
Serial.println(F("Teste Sensoren.."));
}
void loop() {
float t1 = sht31a.readTemperature()+Korrektur_t_1;
float h1 = sht31a.readHumidity()+Korrektur_h_1;
float t2 = sht31b.readTemperature()+Korrektur_t_2;
float h2 = sht31b.readHumidity()+Korrektur_h_2;
if (fehler == true) // Prüfen, ob gültige Werte von den Sensoren kommen
{
fehler = false;
if (isnan(h1) || isnan(t1) || h1 > 100 || h1 < 1 || t1 < -40 || t1 > 80 ) {
Serial.println(F("Fehler beim Auslesen vom 1. Sensor!"));
display.setTextSize(2);
display.setTextColor(SH110X_WHITE);
display.setCursor(0,1);
display.print("Fehler Sensor 1");
fehler = true;
}else {
display.setTextSize(2);
display.setTextColor(SH110X_WHITE);
display.setCursor(0,1);
display.print("Sensor 1 in Ordnung");
}
delay(2000); // Zeit um das Display zu lesen
if (isnan(h2) || isnan(t2) || h2 > 100 || h2 < 1 || t2 < -40 || t2 > 80) {
Serial.println(F("Fehler beim Auslesen vom 2. Sensor!"));
display.setTextSize(2);
display.setTextColor(SH110X_WHITE);
display.setCursor(0,1);
display.print("Fehler Sensor 2");
fehler = true;
} else {
display.setTextSize(2);
display.setTextColor(SH110X_WHITE);
display.setCursor(0,1);
display.print("Sensor 2 in Ordnung");
}
delay(2000); // Zeit um das Display zu lesen
}
if (isnan(h1) || isnan(t1) || isnan(h2) || isnan(t2)) fehler = true;
if (fehler == true) {
digitalWrite(RELAIPIN, RELAIS_AUS); // Relais ausschalten
display.setTextSize(2);
display.setTextColor(SH110X_WHITE);
display.setCursor(0,3);
display.println(F("CPU Neustart....."));
while (1); // Endlosschleife um das Display zu lesen und die CPU durch den Watchdog neu zu starten
}
wdt_reset(); // Watchdog zurücksetzen
//**** Taupunkte errechnen********
float Taupunkt_1 = taupunkt(t1, h1);
float Taupunkt_2 = taupunkt(t2, h2);
// Werteausgabe auf Serial Monitor
Serial.print(F("Sensor-1: " ));
Serial.print(F("Luftfeuchtigkeit: "));
Serial.print(h1);
Serial.print(F("% Temperatur: "));
Serial.print(t1);
Serial.print(F("°C "));
Serial.print(F(" Taupunkt: "));
Serial.print(Taupunkt_1);
Serial.println(F("°C "));
Serial.print("Sensor-2: " );
Serial.print(F("Luftfeuchtigkeit: "));
Serial.print(h2);
Serial.print(F("% Temperatur: "));
Serial.print(t2);
Serial.print(F("°C "));
Serial.print(F(" Taupunkt: "));
Serial.print(Taupunkt_2);
Serial.println(F("°C "));
Serial.println();
// Werteausgabe auf dem I2C-Display
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.setCursor(0,0);
display.print("Innen: ");
display.print(t1);
display.print("°C | ");
display.print(h1);
display.println("% rF");
display.print(" Taupunkt: ");
display.print(Taupunkt_1);
display.println("°C");
display.print("Außen: ");
display.print(t2);
display.print("°C | ");
display.print(h2);
display.println("% rF");
display.print(" Taupunkt: ");
display.print(Taupunkt_2);
display.println("°C");
delay(6000); // Zeit um das Display zu lesen
wdt_reset(); // Watchdog zurücksetzen
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.setCursor(0,0);
float DeltaTP = Taupunkt_1 - Taupunkt_2;
if (DeltaTP > (SCHALTmin + HYSTERESE))rel = true;
if (DeltaTP < (SCHALTmin))rel = false;
if (t1 < TEMP1_min )rel = false;
if (t2 < TEMP2_min )rel = false;
if (rel == true)
{
digitalWrite(RELAIPIN, RELAIS_EIN); // Relais einschalten
display.println("Fenster auf");
} else {
digitalWrite(RELAIPIN, RELAIS_AUS); // Relais ausschalten
display.println("Fenster zu");
}
display.setCursor(0,15);
display.print("Delta TP: ");
display.print(DeltaTP);
display.println("°C");
delay(4000); // Wartezeit zwischen zwei Messungen
wdt_reset(); // Watchdog zurücksetzen
}
float taupunkt(float t, float r) {
float a, b;
if (t >= 0) {
a = 7.5;
b = 237.3;
} else if (t < 0) {
a = 7.6;
b = 240.7;
}
// Sättigungsdampfdruck in hPa
float sdd = 6.1078 * pow(10, (a*t)/(b+t));
// Dampfdruck in hPa
float dd = sdd * (r/100);
// v-Parameter
float v = log10(dd/6.1078);
// Taupunkttemperatur (°C)
float tt = (b*v) / (a-v);
return { tt };
}
void software_Reset() // Startet das Programm neu, nicht aber die Sensoren oder das LCD
{
asm volatile (" jmp 0");
}
und hier die serielle Ausgabe:
serial.begin
delay250
60
serial.begin
delay250
60
serial.begin
delay250
60