Si7021 und 4 Zeilen Display

Hallo zusammen,

habe eine Si7021 und ein 4 Zeilen LCD am Arduino Uno. Nach einem Neustart liefert der Si7021 keine Werte, erst wenn ich die Datenleitung des Displays oder des Sensores ziehe und wieder anschließe.

Wo habe ich einen Fehler drin?

Hier meinem Sketch:

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Si7021.h>
#include <dht.h>           // library für DHT22
  

#define PinS1 2            // Schalter an Pin 2 (Automatik)
#define PinS2 3            // Schalter an Pin 3 (Man. ein)
#define PinFanIN 8         // Lüfter Zuluft an Pin 8
#define PinFanOUT 9        // Lüfter Abluft an Pin 9
#define DHT1_PIN 5         // Zur Messung DHT-Sensor 1 verwendeter Pin 5 (Innen)
#define Hmax 55            // max. Luftfeuchte Innen
#define dT 5               // Temp. Delta für Taupunktberechnung
#define OS1 -3.1            // Offset Temp Sensor 1   (Bitte alle Offsets mit allen Sensoren abgleichen!)
#define OS2 -2.6            // Offset Temp Sensor 2
#define OSH1 2.5           // Offset Feuchte Sensor 1
#define OSH2 -0.6           // Offset Feuchte Sensor 2
#define lcdButton 13       // aktiviert LCD
dht DHT1;                  // Initialisieren der DHTs


Si7021 si7021;

boolean S1;                // Schalter S1 (Automatik)
boolean S2;                // Schalter S2 (Man. ein)
boolean lcdActive = false; // LCD Aktivität

// *****************************************************************************

int FAN_I = 1;              // Zuluft Lüfter ein
int FAN_A = 1;              // Abluft Lüfter ein

float dht1_h;              // Innen Feuchte
float dht1_t;              // Innen Temp.
float si70212_h;              // Aussen Feuchte
float si70212_t;              // Aussen Temp.
float dp;                  // Berechneter Taupunkt Aussen

LiquidCrystal_I2C lcd(0x27, 20, 4); //LCD mit 4 Zielen à 20 Spalten

// ****** SETUP ****************************************************************

void setup()
{

  pinMode(PinS1, INPUT);          // Schalter I Automatik
  digitalWrite(PinS1, HIGH);      // Pullupwiderstand aktivieren (gegen Masse schalten)
  pinMode(PinS2, INPUT);          // Schalter II Man. ein.
  digitalWrite(PinS2, HIGH);      // Pullupwiderstand aktivieren (gegen Masse schalten)
  pinMode(PinFanIN, OUTPUT);      // Lüfter Zuluft
  digitalWrite(PinFanIN, HIGH);   // Ausschalten
  pinMode(PinFanOUT, OUTPUT);     // Lüfter Abluft
  digitalWrite(PinFanOUT, HIGH);  // Ausschalten
  pinMode(LED_BUILTIN, OUTPUT);   // Kontroll LED für Loop
  pinMode(lcdButton,INPUT_PULLUP);// aktiviert LCD
  lcd.init();
  lcd.begin();
  lcd.clear();
  lcd.noBlink();
  lcd.noCursor();
  lcd.noDisplay();
  lcd.noBacklight();
  
  Serial.begin(9600);
  Serial.flush();
  delay(500);
// Neuer Sensor
uint64_t serialNumber = 0ULL;

  Serial.begin(115200);
  si7021.begin();


  serialNumber = si7021.getSerialNumber();
 
  //arduino lib doesn't natively support printing 64bit numbers on the serial port
  //so it's done in 2 times
  Serial.print("Si7021 serial number: ");
  Serial.print((uint32_t)(serialNumber >> 32), HEX);
  Serial.println((uint32_t)(serialNumber), HEX);
 
  //Firware version
  Serial.print("Si7021 firmware version: ");
  Serial.println(si7021.getFirmwareVersion(), HEX);

// Ende neuer Sensor


 
}


