Фоторезистор: подключение к ESP32 и Arduino

Датчик освещённости

Сопротивление падает на свету и растёт в темноте. В делителе напряжения это превращается в число на аналоговом входе — день или ночь.

Как работает

Фоторезистор меняет сопротивление от единиц килоом на свету до мегаома в темноте. Сам по себе он не выдаёт напряжение — его ставят в делитель с постоянным резистором, и средняя точка идёт на аналоговый вход. Модуль с выводом AO уже содержит этот делитель.

analogRead() выдаёт 0–4095 на ESP32 (12 бит) и 0–1023 на Arduino (10 бит). Зависимость от освещённости нелинейная — для «день/ночь» хватает порога, для люксов нужна калибровка.

Выводы

ВыводНазначение
AOаналоговый выход — средняя точка делителя
DOцифровой выход компаратора: порог задаёт подстроечный резистор на модуле
VCCпитание делителя
GNDобщий провод

Подключение к ESP32

ФоторезисторESP32
AOGPIO34
VCC3V3
GNDGND

Схема из примера «Фоторезистор: уровень освещённости».

Фоторезистор: уровень освещённости

Открыть пример целиком
Код скетча
const int LDR = 34;

// Значения снимаются один раз в темноте и при полном свете.
const int DARK = 200;
const int BRIGHT = 3800;

void setup() {
  Serial.begin(115200);
}

void loop() {
  int raw = analogRead(LDR);
  int percent = constrain(map(raw, DARK, BRIGHT, 0, 100), 0, 100);
  Serial.printf("сырое %4d   освещённость %3d %%\n", raw, percent);
  delay(300);
}

Подключение к Arduino Uno

ФоторезисторArduino Uno
AOA0
VCC5V
GNDGND

Схема из примера «Arduino Uno: ночник с гистерезисом».

Arduino Uno: ночник с гистерезисом

Открыть пример целиком
Код скетча
// Ночник: темнее порога — включить, светлее — выключить.
//
// Порогов два, и это не перестраховка. С одним порогом на границе
// освещённости выход щёлкает при каждом дрожании последнего разряда:
// 499 — включили, 501 — выключили, 499 — включили. Реле в такой схеме
// живёт неделю.
//
// Гистерезис — это разные пороги на включение и на выключение. Между
// ними не происходит ничего, и попасть в эту зону дрожанием нельзя:
// она шире дрожи.
//
// Крутите ползунок освещённости на детали, чтобы это увидеть.

const int LDR = A0;
const int LED = 8;

const int DARK = 400;    // темнее этого — включаем
const int LIGHT = 600;   // светлее этого — выключаем

bool lit = false;

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int level = analogRead(LDR);

  if (!lit && level < DARK) {
    lit = true;
    Serial.println("стемнело — включаю");
  } else if (lit && level > LIGHT) {
    lit = false;
    Serial.println("рассвело — выключаю");
  }

  digitalWrite(LED, lit);

  Serial.print("light:");
  Serial.println(level);
  delay(200);
}

В железе

На ESP32 при включённом Wi-Fi не работает АЦП2 (GPIO0, 2, 4, 12–15, 25–27). Для датчиков берите АЦП1: GPIO32–39. Питание модуля от 3,3 В, а не от 5 В — иначе на вход попадёт больше 3,3 В.

Частые ошибки

Другие детали