ELECTRONICS

Фоторезистор и Arduino: схема подключения, делитель напряжения и скетч

Датчики светаСкетч проверен компиляцией

Фоторезистор — это резистор, сопротивление которого зависит от освещённости. В темноте оно огромное, сотни килоом, на ярком свету падает до сотен ом. Плата измерять сопротивление не умеет, она умеет измерять напряжение, поэтому фоторезистор всегда включают в пару с обычным резистором — получается делитель напряжения.

На готовом модуле этот второй резистор уже стоит, и наружу выведен готовый аналоговый сигнал. Если у вас голый фоторезистор с двумя ногами, придётся добавить резистор на десять килоом самому — иначе показания будут случайными.

Схема подключения

Наведите курсор на провод — расскажу, зачем он нужен.

Распиновка модуля

ПроводКуда и зачем
VCCПитание 3,3 или 5 В.
GNDЗемля.
AOАналоговый выход: плавное значение освещённости. То, что нужно в большинстве случаев.
DOЦифровой выход: ноль или единица, порог задаётся подстроечником на плате. Нужен, только если хватает ответа «темно или светло».

Характеристики

Сопротивление в темноте
от 200 кОм и выше
Сопротивление на свету
1–10 кОм
Резистор делителя
10 кОм — типовое значение
Время реакции
десятки миллисекунд, свет замечает не мгновенно
Питание
3,3 или 5 В

Если фоторезистор голый, без платы

Схема простая: одна нога фоторезистора идёт на пять вольт, вторая — одновременно на аналоговый вход и через резистор на десять килоом на землю. Точка между фоторезистором и резистором и есть сигнал.

Если поменять их местами — резистор к питанию, фоторезистор к земле, — направление изменится на противоположное: свет будет давать меньшие числа. Оба варианта рабочие, важно лишь понимать, какой у вас, и не удивляться, что ночник включается днём.

Библиотека

не нужнаДостаточно analogRead. Фоторезистор — один из самых простых датчиков вообще.

Готовый скетч

const int PIN_LDR = A0;
const int PIN_LED = 13;

int threshold = 400;    // ниже этого значения считаем, что стемнело

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

void loop() {
  // усредняем пять замеров — гасим дрожание последнего разряда
  long sum = 0;
  for (int i = 0; i < 5; i++) {
    sum += analogRead(PIN_LDR);
    delay(5);
  }
  int light = sum / 5;

  // гистерезис: включаем и выключаем на разных порогах,
  // иначе на границе светодиод будет мигать без остановки
  if (light < threshold - 30) {
    digitalWrite(PIN_LED, HIGH);
  } else if (light > threshold + 30) {
    digitalWrite(PIN_LED, LOW);
  }

  Serial.println(light);
  delay(200);
}

Скетч собирается arduino-cli под Arduino UNO

Гистерезис — главная хитрость этого скетча. Без него на пороге сумерек светодиод начинает частить: включился, стало чуть светлее, выключился, снова темнее. Разные пороги на включение и выключение убирают это полностью.

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

Значения случайные и не зависят от света

Голый фоторезистор подключён без второго резистора. Без делителя вход висит в воздухе и показывает наводки, а не освещённость.

Светодиод мигает на границе срабатывания

Нет гистерезиса. Разведите порог включения и выключения хотя бы на несколько десятков единиц.

Датчик реагирует наоборот

Фоторезистор и резистор поменяны местами в делителе. Либо переверните их, либо вычтите значение из тысячи двадцати трёх в скетче.

Порог, подобранный дома, не работает на улице

Диапазон освещённости на улице несравнимо шире. Не зашивайте число намертво: измерьте минимум и максимум в реальных условиях и считайте порог от них.

Показания скачут рядом с лампой

Лампы накаливания и дешёвые светодиодные мерцают с частотой сети, а фоторезистор это мерцание видит. Усреднение по нескольким замерам решает проблему.

Что понадобится