Урок 3. Светильник с управляемой яркостью


В этом эксперименте мы меняем яркость светодиода, вращая ручку переменного резистора.

Список деталей для эксперимента

Для дополнительного задания

  • еще 1 светодиод
  • еще 1 резистор номиналом 220 Ом
  • еще 2 провода

Принципиальная схема

Схема на макетке

Обратите внимание

  • Мы подключили «землю» светодиода и переменного резистора (потенциометра) к длинной рельсе «-» макетной платы, и уже ее соединили с входом GND микроконтроллера. Таким образом мы использовали меньше входов и от макетки к контроллеру тянется меньше проводов.
  • Подписи «+» и «-» на макетке не обязывают вас использовать их строго для питания, просто чаще всего они используются именно так и маркировка нам помогает
  • Не важно, какая из крайних ножек потенциометра будет подключена к 5 В, а какая к GND, поменяется только направление, в котором нужно крутить ручку для увеличения напряжения. Запомните, что сигнал мы считываем со средней ножки
  • Для считывания аналогового сигнала, принимающего широкий спектр значений, а не просто 0 или 1, как цифровой, подходят только порты, помеченные на плате как «ANALOG IN» и пронумерованные с префиксом A. Для Arduino Uno — это A0-A5.

Скетч

  1.     // даём разумные имена для пинов со светодиодом
    
  2.     // и потенциометром (англ potentiometer или просто «pot»)
    
  3.     #define LED_PIN     9
    
  4.     #define POT_PIN     A0
    
  5.  
  6.     void setup(
    )
    
  7.     {
    
  8.       // пин со светодиодом — выход, как и раньше...
    
  9.       pinMode(LED_PIN, OUTPUT)
    ;
    
  10.  
  11.       // ...а вот пин с потенциометром должен быть входом
    
  12.       // (англ. «input»): мы хотим считывать напряжение,
    
  13.       // выдаваемое им
    
  14.       pinMode(POT_PIN, INPUT)
    ;
    
  15.     }
    
  16.  
  17.     void loop(
    )
    
  18.     {
    
  19.       // заявляем, что далее мы будем использовать 2 переменные с
    
  20.       // именами rotation и brightness, и что хранить в них будем
    
  21.       // целые числа (англ. «integer», сокращённо просто «int»)
    
  22.       int rotation, brightness;  
  23.  
  24.       // считываем в rotation напряжение с потенциометра:
    
  25.       // микроконтроллер выдаст число от 0 до 1023
    
  26.       // пропорциональное углу поворота ручки
    
  27.       rotation = analogRead(POT_PIN)
    ;
    
  28.  
  29.       // в brightness записываем полученное ранее значение rotation
    
  30.       // делённое на 4. Поскольку в переменных мы пожелали хранить
    
  31.       // целые значения, дробная часть от деления будет отброшена.
    
  32.       // В итоге мы получим целое число от 0 до 255
    
  33.       brightness = rotation / 4
    ;
    
  34.  
  35.       // выдаём результат на светодиод
    
  36.       analogWrite(LED_PIN, brightness)
    ;
    
  37.     }
    

Пояснения к коду

  • С помощью директивы #define мы сказали компилятору заменять идентификатор POT_PIN на A0 — номер аналогового входа. Вы можете встретить код, где обращение к аналоговому порту будет по номеру без индекса A. Такой код будет работать, но во избежание путаницы с цифровыми портами используйте индекс.
  • Переменным принято давать названия, начинающиеся со строчной буквы.
  • Чтобы использовать переменную, необходимо ее объявить, что мы и делаем инструкцией:
  1. int rotation, brightness;
    
  • Для объявления переменной необходимо указать ее тип, здесь — int (от англ. integer) — целочисленное значение в диапазоне от -32 768 до 32 767, с другими типами мы познакомимся позднее
  • Переменные одного типа можно объявить в одной инструкции, перечислив их через запятую, что мы и сделали
  • Функция analogRead(pinA) возвращает целочисленное значение в диапазоне от 0 до 1023, пропорциональное напряжению, поданному на аналоговый вход, номер которого мы передаем функции в качестве параметра pinA
  • Обратите внимание, как мы получили значение, возвращенное функцией analogRead(): мы просто поместили его в переменную rotation с помощью оператора присваивания =, который записывает то, что находится справа от него в ту переменную, которая стоит слева

Вопросы для проверки себя

  • Можем ли мы при сборке схемы подключить светодиод и потенциометр напрямую к разным входам GND микроконтроллера?
  • В какую сторону нужно крутить переменный резистор для увеличения яркости светодиода?
  • Что будет, если стереть из программы строчку pinMode(LED_PIN, OUTPUT)? строчку pinMode(POT_PIN, INPUT)?
  • Зачем мы делим значение, полученное с аналогового входа перед тем, как задать яркость светодиода? что будет, если этого не сделать?

Задания для самостоятельного решения

  1. Отключите питание платы, подключите к порту 5 еще один светодиод. Измените код таким образом, чтобы второй светодиод светился на 1/8 от яркости первого
Теги: 
Источник: 

wiki.amperka.ru