Датчик света (фоторезистор)
Закрой ладонью маленький датчик — и светодиод сам зажжётся. Ты только что построил автоматический ночник, реагирующий на темноту.
Фоторезистор (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 кОм = делитель, измеряющий свет. Порог подбирается опытно по монитору порта. Ты собрал устройство, реагирующее на окружение. Дальше — датчик, измеряющий температуру и влажность.