Датчик света (фоторезистор)

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

Фоторезистор (LDR) меняет сопротивление от света: на свету — маленькое, в темноте — большое. Подключи его делителем — и Arduino научится видеть, светло или темно.

Сейчас соберём датчик света и сделаем ночник: темно — светодиод горит, светло — гаснет. Это первый датчик, который реагирует на настоящий мир вокруг тебя.

Схема: делитель с фоторезистором

   5V ---[ фоторезистор LDR ]---+--- A0
                               |
                 [ резистор 10 кОм ]
                               |
                              GND

  Светло -> сопротивление LDR мало -> на A0 больше напряжения -> число выше
  Темно  -> сопротивление LDR велико -> на A0 меньше -> число ниже

Код: ночник

const int LED = 9;
const int THRESHOLD = 300;   // порог темноты, подбирается опытно

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

void loop() {
  int light = analogRead(A0);
  Serial.println(light);
  if (light < THRESHOLD) {     // темно
    digitalWrite(LED, HIGH);
  } else {                     // светло
    digitalWrite(LED, LOW);
  }
  delay(50);
}

Как работает под капотом

Фоторезистор сделан из полупроводника (часто сульфид кадмия). Свет выбивает в нём носители заряда — и сопротивление падает. В нашем делителе фоторезистор стоит сверху, постоянный резистор 10 кОм — снизу. По формуле делителя напряжение на A0 = 5 В · R_низ / (R_LDR + R_низ). Падает сопротивление LDR (светло) → растёт напряжение на A0 → растёт число. Порог THRESHOLD ты подбираешь, глядя в монитор порта на свету и в темноте.

# Та же логика на Python: переводим показания в "ночник вкл/выкл"
THRESHOLD = 300
def nightlight(samples):
    out = []
    for light in samples:
        led = "LED ВКЛ (темно)" if light < THRESHOLD else "LED выкл (светло)"
        out.append((light, led))
    return out

for light, led in nightlight([800, 600, 350, 250, 120, 400]):
    print("датчик", light, "->", led)

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

  • Жёстко зашитый порог из чужого проекта. Освещение разное — всегда подбирай THRESHOLD своими глазами по монитору.
  • Светодиод-индикатор светит на сам датчик. Возникает «петля»: загорелся — стало светло — погас. Разнеси их.
  • Перепутали верх/низ делителя. Логика инвертируется — «темно» и «светло» меняются местами.

Best practices

  • Сначала выведи сырые значения в монитор порта, поиграй рукой над датчиком — и только потом выбирай порог.
  • Добавь усреднение (из прошлого урока), чтобы ночник не «моргал» на границе порога.
  • Для плавного света замени порог на map + analogWrite: чем темнее, тем ярче светодиод.

Сделаем ночник плавным

Простой порог «темно/светло» работает, но устройство выглядит интереснее, если светодиод разгорается плавно по мере наступления темноты. Здесь соединяются сразу два навыка: читаем фоторезистор через analogRead, переводим показания в яркость через map (не забыв перевернуть диапазон, ведь чем темнее — тем ярче), и выдаём результат через analogWrite на ШИМ-пин. Получается «умный» ночник с мягкой регулировкой, а не резким щелчком.

Ещё одна типичная доработка — гистерезис. Если светодиод включается ровно на пороге 300, то при освещённости, колеблющейся около этого числа, он будет нервно мигать. Лечение: включать при значении ниже 280, а выключать только выше 320. Между этими числами — «мёртвая зона», в которой состояние не меняется. Этот приём с двумя порогами вместо одного применяют везде, где сигнал шумит у границы срабатывания: термостаты, датчики уровня, охранные системы. Маленькая идея — большая надёжность.

Итоги

Фоторезистор + резистор 10 кОм = делитель, измеряющий свет. Порог подбирается опытно по монитору порта. Ты собрал устройство, реагирующее на окружение. Дальше — датчик, измеряющий температуру и влажность.

Проверьте себя
1. Как меняется сопротивление фоторезистора при ярком свете?
AРастёт
BУменьшается
CНе меняется
DСтановится бесконечным
2. Почему порог THRESHOLD лучше подбирать самому по монитору порта?
AТак требует компилятор
BОсвещение и детали разные, чужое число не подойдёт
CЭто ускоряет плату
DИначе сгорит датчик