Skip to content

Instantly share code, notes, and snippets.

@haeshh
Created August 26, 2021 20:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save haeshh/8e4f2581badcec97e82b2b58843584d9 to your computer and use it in GitHub Desktop.
Save haeshh/8e4f2581badcec97e82b2b58843584d9 to your computer and use it in GitHub Desktop.
Lichtsensoren BH1750 und TEMT6000: Testprogramme für ESP32 (siehe https://unsinnsbasis.de/bh1750-lichtsensor/ und https://unsinnsbasis.de/temt6000-analoger-lichtsensor/)
/* Lichtsensoren am ESP32
* Vergleich der beiden BH1750-Varianten
* - nicht-blockierendes Lesen
* - verschiedene Qualitätsstufen, "Autoranging"
* - blaues Modul GY-302 an I2C-Adr. 0x23
* - rotes Modul mit Kappe an I2C-Adr. 0x5C
*
* 2021-08-25 Heiko (unsinnsbasis.de)
*/
#include <Arduino.h>
// Bibliothek und Sensor-Objekte für den BH1750
#include <hp_BH1750.h>
hp_BH1750 BH1750_blue, BH1750_red;
// Dauer der Messungen in Millisekunden
long ms_blue, ms_red;
// letzter Messwert des jew. Sensors für Vergleich
float lux_blue, lux_red;
void setup() {
int rc; // Returncode
long m; // Millisekunden zum Kalibrieren der Sensoren
Serial.begin(115200);
delay(500);
Serial.println("Lichtsensoren BH1750 - Vergleich (mit Kappe)");
// Init des BH1750 (mit der Standard-I2C-Adresse)
if (! BH1750_blue.begin(BH1750_TO_GROUND)) {
Serial.println("Fehler beim Initialisieren des BH1750 GY-302");
} else {
m = millis();
rc = BH1750_blue.calibrateTiming();
m = millis() - m;
Serial.print("Blauer BH1750 GY-302 wurde kalibriert (Dauer: ");
Serial.print(m);
Serial.print(" ms)");
if (rc != 0) {
Serial.print(" - Fehlercode ");
Serial.print(rc);
}
Serial.println();
}
// Init des zweiten BH1750 (I2C-Adresse 0x5C)
if (! BH1750_red.begin(BH1750_TO_VCC)) {
Serial.println("Fehler beim Initialisieren des roten BH1750");
} else {
m = millis();
rc = BH1750_red.calibrateTiming();
m = millis() - m;
Serial.print("Roter BH1750 wurde kalibriert (Dauer: ");
Serial.print(m);
Serial.print(" ms)");
if (rc != 0) {
Serial.print(" - Fehlercode ");
Serial.print(rc);
}
Serial.println();
}
// jeweils erste Messung (und Zeitmessung) starten
lux_blue = -1; // kein Vergleichswert vorhanden
BH1750_blue.start();
ms_blue = millis();
// der rote misst in niedriger Qualität; der zweite Parameter wird
// ggf. auf den kleinsten gültigen Wert gesetzt (BH1750_MTREG_LOW = 31)
lux_red = -1; // kein Vergleichswert vorhanden
BH1750_red.start(BH1750_QUALITY_LOW, 1);
ms_red = millis();
}
// ------------------------------------------------------------
void loop() {
float lux;
// wenn der "blaue" Sensor eine Messung durchgeführt hat,
// wird das Ergebnis ausgegeben
// da die Messungen recht schnell erfolgen (insbes. in niedriger
// Qualität), wird der Wert nur bei einer Änderung ausgegeben
if (BH1750_blue.hasValue()) {
ms_blue = millis() - ms_blue; // Zeit stoppen
// falls der Sättigungswert erreicht ist, wird die Messung
// verworfen / nicht angezeigt)
if (!BH1750_blue.saturated()) {
lux = BH1750_blue.getLux();
// gestoppte Zeit und Messwert ausgeben, wenn sich der Wert geändert hat
if (lux != lux_blue) {
lux_blue = lux;
Serial.print("blau (");
Serial.print(ms_blue);
Serial.print(" ms): ");
Serial.print(lux);
Serial.println(" lx");
}
}
// Intervall für die nächste Messung anpassen
BH1750_blue.adjustSettings(90);
// nächste Messung starten
BH1750_blue.start();
ms_blue = millis();
}
// analoges Vorgehen für den "roten" Sensor
// - eine Anpassung des Messintervalls ist in niedrigster
// Qualität und Auflösung nicht nötig
if (BH1750_red.hasValue()) {
ms_red = millis() - ms_red; // Zeit stoppen
// falls der Sättigungswert erreicht ist, wird die Messung
// verworfen / nicht angezeigt)
if (!BH1750_red.saturated()) {
lux = BH1750_red.getLux();
// gestoppte Zeit und Messwert ausgeben, wenn sich der Wert geändert hat
if (lux != lux_red) {
lux_red = lux;
Serial.print("rot (");
Serial.print(ms_red);
Serial.print(" ms):\t\t");
Serial.print(lux);
Serial.println(" lx");
}
}
// nächste Messung starten
BH1750_red.start();
ms_red = millis();
}
}
/* Lichtsensoren am ESP32
* - TEMT6000 (analog, Messung per ADS1115)
* - BH1750 (digital; I2C)
*
* 2021-08-22 Heiko (unsinnsbasis.de)
*/
#include <Arduino.h>
// Bibliothek und Sensor-Objekt für den BH1750
#include <hp_BH1750.h>
hp_BH1750 BH1750;
// Bibliothek und Datenobjekt für den ADS1115 ADC am ESP32
#include <Adafruit_ADS1X15.h> // bindet Wire.h für I2C mit ein
Adafruit_ADS1115 ads;
#define ADS_I2C_ADDR 0x48
const float ads_multiplier = 0.125F; // ADS1115-Multiplikator bei einf. Verstärkung
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("Lichtsensoren BH1750 und TEMT6000 - Test");
// Init des BH1750 (mit der Standard-I2C-Adresse)
if (! BH1750.begin(BH1750_TO_GROUND)) {
Serial.println("Fehler beim Initialisieren des BH1750");
} else {
int rc = BH1750.calibrateTiming();
Serial.print("BH1750 wurde kalibriert");
if (rc != 0) {
Serial.print(" - Fehlercode ");
Serial.print(rc);
}
Serial.println();
}
// Init des ADS1115 mit 1-facher Verstärkung
ads.begin(ADS_I2C_ADDR, &Wire);
ads.setGain(GAIN_ONE);
}
void loop() {
float lux;
// analoger Messwert an Kanal 0 des ADS1115; wird umgerechnet in mV
float adc0;
BH1750.start(); // mit dem BH1750 Messung in Lux durchführen
if (!BH1750.saturated())
lux = BH1750.getLux();
BH1750.adjustSettings(90);
// Messung per ADS1115 an Kanal 0 (single-ended)
// in Millivolt umrechnen
adc0 = ads.readADC_SingleEnded(0) * ads_multiplier;
Serial.print("BH1750: ");
Serial.print(lux,2); // 2 Nachkommastellen
Serial.print(" lx; TEMT6000: ");
Serial.print(adc0);
Serial.println(" mV");
delay(10000);
}
/* Lichtsensor BH1750
* (Basisfunktionen zum Auslesen der Messwerte)
*
* 2021-08-22 Heiko (unsinnsbasis.de)
*/
#include <Arduino.h>
// Bibliothek und Sensor-Objekt für den BH1750
#include <hp_BH1750.h>
hp_BH1750 BH1750;
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("Lichtsensor BH1750 - Messwerte ausgeben");
// Init des BH1750 (Standard-I2C-Adresse; ADDR ist mit Masse verbunden)
if (! BH1750.begin(BH1750_TO_GROUND)) {
Serial.println("Fehler beim Initialisieren des BH1750");
while(1); // unendliche Schleife -> Programm nicht forsetzen
}
}
void loop() {
float lux;
BH1750.start(); // Start einer Messung
// Messwert lesen (wartet, bis die Messung erledigt ist)
lux = BH1750.getLux();
Serial.print("BH1750: ");
Serial.print(lux,2);
Serial.println(" lx");
delay(5000);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment