Verständnisfrage zur Kontaktierung mehrerer I2C Clients

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;
}

Dann könnte eventuell snprintf (oder auch hier für den richtigen Compiler) für Dich von Interesse sein.

Dann doch lieber optional:

#define DEBUGGING                     // Einkommentieren für die Serielle Ausgabe

#ifdef DEBUGGING
#define DEBUG_B(...) Serial.begin(__VA_ARGS__)
#define DEBUG_P(...) Serial.print(__VA_ARGS__)
#define DEBUG_L(...) Serial.println(__VA_ARGS__)
#define DEBUG_F(...) Serial.printf(__VA_ARGS__)
#else
#define DEBUG_B(...)
#define DEBUG_P(...)
#define DEBUG_L(...)
#define DEBUG_F(...)
#endif
...
DEBUG_L(F("Start-Sequenz gefunden"));

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