Ich möchte mal den Partikelsensor / Staubsensor testen.

Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ich möchte mal den Partikelsensor / Staubsensor testen.

Beitrag von Admin »

Und hier habe ich mal für die, die auch ohne den Logic Level Converter arbeiten wollen, diesen aus dem Schaltplan entfernt. Ich werde mein Gerät wohl ohne den bauen. Aber die Empfehlung ist im Datenblatt 3,3 Volt 5 Volt verträglich !!
.
SEN54_SDN-T ohne LLC.JPG
SEN54_SDN-T ohne LLC.JPG (261.97 KiB) 308 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ich möchte mal den Partikelsensor / Staubsensor testen.

Beitrag von Admin »

Im ArduinoCC Forum hat mich eim User darauf hingewiesen, dass in Datenblatt meines Sensors steht, dass bei den Werten größerer Partikel immer die kleineren mitgezählt werden. Das heißt, dass z.B. Im PM10,0 Wert alle Partikel gezählt werden. Das heißt, wenn ich korrekte Werte haben will, muss ich zumindest den Feinstaub PM1,0 von den anderen abziehen, denn das ist der am meisten Vorhandene Feinstaub. Was ich mit dieser Programmversion hier gemacht habe.

Code: Alles auswählen


/*
   I2C-Generator: 0.3.0
   Yaml Version: 2.1.3
   Template Version: 0.7.0-112-g190ecaa

   Copyright (c) 2021, Sensirion AG
   All rights reserved.

    Weiterverbreitung und Nutzung in Quell- und Binärform, mit oder ohne
    Änderungen sind zulässig, sofern folgende Bedingungen erfüllt sind:

 * * Bei der Weiterverbreitung des Quellcodes muss der oben stehende Copyright-Hinweis enthalten
     sein Liste der Bedingungen und den folgenden Haftungsausschluss.

 * * Weiterverbreitungen in binärer Form müssen den oben genannten Urheberrechtshinweis
     wiedergeben. diese Liste der Bedingungen und den folgenden Haftungsausschluss in der
     Dokumentation und/oder andere Materialien, die mit der Verteilung bereitgestellt werden.

 * * Weder der Name der Sensirion AG noch deren Namen
     Mitwirkende können dazu verwendet werden, daraus abgeleitete Produkte zu unterstützen oder
     zu bewerben diese Software ohne vorherige ausdrückliche schriftliche Genehmigung.

    DIESE SOFTWARE WIRD VON DEN COPYRIGHT-INHABERN UND MITARBEITERN „WIE BESEHEN“ ZUR VERFÜGUNG
    GESTELLT.UND ALLE AUSDRÜCKLICHEN ODER STILLSCHWEIGENDEN GEWÄHRLEISTUNGEN, EINSCHLIESSLICH,
    ABER NICHT BESCHRÄNKT AUF DIE STILLSCHWEIGENDE GEWÄHRLEISTUNGEN DER MARKTGÄNGIGKEIT UND
    EIGNUNG FÜR EINEN BESTIMMTEN ZWECK WERDEN AUSGESCHLOSSEN.
    IN KEINEM FALL IST DER COPYRIGHT-INHABER ODER MITARBEITER HAFTBAR FÜR DIREKTE, INDIREKTE,
    ZUFÄLLIGE, BESONDERE, BEISPIELHAFTE ODER FOLGESCHÄDEN (EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT
    AUF DIE BESCHAFFUNG VON WAREN ODER DIENSTLEISTUNGEN ERSETZEN; NUTZUNGS-, DATEN- ODER
    GEWINNVERLUST; ODER GESCHÄFT UNTERBRECHUNG) JEGLICH VERURSACHT UND AUF JEDER HAFTUNGSTHEORIE,
    OB IN VERTRAG, GEFÄHRLICHE HAFTUNG ODER unerlaubte Handlung (EINSCHLIESSLICH FAHRLÄSSIGKEIT
    ODER ANDERWEITIG) DIE IN IRGENDEINER WEISE AUS DER VERWENDUNG DIESER SOFTWARE ENTSTEHEN,
    AUCH WENN SIE DARAUF HINGEWIESEN WURDEN MÖGLICHKEIT SOLCHER SCHÄDEN.

    ACHTUNG !!! PIN:5 auf GND legen um die I2C Schnittstelle zu aktivieren !!!
*/

#include <Arduino.h>
#include <SensirionI2CSen5x.h>
#include <Wire.h>
// LCD Display I2C 4 Zeilen je 20 Zeichen einrichten
#include <LiquidCrystal_I2C.h> // LCD Display
// Displayadresse ist 0x27 oder 0x3F
LiquidCrystal_I2C lcd(0x27, 20, 4);

// Die verwendeten Befehle belegen bis zu 48 Bytes. Bei einigen Arduinos der Standardpuffer
// Der Platz ist nicht groß genug
#define MAXBUF_REQUIREMENT 48

#if (defined(I2C_BUFFER_LENGTH) &&                 \
     (I2C_BUFFER_LENGTH >= MAXBUF_REQUIREMENT)) || \
    (defined(BUFFER_LENGTH) && BUFFER_LENGTH >= MAXBUF_REQUIREMENT)
#define USE_PRODUCT_INFO
#endif

SensirionI2CSen5x sen5x;

