Фоторезистор и 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
Гистерезис — главная хитрость этого скетча. Без него на пороге сумерек светодиод начинает частить: включился, стало чуть светлее, выключился, снова темнее. Разные пороги на включение и выключение убирают это полностью.
Частые ошибки
Значения случайные и не зависят от света
Голый фоторезистор подключён без второго резистора. Без делителя вход висит в воздухе и показывает наводки, а не освещённость.
Светодиод мигает на границе срабатывания
Нет гистерезиса. Разведите порог включения и выключения хотя бы на несколько десятков единиц.
Датчик реагирует наоборот
Фоторезистор и резистор поменяны местами в делителе. Либо переверните их, либо вычтите значение из тысячи двадцати трёх в скетче.
Порог, подобранный дома, не работает на улице
Диапазон освещённости на улице несравнимо шире. Не зашивайте число намертво: измерьте минимум и максимум в реальных условиях и считайте порог от них.
Показания скачут рядом с лампой
Лампы накаливания и дешёвые светодиодные мерцают с частотой сети, а фоторезистор это мерцание видит. Усреднение по нескольким замерам решает проблему.
Что понадобится
- Модуль фоторезистора или голый фоторезистор GL5528
- Резистор 10 кОм — если фоторезистор без платы
- Arduino UNO
- Провода «папа-мама»