ESP8266 mit SCD30 Sensor (Schleife wird nicht wiederholt?)

Hallo liebe Arduino Community,

ich schreib hier auch mal was, weil ich aktuell nicht weiter komme.

Ich arbeite aktuell an einem kleinem Projekt mit dem ESP8266 und SCD30 Sensor.
Der Sensor soll die Werte erfassen und dann ausgeben.
Bei mir erfolgt die Ausgabe auf einer 8x8 Adafruit Matrix.

Ich hab aktuell ein Problem.
Mein Code steht soweit (warscheinlich nicht gut aber sollte erstmal so passen, programmier noch nicht so lang)

Sobald ich den Sensor Ansteuer, gibt er kein Wert aus.
Wenn ich dann unten im Loop alles nach delay(500); rauslösche, dass heißt alle if-Funktionen weg, geht es wieder.

Hat einer eine Idee woran es liegen könnte?
Er hat irgendwie Probleme das ganze zu loopen.

if ([u]int/u <1000 )
Das int hab ich hin, weil ich dachte, dass er irgendwie einen Wert braucht.

Vielen Dank schon im vorraus :slight_smile:
Gruß Rayven

P.S. Gerne auch über Discord melden :D: Rayvenlive#6122

Hier der Code:

#include <Wire.h> // Wird benötigt für die I2C Ports(Beim ESP8266 Pin D1 und D2))
#include "SparkFun_SCD30_Arduino_Library.h" //Bibliothek für Co2 Sensor (SCD30)

#include <avr/pgmspace.h>  // Es wird im Flash Speicher gespeichet. [Needed to store stuff in Flash using PROGMEM] (verbraucht weniger Speicher und wird nicht in Flash gespeichert)
#include "FastLED.h"       // FastLED Bibliothek zum LED Steuern. [Fastled library to control the LEDs]


SCD30 airSensor;

#define NUM_LEDS 64 // Anzahl der LED. [How many leds are connected?]

#define DATA_PIN 6 // Data Pin der LED Matrix. [Connected to the data pin of the first LED strip]

CRGB leds[NUM_LEDS]; // RGB Pixel. [Define the array of leds]



//Jetzt werden alle 9 Möglichkeiten eingetragen (Von alle Grün zu alle Rot)
// Sie werden alle mit dem HTML Farb code wiedergegeben

const long Bild1[] PROGMEM =  // Alle Grün (0-1000)
{
0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 
0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 
0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 
0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 
0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 
0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 
0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 
0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00, 0x00ff00
};


Die anderen Hier hab ich rausgenommen, weils zu lang wäre


void setup(){
 FastLED.addLeds<NEOPIXEL,DATA_PIN>(leds, NUM_LEDS);  //FastLED Bibliothek mit Pin wird angesteuert [Init of the Fastled library]
 FastLED.setBrightness(50); //Helligkeit [Brightness] (Max255)
 

 Serial.begin(115200);
 Serial.println("SCD30 Example");
 Wire.begin();

 if (airSensor.begin() == false)
 {
   Serial.println("Air sensor not detected. Please check wiring. Freezing...");
   while (1)
     ;
 }

}

