Проблема экономии электроэнергии является одной из ключевых в современном мире. Часто можно наблюдать, как где-нибудь горит электрический свет в то время как в помещении (на улице) достаточно светло, тем самым растрачивая впустую электроэнергию. На нашем сайте мы уже рассматривали детектор темноты на основе Arduino и фоторезистора, который включал и выключал свет в зависимости от освещенности в комнате. Но в данном проекте мы будем не просто включать/выключать свет от уровня освещенности, но адаптивно регулировать (подстраивать) его яркость в зависимости от окружающей обстановки (освещенности). В качестве источника света будет использоваться светодиод мощностью 1 Вт, которым мы будем управлять с помощью платы Arduino и транзистора.
Принцип управления яркостью свечения светодиода будет основан на использовании ШИМ (широтно-импульсной модуляции), изменяя коэффициент заполнения которой можно заставить светодиод гореть ярче/темнее.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Фоторезистор (LDR) (купить на AliExpress).
- Транзистор 2N2222 (купить на AliExpress).
- Резистор 510 Ом (купить на AliExpress).
- Резистор 100 кОм (купить на AliExpress).
- Конденсатор 0,1 мкФ (купить на AliExpress).
- Светодиод мощностью 1 Вт.
- Соединительные провода.
- Макетная плата.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема проекта
Схема автоматического управления яркостью свечения светодиода с помощью Arduino и фоторезистора представлена на следующем рисунке.
Как видите, она достаточно проста и, будем надеяться, ее сборка не вызовет у вас затруднений.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же обсудим его наиболее важные фрагменты.
Сначала в программе нам необходимо объявить используемые переменные и инициализировать используемые контакты – на pin 12 мы будем формировать ШИМ (PWM) сигнал, а на A0 считывать аналоговое значение напряжения.
1 2 3 4 |
int pwmPin = 2; // на pin 2 мы будем формировать ШИМ сигнал int LDR = A0; // с контакта A0 мы будем считывать аналоговое значение напряжения int c1 = 0; // объявляем переменную c1 int c2 = 0; // объявляем переменную c2 |
Далее, в функции loop мы будем считывать аналоговое значение напряжения с помощью команды “analogRead(LDR)”, а затем сохранять это значение напряжения в переменной “value”. Потом при помощи несложных математических преобразований мы будем формировать ШИМ сигнал с нужным нам коэффициентом заполнения. Если аналоговое значение напряжения (с выхода АЦП) меньше 500, то мы будем адаптивно управлять яркостью свечения светодиода, а если больше или равно 500 – то мы будем включать его на полную мощность.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
int value = analogRead(LDR); Serial.println(value); c1= value; c2= 500-c1; // вычитаем c1 из 500 и результат сохраняем в c2 if (value < 500) { digitalWrite(pwmPin, HIGH); delayMicroseconds(c2); digitalWrite(pwmPin, LOW); delayMicroseconds(c1); } if (value > 500) { digitalWrite(2,LOW); } } |
Более подробно об использовании ШИМ в Arduino можно прочитать в этой статье.
Принцип работы проекта
Как можно видеть из представленной выше схемы, мы использовали делитель напряжения, состоящий из фоторезистора и резистора сопротивлением 100 кОм. Выход делителя напряжения подключен к аналоговому входу Arduino – с выхода его АЦП мы считываем значение напряжения. Из-за изменений условий освещенности сопротивление фоторезистора уменьшается, следовательно, изменяется и значение напряжения на аналоговом входе Arduino. Если вокруг темно, то сопротивление фоторезистора велико, следовательно напряжение на аналоговом входе Arduino мало. Это полученное значение напряжения мы затем преобразуем в коэффициент заполнения ШИМ, который непосредственным образом влияет на яркость свечения светодиода. Принцип работы нашей схемы можно пояснить с помощью следующей условной диаграммы:
Интенсивность света на фоторезисторе ↓ - Сопротивление фоторезистора↑ - Напряжение на аналоговом входе Arduino↓ - Коэффициент заполнения ШИМ (PWM)↑ - Яркость свечения светодиода↑.
Если вокруг достаточно светло и значение на выходе АЦП аналогового входа Arduino более 500, то мы выключаем светодиод.
Также на нашем сайте вы можете посмотреть все проекты, в которых был использован фоторезистор.
Исходный код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
int pwmPin = 2; // на pin 2 мы будем формировать ШИМ сигнал int pot = A0; // с контакта A0 мы будем считывать аналоговое значение напряжения int c1 = 0; // объявляем переменную c1 int c2 = 0; // объявляем переменную c2 void setup() // setup loop { pinMode(pwmPin, OUTPUT); pinMode(pot, INPUT); Serial.begin(9600); } void loop() { int value = analogRead(pot); Serial.println(value); c1= value; c2= 500-c1; // вычитаем c1 из 500 и результат сохраняем в c2 if (value < 500) { digitalWrite(pwmPin, HIGH); delayMicroseconds(c2); digitalWrite(pwmPin, LOW); delayMicroseconds(c1); } if (value > 500) // если светло – выключаем светодиод { digitalWrite(2,LOW); } } |