Softwareserial zickt

Moin, ich verwende den Sauerstoffsensor von DFRobot, SEN0465. Dabei möchte ich nicht das I2C-Protokoll verwenden, weil es sich mit einem anderen Sensor beisst. Zum Testen habe ich alsovon der DFRobot-Seite (CO, O2, NH3, H2S, NO2, HCL, H2, PH3, SO2, O3, CL2, HF Gas Sensor Wiki - DFRobot) den Beispielsketch kopiert und die Zeile #define I2C_COMMUNICATION auskommentiert.
Beim compilieren für den Mega erscheint folgende Fehlermeldung:
'SoftwareSerial' does not name a type; did you mean 'HardwareSerial'?
Wie gehe ich damit um?
Es hilft auch nicht, die SoftwareSerial.h einzubinden.

Welcher andere Sensor ist das?

Und zeige einmal deinen Sketch in Code Tags

Lesetipp: https://docs.arduino.cc/learn/built-in-libraries/software-serial/

Das heißt?

Es ist aber unumgänglich diese auch einzubinden, wenn sie verwendet werden soll. Ist halt nur die Frage, wie das geschieht/wie du das machst => daher bitte deinen aktuell verwendeten Sketch zeigen.

Zudem stellen sich noch andere Fragen: welchen Arduino/Controller verwendest du? Eventuell gibt es ja auch eine Hardware-Serial-Schnittstelle, die sich anbietet => verwendeten Mikrocontroller bitte zeigen.
Edit: ah, ich seh grad: Mega2560? Dann hast du gleich 3 zusätzliche Serial-Ports: Serial1 - pins 19 (RX) & 18 (TX), Serial2 - pins 17 (RX) & 16 (TX), Serial3 - pins 15 (RX) & 14 (TX)

Eventuell kann man aber auch das Problem der "sich beißenden" Sensoren beseitigen.. Wo liegt denn da die Bisswunde? In der gleichen Adressierung beider Sensoren? Auch dafür gäbe es eine Lösung..

Zum letzten Kommentar: Ich verwende gerade einen Mega, weil der zum Experimentieren schöner zu händeln ist als der Pro Mini, der später aus Platzgründen verbaut werden soll. Deshalb helfen mir die extra seriellen Anschlüsse nichts. Die Software soll auf den Mini übertragbar sein.
Insgesamt sollen 4 Sensoren bedient werden: O2 (DFRobot Sen0465 V1.1, seriell oder I2C), CO2 (MH-Z14A, analog), Temperatur und Feuchtigkeit (DHT22, digital) sowie Helligkeit (GY-30, I2C).
Ein Raspberry Pi soll zur Speicherung und Weiterverarbeitung der Daten dienen, das wäre hier jetzt aber off topic.
Der erste Sketch bedient alle Sensoren außer Helligkeit, hier funktioniert alles problemlos:

/*------------O2-------------
DFRobot SEN0465 I2C 0x74  */
#include "DFRobot_MultiGasSensor.h"
#define I2C_COMMUNICATION
#define I2C_ADDRESS 0x74
DFRobot_GAS_I2C gas(&Wire, I2C_ADDRESS);

/*------------Temp, Hum-------------
DHT22 */
#include "DHT.h"
#define DHTPIN 4   
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

float O2,CO2,Temp,Hum,Light = 0.0;

/*--------------CO2-------------
MH-Z14A mit Analogausgabe an A0 */
#define TEMP_CORR 38
unsigned int rangeFactor = 5000;

void setup() 
{
   Serial.begin(9600);

/*------------O2-------------*/   
   while(!gas.begin())
   {
    Serial.println("Kein O2-Sensor");
    delay(1000);
   }
   gas.changeAcquireMode(gas.PASSIVITY);
   delay(1000);
   gas.setTempCompensation(gas.OFF);

/*-------------Temp/Hum----------*/
   dht.begin();
}

void loop() 
{
   O2 = gas.readGasConcentrationPPM();
   CO2 = (((analogRead(A0))/1023.0 * 5.0) -0.4)/1.6 * rangeFactor;
   Temp = dht.readTemperature();
   Hum = dht.readHumidity();
/*   char ReceivedByte  = "0"; // (1) Dieser Abschitt ist auskommentiert, 
 *    da er für spätere Komminikation mit PC vorgesehen ist
   
   
   if (Serial.available() > 0) //Wait for data reception
   {
     ReceivedByte = Serial.read();//Read data from Arduino Serial UART buffer

     if (ReceivedByte == '$')//Check received byte is $
     {
*/    
      Serial.print(O2);
      Serial.print('|');
      Serial.print(CO2);
      Serial.print('|');
      Serial.print(Temp);
      Serial.print('|');
      Serial.print(Hum);
      Serial.print('|');
      Serial.println(Light);
 /* siehe (1)     
     } //end of if
     else
     {
       Serial.println("INVALID");
       Serial.println("use $ to start conversion");
     }
     */
   }