void loop()
{

 if (airSensor.dataAvailable())
 {
   Serial.print("co2(ppm):");
   Serial.print(airSensor.getCO2());

   Serial.print(" temp(C):");
   Serial.print(airSensor.getTemperature(), 1);

   Serial.print(" humidity(%):");
   Serial.print(airSensor.getHumidity(), 1);

   Serial.println();
 }
 else
 {
   Serial.println("Waiting for new data");
 }
 delay(500); //SCD30 liest nur alle 2 Sekunden den Wert aus


 if (int(airSensor.getCO2()) <1000 )     //PPM bis 1000
 {
   FastLED.clear();
     for(int i = 0; i < NUM_LEDS; i++) {
     leds[i] = pgm_read_dword(&(Bild1[i]));
     }
  FastLED.show();
  delay(100); //SCD30 liest nur alle 2 Sekunden den Wert aus
 }


 if (int(airSensor.getCO2()) >1000 && int(airSensor.getCO2()) <=1143)     //Wenn der Messwert größer 1000 und kleiner-gleich als 1143 ist, dann...
 { 
   FastLED.clear();
     for(int i = 0; i < NUM_LEDS; i++) {
     leds[i] = pgm_read_dword(&(Bild2[i]));
     }
  FastLED.show();
  delay(100);    //SCD30 liest nur alle 2 Sekunden den Wert aus
 }


 if (int(airSensor.getCO2()) >1143 && int(airSensor.getCO2()) <=1286)     //Wenn der Messwert größer 1143 und kleiner-gleich als 1286 ist, dann...
 {
   FastLED.clear();
     for(int i = 0; i < NUM_LEDS; i++) {
     leds[i] = pgm_read_dword(&(Bild3[i]));
     }
   FastLED.show();
   delay(100);     //SCD30 liest nur alle 2 Sekunden den Wert aus
 }


 if (int(airSensor.getCO2()) >1286 && int(airSensor.getCO2()) <=1429)     //Wenn der Messwert größer 1286 und kleiner-gleich als 1429 ist, dann...
 {
   FastLED.clear();
     for(int i = 0; i < NUM_LEDS; i++) {
     leds[i] = pgm_read_dword(&(Bild4[i]));
     }
   FastLED.show();
   delay(100);    //SCD30 liest nur alle 2 Sekunden den Wert aus
 }


 if (int(airSensor.getCO2()) >1429 && int(airSensor.getCO2()) <=1572)     //Wenn der Messwert größer 1429 und kleiner-gleich als 1572 ist, dann...
 {
   FastLED.clear();
     for(int i = 0; i < NUM_LEDS; i++) {
     leds[i] = pgm_read_dword(&(Bild5[i]));
     }
   FastLED.show();
   delay(100);    //SCD30 liest nur alle 2 Sekunden den Wert aus
 }


 if (int(airSensor.getCO2()) >1572 && int(airSensor.getCO2()) <=1715)     //Wenn der Messwert größer 1572 und kleiner-gleich als 1715 ist, dann...
 {
   FastLED.clear();
     for(int i = 0; i < NUM_LEDS; i++) {
     leds[i] = pgm_read_dword(&(Bild6[i]));
     }
   FastLED.show();
   delay(100);    //SCD30 liest nur alle 2 Sekunden den Wert aus
 }


 if (int(airSensor.getCO2()) >1715 && int(airSensor.getCO2()) <=1858)     //Wenn der Messwert größer 1715 und kleiner-gleich als 1858 ist, dann...
 {
   FastLED.clear();
     for(int i = 0; i < NUM_LEDS; i++) {
     leds[i] = pgm_read_dword(&(Bild7[i]));
     }
   FastLED.show();
   delay(100);    //SCD30 liest nur alle 2 Sekunden den Wert aus
 }


 if (int(airSensor.getCO2()) >1858 && int(airSensor.getCO2()) <=2001)     //Wenn der Messwert größer 1858 und kleiner-gleich als 2001 ist, dann...
 {
   FastLED.clear();
     for(int i = 0; i < NUM_LEDS; i++) {
     leds[i] = pgm_read_dword(&(Bild8[i]));
     }
   FastLED.show();
   delay(100);    //SCD30 liest nur alle 2 Sekunden den Wert aus
 }


 if (int(airSensor.getCO2()) >2001)     //Wenn der Messwert größer 2001, dann...
 {
   FastLED.clear();
     for(int i = 0; i < NUM_LEDS; i++) {
     leds[i] = pgm_read_dword(&(Bild9[i]));
     }
   FastLED.show();
   delay(100);    //SCD30 liest nur alle 2 Sekunden den Wert aus
 }


}

Programmco2sensor.txt (11.3 KB)

Hallo und willkommen im Forum!

Bitte setze deinen Sketch direkt ins Forum und verwende dazu Code-Tags. Dann ist er besser lesbar, vorallem für unsere Tablet Nutzer.

Gruß

Sobald ich den Sensor Ansteuer, gibt er kein Wert aus.
Wenn ich dann unten im Loop alles nach delay(500); rauslösche, dass heißt alle if-Funktionen weg, geht es wieder.

Soll heißen die serielle Ausgabe davor funktioniert? Aber nur ohne If Anweisungen?

Ich kenne diesen Sensor nicht aber du hast da immer wieder einen Vermerk von 2 Sekunden drin stehen. Mal ein Schuss ins blaue, denke du funkst den Sensor viel zu oft an. Lese doch den Sensor an einer Stelle mit mindestens 2 Sekunden Pause ein und schreibe den Wert in eine Variable. Diese Variable nutzt du dann um deine Vergleiche zu machen. In der Zeit hat dein Sensor dann Pause..

Gruß

Wenn der Sensor nur alle 2 Sek. Daten liefert, ist es wohl keine gute Idee ihn mehrfach pro Sek. auszulesen.
Deshalb solltest du ihn nur auslesen, wenn ein Wert verfügbar ist, und diesen in eine Variable speichern, mit welcher du dann weiterarbeitest. Auch sollten die If-Abfragen nur abgearbeitet werden, wenn ein neuer Wert vorliegt.
FastLED.clear() brauchst du nicht aufzurufen, wenn du die Farben der LEDs lediglich aktualisieren möchtest.
Habe zusätzlich noch die Redundanzen aus den If-Abfragen rausgekürzt.
Hoffe, ich hab nichts übersehen.

