-
-
Notifications
You must be signed in to change notification settings - Fork 8
Сенсор освітлення
Починаючи з версії 3.7 прошивка підтримує аналогові (фоторезистори) та цифрові (BH1750) сенсори освітлення.
Дані з сенсора використовуються для автоматиного регулювання яскравості мапи, якщо обрано відповідний режим в налаштуваннях ("Автоматична яскравість"->"Сенсор освітлення"). Прошивка підтримує 20 градацій навколишнього освітлення. Мінімальне значення яскравості береться з налаштувань нічної яскравості, максимальне - з денної яскравості. Всі проміжні значення яскравості розраховуються математично між згаданимим вище значеннями.
Для регулювання чутливості сенсора можна використовувати налаштування "Коефіцієнт чутливості" на вкладці "Яскравість". Коефіцієнт працює наступним чином: значення менше 1 - знижує чутливість, більше 1 - підвищує. Формула для розрахунку - L = Ls * K, де Ls - дані з сенсора, K - коефіцієнт чутливості, L - рівень освітлення, що використовується для регулювання яскравості мапи.
Сенсор підʼєднується до I2C шини ESP32, та використовує стандартну адрусу (0x23). Пін ADDR сенсора BH1750 нікуди не підʼєднуємо.
Схема підключення до ESP32:
BH1750 | ESP32 |
---|---|
VCC | 3.3V |
GND | GND |
SCL | GPIO 22 |
SDA (Дані) | GPIO 21 |
ADDR | Не підʼєднувати |
Сенсор налаштовано на максимальну чутливість, він вимірює освітленість навколишнього середовища в діапазоні 0..27306lx.
Скетч для тестування роботи сенсора (використовується бібліотека BH1750_WE):
/***************************************************************************
* Example sketch for the BH1750_WE library
*
* Mode selection / abbreviations:
* CHM: Continuously H-Resolution Mode
* CHM_2: Continuously H-Resolution Mode2
* CLM: Continuously L-Resolution Mode
* OTH: One Time H-Resolution Mode
* OTH_2: One Time H-Resolution Mode2
* OTL: One Time L-Resolution Mode
*
* Measuring time factor:
* 1.0 ==> Measuring Time Register = 69
* 0.45 ==> Measuring Time Register = 31
* 3.68 ==> Mesuring Time Register = 254
*
* Other implemented functions, not used in this example:
* resetDataReg() --> resets Data Register
* powerOn() --> Wake Up!
* powerDown() --> Sleep well, my BH1750
*
* If you change the measuring time factor for calibration purposes,
* then you need to divide the light intensity by the measuring time factor.
*
* More information can be found on:
* https://wolles-elektronikkiste.de/en/bh1750fvi-gy-30-302-ambient-light-sensor
* or in German:
* https://wolles-elektronikkiste.de/bh1750fvi-lichtsensormodul
***************************************************************************/
#include <Wire.h>
#include <BH1750_WE.h>
#define BH1750_ADDRESS 0x23
BH1750_WE myBH1750 = BH1750_WE(BH1750_ADDRESS);
// You may also pass a TwoWire object:
//BH1750_WE myBH1750 = BH1750_WE(&Wire, BH1750_ADDRESS);
// If you don't pass any parameter, Wire and 0x23 will be applied
void setup(){
Serial.begin(9600);
Wire.begin();
if(!myBH1750.init()){ // sets default values: mode = CHM, measuring time factor = 1.0
Serial.println("Connection to the BH1750 failed");
Serial.println("Check wiring and I2C address");
while(1){}
}
else{
Serial.println("BH1750 is connected");
}
// myBH1750.setMode(CLM); // uncomment if you want to change the default values
// myBH1750.setMeasuringTimeFactor(0.45); // uncomment for selection of value between 0.45 and 3.68
}
void loop(){
float lightIntensity = myBH1750.getLux();
Serial.print(F("Light intensity: "));
Serial.print(lightIntensity);
Serial.println(F(" Lux"));
delay(1000);
}
Значення сенсора зчитується з піна 32 (можна змінити в налаштуваннях, пін має бути аналоговий).
Схема підключення сенсора освітлення (пін обираєте на власний розсуд, але він має бути аналоговим):
Мінімальний скетч для перевірки роботи сенсора:
/*
* This ESP32 code is created by esp32io.com
*
* This ESP32 code is released in the public domain
*
* For more detail (instruction and wiring diagram), visit https://esp32io.com/tutorials/esp32-light-sensor
*/
#define LIGHT_SENSOR_PIN 32 // ESP32 pin GIOP32 (ADC4)
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
void loop() {
// reads the input on analog pin (value between 0 and 4095)
int analogValue = analogRead(LIGHT_SENSOR_PIN);
Serial.print("Analog Value = ");
Serial.print(analogValue); // the raw analog reading
// We'll have a few threshholds, qualitatively determined
if (analogValue < 40) {
Serial.println(" => Dark");
} else if (analogValue < 800) {
Serial.println(" => Dim");
} else if (analogValue < 2000) {
Serial.println(" => Light");
} else if (analogValue < 3200) {
Serial.println(" => Bright");
} else {
Serial.println(" => Very bright");
}
delay(500);
}