void printModuleVersions() {
  uint16_t error;
  char errorMessage[256];

  unsigned char productName[32];
  uint8_t productNameSize = 32;

  error = sen5x.getProductName(productName, productNameSize);

  if (error) {
    Serial.print("Fehler65 beim Versuch, getProductName auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  } else {
    Serial.print("ProductName:");
    Serial.println((char*)productName);
  }

  uint8_t firmwareMajor;
  uint8_t firmwareMinor;
  bool firmwareDebug;
  uint8_t hardwareMajor;
  uint8_t hardwareMinor;
  uint8_t protocolMajor;
  uint8_t protocolMinor;

  error = sen5x.getVersion(firmwareMajor, firmwareMinor, firmwareDebug,
                           hardwareMajor, hardwareMinor, protocolMajor,
                           protocolMinor);
  if (error) {
    Serial.print("Fehler85 beim Versuch, getVersion auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  } else {
    Serial.print("Firmware: ");
    Serial.print(firmwareMajor);
    Serial.print(".");
    Serial.print(firmwareMinor);
    Serial.print(", ");

    Serial.print("Hardware: ");
    Serial.print(hardwareMajor);
    Serial.print(".");
    Serial.println(hardwareMinor);
  }
}

void printSerialNumber() {
  uint16_t error;
  char errorMessage[256];
  unsigned char serialNumber[32];
  uint8_t serialNumberSize = 32;

  error = sen5x.getSerialNumber(serialNumber, serialNumberSize);
  if (error) {
    Serial.print("Fehler110 beim Versuch, getSerialNumber auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  } else {
    Serial.print("SerialNumber:");
    Serial.println((char*)serialNumber);
  }
}
//##########################################################################
//###################### SETUP #############################################
//##########################################################################

void setup() {

  Serial.begin(115200);
  while (!Serial) {
    delay(100);
  }
  //-----------LCD Display Start----------------------------------------
  lcd.begin();
  lcd.backlight();
  lcd.clear();
  //-----------LCD Standart Text Display--------------------------------
  lcd.setCursor (0, 0);            // Zeile 1
  lcd.print (F("PM1       PM2"));
  lcd.setCursor (0, 1);            // Zeile 2
  lcd.print (F("PM4       PM10"));
  lcd.setCursor (0, 2);            // Zeile 3
  lcd.print (F("FlOrgVe       mg/m3"));
  lcd.setCursor (0, 3);            // Zeile 4
  lcd.print (F("Tem       Hy"));
  //----------------------------------------------------------------------
  Wire.begin();

  sen5x.begin(Wire);

  uint16_t error;
  char errorMessage[256];
  error = sen5x.deviceReset();
  if (error) {
    Serial.print("Fehler135 beim Versuch, deviceReset auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  }

  // Drucken Sie SEN55-Modulinformationen, wenn die i2c-Puffer groß genug sind
#ifdef USE_PRODUCT_INFO
  printSerialNumber();
  printModuleVersions();
#endif

  // einen Temperatur-Offset in Grad Celsius einstellen
  // Hinweis: Unterstützt von SEN54- und SEN55-Sensoren
  // Standardmäßig werden Temperatur und Luftfeuchtigkeit vom Sensor ausgegeben
  // werden für die Eigenerwärmung der Module kompensiert. Wenn das Modul ist
  // In ein Gerät integriert, das möglicherweise eine Temperaturkompensation benötigt
  // angepasst werden, um die Änderung der thermischen Kopplung zu berücksichtigen und
  // Eigenerwärmung anderer Gerätekomponenten.
  //
  // Ein Leitfaden zur Erzielung optimaler Leistung, einschließlich Referenzen
  // zu mechanischen Design-In-Beispielen finden Sie im App-Hinweis
  // „SEN5x – Anleitung zur Temperaturkompensation“ unter www.sensirion.com.
  // Weitere Informationen finden Sie in den Anwendungshinweisen
  // über die verwendeten erweiterten Kompensationseinstellungen
  // in `setTemperatureOffsetParameters`, `setWarmStartParameter` und
  // `setRhtAccelerationMode`.
  //
  // TempOffset anpassen, um zusätzliche Temperaturunterschiede zu berücksichtigen
  // Überschreitung der Eigenerwärmung des SEN-Moduls.
  float tempOffset = 0.0;
  error = sen5x.setTemperatureOffsetSimple(tempOffset);
  if (error) {
    Serial.print("Fehler169 beim Versuch, setTemperatureOffsetSimple auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  } else {
    Serial.print("Temperatur-Offset eingestellt auf ");
    Serial.print(tempOffset);
    Serial.println(" Grad. Celsius (nur SEN54/SEN55).");
  }

  // Start Measurement
  error = sen5x.startMeasurement();
  if (error) {
    Serial.print("Fehler181 beim Versuch, startMeasurement auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  }
}
//#############################################################################
//############################### LOOP ########################################
//#############################################################################
void loop() {
  uint16_t error;
  char errorMessage[256];

  delay(5000);

  // Read Measurement
  float massConcentrationPm1p0;
  float massConcentrationPm2p5;
  float massConcentrationPm4p0;
  float massConcentrationPm10p0;
  //-----Display Werte------------
  float massConcentrationPm2p5_2;
  float massConcentrationPm4p0_2;
  float massConcentrationPm10p0_2;
  float ambientHumidity;
  float ambientTemperature;
  float vocIndex;
  float noxIndex;

  error = sen5x.readMeasuredValues(
            massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0,
            massConcentrationPm10p0, ambientHumidity, ambientTemperature, vocIndex,
            noxIndex);

  if (error) {
    Serial.print("Fehler211 beim Versuch, readMeasuredValues auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  } else {
    //Serial.print("MC -> Pm1p0: ");
    //Serial.print(massConcentrationPm1p0);
    lcd.setCursor (4, 0);            // Zeile 1
    lcd.print ("      ");
    lcd.setCursor (4, 0);            // Zeile 1
    lcd.print (massConcentrationPm1p0);
    //--------------------------------------------
    //Serial.print("   MC -> Pm2p5: ");
    //Serial.print(massConcentrationPm2p5);
    massConcentrationPm2p5_2 = massConcentrationPm2p5 - massConcentrationPm1p0;
    if (massConcentrationPm2p5_2 <10){
    lcd.setCursor (14, 0);            // Zeile 1
    lcd.print ("      ");
    lcd.setCursor (15, 0);            // Zeile 1
    lcd.print (massConcentrationPm2p5_2);
    } else {
       lcd.setCursor (14, 0);            // Zeile 1
    lcd.print ("      ");
    lcd.setCursor (14, 0);            // Zeile 1
    lcd.print (massConcentrationPm2p5_2);
    }
    
    //--------------------------------------------
    //Serial.print("   MC -> Pm4p0: ");
    //Serial.print(massConcentrationPm4p0);
    massConcentrationPm4p0_2 = massConcentrationPm4p0 - massConcentrationPm2p5;
    lcd.setCursor (4, 1);            // Zeile 2
    lcd.print ("     ");
    lcd.setCursor (4, 1);            // Zeile 2
    lcd.print (massConcentrationPm4p0_2);
    //--------------------------------------------
    //Serial.print("   MC -> Pm10p0: ");
    //Serial.print(massConcentrationPm10p0);
    massConcentrationPm10p0_2 = massConcentrationPm10p0 - massConcentrationPm4p0;
    lcd.setCursor (15, 1);            // Zeile 2
    lcd.print ("     ");
    lcd.setCursor (15, 1);            // Zeile 2
    lcd.print (massConcentrationPm10p0_2);
    //--------------------------------------------
    //Serial.print("  /  Luftfeuchte: ");
    if (isnan(ambientHumidity)) {
      //Serial.print("n/a");
    } else {
      //Serial.print(ambientHumidity);
      lcd.setCursor (14, 3);            // Zeile 4
      lcd.print ("      ");
      lcd.setCursor (14, 3);            // Zeile 4
      lcd.print (ambientHumidity);
    }
    //Serial.print("   Temp.: ");
    if (isnan(ambientTemperature)) {
      //Serial.print("n/a");
    } else {
      //Serial.print(ambientTemperature);
      lcd.setCursor (4, 3);            // Zeile 4
      lcd.print ("      ");
      lcd.setCursor (4, 3);            // Zeile 4
      lcd.print (ambientTemperature);
    }
    //Serial.print(" / Fluechtige-Organische-Verb.:");
    if (isnan(vocIndex)) {
      //Serial.print("n/a");
    } else {
      //Serial.print(vocIndex);
      lcd.setCursor (8, 2);            // Zeile 3
      lcd.print ("      ");
      lcd.setCursor (8, 2);            // Zeile 3
      lcd.print (vocIndex / 100);
    }
    //Serial.print(" NoxIndex:");
    if (isnan(noxIndex)) {
      //Serial.println("n/a");
    } else {
      //Serial.println(noxIndex);
    }
  }
}
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ich möchte mal den Partikelsensor / Staubsensor testen.

Beitrag von Admin »

Und ich habe jetzt gerade beim Lüften so richtig schlechte Luft mitbekommen. Da das Programm schon geändert war, konnte ich das gleich mit der extrem miesen Luft einer Holzofen-Heizung testen. Hier das Ergebnis: :O:
.
SEN50_SDN_T_Aufbau_7.jpg
SEN50_SDN_T_Aufbau_7.jpg (322.69 KiB) 296 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ich möchte mal den Partikelsensor / Staubsensor testen.

Beitrag von Admin »

Ich habe jetzt mal um ein Display erweitert, weil ich nicht mehr weiß wo ich meine Daten anzeigen soll. Und der CO2 Sensor läuft fürs erste. Morgen werde ich mal noch den DHT22 Sensor anhängen. Wenn der auch läuft, was kein Problem sein kann, dann werde ich mich mal ans Gehäuse machen.

Hier ist das aktuelle Programm. Wie gesagt mir zwei Display je 4x20 Zeichen, SEN54_SDN-T und CO2 Sensor. Die Software für den DHT22 Aussensensor ist auch schon enthalten. Die DHT22 Sensoren sind mir ausgegangen. Den kann ich erst in ein paar Tagen anschließen.

Achtung!! Ich habe mich gerade einige Stunden selbst verarscht und Hardware, wie auch Software auf den Kopf gestellt. Der Sensor, den ich bestellt habe, ist 0-5000 PPM. Bekommen habe ich 0-3000 PPM was man aber nur durch das Kontrollieren des PWM Ausganges des Sensors sehen kann, denn der Aufkleber auf dem Sensor sagt 0-5000 ppm. Das muss man aber oben bei den Deklarationen "int ppmrange = 3000;" selber entsprechend einstellen. Ich aheb natürlich für 0-5000 auch ppmrange = 5000 eingestellt. Ja, wenn aber der Sensor 0-3000 ist, dann hat man total falsche
werte. Kaum ist "ppmrange = 3000" klappt alles wunderbar. :(o): :(o): Vom Lieferanten verarscht :(o): :(o):

Code: Alles auswählen


/*
   I2C-Generator: 0.3.0
   Yaml Version: 2.1.3
   Template Version: 0.7.0-112-g190ecaa

   Copyright (c) 2021, Sensirion AG
   All rights reserved.

    Weiterverbreitung und Nutzung in Quell- und Binärform, mit oder ohne
    Änderungen sind zulässig, sofern folgende Bedingungen erfüllt sind:

 * * Bei der Weiterverbreitung des Quellcodes muss der oben stehende Copyright-Hinweis enthalten
     sein Liste der Bedingungen und den folgenden Haftungsausschluss.

 * * Weiterverbreitungen in binärer Form müssen den oben genannten Urheberrechtshinweis
     wiedergeben. diese Liste der Bedingungen und den folgenden Haftungsausschluss in der
     Dokumentation und/oder andere Materialien, die mit der Verteilung bereitgestellt werden.

 * * Weder der Name der Sensirion AG noch deren Namen
     Mitwirkende können dazu verwendet werden, daraus abgeleitete Produkte zu unterstützen oder
     zu bewerben diese Software ohne vorherige ausdrückliche schriftliche Genehmigung.

    DIESE SOFTWARE WIRD VON DEN COPYRIGHT-INHABERN UND MITARBEITERN „WIE BESEHEN“ ZUR VERFÜGUNG
    GESTELLT.UND ALLE AUSDRÜCKLICHEN ODER STILLSCHWEIGENDEN GEWÄHRLEISTUNGEN, EINSCHLIESSLICH,
    ABER NICHT BESCHRÄNKT AUF DIE STILLSCHWEIGENDE GEWÄHRLEISTUNGEN DER MARKTGÄNGIGKEIT UND
    EIGNUNG FÜR EINEN BESTIMMTEN ZWECK WERDEN AUSGESCHLOSSEN.
    IN KEINEM FALL IST DER COPYRIGHT-INHABER ODER MITARBEITER HAFTBAR FÜR DIREKTE, INDIREKTE,
    ZUFÄLLIGE, BESONDERE, BEISPIELHAFTE ODER FOLGESCHÄDEN (EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT
    AUF DIE BESCHAFFUNG VON WAREN ODER DIENSTLEISTUNGEN ERSETZEN; NUTZUNGS-, DATEN- ODER
    GEWINNVERLUST; ODER GESCHÄFT UNTERBRECHUNG) JEGLICH VERURSACHT UND AUF JEDER HAFTUNGSTHEORIE,
    OB IN VERTRAG, GEFÄHRLICHE HAFTUNG ODER unerlaubte Handlung (EINSCHLIESSLICH FAHRLÄSSIGKEIT
    ODER ANDERWEITIG) DIE IN IRGENDEINER WEISE AUS DER VERWENDUNG DIESER SOFTWARE ENTSTEHEN,
    AUCH WENN SIE DARAUF HINGEWIESEN WURDEN MÖGLICHKEIT SOLCHER SCHÄDEN.

    ACHTUNG !!! PIN:5 auf GND legen um die I2C Schnittstelle zu aktivieren !!!
    Version "I2C_SenX5_Beta_02" mit SEN54_SDN-T / CO2 Sensor MH-Z19B / 2 x Display / DTH22 Sensor
*/

#include <Arduino.h>
#include <SensirionI2CSen5x.h>
#include <Wire.h>
// LCD Display I2C 4 Zeilen je 20 Zeichen einrichten
#include <LiquidCrystal_I2C.h> // LCD Display
// Displayadresse ist 0x27 oder 0x3F
LiquidCrystal_I2C lcd1(0x27, 20, 4);
LiquidCrystal_I2C lcd2(0x3F, 20, 4);
//----------------------------------------------
#include "DHT.h"
const byte DHTPIN1 = 7;         // Hier die Pin Nummer eintragen wo der Sensor1 angeschlossen ist
#define DHTTYPE DHT22     // Hier wird definiert was für ein Sensor DHT11 oder DHT22 !!
DHT dht1(DHTPIN1, DHTTYPE); //Sensor1 einrichten
//------CO2 Sensor-------------------------------
const byte DataPin = 6; // Pin für CO2 Sensor
//----CO2 Sensor------
int ppmrange = 2000; // 2000 oder 5000 ??
unsigned long pwmtime;
int PPM = 0;
float pulsepercent = 0;
unsigned long Sekundenablauf01 = 0;
unsigned long Pausezeit01 = 5000;
unsigned long milliuebergabe = 0;
//-----------------------------------------------
// Die verwendeten Befehle belegen bis zu 48 Bytes. Bei einigen Arduinos der Standardpuffer
// Der Platz ist nicht groß genug
#define MAXBUF_REQUIREMENT 48

#if (defined(I2C_BUFFER_LENGTH) &&                 \
     (I2C_BUFFER_LENGTH >= MAXBUF_REQUIREMENT)) || \
    (defined(BUFFER_LENGTH) && BUFFER_LENGTH >= MAXBUF_REQUIREMENT)
#define USE_PRODUCT_INFO
#endif

SensirionI2CSen5x sen5x;

void printModuleVersions() {
  uint16_t error;
  char errorMessage[256];

  unsigned char productName[32];
  uint8_t productNameSize = 32;

  error = sen5x.getProductName(productName, productNameSize);

  if (error) {
    Serial.print("Fehler65 beim Versuch, getProductName auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  } else {
    Serial.print("ProductName:");
    Serial.println((char*)productName);
  }

  uint8_t firmwareMajor;
  uint8_t firmwareMinor;
  bool firmwareDebug;
  uint8_t hardwareMajor;
  uint8_t hardwareMinor;
  uint8_t protocolMajor;
  uint8_t protocolMinor;

  error = sen5x.getVersion(firmwareMajor, firmwareMinor, firmwareDebug,
                           hardwareMajor, hardwareMinor, protocolMajor,
                           protocolMinor);
  if (error) {
    Serial.print("Fehler85 beim Versuch, getVersion auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  } else {
    Serial.print("Firmware: ");
    Serial.print(firmwareMajor);
    Serial.print(".");
    Serial.print(firmwareMinor);
    Serial.print(", ");

    Serial.print("Hardware: ");
    Serial.print(hardwareMajor);
    Serial.print(".");
    Serial.println(hardwareMinor);
  }
}

void printSerialNumber() {
  uint16_t error;
  char errorMessage[256];
  unsigned char serialNumber[32];
  uint8_t serialNumberSize = 32;

  error = sen5x.getSerialNumber(serialNumber, serialNumberSize);
  if (error) {
    Serial.print("Fehler110 beim Versuch, getSerialNumber auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  } else {
    Serial.print("SerialNumber:");
    Serial.println((char*)serialNumber);
  }
}
//##########################################################################
//###################### SETUP #############################################
//##########################################################################
void setup() {

  Serial.begin(115200);
  while (!Serial) {
    delay(100);
  }
  // Luftfeuchte und Temperatur Sensoren
  dht1.begin(); // Sensor1 starten
  //-----------LCD1 + 2 Display Start--------------------------------------
  lcd1.begin();
  lcd1.backlight();
  lcd1.clear();
  lcd2.begin();
  lcd2.backlight();
  lcd2.clear();
  //-----------LCD1 + 2 Standart Text Display------------------------------
  lcd1.setCursor (0, 0);            // Zeile 1
  lcd1.print (F("PM1       PM2"));
  lcd1.setCursor (0, 1);            // Zeile 2
  lcd1.print (F("PM4       PM10"));
  lcd1.setCursor (0, 2);            // Zeile 3
  lcd1.print (F("FlOrgVe       mg/m3"));
  lcd1.setCursor (0, 3);            // Zeile 4
  lcd1.print (F("Tem       Hy"));
  lcd2.setCursor (0, 0);            // Zeile 1
  lcd2.print (F("CO2 - Wert      PPM"));
  lcd2.setCursor (0, 1);            // Zeile 2
  lcd2.print (F("AussenTemp        C"));
  lcd2.setCursor (0, 2);            // Zeile 2
  lcd2.print (F("Lu-Feuchte        %"));
  //----------------------------------------------------------------------
  Wire.begin();

  sen5x.begin(Wire);

  uint16_t error;
  char errorMessage[256];
  error = sen5x.deviceReset();
  if (error) {
    Serial.print("Fehler135 beim Versuch, deviceReset auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  }

  // Drucken Sie SEN55-Modulinformationen, wenn die i2c-Puffer groß genug sind
#ifdef USE_PRODUCT_INFO
  printSerialNumber();
  printModuleVersions();
#endif

  // einen Temperatur-Offset in Grad Celsius einstellen
  // Hinweis: Unterstützt von SEN54- und SEN55-Sensoren
  // Standardmäßig werden Temperatur und Luftfeuchtigkeit vom Sensor ausgegeben
  // werden für die Eigenerwärmung der Module kompensiert. Wenn das Modul ist
  // In ein Gerät integriert, das möglicherweise eine Temperaturkompensation benötigt
  // angepasst werden, um die Änderung der thermischen Kopplung zu berücksichtigen und
  // Eigenerwärmung anderer Gerätekomponenten.
  //
  // Ein Leitfaden zur Erzielung optimaler Leistung, einschließlich Referenzen
  // zu mechanischen Design-In-Beispielen finden Sie im App-Hinweis
  // „SEN5x – Anleitung zur Temperaturkompensation“ unter www.sensirion.com.
  // Weitere Informationen finden Sie in den Anwendungshinweisen
  // über die verwendeten erweiterten Kompensationseinstellungen
  // in `setTemperatureOffsetParameters`, `setWarmStartParameter` und
  // `setRhtAccelerationMode`.
  //
  // TempOffset anpassen, um zusätzliche Temperaturunterschiede zu berücksichtigen
  // Überschreitung der Eigenerwärmung des SEN-Moduls.
  float tempOffset = 0.0;
  error = sen5x.setTemperatureOffsetSimple(tempOffset);
  if (error) {
    Serial.print("Fehler169 beim Versuch, setTemperatureOffsetSimple auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  } else {
    Serial.print("Temperatur-Offset eingestellt auf ");
    Serial.print(tempOffset);
    Serial.println(" Grad. Celsius (nur SEN54/SEN55).");
  }

  // Start Measurement
  error = sen5x.startMeasurement();
  if (error) {
    Serial.print("Fehler181 beim Versuch, startMeasurement auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  }
}
//#############################################################################
//############################### LOOP ########################################
//#############################################################################
void loop() {
  uint16_t error;
  char errorMessage[256];
  milliuebergabe = millis();
  //--------------------------------------------------------------------------
  if (milliuebergabe - Sekundenablauf01 >= Pausezeit01) { // 5000ms abgelaufen?
    Sekundenablauf01 = millis();                     // Die 5000ms neu starten
    //------------------------------------------------------------------------
    //------------------- CO2 Messung und Aussen Temp / Feuchte---------------
    //------------------------------------------------------------------------
    pwmtime = pulseIn(DataPin, HIGH, 2000000) / 1000;
    float pulsepercent = pwmtime / 1674.0;
    PPM = ppmrange * pulsepercent;
    //Serial.print (F("PPM= "));
    //Serial.println(PPM);
    float h1 = dht1.readHumidity();    // Lesen der Luftfeuchtigkeit1 und speichern in die Variable h1
    float t1 = dht1.readTemperature(); // Lesen der Temperatur in °C1 und speichern in die Variable t1
    //Serial.print (F("Luftfeuchte= "));
    //Serial.println(h1);
    //Serial.print (F("Temperatur= "));
    //Serial.println(t1);
    lcd2.setCursor (11, 0);            // Zeile 1
    lcd2.print ("     ");
    lcd2.setCursor (11, 0);            // Zeile 1
    lcd2.print (PPM);
    lcd2.setCursor (11, 1);            // Zeile 2
    lcd2.print ("     ");
    lcd2.setCursor (11, 1);            // Zeile 2
    lcd2.print (t1);
    lcd2.setCursor (11, 2);            // Zeile 3
    lcd2.print ("     ");
    lcd2.setCursor (11, 2);            // Zeile 3
    lcd2.print (h1);
    //-------------------------------------------------------------------------
    //--------------- CO2 Messung und Aussen Temp / Feuchte Ende --------------
    //-------------------------------------------------------------------------
    // Read Measurement
    float massConcentrationPm1p0;
    float massConcentrationPm2p5;
    float massConcentrationPm4p0;
    float massConcentrationPm10p0;
    //-----Display Werte------------
    float massConcentrationPm2p5_2;
    float massConcentrationPm4p0_2;
    float massConcentrationPm10p0_2;
    float ambientHumidity;
    float ambientTemperature;
    float vocIndex;
    float noxIndex;

    error = sen5x.readMeasuredValues(
              massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0,
              massConcentrationPm10p0, ambientHumidity, ambientTemperature, vocIndex,
              noxIndex);

    if (error) {
      Serial.print("Fehler211 beim Versuch, readMeasuredValues auszuführen(): ");
      errorToString(error, errorMessage, 256);
      Serial.println(errorMessage);
    } else {
      //Serial.print("MC -> Pm1p0: ");
      //Serial.print(massConcentrationPm1p0);
      lcd1.setCursor (4, 0);            // Zeile 1
      lcd1.print ("      ");
      lcd1.setCursor (4, 0);            // Zeile 1
      lcd1.print (massConcentrationPm1p0);
      //--------------------------------------------
      //Serial.print("   MC -> Pm2p5: ");
      //Serial.print(massConcentrationPm2p5);
      massConcentrationPm2p5_2 = massConcentrationPm2p5 - massConcentrationPm1p0;
      if (massConcentrationPm2p5_2 < 10) {
        lcd1.setCursor (14, 0);            // Zeile 1
        lcd1.print ("      ");
        lcd1.setCursor (15, 0);            // Zeile 1
        lcd1.print (massConcentrationPm2p5_2);
      } else {
        lcd1.setCursor (14, 0);            // Zeile 1
        lcd1.print ("      ");
        lcd1.setCursor (14, 0);            // Zeile 1
        lcd1.print (massConcentrationPm2p5_2);
      }

      //--------------------------------------------
      //Serial.print("   MC -> Pm4p0: ");
      //Serial.print(massConcentrationPm4p0);
      massConcentrationPm4p0_2 = massConcentrationPm4p0 - massConcentrationPm2p5;
      lcd1.setCursor (4, 1);            // Zeile 2
      lcd1.print ("     ");
      lcd1.setCursor (4, 1);            // Zeile 2
      lcd1.print (massConcentrationPm4p0_2);
      //--------------------------------------------
      //Serial.print("   MC -> Pm10p0: ");
      //Serial.print(massConcentrationPm10p0);
      massConcentrationPm10p0_2 = massConcentrationPm10p0 - massConcentrationPm4p0;
      lcd1.setCursor (15, 1);            // Zeile 2
      lcd1.print ("     ");
      lcd1.setCursor (15, 1);            // Zeile 2
      lcd1.print (massConcentrationPm10p0_2);
      //--------------------------------------------
      //Serial.print("  /  Luftfeuchte: ");
      if (isnan(ambientHumidity)) {
        //Serial.print("n/a");
      } else {
        //Serial.print(ambientHumidity);
        lcd1.setCursor (14, 3);            // Zeile 4
        lcd1.print ("      ");
        lcd1.setCursor (14, 3);            // Zeile 4
        lcd1.print (ambientHumidity);
      }
      //Serial.print("   Temp.: ");
      if (isnan(ambientTemperature)) {
        //Serial.print("n/a");
      } else {
        //Serial.print(ambientTemperature);
        lcd1.setCursor (4, 3);            // Zeile 4
        lcd1.print ("      ");
        lcd1.setCursor (4, 3);            // Zeile 4
        lcd1.print (ambientTemperature);
      }
      //Serial.print(" / Fluechtige-Organische-Verb.:");
      if (isnan(vocIndex)) {
        //Serial.print("n/a");
      } else {
        //Serial.print(vocIndex);
        lcd1.setCursor (8, 2);            // Zeile 3
        lcd1.print ("      ");
        lcd1.setCursor (8, 2);            // Zeile 3
        lcd1.print (vocIndex / 100);
      }
      //Serial.print(" NoxIndex:");
      if (isnan(noxIndex)) {
        //Serial.println("n/a");
      } else {
        //Serial.println(noxIndex);
      }
    }
  }
}
Und ein Bild von aktuellen Aufbau:
.
SEN50_SDN_T_Aufbau_8.jpg
SEN50_SDN_T_Aufbau_8.jpg (383.75 KiB) 273 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ich möchte mal den Partikelsensor / Staubsensor testen.

Beitrag von Admin »

Ich habe gerade noch die Uhr reingestrickt. Alles läuft weterhin sehr gut. Hier ist das aktuelle Programm:

Code: Alles auswählen


/*
   I2C-Generator: 0.3.0
   Yaml Version: 2.1.3
   Template Version: 0.7.0-112-g190ecaa

   Copyright (c) 2021, Sensirion AG
   All rights reserved.

    Weiterverbreitung und Nutzung in Quell- und Binärform, mit oder ohne
    Änderungen sind zulässig, sofern folgende Bedingungen erfüllt sind:

 * * Bei der Weiterverbreitung des Quellcodes muss der oben stehende Copyright-Hinweis enthalten
     sein Liste der Bedingungen und den folgenden Haftungsausschluss.

 * * Weiterverbreitungen in binärer Form müssen den oben genannten Urheberrechtshinweis
     wiedergeben. diese Liste der Bedingungen und den folgenden Haftungsausschluss in der
     Dokumentation und/oder andere Materialien, die mit der Verteilung bereitgestellt werden.

 * * Weder der Name der Sensirion AG noch deren Namen
     Mitwirkende können dazu verwendet werden, daraus abgeleitete Produkte zu unterstützen oder
     zu bewerben diese Software ohne vorherige ausdrückliche schriftliche Genehmigung.

    DIESE SOFTWARE WIRD VON DEN COPYRIGHT-INHABERN UND MITARBEITERN „WIE BESEHEN“ ZUR VERFÜGUNG
    GESTELLT.UND ALLE AUSDRÜCKLICHEN ODER STILLSCHWEIGENDEN GEWÄHRLEISTUNGEN, EINSCHLIESSLICH,
    ABER NICHT BESCHRÄNKT AUF DIE STILLSCHWEIGENDE GEWÄHRLEISTUNGEN DER MARKTGÄNGIGKEIT UND
    EIGNUNG FÜR EINEN BESTIMMTEN ZWECK WERDEN AUSGESCHLOSSEN.
    IN KEINEM FALL IST DER COPYRIGHT-INHABER ODER MITARBEITER HAFTBAR FÜR DIREKTE, INDIREKTE,
    ZUFÄLLIGE, BESONDERE, BEISPIELHAFTE ODER FOLGESCHÄDEN (EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT
    AUF DIE BESCHAFFUNG VON WAREN ODER DIENSTLEISTUNGEN ERSETZEN; NUTZUNGS-, DATEN- ODER
    GEWINNVERLUST; ODER GESCHÄFT UNTERBRECHUNG) JEGLICH VERURSACHT UND AUF JEDER HAFTUNGSTHEORIE,
    OB IN VERTRAG, GEFÄHRLICHE HAFTUNG ODER unerlaubte Handlung (EINSCHLIESSLICH FAHRLÄSSIGKEIT
    ODER ANDERWEITIG) DIE IN IRGENDEINER WEISE AUS DER VERWENDUNG DIESER SOFTWARE ENTSTEHEN,
    AUCH WENN SIE DARAUF HINGEWIESEN WURDEN MÖGLICHKEIT SOLCHER SCHÄDEN.

    ACHTUNG !!! PIN:5 von SEN54 auf GND legen um die I2C Schnittstelle zu aktivieren !!!
    Version "I2C_SenX5_Beta_02" 
    mit SEN54_SDN-T / CO2 Sensor MH-Z19B / 2 x Display / DTH22 Sensor / DC3231 Uhr
*/

#include <Arduino.h>
#include <SensirionI2CSen5x.h>
#include <Wire.h>
#define DS3231_ADDRESSE 0x68
// LCD Display I2C 4 Zeilen je 20 Zeichen einrichten
#include <LiquidCrystal_I2C.h> // LCD Display
// Displayadresse ist 0x27 oder 0x3F
LiquidCrystal_I2C lcd1(0x27, 20, 4);
LiquidCrystal_I2C lcd2(0x3F, 20, 4);
//----------------------------------------------
#include "DHT.h"
const byte DHTPIN1 = 7;         // Hier die Pin Nummer eintragen wo der Sensor1 angeschlossen ist
#define DHTTYPE DHT22     // Hier wird definiert was für ein Sensor DHT11 oder DHT22 !!
DHT dht1(DHTPIN1, DHTTYPE); //Sensor1 einrichten
//------CO2 Sensor-------------------------------
const byte DataPin = 6; // Pin für CO2 Sensor
//----CO2 Sensor------
int ppmrange = 3000; // 2000, 3000 oder 5000 ??
unsigned long pwmtime;
int PPM = 0;
float pulsepercent = 0;
unsigned long Sekundenablauf01 = 0;
unsigned long Pausezeit01 = 5000;
unsigned long milliuebergabe = 0;
//-----------------------------------------------
// Die verwendeten Befehle belegen bis zu 48 Bytes. Bei einigen Arduinos der Standardpuffer
// Der Platz ist nicht groß genug
#define MAXBUF_REQUIREMENT 48

#if (defined(I2C_BUFFER_LENGTH) &&                 \
     (I2C_BUFFER_LENGTH >= MAXBUF_REQUIREMENT)) || \
    (defined(BUFFER_LENGTH) && BUFFER_LENGTH >= MAXBUF_REQUIREMENT)
#define USE_PRODUCT_INFO
#endif

SensirionI2CSen5x sen5x;

void printModuleVersions() {
  uint16_t error;
  char errorMessage[256];

  unsigned char productName[32];
  uint8_t productNameSize = 32;

  error = sen5x.getProductName(productName, productNameSize);

  if (error) {
    Serial.print("Fehler65 beim Versuch, getProductName auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  } else {
    Serial.print("ProductName:");
    Serial.println((char*)productName);
  }

  uint8_t firmwareMajor;
  uint8_t firmwareMinor;
  bool firmwareDebug;
  uint8_t hardwareMajor;
  uint8_t hardwareMinor;
  uint8_t protocolMajor;
  uint8_t protocolMinor;

  error = sen5x.getVersion(firmwareMajor, firmwareMinor, firmwareDebug,
                           hardwareMajor, hardwareMinor, protocolMajor,
                           protocolMinor);
  if (error) {
    Serial.print("Fehler85 beim Versuch, getVersion auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  } else {
    Serial.print("Firmware: ");
    Serial.print(firmwareMajor);
    Serial.print(".");
    Serial.print(firmwareMinor);
    Serial.print(", ");

    Serial.print("Hardware: ");
    Serial.print(hardwareMajor);
    Serial.print(".");
    Serial.println(hardwareMinor);
  }
}

void printSerialNumber() {
  uint16_t error;
  char errorMessage[256];
  unsigned char serialNumber[32];
  uint8_t serialNumberSize = 32;

  error = sen5x.getSerialNumber(serialNumber, serialNumberSize);
  if (error) {
    Serial.print("Fehler110 beim Versuch, getSerialNumber auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  } else {
    Serial.print("SerialNumber:");
    Serial.println((char*)serialNumber);
  }
}
unsigned long minutenablauf = 0;
unsigned long eineminute = 60000;
//##########################################################################
//###################### SETUP #############################################
//##########################################################################
void setup() {

  Serial.begin(115200);
  while (!Serial) {
    delay(100);
  }
  // Luftfeuchte und Temperatur Sensoren
  dht1.begin(); // Sensor1 starten
  //-----------LCD1 + 2 Display Start--------------------------------------
  lcd1.begin();
  lcd1.backlight();
  lcd1.clear();
  lcd2.begin();
  lcd2.backlight();
  lcd2.clear();
  //-----------LCD1 + 2 Standart Text Display------------------------------
  lcd1.setCursor (0, 0);            // Zeile 1
  lcd1.print (F("PM1       PM2"));
  lcd1.setCursor (0, 1);            // Zeile 2
  lcd1.print (F("PM4       PM10"));
  lcd1.setCursor (0, 2);            // Zeile 3
  lcd1.print (F("FlOrgVe       mg/m3"));
  lcd1.setCursor (0, 3);            // Zeile 4
  lcd1.print (F("Tem       Hy"));
  lcd2.setCursor (0, 0);            // Zeile 1
  lcd2.print (F("CO2 - Wert      PPM"));
  lcd2.setCursor (0, 1);            // Zeile 2
  lcd2.print (F("AussenTemp        C"));
  lcd2.setCursor (0, 2);            // Zeile 2
  lcd2.print (F("Lu-Feuchte        %"));

  zeigeZeit(); // Zeit ausgeben    // Zeile 1
  //----------------------------------------------------------------------
  Wire.begin();
  // Wenn die Zeit gestellt werden muß
  // aktuelle Zeit        sek min std wt tag monat jahr
  // einstellenDS3231zeit(00, 22, 22, 2, 16,  06,  20);
  sen5x.begin(Wire);

  uint16_t error;
  char errorMessage[256];
  error = sen5x.deviceReset();
  if (error) {
    Serial.print("Fehler135 beim Versuch, deviceReset auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  }

  // Drucken Sie SEN55-Modulinformationen, wenn die i2c-Puffer groß genug sind
#ifdef USE_PRODUCT_INFO
  printSerialNumber();
  printModuleVersions();
#endif

  // einen Temperatur-Offset in Grad Celsius einstellen
  // Hinweis: Unterstützt von SEN54- und SEN55-Sensoren
  // Standardmäßig werden Temperatur und Luftfeuchtigkeit vom Sensor ausgegeben
  // werden für die Eigenerwärmung der Module kompensiert. Wenn das Modul ist
  // In ein Gerät integriert, das möglicherweise eine Temperaturkompensation benötigt
  // angepasst werden, um die Änderung der thermischen Kopplung zu berücksichtigen und
  // Eigenerwärmung anderer Gerätekomponenten.
  //
  // Ein Leitfaden zur Erzielung optimaler Leistung, einschließlich Referenzen
  // zu mechanischen Design-In-Beispielen finden Sie im App-Hinweis
  // „SEN5x – Anleitung zur Temperaturkompensation“ unter www.sensirion.com.
  // Weitere Informationen finden Sie in den Anwendungshinweisen
  // über die verwendeten erweiterten Kompensationseinstellungen
  // in `setTemperatureOffsetParameters`, `setWarmStartParameter` und
  // `setRhtAccelerationMode`.
  //
  // TempOffset anpassen, um zusätzliche Temperaturunterschiede zu berücksichtigen
  // Überschreitung der Eigenerwärmung des SEN-Moduls.
  float tempOffset = 0.0;
  error = sen5x.setTemperatureOffsetSimple(tempOffset);
  if (error) {
    Serial.print("Fehler169 beim Versuch, setTemperatureOffsetSimple auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  } else {
    Serial.print("Temperatur-Offset eingestellt auf ");
    Serial.print(tempOffset);
    Serial.println(" Grad. Celsius (nur SEN54/SEN55).");
  }

  // Start Measurement
  error = sen5x.startMeasurement();
  if (error) {
    Serial.print("Fehler181 beim Versuch, startMeasurement auszuführen(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  }
  minutenablauf = millis();
}
//#############################################################################
//############################### LOOP ########################################
//#############################################################################
void loop() {
  uint16_t error;
  char errorMessage[256];
  milliuebergabe = millis();
  //-----------Zeit ausgeben von DS3231-----------------------------------
  if (milliuebergabe - minutenablauf >= eineminute) { // Eine Minute abgelaufen?
    zeigeZeit(); // Zeit ausgeben
  }
    //--------------------------------------------------------------------------
    if (milliuebergabe - Sekundenablauf01 >= Pausezeit01) { // 5000ms abgelaufen?
      Sekundenablauf01 = millis();                     // Die 5000ms neu starten
      //------------------------------------------------------------------------
      //------------------- CO2 Messung und Aussen Temp / Feuchte---------------
      //------------------------------------------------------------------------
      pwmtime = pulseIn(DataPin, HIGH, 2000000) / 1000;
      float pulsepercent = pwmtime / 1000.0;
      PPM = ppmrange * pulsepercent;
      //Serial.print (F("PPM= "));
      //Serial.println(PPM);
      float h1 = dht1.readHumidity();    // Lesen der Luftfeuchtigkeit1 und speichern in die Variable h1
      float t1 = dht1.readTemperature(); // Lesen der Temperatur in °C1 und speichern in die Variable t1
      //Serial.print (F("Luftfeuchte= "));
      //Serial.println(h1);
      //Serial.print (F("Temperatur= "));
      //Serial.println(t1);
      lcd2.setCursor (11, 0);            // Zeile 1
      lcd2.print ("     ");
      lcd2.setCursor (11, 0);            // Zeile 1
      lcd2.print (PPM);
      lcd2.setCursor (11, 1);            // Zeile 2
      lcd2.print ("     ");
      lcd2.setCursor (11, 1);            // Zeile 2
      lcd2.print (t1);// t1 = Lufttemperatur
      lcd2.setCursor (11, 2);            // Zeile 3
      lcd2.print ("     ");
      lcd2.setCursor (11, 2);            // Zeile 3
      lcd2.print (h1);// h1 = Luftfeuchte
      //-------------------------------------------------------------------------
      //--------------- CO2 Messung und Aussen Temp / Feuchte Ende --------------
      //-------------------------------------------------------------------------
      // Read Measurement
      float massConcentrationPm1p0;
      float massConcentrationPm2p5;
      float massConcentrationPm4p0;
      float massConcentrationPm10p0;
      //-----Display Werte------------
      float massConcentrationPm2p5_2;
      float massConcentrationPm4p0_2;
      float massConcentrationPm10p0_2;
      float ambientHumidity;
      float ambientTemperature;
      float vocIndex;
      float noxIndex;

      error = sen5x.readMeasuredValues(
                massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0,
                massConcentrationPm10p0, ambientHumidity, ambientTemperature, vocIndex,
                noxIndex);

      if (error) {
        Serial.print("Fehler211 beim Versuch, readMeasuredValues auszuführen(): ");
        errorToString(error, errorMessage, 256);
        Serial.println(errorMessage);
      } else {
        //Serial.print("MC -> Pm1p0: ");
        //Serial.print(massConcentrationPm1p0);
        lcd1.setCursor (4, 0);            // Zeile 1
        lcd1.print ("      ");
        lcd1.setCursor (4, 0);            // Zeile 1
        lcd1.print (massConcentrationPm1p0);
        //--------------------------------------------
        //Serial.print("   MC -> Pm2p5: ");
        //Serial.print(massConcentrationPm2p5);
        massConcentrationPm2p5_2 = massConcentrationPm2p5 - massConcentrationPm1p0;
        if (massConcentrationPm2p5_2 < 10) {
          lcd1.setCursor (14, 0);            // Zeile 1
          lcd1.print ("      ");
          lcd1.setCursor (15, 0);            // Zeile 1
          lcd1.print (massConcentrationPm2p5_2);
        } else {
          lcd1.setCursor (14, 0);            // Zeile 1
          lcd1.print ("      ");
          lcd1.setCursor (14, 0);            // Zeile 1
          lcd1.print (massConcentrationPm2p5_2);
        }

        //--------------------------------------------
        //Serial.print("   MC -> Pm4p0: ");
        //Serial.print(massConcentrationPm4p0);
        massConcentrationPm4p0_2 = massConcentrationPm4p0 - massConcentrationPm2p5;
        lcd1.setCursor (4, 1);            // Zeile 2
        lcd1.print ("     ");
        lcd1.setCursor (4, 1);            // Zeile 2
        lcd1.print (massConcentrationPm4p0_2);
        //--------------------------------------------
        //Serial.print("   MC -> Pm10p0: ");
        //Serial.print(massConcentrationPm10p0);
        massConcentrationPm10p0_2 = massConcentrationPm10p0 - massConcentrationPm4p0;
        lcd1.setCursor (15, 1);            // Zeile 2
        lcd1.print ("     ");
        lcd1.setCursor (15, 1);            // Zeile 2
        lcd1.print (massConcentrationPm10p0_2);
        //--------------------------------------------
        //Serial.print("  /  Luftfeuchte: ");
        if (isnan(ambientHumidity)) {
          //Serial.print("n/a");
        } else {
          //Serial.print(ambientHumidity);
          lcd1.setCursor (14, 3);            // Zeile 4
          lcd1.print ("      ");
          lcd1.setCursor (14, 3);            // Zeile 4
          lcd1.print (ambientHumidity);
        }
        //Serial.print("   Temp.: ");
        if (isnan(ambientTemperature)) {
          //Serial.print("n/a");
        } else {
          //Serial.print(ambientTemperature);
          lcd1.setCursor (4, 3);            // Zeile 4
          lcd1.print ("      ");
          lcd1.setCursor (4, 3);            // Zeile 4
          lcd1.print (ambientTemperature);
        }
        //Serial.print(" / Fluechtige-Organische-Verb.:");
        if (isnan(vocIndex)) {
          //Serial.print("n/a");
        } else {
          //Serial.print(vocIndex);
          lcd1.setCursor (8, 2);            // Zeile 3
          lcd1.print ("      ");
          lcd1.setCursor (8, 2);            // Zeile 3
          lcd1.print (vocIndex / 100);
        }
        //Serial.print(" NoxIndex:");
        if (isnan(noxIndex)) {
          //Serial.println("n/a");
        } else {
          //Serial.println(noxIndex);
        }
      }
    }
  }
  //---------------Erweiterung für die DS3132---------------------------------------------------------------------
  void einstellenDS3231zeit(byte sekunde, byte minute, byte stunde, byte wochentag, byte tag, byte monat, byte jahr)
  {
    // Datum und Uhrzeit einstellen
    Wire.beginTransmission(DS3231_ADDRESSE);
    Wire.write(0);
    Wire.write(decToBcd(sekunde)); // Sekunden einstellen
    Wire.write(decToBcd(minute)); // Minuten einstellen
    Wire.write(decToBcd(stunde));
    Wire.write(decToBcd(wochentag)); // 1=Sonntag ... 7=Samstag
    Wire.write(decToBcd(tag));
    Wire.write(decToBcd(monat));
    Wire.write(decToBcd(jahr)); // 0...99
    Wire.endTransmission();
  }
  //--------------------------Die Zeit auslesen------------------------------------------------------------------
  // jede Minute etwa 5000 Microsekunden
  void leseDS3231zeit(byte * sekunde, byte * minute, byte * stunde, byte * wochentag, byte * tag, byte * monat, byte * jahr)
  {
    Wire.beginTransmission(DS3231_ADDRESSE);
    Wire.write(0); // DS3231 Register zu 00h
    Wire.endTransmission();
    Wire.requestFrom(DS3231_ADDRESSE, 7); // 7 Byte Daten vom DS3231 holen
    *sekunde = bcdToDec(Wire.read() & 0x7f);
    *minute = bcdToDec(Wire.read());
    *stunde = bcdToDec(Wire.read() & 0x3f);
    *wochentag = bcdToDec(Wire.read());
    *tag = bcdToDec(Wire.read());
    *monat = bcdToDec(Wire.read());
    *jahr = bcdToDec(Wire.read());
  }
  //---------------------------Die Zeit anzeigen----------------------------------------------------------------
  // jede Minute etwa 15000 Microsekunden
  void zeigeZeit() {
    byte sekunde, minute, stunde, wochentag, tag, monat, jahr, minuteAlt;
    leseDS3231zeit(&sekunde, &minute, &stunde, &wochentag, &tag, &monat, &jahr);   // Daten vom DS3231 holen
    if ((minute > minuteAlt) || (minute == 0)) {
      switch (wochentag) {
        case 1:
          lcd2.setCursor(0, 3);
          lcd2.print(F("Mo "));
          break;
        case 2:
          lcd2.setCursor(0, 3);
          lcd2.print(F("Di "));
          break;
        case 3:
          lcd2.setCursor(0, 3);
          lcd2.print(F("Mi "));
          break;
        case 4:
          lcd2.setCursor(0, 3);
          lcd2.print(F("Do "));
          break;
        case 5:
          lcd2.setCursor(0, 3);
          lcd2.print(F("Fr "));
          break;
        case 6:
          lcd2.setCursor(0, 3);
          lcd2.print(F("Sa "));
          break;
        case 7:
          lcd2.setCursor(0, 3);
          lcd2.print(F("So "));
          break;
        default:
          break;
      }
      if (tag < 10) {
        lcd2.print(F("0"));
      }
      lcd2.print(tag); // ausgeben T.M.J H:M:S
      lcd2.print(F("."));
      if (monat < 10) {
        lcd2.print(F("0"));
      }
      lcd2.print(monat);
      lcd2.print(F("."));
      lcd2.print(jahr);
      lcd2.print(F(" um "));
      if (stunde < 10) {
        lcd2.print(F("0"));
      }
      lcd2.print(stunde, DEC); // byte in Dezimal zur Ausgabe
      lcd2.print(F(":"));
      if (minute < 10) {
        lcd2.print("0");
      }
      lcd2.print(minute, DEC);
      minuteAlt = minute;
      // Bestimmen wann wieder eine Minute um
      minutenablauf = millis();
      eineminute = (60 - sekunde) * 1000UL;
    }
  }
  byte decToBcd(byte val) {
    // Dezimal Zahl zu binary coded decimal (BCD) umwandeln
    return ((val / 10 * 16) + (val % 10));
  }
  byte bcdToDec(byte val) {
    // BCD (binary coded decimal) in Dezimal Zahl umwandeln
    return ((val / 16 * 10) + (val % 16));
  }
.
SEN50_SDN_T_Aufbau_72.jpg
SEN50_SDN_T_Aufbau_72.jpg (365.09 KiB) 232 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ich möchte mal den Partikelsensor / Staubsensor testen.

Beitrag von Admin »

Jetzt muß ich mal ein bischen überlegen, wie es damit weiter geht. Ich werde als Signalisierung einen MP3 Player einbauen. Und anstelle von irgend einem Gepiepse, lieber eigene Musik aus meiner MP3 Sammlung auf die Speicherkarten legen. Kleiner Verstärker, zwei kleine Lautsprecher, usw. Dann braucht man keine LEDs und Gepiepse als Signalisierung. Man kann auch selber Ansagen aufspielen, die dann aufgerufen werden.
Zum Beispiel, "hey du Pfeife, mache doch mal das Fenster auf, da stinkts nach dir, oder willst du lieber ersticken". :oo:
Und später dann, "OK, OK, jetzt reicht es schon wieder mit dem Lüften. Man soll nichts übertreiben. Wir haben hier wieder beste Luft" :(o):
Oder, "OK, das mit dem Lüften ist im Moment doch nicht soooo gut, da fliegen gerade seeeeehr viele Russ-Partikel durch die Luft". :(oo):

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ich möchte mal den Partikelsensor / Staubsensor testen.

Beitrag von Admin »

Ich habe jetzt mein Kontrollgerät nochmal im Freien an guter frischer Luft auf 400ppm Kalibriert und dann meine Kiste hier auch nochmal damit verglichen. Da habe ich festgestellt dass ich mit der Einstellung "ppmrange = 3000" wunderbar hin komme. Daher habe ich weiter oben nochmal geändert.

Seit ich das Kontrollgerät heute mal wieder Kalibriert habe, sind die CO2 Werte zwischen dem Gerät und meinen Sensor wirklich super nahe zusammen. Nach dem Kalibrieren sind beide fast parallel wieder hoch gegangen, und auch jetzt in den höheren Bereichen sind sie zwischen 1 und 20 ppm auseinander. Also mehr als erwartet. Wenn man überlegt, dass da jedes mal schnell 50ppm und mehr abweichen kann, dann ist das jetzt schon seeehr gut getroffen. Und ich habe nichts zum Anpassen getan. Nur das eine Kalibriert und der neue Sensor hat eh gepasst. Hier ist noch ein aktuelles Bild davon. Da war der CO2 Wert bei den beiden Geräten 1188 und 1191ppm.

Gerade ist mein Aussensensor für Temp und Feuchte angekommen. Also habe ich den auch noch angesteckt. Bin zufrieden mit dem Ergebnis. :(oo):

Franz :(V):
.
SEN50_SDN_T_Aufbau_83.jpg
SEN50_SDN_T_Aufbau_83.jpg (382.21 KiB) 196 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ich möchte mal den Partikelsensor / Staubsensor testen.

Beitrag von Admin »

Der Wert für Flüchtige Organische Verbindungen von meinem Sensor ist noch nicht das was ich mir vorstelle. Da ist der Wert der von dem Kontrollgerät ermittelt wird, schon immer sehr deutlich anders. Hier oben am Bild Kotrollgerät 2,64 und mein Sensor 1,01. Ich glaube ich besorge mir noch einen guten Sensor für schädliche Stoffe in der Luft. :roll:
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ich möchte mal den Partikelsensor / Staubsensor testen.

Beitrag von Admin »

Ich habe mir jetzt noch den Sensor bestellt. Denn der Wert für "Flüchtige Organische Stoffe ist mir irgendwie nicht Vertraut. Das ist ein sensor der auf 4 Verschiedene Gase Testet, und auch 4 Schnüffelnasen dafür auf der Platine hat. Ich hoffe mal, das bringt Quallitative Vorteile bei den Messergebnissen. :(o): :(o):

Sollte Ende Der Woche hier sein, denke ich.
Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Ich möchte mal den Partikelsensor / Staubsensor testen.

Beitrag von Admin »

Der MP3 Player ist eingebaut und läuft wunderbar. Ich habe noch nicht alle Meldungen aufgesprochen und die Auslöser der Meldungen noch nicht alle verknüpft, aber das ist am Wochenende warscheinlich erledigt. Die Platine mit den 4 Schnüffelnasen ist unterwegs zu mir. Ich denke am Wochenende wird das noch hier eintreffen. Dann kann ich den letzten Punkt noch testen. OK, die Verknüpfungen sind noch ein bischen Arbeit, aber die Richtung habe ich schon. Dann ist das Ding erst mal erledigt. Das kann man dann mit Automatischen Fenstersteuerungen benutzen, oder mit Sprachausgabe die zum Manuellen Lüften auffordert.

Franz
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 26 Gäste