gruß Lorenz

example.ino (9.93 KB)

Hallo
hier kommt eine ungtestete Lösung.
Ich habe, wie oben angemerkt, eine lokale Variable airSensorCO2 in den Sketch aufgenommen und jage diese, als Ersatz für die unübersichtliche IF-Kontruktion, durch einen Switch/Case Konstrukt. Hier mußt du schauen ob die Intervalle zu deinem Projekt passen.
UNGETESTET:

void loop()
{
  if (airSensor.dataAvailable())
  {
    int airSensorCO2 = airSensor.getCO2(); // Sensor einmal auslesen
    Serial.print("co2(ppm):");
    Serial.print(airSensor.getCO2());
    Serial.print(" temp(C):");
    Serial.print(airSensor.getTemperature(), 1);
    Serial.print(" humidity(%):");
    Serial.print(airSensor.getHumidity(), 1);
    Serial.println();

#define iLED int i = 0; i < NUM_LEDS; i++ // ein Makro, erspart Tipparbeit 
    switch (airSensorCO2)
    {
      case 0 ... 999:
        for (iLED) leds = pgm_read_dword(&(Bild1));
        break;
      case 1000 ... 1141:
        for (iLED) leds = pgm_read_dword(&(Bild2));
        break;
      case 1142 ... 1285:
        for (iLED) leds = pgm_read_dword(&(Bild3));
        break;
      case 1286 ... 1429:
        for (iLED) leds = pgm_read_dword(&(Bild4));
        break;
      case 1430 ... 1571:
        for (iLED) leds = pgm_read_dword(&(Bild5));
        break;
      case 1572 ... 1715:
        for (iLED) leds = pgm_read_dword(&(Bild6));
        break;
      case 1716 ... 1857:
        for (iLED) leds = pgm_read_dword(&(Bild7));
        break;
      case 1857 ... 2001:
        for (iLED) leds = pgm_read_dword(&(Bild8));
        break;
      default:
        for (iLED) leds = pgm_read_dword(&(Bild9));
        break;
        FastLED.show();
    }
  }
  else
  {
    Serial.println("Waiting for new data");
  }
  delay(2000); //SCD30 liest nur alle 2 Sekunden den Wert aus
}

paulpaulson:

      default:

for (iLED) leds = pgm_read_dword(&(Bild9));
        break;
        FastLED.show();
    }

FastLED.show() kommt so nie zur Ausführung und sollte daher so aussehen:

      default:
        for (iLED) leds = pgm_read_dword(&(Bild9));
    }
    FastLED.show();

gruß lorenz

corvus_:
FastLED.show() kommt so nie zur Ausführung und sollte daher so aussehen:

      default:

for (iLED) leds = pgm_read_dword(&(Bild9));
   }
   FastLED.show();




gruß lorenz

Hallo
und ein Danke für Deinen Hinweis.
Hast Du den Sketch so gestestet ?

Vielen Dank für die guten Tipps.

Dem Sensor machts nichts aus wenn er öfter abgefragt wird. Er gibt dann erst ein Wert aus wenn er da ist.
Da stand eigentlich daly(2000) drinne, aber hab zum Testen rumgespielt.

Ich werde es nachher ausprobieren und geb dann bescheid ob alles passt :slight_smile:

Gruß

paulpaulson:
Hast Du den Sketch so gestestet ?

Nein, habe die Hardware nicht.
was mir gerade noch auffällt:

paulpaulson:

Serial.print(airSensor.getCO2());

sollte konsequenterweise dann auch so aussehen:

Serial.print(airSensorCO2);

Also nachdem ich jetzt den Code ausprobiert habe sind zwei Lösungen rausgekommen.

