Главная » Статьи » Arduino с нуля » Работа с Arduino

Урок 3. Часть 2. Управление яркостью светодиода в зависимости от окружающего освещения

 

Иногда, при конструировании устройства, нужно применять плавное увеличение яркости, или наоборот - плавное ее уменьшение.

В данной серии уроков, мы поможем вам разобраться с этим вопросом. И подробно расскажем о всех тонкостях данного процесса. 

 

 

В данном уроке мы рассмотрим второй способ изменения яркости светодиода - автоматический, в зависимости от освещения окружающей среды. 

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

Например, это можно применить в уличном освещении. Когда на улице темнеет, освещение включается, как только начинает светать, так освещение выключается.

 

Но мы, в данном уроке, разберем плавное нарастание и уменьшение яркости. Это в основном можно использовать в робототехнике, а так же в домашних условиях, например в домашнем освещении. Хотя никто не запрещает этот метод использовать и на уличных фонарях. 

 

Для определения яркости мы будем использовать датчик освещенности, который построен на принципе фоторезистора. 

Фоторезистор - резистор, который изменяет своё сопротивление под действием света.

 

В основе метода, как и в предыдущем уроке, лежит широтно-импульсная модуляция, она же ШИМ. Если вы не читали предыдущий урок, то советую для начала прочитать эту статью.

 

Для этого урока понадобятся следующие компоненты:

  • Arduino Uno
  • Braedboard
  • Соединительные провода "папа-папа"
  • Резисторы (10 кОм и 220 Ом) по 1 шт.
  • Фоторезистор 1шт.
  • Светодиод 1шт.

 

Далее переходим к подключению всех элементов к Arduino. Подключаем наш фоторезистор к контроллеру по схеме ниже (используется резистор на 10 кОм). Эта схема делителя напряжения. 

 

У меня получилось так:

 

 

Далее подключаем Arduino к компьютеру и заливаем скетч (код). 

#define foto 0 //Фотоэлемент подключен к пину 0 (аналоговый вход A0)
void setup()
{
 Serial.begin(9600);
}
void loop()
{ 
 Serial.println(analogRead(foto));
 delay(20);
}

 

Давайте разберемся с кодом. 

  • Инициирует последовательное соединение и задает скорость передачи данных в бит/c, для обмена данными с компьютером. В данном случае скорость 9600 бит/с
    Serial.begin(9600);
  • Передает на монитор последовательного порта данные с фоторезистора
    Serial.println(analogRead(foto));

Таким образом, после того как мы включили наше устройство, через каждые 20мсек, на Arduino (аналоговый вход А0) будут поступать значения, которые в данном случае характеризуют освещенность. 

 

После того, как мы загрузили скетч, в Arduino IDE открываем "монитор последовательного порта" (кнопка в виде лупы на верхней панели справа).

 

 

И смотрим какие значения у нас выводятся. У меня эти значения колебались от 300 до 700 где-то.  

При большой освещенности:

При малой освещенности:

 

Максимальное и минимальное значения освещения мы получили. Теперь давайте подключим светодиод к нашей схеме и начнем управлять его яркостью, в зависимости от показаний освещенности. 

К уже имеющейся схеме, подключаем светодиод:

 

Вы можете использовать любой пин Arduino, в номере которого имеется знак тильды "~". Именно в этих пинах может использоваться ШИМ.

 

После добавления светодиода, у меня получилось следующее:

 

 

И теперь давайте зальем вот такой код:

#define foto 0
#define led 9

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

void loop()
{ 
int val = (analogRead(foto));
val = constrain (val, 320, 680);
int Level = map (val ,680 ,320, 0 , 255);
analogWrite (led, Level);
delay(50);
}

Как мы видим, к предыдущему скетчу добавилось несколько новых строк. В функции setup() мы настроили пин для светодиода, на этом я останавливаться не буду. А в функции loop() появились новые функции. Давайте разберемся для чего они. 

 

  • Объявляем новую переменную val и записываем в нее текущее значение, которое поступает на вход Arduino (пин А0)
    int val = (analogRead(foto));
  • Проверяем значение val. Как я уже говорил, мои значения колебались от 300 до 700. Я немного сузил участок, и взял значения 320 и 680. Но на входе Arduino все равно могут быть значения меньше или больше этого диапазона. Что не желательно. Поэтому используем функцию constrain, которая ограничивает весь диапазон получаемых значений. Если полученное значение val будет меньше 320 или больше 680, то в переменную val запишутся 320 и 680 соответственно. Мы никогда не выйдем за заданный диапазон
    val = constrain (val, 320, 680);
  • Теперь, в зависимости от получаемых значений освещенности, нужно подавать на вход светодиода уровень от 0 до 255. Но наши получаемые значения от 320 до 680. И как же это сделать? На помощь приходит функция map, которая сопоставляет заданные ей значения, в аргументах, и выдает их. 
    int Level = map (val ,680 ,320, 0 , 255);
    Так например в данном случае, мы ей задаем, что уровень 680 сопоставляется с 0, а значение 320 - с 255. И уже исходя из значений val, она выдает значения от 0 до 255. Например, если val равно 680, то в переменную Level запишется 0, а при 320 - запишется 255
  • Ну и последняя строка выдает полученный уровень Level на светодиод
    analogWrite (led, Level);

 