// ****** Hauptprogramm Loop START *********************************************
void loop()
{


   Serial.print("Humidity: ");
  Serial.print(si7021.measureHumidity());
  Serial.print("% - Temperature: ");
  Serial.print(si7021.getTemperatureFromPreviousHumidityMeasurement());
  Serial.println("C");
  delay(500);
 



  readSensor();

  // ****** Betriebswahl *******************************************************
  S1 = digitalRead(PinS1);  // Schalter 1 = Automatik EIN
  S2 = digitalRead(PinS2);  // Schalter 2 = HAND EIN

  if (S1 == LOW) Automatik();
  if (S2 == LOW) Handbetrieb();
  if (S1 == HIGH && S2 == HIGH) AUS();

  //Plotter();                                            // Ausgabe auf Plotter
  if(!digitalRead(lcdButton)){
    lcdActive = true;
    printLCD();
  } else {
    if(lcdActive){
      lcd.noDisplay();
      lcd.noBacklight();
      lcdActive = false;
    }
  }
  digitalWrite(LED_BUILTIN,digitalRead(LED_BUILTIN)^1);   // Kontroll LED
}

// ****** Funktion Temperatur der Sensoren auslesen ****************************
void readSensor()
{
  DHT1.read22(DHT1_PIN);
  dht1_h = DHT1.humidity, 1;         // Luftfeuchte auslesen
  dht1_h = dht1_h + OSH1;            // Offset hinzu
  dht1_t = DHT1.temperature, 1;      // Temperatur auslesen
  dht1_t = dht1_t + OS1;             // Offset hinzu
  

 
  si70212_t = si7021.getTemperatureFromPreviousHumidityMeasurement() ;      // Temperatur auslesen
  si70212_t = si70212_t + OS2;               // Offset hinzu
  si70212_h = si7021.measureHumidity() ;       // Luftfeuchte auslesen
  si70212_h = si70212_h + OSH2;               // Offset hinzu
  
  
  /*  si70211.read22(si70211_PIN);
  si70211_h = si70211.humidity, 1;         // Luftfeuchte auslesen
  si70211_h = si70211_h + OSH1;            // Offset hinzu
  si70211_t = si70211.temperature, 1;      // Temperatur auslesen
  si70211_t = si70211_t + OS1;             // Offset hinzu

  si70212.read22(si70212_PIN);
  si70212_h = si70212.humidity, 1;         // Luftfeuchte auslesen
  si70212_h = si70212_h + OSH2;            // Offset hinzu
  si70212_t = si70212.temperature, 1;      // Temperatur auslesen
  si70212_t = si70212_t + OS2;             // Offset hinzu
*/
 
 
}


//****** Automatik Betrieb *****************************************************
void Automatik()
{
  Regelung();  // Automatikregelung
  if (FAN_I == 1)
  {
    digitalWrite(PinFanIN, LOW); // Einschalten
    digitalWrite(PinFanOUT, LOW); // Einschalten
  } else {
    digitalWrite(PinFanOUT, HIGH); // Ausschalten
    digitalWrite(PinFanIN, HIGH);  // Ausschalten
  }
}
//****** Man. ein Betrieb ******************************************************
void Handbetrieb()
{
  if (S2 == LOW)
  {
    digitalWrite(PinFanOUT, LOW); // Einschalten
    digitalWrite(PinFanIN, LOW);  // Einschalten
  }
}
//****** Ausschalten ***********************************************************
void AUS()
{
  digitalWrite(PinFanOUT, HIGH); // Ausschalten
  digitalWrite(PinFanIN, HIGH);  // Ausschalten
}
//******Lüftersteuerung ********************************************************
void Regelung() {
  float a, b;
  if (si70212_t >= 0) {
    a = 7.5;
    b = 237.3;
  } else {
    a = 7.6;
    b = 240.7;
  }

  float sgp = 6.1078 * pow(10, (a * si70212_t) / (b + si70212_t));

  float gp = (si70212_h / 100) * sgp;

  float v = log10(gp / 6.1078);

  dp = (b * v) / (a - v);

  if ((dp - dT) < dht1_t) {
    FAN_I = 1;
  } else {
    FAN_I = 0;
  }
  if (si70212_h > Hmax)  FAN_I = 0;                 // Feuchte aussen zu hoch

}

/****** LCD ***************************************************************
void printLCD () {
  lcd.display();
  lcd.backlight();
  lcd.home();

  //Zeile 1
  lcd.print("AT: ");lcd.print(si70212_t,1);lcd.setCursor(9,0);lcd.print("TP-A: ");lcd.print(dp,1);

  //Zeile 2
  lcd.setCursor(0,1);
  lcd.print("AH: ");lcd.print(si70212_h,1);lcd.print("%");

  //Zeile 3
  lcd.setCursor(0,2);
  lcd.print("IT: ");lcd.print(si70211_t,1);lcd.setCursor(9,2);lcd.print("MODE: ");
  
  if(!S1){
    lcd.print("AUT");
  } else {
    lcd.print("MAN");
  }

  //Zeile 4
  lcd.setCursor(0,3);
  lcd.print("IH:");lcd.print(si70211_h,1);;lcd.print("%");lcd.setCursor(9,3);lcd.print("FAN:  ");
  
  if(FAN_I){
    lcd.print("ON ");
  } else {
    lcd.print("OFF");
  }
}

*/

void printLCD () {
  lcd.display();
  lcd.backlight();
  lcd.home();

  //Zeile 1
  lcd.print("Aussen: ");lcd.print(si70212_t,1);lcd.print("\337C ");lcd.print(si70212_h,1);lcd.print("%");

  //Zeile 2
 lcd.setCursor(0,1);
 lcd.print("Bunker: ");lcd.print(dht1_t,1);lcd.print("\337C ");lcd.print(dht1_h,1);lcd.print("%");

  //Zeile 3
  lcd.setCursor(0,2);
  lcd.print("Taupunkt A.: ");lcd.print(dp,1);lcd.print("\337C ");
  
  //Zeile 4
  lcd.setCursor(0,3);
    
  if(!S1){
    lcd.print("Automatik\176L\365fter ");
  
  if(FAN_I){
    lcd.print("EIN");
  } else {
    lcd.print("AUS");
  }
  } 
    
    if(!S2){
    lcd.print("Manuell \176 L\365fter EIN");
  
  } 
if(S1 == HIGH && S2 == HIGH){
   lcd.print("Manuell \176 L\365fter AUS");
   }

}

// ****** Serial Plotter ****************************************************
void Plotter () {
  Serial.print(dht1_h); Serial.print('\t');
  Serial.print(dht1_t); Serial.print('\t');
  Serial.print(si70212_h); Serial.print('\t');
  Serial.print(si70212_t); Serial.print('\t');
  Serial.print(dp); Serial.print('\t');
  Serial.println();
}

Dein Sketch kann nicht funktionieren.
Ich sehe kein Setup.

Damit wir helfen können, musst du den kompletten Sketch posten.
Den allerdings in Code-Tags, nicht in Quote-Tags, da er so schwer lesbar ist.
Den Sketch kannst du auch nachträglich noch ändern.

HotSystems:
Dein Sketch kann nicht funktionieren.
Ich sehe kein Setup.

Damit wir helfen können, musst du den kompletten Sketch posten.
Den allerdings in Code-Tags, nicht in Quote-Tags, da er so schwer lesbar ist.
Den Sketch kannst du auch nachträglich noch ändern.

Habe jetzt gegen das komplette ausgetauscht.

Hi

Was mir auffällt: Du benutzt Pin13 und die Builtin-LED - Die ist beim UNO ebenfalls Pin 13.
Dadurch schaltest Du, wenn Du die LED schalten willst, den PullUP an und aus.

Weiter, wenn der Sensor zufällig SPI benutzt, ist Pin 13 auch darin enthalten - könnte ebenfalls erklären, warum Das nicht zusammen laufen will, zumindest nicht sonderlich rund.

