Konflikt zweier Bibliotheken

Hallo Forum,

ich habe nur rudimentäre Programmierkenntnisse, mit denen ich aber bisher beim ARDUINO gut zurecht gekommen bin. Nun komme ich aber nicht mehr weiter.
Ich möchte Feinstaubdaten vom SDS11 auslesen und diese Daten auf einer SD-Karte speichern.
Für das Auslesen habe ich einen funktionsfähigen Sketch erstellt, ebenso für das Speichern von Daten. Leider laufen die Bibliotheken nicht gemeinsam.

"SdsDustSensor.h" und <SPI.h> mit <SD.h>

führen zu einem "Stillstand. Keine Serielle Ausgabe mehr. Nichts geht. Alle Hinweise, die ich gefunden habe ende mit dem Hinweis: andere Bibliotheken verwenden, doch ich finde keine Passenden, die zusammenarbeiten. Hat hier vielleicht jemand eine passende Kombination oder eine andere Lösung?

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Der Sensor arbeitet mit der seriellen Schnittstelle, da wundert es, dass es nicht funktioniert.
Wie hast du den angeschlossen ?
An D0 und D1, dann hast du Probleme mit der Ausgabe.
Nutze SoftwareSerial für den Sensor, da kannst du andere freie Pins verwenden.

Der Sensor ist an 2 und 3 andeschlossen

#include "SdsDustSensor.h"
//#include <SPI.h>
//#include <SD.h>
#include <Wire.h>
 
int rxPin = 2;                                               //  SDS TxD am UNO 2: RxD
int txPin = 3;                                               //  SDS RxT am UNO 3: TxD
SdsDustSensor sds(rxPin, txPin);                             // Anschluss gekreuzt siehe oben
float pm25;
float pm10;
float StartZeit, LaufZeit;                                   // Zeitpunkt der Messung


void setup() {
  Serial.begin(9600);
  sds.begin();
 
  Serial.println(sds.queryFirmwareVersion().toString());     // prints firmware version
  Serial.println(sds.setActiveReportingMode().toString());   // ensures sensor is in 'active' reporting mode
  Serial.println(sds.setCustomWorkingPeriod(2).toString());  // sensor sends data every 2 minutes
}
 
void loop() {
  PmResult pm = sds.readPm();
  SerielleAusgabe();

if (pm.isOk()) {
      StartZeit = millis();    
      Serial.print("PM2.5 = ");
      Serial.print(pm.pm25);
      pm25 = pm.pm25;
      Serial.print(", PM10 = ");
      Serial.println(pm.pm10);
      pm10 = pm.pm10;
      Serial.println(pm.toString());                        // if you want to just print the measured values, you can use toString() method as well
  } else {                   
      LaufZeit =  (millis() - StartZeit)/1000;              // ACHTUNG loop delay is set to 5s aber der Sensor sendet alle 5 Mintuten Daten
      Serial.print("Keine neuen Daten. Warte ca. ");
      Serial.print(120-LaufZeit,0);
      //Serial.print(pm.statusToString());
      Serial.print(" s  letzte Messwerte:  pm25 = ");
      Serial.print(pm25);
      Serial.print("  und  pm10 = ");
      Serial.println(pm10);
    }

  delay(5000);
}

void SerielleAusgabe(){

}

Ok, es sieht danach aus, dass die Sensor-Library schon eine eigene SoftwareSerielle verwendet.
Diese kenne ich nicht und kann nur den Tipp geben, das evtl. mit der "richtigen" SoftwareSerial oder mit einem anderen Controller arbeiten, der eine zusätzliche HardwareSerielle bietet.
Du könntest evtl. auch andere Pins für die serielle verwenden. Z.B. D8 und D9.

Ab wann wird denn die Ausgabe blockiert ?

Was für einer UNO?
Zeige auch dein zusammen gebauten Sketch

Sobald ich eine der beiden Bibliotkeken einbinde:

//#include <SPI.h>

//#include <SD.h>

auch wenn ich Pin 6 und 7 verwende. Ich habe schon befürchtet, dass es im "inneren" Probleme gibt.

#include "SdsDustSensor.h"
//#include <SPI.h>
#include <SD.h>
#include <Wire.h>
 
int rxPin = 6;                                               //  SDS TxD am UNO 2: RxD
int txPin = 7;                                               //  SDS RxT am UNO 3: TxD
SdsDustSensor sds(rxPin, txPin);                             // Anschluss gekreuzt siehe oben
float pm25;
float pm10;
float StartZeit, LaufZeit;                                   // Zeitpunkt der Messung


void setup() {
  Serial.begin(9600);
  sds.begin();
 
  Serial.println(sds.queryFirmwareVersion().toString());     // prints firmware version
  Serial.println(sds.setActiveReportingMode().toString());   // ensures sensor is in 'active' reporting mode
  Serial.println(sds.setCustomWorkingPeriod(2).toString());  // sensor sends data every 2 minutes
}
 
void loop() {
  PmResult pm = sds.readPm();
  SerielleAusgabe();

if (pm.isOk()) {
      StartZeit = millis();    
      Serial.print("PM2.5 = ");
      Serial.print(pm.pm25);
      pm25 = pm.pm25;
      Serial.print(", PM10 = ");
      Serial.println(pm.pm10);
      pm10 = pm.pm10;
      Serial.println(pm.toString());                        // if you want to just print the measured values, you can use toString() method as well
  } else {                   
      LaufZeit =  (millis() - StartZeit)/1000;              // ACHTUNG loop delay is set to 5s aber der Sensor sendet alle 5 Mintuten Daten
      Serial.print("Keine neuen Daten. Warte ca. ");
      Serial.print(120-LaufZeit,0);
      //Serial.print(pm.statusToString());
      Serial.print(" s  letzte Messwerte:  pm25 = ");
      Serial.print(pm25);
      Serial.print("  und  pm10 = ");
      Serial.println(pm10);
    }

  delay(5000);
}