Таким образом весь цикл будет таков:

  1. Считываем значение получаемое на аналоговый вход А0 (foto). И записываем это значение в переменную val
  2. Проверяем значение переменной val, и если оно больше или меньше заданного диапазона (от 320 до 680), то перезаписываем переменную с новыми значениями, удовлетворяющих заданному участку. 
  3. Записываем в переменную Level значение от 0 до 255, соответствующие пропорционально значениям 680 и 320. 
  4. Выдаем значение уровня Level на вход светодиода. 
  5. Включаем задержку в 50 мсек. И потом все повторяем сначала. 

 

Давайте же посмотрим, как будет работать наше устройство с таким алгоритмом:

 

Задание для самостоятельного выполнения:

Задание к данному уроку будет одно: постарайтесь сделать так, что при увеличении освещенности окружающей среды, светодиод тоже увеличивал свою яркость, а когда становилось темно - светодиод погасал.

Это можно реализовать, изменив одну строку программы. Но не забывайте, что менять параметры нужно обдуманно.

 

Четвертый урок проекта "Arduino с нуля" подошел к концу. Надеюсь тема была для вас полезной, и вы узнали что-нибудь новое. Также надеюсь, что при выполнении задания у вас не возникнет вопросов и вы справитесь самостоятельно.

Если же что-нибудь не будет получаться, или у вас появятся какие-либо вопросы, не стесняйтесь, и оставляйте их в комментариях или же на форуме.  

 

Если Вам понравился наш урок, поделитесь им с друзьями.

 

 


←Предыдущий урок | Следующий урок→


 

Категория: Работа с Arduino | Добавил: GM (15.10.2015)
Просмотров: 5585 | Комментарии: 6 | Рейтинг: 5.0/4
Всего комментариев: 5
avatar
1 zirkov_micha • 20:11, 15.10.2015 [Материал]
Спасибо за урок. Все понятно и просто описано. А где еще можно применить подобное устройство?
avatar
0
2 GM • 22:08, 15.10.2015 [Материал]
Этот урок показывает лишь общее применение подобного метода. На светодиодах проще всего учить основам (материал лучше усваивается). А вообще, вместо светодиода, может быть любое другое устройство.
Например у Вас дома жалюзи. Вы устанавливаете на жалюзи сервопривод, который будет управлять шторками, и устанавливаете датчик в комнате. И вот когда на улице светает, жалюзи или открываются или закрываются, на ваше усмотрение. Ну как то так smile
avatar
А подскажите пожалуйста, "Далее переходим к подключению всех элементов к Arduino. Подключаем наш фоторезистор к контроллеру по схеме ниже (используется резистор на 10 кОм). Эта схема делителя напряжения. "
Зачем он нужен, и что без него  будет( без делителя напряжения)?
avatar
4 zirkov_micha • 11:37, 25.11.2015 [Материал]
Я думаю, что если бы мы подключили без резистора на 10кОм, то фоторезистор бы не выдержал большого тока через него и вышел из строя.
avatar
0
5 GM • 12:04, 25.11.2015 [Материал]
Вы почти правы. Если подключить фоторезистор между 5В и GND, то настанет такой момент, когда сопротивление фоторезистора будет равно 0, Вы просто закоротите питание, что может привести к выходу контроллера из строя. Чтобы это избежать, в схему добавляется резистор на 10кОм. 

Немного теории: 

Делитель напряжения (резистивный делитель) состоит из двух резисторов R1 и R2:



Выходное напряжение - это потенциал точки делителя. В зависимости от сопротивлений, выходное напряжение можно изменять. Так, если взять источник питания (Uвх) 9В и резисторы R1 =  R2 = 900 Ом. То выходное напряжение будет равно 5 В. Это простой способ получить несколько различных напряжений в одной схеме, оставив при этом только один источник питания.

Если же вместо R1 или R2 использовать компоненты, которые меняют свое сопротивление в зависимости от окружающей среды (термисторы, фоторезисторы), и подключив выходное напряжение (Uвых) к аналоговому входу Ардуино, то можно будет получать информацию о температуре, уровне освещённости и других параметрах среды (напряжение на выходе будет изменяться пропорционально сопротивлению компонентов).
avatar