ESP 2 x Wire

Hallo.

Ich versuche derzeit 2 AOSONG AM2320B I2C Sensoren mit einem ESP auszulesen.

Da beide Sensoren bzw alle die selbe i2c ID haben muss ich 2 Busse aufsetzen

Derzeit sieht das ganze so aus:

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Wire.h>
#include <BH1750.h>
#include <PubSubClient.h>

const char* TOPICS[] = {
  "WOHN/HUM", "WOHN/TEMP"
};

const char* ssid = "1";
const char* password = "1";
const char* mqtt_server = "10.10.10.44";

WiFiClient espClient;
PubSubClient client(espClient);

unsigned long currentMillis;

unsigned long previousMillistimeupdate = 0;
const long intervaltimeupdate = 2000;

unsigned long previousMillisupdate = 0;
const long intervalupdate = 20000;


static bool online = false;

#define INTERVAL 1000 // in msec

String webSite, javaScript, XML;

BH1750 lightMeter(0x23);

ESP8266WebServer server ( 80 );


float humout;
float humschlaf;
float humwohn;
float tempout;
float tempschlaf;
float tempwohn;

float hout;
float tout;
float hin;
float tin;
uint16_t lux;

TwoWire Wire2 = TwoWire();

#include "web.h"

void setup() {
  pinMode(BUILTIN_LED, OUTPUT);


  Serial.begin(115200);
  Serial.println("\nSerial started");
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  Wire.begin(4, 5);
  Wire2.begin(12, 14);
  lightMeter.begin(BH1750_CONTINUOUS_HIGH_RES_MODE);

  server.on("/", handleWebsite);
  server.on("/xml", handleXML);

  server.onNotFound ( handleNotFound );
  server.begin();
  Serial.println ( "HTTP server started" );

  Serial.println();
  Serial.println("Status\tHumidity (%)\tTemperature (C)\tLight (L)\t");

}

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  String mqtttopic = String((char*)topic);
  String mqttpayload = String((char*)payload);

  if (mqtttopic == "WOHN/HUM") {
    humwohn = mqttpayload.toFloat();
  }

  if (mqtttopic == "WOHN/TEMP") {
    tempwohn = mqttpayload.toFloat();
  }

}


void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect

    if (client.connect("ESP8266Client", "1", "1")) {
      //  if (client.connect("ESP8266Client")) {
      Serial.println("connected");


      for (int i = 0; i < (sizeof(TOPICS) / sizeof(int)); i++) {
        client.subscribe(TOPICS[i]);
        client.loop();
        Serial.print("subscribe: ");
        Serial.println(TOPICS[i]);
      }

    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  currentMillis = millis();

  server.handleClient();

  if (currentMillis - previousMillistimeupdate >= intervaltimeupdate) {
    previousMillistimeupdate = currentMillis;

    Wire.begin(4, 5);

    lux = lightMeter.readLightLevel();


    switch (SensorOut()) {
      case 2:
        Serial.println("CRC failed");
        online = false;
        break;
      case 1:
        Serial.println("Sensor1 offline");
        online = false;
        break;
      case 0:
        humout = hout;
        tempout = tout;
        online = true;

        Serial.print("Humidity: ");
        Serial.print(hout);
        Serial.print("%\t Temperature: ");
        Serial.print(tout);
        Serial.println("*C");
        break;
    }

    switch (SensorIn()) {
      case 2:
        Serial.println("CRC failed");
        online = false;
        break;
      case 1:
        Serial.println("Sensor2 offline");
        online = false;
        break;
      case 0:
        humschlaf = hin;
        tempschlaf = tin;
        online = true;

        Serial.print("Humidity: ");
        Serial.print(hin);
        Serial.print("%\t Temperature: ");
        Serial.print(tin);
        Serial.println("*C\n\n");
        break;
    }


    Serial.println(lux);

  }

  if (currentMillis - previousMillisupdate >= intervalupdate) {
    previousMillisupdate = currentMillis;

    if (online == true) {

      client.publish("OUT/HUM", String(humout).c_str());
      client.publish("OUT/TEMP", String(tempout).c_str());
      client.publish("SCHLAF/HUM", String(humschlaf).c_str());
      client.publish("SCHLAF/TEMP", String(tempschlaf).c_str());
      client.publish("SCHLAF/LUX", String(lux).c_str());

    }
  }
}

