Lichtsensoren BH1750 und TEMT6000: Testprogramme für ESP32 (siehe https://unsinnsbasis.de/bh1750-lichtsensor/ und https://unsinnsbasis.de/temt6000-analoger-lichtsensor/)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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