Go Down

Topic: Zwei Si7021 auslesen (Read 219 times) previous topic - next topic

dermaik

Hallo zusammen,

an meinem Arduino Uno habe ich einen Si7021 am I2C Bus angeschlossen und den anderen Si7021 Analog an Pin 4 und 5.

Ist es möglich, die Temperatur und Luftfeuchtigkeit von jedem Sensor separat auszulesen, bzw. mit welchen Sketch?

Vielen Dank

Tommy56

Am Uno gibt es I2C nur an den Pins A4 und A5. Da sich der Si7021 nicht in der I2C-Adresse umstellen läßt, kannst Du 2 Stück nur über I2C-Multiplexer/Switche anschließen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

postmaster-ino

Hi

... oder per Software I²C emulieren - ein I²C-Multiplexer ist Da deutlich schöner.
Ein Analog-Switch könnte auch gehen - daß Du nur Den Teilnehmer 'zuschaltest', mit Dem Du schwätzen willst - der Andere bekommt entweder keine Daten, oder keinen Takt (kein Takt wird wohl sinnvoller sein).
(Viel was Anderes ist in dem Multiplexer auch nicht drin - dort ist's aber direkt per I²C einstellbar)

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

dermaik


uxomm

I2C Multiplexer (zum Beispiel): TCA9548A
Hier ein Tutorial dafür
Always decouple electronic circuitry.

dermaik

Hi,

genau den habe ich aktuell vor mir liegen und angeschlossen, bin aber echt überfordert, das vorhandene Sketch mit den DHT22 gegen die Si7021 am TCA9548A auszutauschen. Habe mir als totaler Anfänger glaube ich zu viel zugemutet.

Folgendes Sketch für eine Lüftersteuerung möchte ich anpassen. Mit dem Austausch der DHT22 gegen die Si7021 bin ich echt überfordert.

Könnt ihr mir da helfen?



/*****************************************************************************************************************************
  Verein Feuerkunst-Pyrotechnik  - www.feuerkunst-pyrotechnik.ch  (C)2018
  Projekt: Trockenlüftungs-Steuerung V 1.0
  Beschreibung:  zwei DHT22 Feuchte/Temperatur Sensoren ermitteln Innen und Aussen die aktuellen Werte.
  Durch Berechnung wird der Taupunkt ermittelt, und Zu- und Abluft-Ventilatoren ein-/ausgeschaltet.

  Über ein Taster an Pin A3 können Daten am LCD angezeigt werden

  Einige Programmteile wurden übernommen von www.fluuux.de, www.markus-otte.de, und www.arduino.cc
*****************************************************************************************************************************/
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <dht.h>           // library für DHT22
#include "Adafruit_Si7021.h" //neu

Adafruit_Si7021 sensor = Adafruit_Si7021(); //neu

#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 DHT2_PIN 6         // Zur Messung DHT-Sensor 2 verwendeter Pin 6 (Aussen)
#define Hmax 55            // max. Luftfeuchte Innen
#define dT 5               // Temp. Delta für Taupunktberechnung
#define OS1 0.0            // Offset Temp Sensor 1   (Bitte alle Offsets mit allen Sensoren abgleichen!)
#define OS2 0.0            // Offset Temp Sensor 2
#define OSH1 0.0           // Offset Feuchte Sensor 1
#define OSH2 0.0           // Offset Feuchte Sensor 2
#define lcdButton 13       // aktiviert LCD

dht DHT2;                  // Initialisieren der DHTs
dht DHT1;                  // Initialisieren der DHTs

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 dht2_h;              // Aussen Feuchte
float dht2_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.begin();
 lcd.clear();
 lcd.noBlink();
 lcd.noCursor();
 lcd.noDisplay();
 lcd.noBacklight();
 
 Serial.begin(9600);
 Serial.flush();
 delay(500);
}
// ****** Hauptprogramm Loop START *********************************************
void loop()
{
 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

 DHT2.read22(DHT2_PIN);
 dht2_h = DHT2.humidity, 1;         // Luftfeuchte auslesen
 dht2_h = dht2_h + OSH2;            // Offset hinzu
 dht2_t = DHT2.temperature, 1;      // Temperatur auslesen
 dht2_t = dht2_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 (dht2_t >= 0) {
   a = 7.5;
   b = 237.3;
 } else {
   a = 7.6;
   b = 240.7;
 }

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

 float gp = (dht2_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 (dht2_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(dht2_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(dht2_h,1);

 //Zeile 3
 lcd.setCursor(0,2);
 lcd.print("IT: ");lcd.print(dht1_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(dht1_h,1);lcd.setCursor(9,3);lcd.print("FAN:  ");
 
 if(FAN_I){
   lcd.print("ON");
 } else {
   lcd.print("OFF");
 }
}

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

Go Up