Jetzt habe ich den Code erweitert, um den Lichtsensor auch noch zu bedienen. Da der GY-30 nur I2C kann, habe ich seine Anschlüsse auf die des O2-Sensors geklemmt und den Code um ein paar Zeilen erweitert, die aus dem Beispielcode BH1750_WE (example) stammen.
Jetzt bleibt die Ausgabe auf dem seriellen Monitor komplett leer, wenn die Zeile 3 (#define I2C_COMMUNICATION) aktiv ist. Wenn das Kommentarzeichen davorkommt (und natürlich der Sensor an seinem DIP-Schalter auf serielle Kommunikation umgeschaltet ist), kommt die oben genannte Fehlermeldung ('SoftwareSerial' does not name a type; did you mean 'HardwareSerial'?)
Hier der zweite Sketch:

/*-----------O2----------*/
#include "DFRobot_MultiGasSensor.h"
#define I2C_COMMUNICATION  // für seriellen Anschluss (Rx->2, Tx ->3) auskommentieren
#ifdef I2C_COMMUNICATION
#define I2C_ADDRESS 0x74
DFRobot_GAS_I2C gas(&Wire , I2C_ADDRESS);
#else
#if (!defined ARDUINO_ESP32_DEV) && (!defined __SAMD21G18A__)
SoftwareSerial mySerial(2,3);
  DFRobot_GAS_SoftWareUart gas(&mySerial);
#else
  DFRobot_GAS_HardWareUart gas(&Serial2);
#endif
#endif

/*-----------Temp/Hum-----*/
#include "DHT.h"
#define DHTPIN 4   
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

/*----------Licht-------*/
/* BH1750_WE (=GY-30)*/
#include <Wire.h>
#include <BH1750_WE.h>
#define BH1750_ADDRESS 0x23
BH1750_WE myBH1750 = BH1750_WE(BH1750_ADDRESS); 
float Light = myBH1750.getLux();

/*-------CO2-----------*/
#define TEMP_CORR 38
unsigned int rangeFactor = 5000;


float O2,CO2,Temp,Hum = 0.0;

void setup() 
{
   Serial.begin(9600); //Data will be send to PC @9600bps
//   Wire.begin();
   if(!myBH1750.init()){ // sets default values: mode = CHM, measuring time factor = 1.0
    Serial.println("Connection to the BH1750 failed");
    Serial.println("Check wiring and I2C address");
    while(1){}
  }
  else{
    Serial.println("BH1750 is connected");
  }

   while(!gas.begin())
   {
    Serial.println("Kein O2-Sensor");
    delay(1000);
   }

   gas.changeAcquireMode(gas.PASSIVITY);
   delay(1000);

   gas.setTempCompensation(gas.OFF);

   dht.begin();
}

void loop() 
{
   O2 = gas.readGasConcentrationPPM();
   CO2 = (((analogRead(A0))/1023.0 * 5.0) -0.4)/1.6 * rangeFactor;
   Temp = dht.readTemperature();
   Hum = dht.readHumidity();
/*   char ReceivedByte  = "0"; //
   
   
   if (Serial.available() > 0) //Wait for data reception
   {
     ReceivedByte = Serial.read();//Read data from Arduino Serial UART buffer

     if (ReceivedByte == '$')//Check received byte is $
     {*/
     
      Serial.print(O2);
      Serial.print('|');
      Serial.print(CO2);
      Serial.print('|');
      Serial.print(Temp);
      Serial.print('|');
      Serial.print(Hum);
      Serial.print('|');
      Serial.println(Light);
/*      
     } //end of if
     else
     {
       Serial.println("INVALID");
       Serial.println("use $ to start conversion");
     }
  
*/
}```

Korrektur:
Ich habe noch die Kommentarzeichen vor
Wire.begin();
entfernt. Jetzt kommt diese ominöse Fehlermeldung nicht mehr, der serielle Monitor bleibt trotzdem leer...

Du schreibst aber nichts dazu, welche Sensoren sich im I2C stören.
Das wäre mal wichtig, da du problemlos mehrere Sensoren (mit unterschiedlichen Adressen) im I2C zusammen schalten kannst.

Warum sehe ich dafür kein Include?

Offensichtlich scheint die Lib nicht für den Nano zu sein.

Warum das so ist, erschließest sich mir nicht.

Kann es sein, das auf jedem deiner Boards PullUps auf den I2C Leitungen sind? Und das dann der Gesamt PullUp zu klein wird. Das du also ein Hardwareproblem hast?

Einfach mal im stromlosen Zustand bei jedem Modul zwischen SDA/SCL und Vcc den Widerstand messen, um das zu prüfen.
Da die Hersteller meist 4k7 verbauen, dürfte es bei 2 Modulen mit je 4k7 noch keine Probleme geben.
Wenn jedoch keins der beiden Module PullUp-Widerstände drauf hat, sollte man auf der Leitung jeweils 4k7 nachrüsten.

Gruß Tommy

Es sind ja nur die Sensoren O2 und Licht (Sen0465 und GY-30). Beide haben unterschiedliche Adressen (0x74 und 0x23).

Und wie sollen sich diese gegenseiti stören ?

Hier hängt ein Mega dran. Der sollte mit der Lib funktionieren.

Keine Ahnung. Ich stelle nur fest, dass der Sketch 1 (nur O2-Sensor) läuft, der Sketch 2 (mit beiden Sensoren) nicht.

Wofür soll beim 2. Sketch die #define-Orgie gut sein?
Definiere beide Adressen und lege die Objekte an.

Gruß Tommy

Ja klar, weil du da irgendwas mit SoftwareSerial rumfummelst, ohne zu wissen, wie das funktioniert. Mach es sauber mit I2C und das wird laufen.

Lichtsensor (GY-30): Vcc-SDA 10k, Vcc-SCL unendlich*
O2-Sensor (Sen0465): Vcc-SDA 10k, Vcc-SCL 10k

*bei noch einem zweiten Exemplar nachgemessen: identisch.

und SDA zu Vcc?

Wenn der auch unendlich ist, hänge an die Leitung zwischen SDA und Vcc 4k7 und zwischen SCL und Vcc ebenfalls. 10k0 ist zu hoch, damit wird es sehr störanfällig.

Gruß Tommy

10k

Ok, dann hänge die 2 4k7 PullUp rein. Irgendwo in der Nähe des Arduino.
Wenn das auch nicht zur Lösung führt, dann benutze erst mal den I2C-Scanner, um zu sehen, ob beide Module erkennt werden und dann wirf das unnötige #define-Gedöns raus.

Gruß Tommy