Falsche 0 Werte mit Helligkeitssenor I2C_BH1750 am ESP8266

Begonnen von Fusssel, 03 März 2020, 22:31:59

Vorheriges Thema - Nächstes Thema

Fusssel

Hallo, vielleicht kann mir jemand helfen mit dem BH1750 Helligkeitssensor, die Werte ohne Fehler einzulesen.

Bei den in Lux gemessenen Werten erhalte ich immer wieder 0 als Ergebnis. Die Werte von 0 abweichend scheinen meist plausibel zu sein.   

2020-03-03_17:21:03 BH1750 luminosity: 0
2020-03-03_17:21:10 BH1750 luminosity: 53.2
2020-03-03_17:21:17 BH1750 luminosity: 0
2020-03-03_17:21:24 BH1750 luminosity: 53.4
2020-03-03_17:21:35 BH1750 luminosity: 53.4
2020-03-03_17:21:42 BH1750 luminosity: 53.5
2020-03-03_17:21:49 BH1750 luminosity: 3.2
2020-03-03_17:21:57 BH1750 luminosity: 53.3
2020-03-03_17:22:03 BH1750 luminosity: 0
2020-03-03_17:22:11 BH1750 luminosity: 53
2020-03-03_17:22:18 BH1750 luminosity: 52.7
2020-03-03_17:22:25 BH1750 luminosity: 52.3
2020-03-03_17:22:32 BH1750 luminosity: 0
2020-03-03_17:22:40 BH1750 luminosity: 0
2020-03-03_17:22:47 BH1750 luminosity: 50.9
2020-03-03_17:22:54 BH1750 luminosity: 50.5


Ich habe den BH1750 Sensor über I2C an einem ESP8266 angeschlossen. Auf dem ESP8266 läuft Firmata mit dem FRM Modul und für den Sensor das I2C_BH1750 Modul.

Folgendes habe ich schon zur Fehlereingrenzung versucht:
1. den Sensor an einem MiniESP8266 mit zusätzlich einem anderen I2C Sensor angeschlossen. Der andere I2C Sensor (Temp und Feuchte) funktioniert. Für Helligkeit kommen jedoch auch 0 Werte.
2. Den Helligkeitssensor direkt an einen Arduino angeschlossen mit einem kleinen Sketch. Hier werden die Werte sauber in Lux ausgegeben ohne 0 Werte.
3. Im Modul I2C_BH1750 nach Funktionsweise und Fehler gesucht. Hier war ich jedoch bald mit meinem Perl-Wissen am Ende. Ich wollte die Inhalte mit den Inhalten des funktionierenden Arduino Sketches vergleichen, da ich den Verdacht habe, dass evtl. auch falsche Bytes ausgelesen werden. Oder ein low-Byte mit einem hight-Byte oder ähnlich verwechselt wird.

Kann mir hierzu jemand helfen? Kann auch das funktionierende Sketch anhängen.


/*
Sample code for the BH1750 Light sensor
Version 0.1
website:www.DFRobot.com

Connection:

VCC-5v
GND-GND
SCL-SCL(analog pin 5)
SDA-SDA(analog pin 4)
ADD-NC
*/
#include <Wire.h> //BH1750 IIC Mode
#include <math.h>
int BH1750address = 0x23; //setting i2c address

byte buff[2];
void setup()
{
  Wire.begin();
  Serial.begin(57600);//init Serail band rate
}

void loop()
{
  int i;
  uint16_t val=0;
  BH1750_Init(BH1750address);
  delay(200);

  if(2==BH1750_Read(BH1750address))
  {
    val=((buff[0]<<8)|buff[1])/1.2;
    Serial.print(val,DEC);
    Serial.println("[lx]");
  }
  delay(150);
}

int BH1750_Read(int address) //
{
  int i=0;
  Wire.beginTransmission(address);
  Wire.requestFrom(address, 2);
  while(Wire.available()) //
  {
    buff[i] = Wire.read();  // receive one byte
    i++;
  }
  Wire.endTransmission();
  return i;
}

void BH1750_Init(int address)
{
  Wire.beginTransmission(address);
  Wire.write(0x10);//1lx reolution 120ms
  Wire.endTransmission();
}

 