void setup() {
  FastLED.addLeds<NEOPIXEL,DATA_PIN>(leds, NUM_LEDS); //FastLED Bibliothek mit Pin wird angesteuert [Init of the Fastled library]
  FastLED.setBrightness(15); //Helligkeit [Brightness] (Max255)
  Serial.begin(115200);
  Serial.println("SCD30 Example");
  Wire.begin();
  if (airSensor.begin() == false)
  {
    Serial.println("Air sensor not detected. Please check wiring. Freezing...");
    while (1);
  }
}
void loop()
{
  if (airSensor.dataAvailable())
  {
    int airSensorCO2 = airSensor.getCO2(); // Sensor einmal auslesen
    Serial.print("co2(ppm):");
    Serial.print(airSensor.getCO2());
    Serial.print(" temp(C):");
    Serial.print(airSensor.getTemperature(), 1);
    Serial.print(" humidity(%):");
    Serial.print(airSensor.getHumidity(), 1);
    Serial.println();

#define iLED int i = 0; i < NUM_LEDS; i++ // ein Makro, erspart Tipparbeit
    switch (airSensorCO2)
    {
      case 0 ... 999:
        for (iLED) leds[1] = pgm_read_dword(&(Bild1[i]));
        break;
      case 1000 ... 1142: //142
        for (iLED) leds[1] = pgm_read_dword(&(Bild2[i]));
        break;
      case 1143 ... 1285: //142
        for (iLED) leds[1] = pgm_read_dword(&(Bild3[i]));
        break;
      case 1286 ... 1428: //142
        for (iLED) leds[1] = pgm_read_dword(&(Bild4[i]));
        break;
      case 1429 ... 1571: //142
        for (iLED) leds[1] = pgm_read_dword(&(Bild5[i]));
        break;
      case 1572 ... 1714: //142
        for (iLED) leds[1] = pgm_read_dword(&(Bild6[i]));
        break;
      case 1715 ... 1857: //142
        for (iLED) leds[1] = pgm_read_dword(&(Bild7[i]));
        break;
      case 1858 ... 2000: //142
        for (iLED) leds[1] = pgm_read_dword(&(Bild8[i]));
        break;
      default:
        for (iLED) leds[1] = pgm_read_dword(&(Bild9[i]));
        break;
    }
    FastLED.show();
  }
  else
  {
    Serial.println("Waiting for new data");
  }
  delay(2200); //SCD30 liest nur alle 2 Sekunden den Wert aus
}

und

void setup() {
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS); //FastLED Bibliothek mit Pin wird angesteuert [Init of the Fastled library]
  FastLED.setBrightness(50); //Helligkeit [Brightness] (Max255)
  Serial.begin(115200);
  Serial.println("SCD30 Example");
  Wire.begin();
  if (airSensor.begin() == false)
  {
    Serial.println("Air sensor not detected. Please check wiring. Freezing...");
    while (1);
  }
}
void loop() {
  if (airSensor.dataAvailable()) {
    C02sensorValue = airSensor.getCO2();
    Serial.print("co2(ppm):");
    Serial.print(C02sensorValue);
    Serial.print(" temp(C):");
    Serial.print(airSensor.getTemperature(), 1);
    Serial.print(" humidity(%):");
    Serial.print(airSensor.getHumidity(), 1);
    Serial.println();
    if (C02sensorValue < 1000 ) {   //PPM bis 1000
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = pgm_read_dword(&(Bild1[i]));
      }
    } else if (C02sensorValue <= 1143) {  //Wenn der Messwert größer-gleich 1000 und kleiner-gleich als 1143 ist, dann...
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = pgm_read_dword(&(Bild2[i]));
      }
    } else if (C02sensorValue <= 1286) {  //Wenn der Messwert größer 1143 und kleiner-gleich als 1286 ist, dann...
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = pgm_read_dword(&(Bild3[i]));
      }
    } else if (C02sensorValue <= 1429) {  //Wenn der Messwert größer 1286 und kleiner-gleich als 1429 ist, dann...
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = pgm_read_dword(&(Bild4[i]));
      }
    } else if (C02sensorValue <= 1572) {  //Wenn der Messwert größer 1429 und kleiner-gleich als 1572 ist, dann...
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = pgm_read_dword(&(Bild5[i]));
      }
    } else if (C02sensorValue <= 1715) {  //Wenn der Messwert größer 1572 und kleiner-gleich als 1715 ist, dann...
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = pgm_read_dword(&(Bild6[i]));
      }
    } else if (C02sensorValue <= 1858) {  //Wenn der Messwert größer 1715 und kleiner-gleich als 1858 ist, dann...
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = pgm_read_dword(&(Bild7[i]));
      }
    } else if (C02sensorValue <= 2001) {  //Wenn der Messwert größer 1858 und kleiner-gleich als 2001 ist, dann...
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = pgm_read_dword(&(Bild8[i]));
      }
    } else {    //Wenn der Messwert größer 2001, dann...
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = pgm_read_dword(&(Bild9[i]));
      }
    }
    //FastLED.clear();
    FastLED.show();
  } 
  else {
    Serial.println("Waiting for new data");
  }
  delay(2200);  //SCD30 liest nur alle 2 Sekunden den Wert aus
}

Beide Funktionieren :slight_smile:

Welchen Code ich jetzt entgültig nehme schau ich mal noch.

Allen Danke

Eventuell werde ich das ganze Projekt noch in Github veröffentlichen.

Gruß

Mensch, das ist super und Danke für Deine Rückmeldung .....

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.