Als Threadstarter wollte ich das hier noch abschließen.
Das Pogramm läuft nun, die CO2 Konzentration wird wie gewünscht angezeigt.
Danke an alle Helfer!
Quintessenz:
- Die Bibliothek für den Sensirion CO2 Sensor sorgt sich selbst um das Öffnen und Schließen der I2C-Verbindung (Dank an noiasca & agmue für den Hinweis)
- Die I2C-Verbindung an mein Display das über einen Arduino Pro Mini als Slave-receiver konfiguriert ist, muß wie in den I2C-Codebeispielen jeweils (mit seiner spezifischen Adresse) auf-und abgebaut werden (wire.beginTransmission(Adresse) und wire.endTransmission)
Hier der Code, ich werde die Ausgabe der Messwerte über die serielle Schnittstelle wohl noch rauswerfen, die diente nur zur Kontrolle beim Testen
/*
2024-02-05 Läuft jetzt richtig: CO2 Anzeige auf LED-Display HDSP_2112!
ToDo:
1. automatische Helligkeitsanpassung Display
2. Uhrzeit Integration
3. WLAN-Versand via FTP auf Fritzbox
4. Abspeichern auf SD-Karte
* Lib des Sensors: Direkt von Sensirion
* Generator: sensirion-driver-generator 0.9.0
* Product: scd30
*/
#include <Arduino.h>
#include <SensirionI2cScd30.h>
#include <Wire.h>
// ##### Teil vom I2C master_writer
#define SDA_PIN 4
#define SCL_PIN 5
const int16_t I2C_SLAVE = 0x08;
int concNeu = 0;
int concAlt = 0;
char Nummer[5] = " ";
// ##############################
SensirionI2cScd30 sensor;
static char errorMessage[128];
static int16_t error;
void setup() {
Serial.begin(115200);
while (!Serial) {
delay(100);
}
Wire.begin();
Wire.beginTransmission(I2C_SLAVE); // transmit to device #8
Wire.write("CO2 conc");
Wire.endTransmission(); // stop transmitting
// #########################
sensor.begin(Wire, SCD30_I2C_ADDR_61);
sensor.stopPeriodicMeasurement();
sensor.softReset();
delay(2000);
uint8_t major = 0;
uint8_t minor = 0;
error = sensor.readFirmwareVersion(major, minor);
if (error != NO_ERROR) {
Serial.print("Error trying to execute readFirmwareVersion(): ");
errorToString(error, errorMessage, sizeof errorMessage);
Serial.println(errorMessage);
return;
}
Serial.print("firmware version major: ");
Serial.print(major);
Serial.print("\t");
Serial.print("minor: ");
Serial.print(minor);
Serial.println();
error = sensor.startPeriodicMeasurement(0);
if (error != NO_ERROR) {
Serial.print("Error trying to execute startPeriodicMeasurement(): ");
errorToString(error, errorMessage, sizeof errorMessage);
Serial.println(errorMessage);
return;
}
}
int Ziffernzahl(int n) {
/*int x;
for (x = 1; (Zahl / 10) > 1; x++) {
Zahl = Zahl / 10;
}
return x;
*/
if (n < 100000) {
if (n < 1000) {
if (n < 100) {
if (n < 10)
return 1;
return 2;
}
return 3;
}
if (n < 10000)
return 4;
else
return 5;
}
if (n < 100000000) {
if (n < 10000000) {
if (n < 1000000)
return 6;
return 7;
}
return 8;
}
if (n < 1000000000)
return 9;
else
return 10;
}
void loop() {
float co2Concentration = 0.0;
float temperature = 0.0;
float humidity = 0.0;
delay(1500);
error = sensor.blockingReadMeasurementData(co2Concentration, temperature,
humidity);
if (error != NO_ERROR) {
Serial.print("Error trying to execute blockingReadMeasurementData(): ");
errorToString(error, errorMessage, sizeof errorMessage);
Serial.println(errorMessage);
return;
}
Serial.print("co2Concentration: ");
Serial.print(co2Concentration);
Serial.print("\t");
Serial.print("temperature: ");
Serial.print(temperature);
Serial.print("\t");
Serial.print("humidity: ");
Serial.print(humidity);
Serial.println();
concNeu = int(co2Concentration);
itoa(concNeu, Nummer, 10);
if (concNeu != concAlt) {
Wire.beginTransmission(I2C_SLAVE); // transmit to device #8
for (int i = 0; i < (4 - Ziffernzahl(concNeu)); i++) {
Wire.write(' ');
}
for (int i = 0; i < Ziffernzahl(concNeu); i++) {
Wire.write(Nummer[i]);
}
Wire.write(" ppm");
Wire.endTransmission(); // stop transmitting
}
concAlt = concNeu;
}