Zu Deinem Sketch:
#define ist 'unschön', benutze für diese Werte besser Variablen im entsprechendem Typ.
Variablen-Typ: nicht Alles muß int sein - oder erwartest Du negative Pin-Nummern?
Selbst wenn, char würde ebenfalls bis -128 'runter gehen' und bräuchte nur 1 Byte Speicher, statt 2 Byte bei int.
Speicher: Was FEST ist, kannst Du auch so deklarieren.
Z.B. Pin-Nummern und auch Deine Fühler-Konstanten.
const byte LED_Pin=13; //Anschluss der Blink-LED
Hier muß kein 'Pin 13' in den Kommentar - DAS sieht man bereits vorne, weiter ist der Kommentar falsch, wenn man diesen Pin - warum auch immer ... vll., weil der Pin schon irgendwie anders benutzt wird, abgeändert wird.

Soll's erst Mal gewesen sein

MfG

Edit
LED-Pin=13 --> LED_Pin=13 ... das Minus wäre eine Berechnung - Das klappt nicht links vom = ... also mit dem - da drin ist's kein Name mehr, sondern es wird der Wert von 'Pin' von dem Wert von 'LED' abgezogen - Beide gibt's nicht, wirft einen Error.

Danke für das Feedback, bin allerdings absoluter Anfänger und der Sketch ist nicht von mir, lediglich bei ein paar Punkten angepasst.

Werde den Pin mal ändern und den Rest, wenn alles funktioniert. Kann ja nicht schaden alles zu optimieren, auch wenn ich den Hintergrund nicht verstehe :slight_smile:

Anbei der Plan für die Verdrahtung, allerdings noch mit zwei DHT22 Sensoren.
Was ich bereits auch gelernt habe, dass 12V nicht so gut für das Board ist, die habe ich gegen ein 9V Netzteil ausgetauscht.

Habe Pin13 gegen Pin 7 ausgetauscht, funktioniert immer noch nicht. Erst wenn ich am Si7021 das Kabel zu SDA ziehe und wieder verbinde, bekomme ich einen Wert angezeigt.

Keiner eine Idee?

dermaik:
Keiner eine Idee?

Mir fällt nur eins dazu ein, hast du am I2C-Bus auch Pullup-Widerstände ?
Ohne die kann es zu Problemen kommen.

Und du solltest deinen Sketch umbauen und mit einem Sensor anfangen.
Wenn das funktioniert, den zweiten hinzufügen.

Ne, Pullup Widerstände habe ich nicht dran, lese mich jetzt in die Funktion ein

Bei Komponenten am I2C-Bus lasse ich zuerst den I2C Scanner laufen, um Adresskonflikte erkennen zu können.

Mein I2C-20x4-LCDisplay hat PullUp-Widerstände auf der Adapter-Platine.

Habe jetzt 5,1 kOhm Widerstände an SCL und SDA angeschlossen, aber funktioniert immer noch nicht.

Der Tipp mit dem I2C Scanner war sehr gut. Habe aktuell nur das Display und den Si7021 angeschlossen.

Nach einem Reboot bekomme ich vom I2C Scanner folgende Rückmeldung:

Scanning...
I2C device found at address 0x27 !
done

Wenn ich dann das Kabel zum SDA Anschluss vom Temperatursensor ziehe und wieder einstecke, wird der Sensor auch gefunden.

Scanning...
I2C device found at address 0x27 !
I2C device found at address 0x40 !
done

Ein Adressenkonflikt oder Fehler im Sketch liegt hier nicht vor und an den fehlenden Pullup Wiederständen dürfte es auch nicht liegen. Den Arduino und den Temperatursensor habe ich testweise auch gegen einen anderen ausgetauscht.

Kann es evtl. daran liegen, dass das Display mit 5V und der Sensor mit 3V läuft?

Hi

  • Widerstände, kommt von wider = gegen, nicht von wieder = erneut
  • es ist Dein Problem, an Dem Du bereits 4 Tage hier rumdoktorst - 3V (nicht 3.3V?) und 5V hätte Dir vor 4 Tagen schon auffallen können.

Klar, wir sind hier Alles Götter und kennen jeden Sensor persönlich und mit Vornamen - aber so Kleinigkeiten wie die unterschiedliche Versorgungsspannungen können auch uns Mal durch die Lappen gehen.
Du wirst Glück gehabt haben, daß der 3.3V-Sensor Das bisher überlebt hat.
Dein Zauberwort wird wohl Pegelwandler/Levelshifter heißen.
Meine Sensor-Wahl wäre der BME280-5V - hier deutet die -5V an, daß Das Ding auch mit 5V kann - normal ist Das auch ein 3.3V-Sensor (und kann wohl auch damit, bisher nur an 5V gehabt).

Ein Blick in die entsprechenden Datenblätter hätte wohl ebenfalls gezeigt, daß der 3,3V-Sensor 3,3V auf SDA/SCL erwartet, die Pins könnten eine Schutzbeschaltung aufweisen, Die eine Überspannung nach Vcc ableitet - wenn der PullUp klein genug gewählt wurde, stirbt Dir der Sensor, weil Sein Vcc plötzlich weit über 3,3V steigt.

Auch liest sich Dein 'funktioniert IMMER noch nicht' etwas patzig.
Was hast Du erwartet, würde der 5K1Ω anstelle eines 4K7Ω ändern?
Hier darf auch gerne drüber nachgedacht werden, was diese Widerstände am I²C-Bus überhaupt machen und ob oder wie sich diese Änderung auswirken KANN.

Warum nur das Display gefunden wird, erschließt sich mir nicht, hätte eher erwartet, daß der SIS den Bus so weit runter zieht, daß Der erkannt aber für das Display die Pegel zu tief werden - warum Das genau anders herum ist - kA.

Was oder ob Du hier von was annimmst ist mir eigentlich egal, ich bin auch in weiteren 4 Tagen noch hier - nur, ob ich Lust habe, auf Deine Posts zu reagieren, wird sich erst zeigen müssen.

MfG

@postaster, danke für die Antwort aber kann es sein, dass Du mit dem falschen Fuß aufgestanden bist? Wenn dir was nicht passt, dann Ignoriere es doch einfach.

Das Thema ist für mich total neu, was erwartest Du?

Der einzige Beitrag der sich „nich nur etwas“ patzig liest, ist deiner. Auf so eine Hilfe kann ich gerne verzichten.

Vielen Dank

dermaik:
Der Tipp mit dem I2C Scanner war sehr gut.

Bitte gerne, hilft mir auch immer mal wieder.

dermaik:
Kann es evtl. daran liegen, dass das Display mit 5V und der Sensor mit 3V läuft?

Das habe ich noch nicht probiert, daher habe ich da keinerlei Erfahrung, aber theoretisch ja.

Passende I2C Pegelwandler gibt es glücklicherweise genug.

Eine Rückmeldung, ob es das gewesen ist, fände ich interessant.

@dermaik

Ich erwarte, auch von einem Anfänger, daß Er Sich zumindest ETWAS einliest.
Auch, daß nicht als erstes Projekt der Mars-Rover erschaffen werden muß, sondern eher, daß eine LED zum blinken gebracht wird.
Wenn hier immer wieder der gleiche Gulasch aufgekocht wird, mag Das für den einmaligen Besucher ja ganz toll sein, der Rest hier kann das alte Zeugs aber langsam nicht mehr riechen.
Das sind Grundlagen und werden Dir immer wieder über den Weg laufen.
Klar ist's schöner, wenn man an die Hand genommen wird und Alles haarklein vorgelöffelt bekommt - selber programmieren ist aber irgendwie anders - da wirst auch Du durch müssen - auch lernt man beim selber machen mehr.

In meinem Post ist Dir wohl aufgefallen, daß mir Deine Information, daß irgendwo eine andere Versorgungsspannung vorhanden ist, ein klein wenig zu spät kam - das hätte, auch ein Anfänger, wissen müssen, zumindest per Google herausfinden können, daß Das zu Problemen führen kann.
Auch gibt's z.B. zu I²C tonnenweise Dokumente in den Tiefen des WWW, dort steht sogar drin, wie der Kram funktioniert.

Aber auch ohne mein Hilfe wirst Du hoffentlich Erfolge erzielen.

MfG

postmaster-ino:
Wenn hier immer wieder der gleiche Gulasch aufgekocht wird, mag Das für den einmaligen Besucher ja ganz toll sein, der Rest hier kann das alte Zeugs aber langsam nicht mehr riechen.

