Skip to content

Сенсор освітлення

Vladyslav Heneraliuk edited this page Mar 17, 2024 · 10 revisions

Загальна інформація

Починаючи з версії 3.7 прошивка підтримує аналогові (фоторезистори) та цифрові (BH1750) сенсори освітлення.

Дані з сенсора використовуються для автоматиного регулювання яскравості мапи, якщо обрано відповідний режим в налаштуваннях ("Автоматична яскравість"->"Сенсор освітлення"). Прошивка підтримує 20 градацій навколишнього освітлення. Мінімальне значення яскравості береться з налаштувань нічної яскравості, максимальне - з денної яскравості. Всі проміжні значення яскравості розраховуються математично між згаданимим вище значеннями.

Для регулювання чутливості сенсора можна використовувати налаштування "Коефіцієнт чутливості" на вкладці "Яскравість". Коефіцієнт працює наступним чином: значення менше 1 - знижує чутливість, більше 1 - підвищує. Формула для розрахунку - L = Ls * K, де Ls - дані з сенсора, K - коефіцієнт чутливості, L - рівень освітлення, що використовується для регулювання яскравості мапи.

Цифровий сенсор BH1750

Сенсор підʼєднується до 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);
}