unsigned int CRC16(byte *ptr, byte length)
{
  unsigned int crc = 0xFFFF;
  uint8_t s = 0x00;

  while (length--) {
    crc ^= *ptr++;
    for (s = 0; s < 8; s++) {
      if ((crc & 0x01) != 0) {
        crc >>= 1;
        crc ^= 0xA001;
      } else crc >>= 1;
    }
  }
  return crc;
}


int SensorOut()
{
  byte buf[8];
  float t;
  float h;
  for (int s = 0; s < 8; s++) buf[s] = 0x00;

  Wire.begin(4, 5);
  Wire.beginTransmission(0x5C);
  Wire.endTransmission();
  // запрос 4 байт (температуры и влажности)
  Wire.beginTransmission(0x5C);
  uint8_t datas = 0x03;
  Wire.write(datas);// запрос
  datas = 0x00 ;
  Wire.write(datas); // с 0-го адреса
  datas = 0x04 ;
  Wire.write(datas); // с 0-го адреса
  if (Wire.endTransmission(1) != 0) return 1;
  delayMicroseconds(1600); //>1.5ms
  // считываем результаты запроса
  Wire.requestFrom(0x5C, 0x08);
  for (int i = 0; i < 0x08; i++) buf[i] = Wire.read();

  // CRC check
  unsigned int Rcrc = buf[7] << 8;
  Rcrc += buf[6];
  if (Rcrc == CRC16(buf, 6)) {
    unsigned int temperature = ((buf[4] & 0x7F) << 8) + buf[5];
    t = temperature / 10.0;
    t = ((buf[4] & 0x80) >> 7) == 1 ? t * (-1) : t;
    tout = t;

    unsigned int humidity = (buf[2] << 8) + buf[3];
    h = humidity / 10.0;
    hout = h;
    return 0;
  }
  return 2;
}

int SensorIn()
{
  byte buf[8];
  float t;
  float h;
  for (int s = 0; s < 8; s++) buf[s] = 0x00;

  Wire2.begin(12, 14);
  Wire2.beginTransmission(0x5C);
  Wire2.endTransmission();
  // запрос 4 байт (температуры и влажности)
  Wire2.beginTransmission(0x5C);
  uint8_t datas = 0x03;
  Wire2.write(datas);// запрос
  datas = 0x00 ;
  Wire2.write(datas); // с 0-го адреса
  datas = 0x04 ;
  Wire2.write(datas); // с 0-го адреса
  if (Wire2.endTransmission(1) != 0) return 1;
  delayMicroseconds(1600); //>1.5ms
  // считываем результаты запроса
  Wire2.requestFrom(0x5C, 0x08);
  for (int i = 0; i < 0x08; i++) buf[i] = Wire2.read();

  // CRC check
  unsigned int Rcrc = buf[7] << 8;
  Rcrc += buf[6];
  if (Rcrc == CRC16(buf, 6)) {
    unsigned int temperature = ((buf[4] & 0x7F) << 8) + buf[5];
    t = temperature / 10.0;
    t = ((buf[4] & 0x80) >> 7) == 1 ? t * (-1) : t;
    tin = t;

    unsigned int humidity = (buf[2] << 8) + buf[3];
    h = humidity / 10.0;
    hin = h;
    return 0;
  }
  return 2;
}

jedoch mag sensor2 auf wire2 nicht lange mit dem esp kommunizieren…

mal geht das paar sekunden mal paar minuten und mal garnicht und der BH1750 will garnicht :confused:

wenn ich den BH1750 mit dem example sketch teste macht er mit

könnt ihr mir mal auf die sprünge helfen?

Suche mal nach I2C Multiplexer.

Gruß Tommy

ich wollte eigentlich auf einen multiplexer verzichten

Dann mußt Du Deine BH1750-Lib umschreiben.

Gib der Klasse die internen Variablen SDA_Pin und SCL_pin und rufe ein wire.begin(SDA_Pin, SCL_Pin) anstelle von wire.begin() auf. Den Konstruktor in der BH1750-Lib dann um die beiden Werte erweitern. Das könnte funktionieren, ich habe es aber nicht getestet.

Gruß Tommy

Edit: Du kannst natürlich keine Callbackfunktionen nutzen.