Dr. Boris Neubert

Hallo,

hatte ein ähnliches Problem. Ursache war, dass zuviele I2C-Module auf Breakout-Board am Bus hingen, jeder mit einem eigenen Pullup. Dadurch wurde die Kommunikation auf dem Bus instabil und es ging manchmal durchgängig, manchmal durchgängig nicht, manchmal aber auch abwechselnd Nullen, plausible Werte oder Fantasiezahlen. Sensor alleine lief mit derselben Firmware immer durch. Austausch gegen einen anderes Board mit ESP hat das Problem gelöst. Vielleicht gibt Dir das noch eine Richtung, um weiterzusuchen.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Fusssel

Danke Boris für dein Input.

In der Tat hatte ich die Pegel etwas vernachlässigt. Ich habe nun alles auf 3.3V umgestellt (da ja ESP) und auch die evtl. vergessenen Pull-ups eingefügt. Generell habe ich nur einen Sensor am Bus. Leider hat sich an den Werten nichts geändert. Werde nochmal das Datenblatt durchgehen und evtl. die Pegel mit dem Oszilloskop prüfen.

Da ich keine Fantasiezahlen messe, wie es bei dir der Fall war, kann ich eine fehlerhafte SW wohl auch nicht ausschließen. Habe dazu noch ein Screenshot angehängt. Hier ist klar zu sehen, dass die Werte nicht über den plausiblen Wert hinausgehen, aber regelmäßig 0 zurück gegeben wird.

Was meintest du mit einem anderem Board? Also ein anderen ESP? 

Danke und beste Grüße
Martin

Fusssel

Bin der Ursache nun auf die Schliche gekommen.   8)

Laut Datenblatt des BH1750 ist die typische Messzeit mit den Default Einstellungen 120ms und maximal 180ms. Mein Sensor scheint jedoch 200ms zu gebrauchen. Je nach Einstellung der Empfindlichkeit kommt noch ein Faktor hinzu.

Diesen Wert habe ich nun im I2C_BH1750 Modul von 180 auf 220ms erhöht. Die Null-Werte sind damit weg beim Auslesen der Register.

Denke dass die Tolleranz einfach auch im Modul etwas höher einstellt werden sollte. Vielleicht könnte der Autor dies bestätigen und ist so freundlikönnte den Wert zu erhöhen.  ;)

Dabei stelle ich mir auch die Frage, wie ich ein Patch auch bei einem FEHM-Update beibehalten kann? Dann könnte ich ja lokal den Wert so belassen, auch wenn das Modul nicht upgedatet wird.

Beste Grüße und Danke,
Martin

Gisbert

Hallo Fussel,

du hast ja eine Lösung gefunden.
Für den Fall, dass man nicht die Ursache beseitigen kann, kann man an den Sympomen arbeiten, indem man im Logfile Nullwerte ignoriert:
attr FileLog_Device ignoreRegexp Device:Reading:.0
Damit fehlen diese Werte dann nach wie vor, aber das Diagramm wird dann wenigstens nicht zerstört.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Fusssel

Hallo Gisbert,

danke für deinen Hinweis. Bis jetzt sehen meine Werte gut aus, könnte dies aber evtl. noch an anderer Stelle gebrauchen. Kannst du mir noch sagen wozu der Punkt vor der 0 steht? Und wie könnte ich einen Bereich angeben. Also sowas wie
attr FileLog_Device ignoreRegexp Device:Reading:0-9.9

Meine Werte für die Helligkeit werde ich wohl noch mit einem Mittelwert filtern, damit bei großen Helligkeitsschwankungen die Schwellwerte noch gut funktionieren. Der "event-aggregator" sollte ja sowas können.

Beste Grüße
Martin

Gisbert

Hallo Martin,

der Punkt ist meines Wissens der Platzhalter für genau ein beliebiges Zeichen, in diesem Fall ein Leerzeichen.

Wie man Wertebereiche statt eines einzelnen Wertes ausblendet,weiß ich leider nicht. Vielleicht weiß das einer der Perl-Experten.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome