Опыт с фоторезистором
Схема на Tinkercad

Компоненты:
- Arduino Uno
- Фоторезистор (LDR)
- Резистор (10 кОм для LDR, ~220 Ом для светодиода)
- Светодиод (LED)
- Макетная плата и соединительные провода
Схема подключения:
- Фоторезистор (LDR):
- Один вывод к 5V.
- Второй вывод — к аналоговому входу A0 и через резистор на землю (GND).
- Светодиод:
- Анод (длинная ножка) — к пину 9 Arduino через резистор.
- Катод — на землю (GND).
Принцип работы:
- Считываем уровень освещенности с фоторезистора через
analogRead()
. - Преобразуем считанное значение из диапазона 0–1023 в 0–255 при помощи
map()
иconstrain()
. - Передаём полученное значение в
analogWrite()
для регулировки яркости светодиода. - Чем темнее — тем ярче горит светодиод (или наоборот — в зависимости от кода).
Код
const int sensorPin = 0;
const int ledPin = 9;
int lightLevel, high = 0, low = 1023;
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(9600); // //Serial monitori seadistamine
}
void loop()
{
// AnalogRead() kasutab väärtused vahemikus 0 (0 вольт) и 1023 (5 вольт).
// AnalogWrite(), kasutatakse, et LEDi sujuvalt sisselülitada 0(ei põle) kuni 255(põleb maksimalselt).
lightLevel = analogRead(sensorPin); //loeme mõõdetud analoogväärtuse
// Map() teisendab sisendi väärtused ühest vahemikust teisse. Näiteks, "from" 0-1023 "to" 0-255.
// Constrain() saed muutujale kindlad piirväärtused.
// Näiteks: kui constrain() kohtub arvudega 1024, 1025, 1026.., siis ta teisendab need 1023, 1023, 1023..). Kui arvud vähem kui 0, siis teisendab need 0:.
// lightLevel = constrain(lightLevel, 0, 255);
manualTune(); //
//autoTune(); //
analogWrite(ledPin, lightLevel);
// Выражение выше, будет изменять яркость светодиода вместе с уровнем освещенности. Чтобы сделать наоборот, заменить в analogWrite(ledPin, lightLevel) "lightLevel" на "255-lightLevel". Теперь у нас получился ночник!
Serial.print(lightLevel); // prindime tulemused Serial Monitori (вывод данных с фоторезистора (0-1023))
Serial.println("");
delay(1000);
}
void manualTune()
{
lightLevel = map(lightLevel, 300, 800, 0, 255); // kaardistame selle analoogväljundi vahemikku (будет от 300 темно, до 800 (светло)).
lightLevel = constrain(lightLevel, 0, 255);
}
void autoTune()
{
if (lightLevel < low)
{
low = lightLevel;
}
if (lightLevel > high)
{
high = lightLevel;
}
lightLevel = map(lightLevel, low+10, high-30, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);
}
Öölamp
Цель:
Создать ночник, который:
- реагирует на уровень освещённости,
- позволяет выбирать цвет с помощью потенциометра,
- автоматически регулирует яркость в зависимости от окружающего света
Изученные функции:
Название функции | Описание |
---|---|
analogRead(PIN) | Считывает аналоговое значение (0–1023) с пина |
analogWrite(PIN, val) | Устанавливает ШИМ-сигнал (яркость/цвет от 0 до 255) |
map(x, in_min, in_max, out_min, out_max) | Переводит значение из одного диапазона в другой |
constrain(x, a, b) | Ограничивает значение в пределах a и b |
Serial.begin(9600) | Включает монитор порта для отладки |
Serial.print/println | Печать значений для отладки |
Описание работы:
RGB-светодиод меняет цвет в зависимости от положения потенциометра.
Фоторезистор измеряет уровень освещённости.
Яркость цвета автоматически адаптируется — чем темнее, тем ярче светит лампа.
Работает 5 режимов цвета, которые переключаются с помощью потенциометра.
Используемые компоненты:
- Arduino Uno
- RGB светодиод (общий катод)
- 3 резистора по 220 Ом (для RGB)
- Фоторезистор (LDR)
- Резистор 10 кОм (для LDR)
- Потенциометр (10 кОм)
- Соединительные провода, макетная плата
Схема подключения:
Создана в Tinkercad (см. изображение / файл .png
)
Основные подключения:
- RGB LED: пины 11 (R), 10 (G), 9 (B) через резисторы.
- Потенциометр: средний пин → A0, боковые пины → 5V и GND.
- Фоторезистор: один конец → 5V, другой → A1 и через резистор на GND.
Схема на Tinkercad

Код:
int RED = 11;
int GREEN = 10;
int BLUE = 9;
int potentsiomeeterPIN = A0;
int photoresistorPIN = A1;
int lightLevel, high = 0, low = 1023;
void setup() {
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
Serial.begin(9600);
}
void loop() {
int photoresistorVALUE = analogRead(photoresistorPIN);
int potentsiomeeterVALUE = analogRead(potentsiomeeterPIN);
// Выбираем режим по значению с потенциометра
int mode = map(potentsiomeeterVALUE, 0, 1023, 1, 5);
lightLevel = photoresistorVALUE;
autoTune(); // Настроим яркость по данным с фоторезистора
// Отправляем данные в серийный монитор
Serial.print("photoresistorVALUE: ");
Serial.print(photoresistorVALUE);
Serial.print(", lightLevel: ");
Serial.println(lightLevel);
// В зависимости от режима, задаем цвет
if (mode == 1) {
// Режим 1 — все выключено
setColor(0, 0, 0);
} else if (mode == 2) {
// Режим 2 — голубой (смешиваем синий и зелёный)
setColor(0, lightLevel, lightLevel);
} else if (mode == 3) {
// Режим 3 — красный
setColor(lightLevel, 0, 0);
} else if (mode == 4) {
// Режим 4 — зелёный
setColor(0, lightLevel, 0);
} else if (mode == 5) {
// Режим 5 — синий
setColor(0, 0, lightLevel);
}
delay(100); // Пауза для стабильности
}
void setColor(int r, int g, int b) {
analogWrite(RED, r);
analogWrite(GREEN, g);
analogWrite(BLUE, b);
}
void autoTune() {
// Настроим диапазон значений для фоторезистора
if (lightLevel < low) low = lightLevel;
if (lightLevel > high) high = lightLevel;
lightLevel = map(lightLevel, low + 10, high - 30, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);
}
Видео
https://drive.google.com/file/d/1tpTnjhvr06XcRWQL9laVF1Nk5cXzoR44/view?usp=sharing
Применение в жизни:
- Умный ночник в детской комнате.
- Атмосферная подсветка с автоматическим включением при наступлении темноты.
- Декоративное освещение в интерьере с ручным управлением.