void SerielleAusgabe(){

}

läuft nicht, aber mit

//#include <SD.h>

geht die Messung.

ADUINO UNO mit

Das ist ja mall wider der Berühmter Dtalog Schild :wink:
Der öfters großer Problemmacher
Also mit SPI.h geht noch?

Und wozu hast du die Wire.h, die brauchst du nicht.
Die ist für I2C.

Meine Vermutung das Ansprechen der SD Karte stimmt nicht dadurch ist Hänger im Setup

Braucht schon wegen RTC

Zeige doch wie haste das zusammen geklebt.

Erstmal nicht. Noch ist keine RTC dran.
Man sollte schon systematisch bei gehen.

Erstmal haben wir Garnichts, wo ist die SD Ansteuerung, habe schon Brille geputzt

Ich hatte doch Pin D8 und D9 geschrieben.
Das ist am Uno ein anderer Port und damit schon ein Unterschied.

Ich habe zwei funktionsfähige Sketches:

SD-Karten-Schreiben:

#include <SPI.h>
#include <SD.h>


const int chipSelect = 10;   //10 is default by shield, but normally on Pin 4
int interval = 5;            //Log to SD Card every 5 seconds

long timer;
String SensorDaten_1, SensorDaten_2;

void setup() {
  Serial.begin(9600);
  delay(3000);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("SD Card error");
    return;
  }
  Serial.println("card initialized");
  
}
//************************************************ L O O P *********************
void loop() {
  if ((timer + interval * 1000) < millis()) {
    timer = millis();
    DatenAuslesen(); //Get your value
    DatenSichern(); //Write value to SD
  }
}
//*******************************************************************************


void DatenAuslesen() {
  SensorDaten_1 = "My Value"; 
  SensorDaten_2 = timer;
}

void DatenSichern() { //Write to SD card
  String AusgabeZeile = SensorDaten_1 + ";" + SensorDaten_2;
  File dataFile = SD.open("datalog.csv", FILE_WRITE);
  if (dataFile) {
    dataFile.println(AusgabeZeile);
    dataFile.close();
    Serial.println(AusgabeZeile);
  }
  else {
    Serial.println("error writing datalog.txt");
  }
}

Karte wird beschrieben, wenn sie vorhanden ist, sonst gibt es eine Meldung. Alles OK

Auch der zweite läuft:

#include "SdsDustSensor.h"

 
int rxPin = 6;                                               //  SDS TxD am UNO 2: RxD
int txPin = 7;                                               //  SDS RxT am UNO 3: TxD
SdsDustSensor sds(rxPin, txPin);                             // Anschluss gekreuzt siehe oben
float pm25;
float pm10;
float StartZeit, LaufZeit;                                   // Zeitpunkt der Messung


void setup() {
  Serial.begin(9600);
  sds.begin();
 
  Serial.println(sds.queryFirmwareVersion().toString());     // prints firmware version
  Serial.println(sds.setActiveReportingMode().toString());   // ensures sensor is in 'active' reporting mode
  Serial.println(sds.setCustomWorkingPeriod(2).toString());  // sensor sends data every 2 minutes
}
 
void loop() {
  PmResult pm = sds.readPm();
  SerielleAusgabe();

if (pm.isOk()) {
      StartZeit = millis();    
      Serial.print("PM2.5 = ");
      Serial.print(pm.pm25);
      pm25 = pm.pm25;
      Serial.print(", PM10 = ");
      Serial.println(pm.pm10);
      pm10 = pm.pm10;
      Serial.println(pm.toString());                        // if you want to just print the measured values, you can use toString() method as well
  } else {                   
      LaufZeit =  (millis() - StartZeit)/1000;              // ACHTUNG loop delay is set to 5s aber der Sensor sendet alle 5 Mintuten Daten
      Serial.print("Keine neuen Daten. Warte ca. ");
      Serial.print(120-LaufZeit,0);
      //Serial.print(pm.statusToString());
      Serial.print(" s  letzte Messwerte:  pm25 = ");
      Serial.print(pm25);
      Serial.print("  und  pm10 = ");
      Serial.println(pm10);
    }

  delay(5000);
}

void SerielleAusgabe(){

}

Nun sollen die Feinstaubdaten uaf der Karte gesichert werden. Aber die Bibliotheken mögen sich nicht. GRRRRRRRRRRRRRRRR...

Wire.h war für andere Sensoren - stimmt, die ist noch unnötig - habe ich entfernt, hat aber auch nicht gestört.

Man sollte nichts unversucht lassen, auch mit den von mir genannten Pins.

#include "SdsDustSensor.h"
#include <SPI.h>
#include <SD.h>
 
int rxPin = 8;                                               //  SDS TxD am UNO 2: RxD
int txPin = 9;                                               //  SDS RxT am UNO 3: TxD
SdsDustSensor sds(rxPin, txPin);  

läuft ebenso nicht, wohl aber

#include "SdsDustSensor.h"
//    #include <SPI.h>
//    #include <SD.h>
 
int rxPin = 8;                                               //  SDS TxD am UNO 2: RxD
int txPin = 9;                                               //  SDS RxT am UNO 3: TxD
SdsDustSensor sds(rxPin, txPin);