Da stimme ich Dir erstmal zu

ABER

das ist DEIN Problem, nicht das vom Fragesteller.

In einem öffentlichen Forum kann jeder eine Frage zum Thema so stellen, wie er meint, die beste Antwort zu bekommen. Das Ergebnis hängt vom fachlichen Wissen, aber auch der sprachlichen und sozialen Kompetenz, der Empathie und weiteren Faktoren ab. Es ist ein Spiegelbild des Fragestellers, aber auch des Zeitgeistes.

Die ständige Wiederholung der selben Fragen mit den manchmal arg begrenzten Möglichkeiten ist vollkommen normal und KEIN Angriff auf Dich. Nur mit einer Änderung DEINER Einstellung wirst Du weiter Spaß an diesem Forum haben und hilfreiche Beiträge schreiben können.

Du bist ein sehr eifriger Schreiber und hast schon so manchen guten Tipp gegeben, weshalb ich mich sehr freuen würde, wenn Du die Kurve bekommen würdest weg vom Frust hin zur Freude. Dann hättest Du wahrscheinlich was Wertvolles für DEIN Leben gelernt.

Ich drücke Dir die Daumen und hoffe, Du kannst meine gut gemeinten Worte als hilfreich empfinden.

:slight_smile:

agmue:
Da stimme ich Dir erstmal zu

ABER

das ist DEIN Problem, nicht das vom Fragesteller.

In einem öffentlichen Forum kann jeder eine Frage zum Thema so stellen, wie er meint, die beste Antwort zu bekommen. Das Ergebnis hängt vom fachlichen Wissen, aber auch der sprachlichen und sozialen Kompetenz, der Empathie und weiteren Faktoren ab. Es ist ein Spiegelbild des Fragestellers, aber auch des Zeitgeistes.

Die ständige Wiederholung der selben Fragen mit den manchmal arg begrenzten Möglichkeiten ist vollkommen normal und KEIN Angriff auf Dich. Nur mit einer Änderung DEINER Einstellung wirst Du weiter Spaß an diesem Forum haben und hilfreiche Beiträge schreiben können.

Du bist ein sehr eifriger Schreiber und hast schon so manchen guten Tipp gegeben, weshalb ich mich sehr freuen würde, wenn Du die Kurve bekommen würdest weg vom Frust hin zur Freude. Dann hättest Du wahrscheinlich was Wertvolles für DEIN Leben gelernt.

Ich drücke Dir die Daumen und hoffe, Du kannst meine gut gemeinten Worte als hilfreich empfinden.

:slight_smile:

Gut auf den Punkt gebracht!

Es ist auch oft eine Frage der Tagesverfassung.

Für mich gilt: Keine Forenbeiträge vor dem 2. Kaffee :slight_smile:

uxomm:
Gut auf den Punkt gebracht!

Danke, ein doppelter Espresso wartet auf mich und verströmt seinen verlockenden Duft ...

Hi

Also derzeit kann's an mangelndem Kaffee nicht liegen - 3 Tassen wurden verinnerlicht - damals * hüstel * war ich aber noch nüchtern (medizinisch).

Klar ist es in erster Linie mein Problem, wenn mich die Frage zum siebenunddreißigsten Mal etwas anders 'berührt', als beim ersten Dutzend.

Habe jetzt 5,1 kOhm Widerstände an SCL und SDA angeschlossen, aber funktioniert immer noch nicht.

Zugegeben: so ganz kalt hat mich das 'immer' dann wohl nicht gelassen.
Habe etwas überreagiert, in meinen Augen las sich Das wie 'jetzt habe ich schon auf Euren Rat hin diesen verdammten Widerstand gewechselt und hier klappt noch immer Nichts'.

Habe wohl einfach zu Viel in den Post rein interpretiert - soll nicht wieder vor kommen - wenn doch: rüffeln und Er wird wieder lieb :wink:

MfG

postmaster-ino:
Habe wohl einfach zu Viel in den Post rein interpretiert - soll nicht wieder vor kommen - wenn doch: rüffeln und Er wird wieder lieb :wink:

Das lese ich gerne :slight_smile: