====== Эксперимент 3. Светильник с управляемой яркостью ====== [[конспект-arduino:маячок-с-нарастающей-яркостью|← Маячок с нарастающей яркостью]] | [[конспект-arduino:|Оглавление]] | [[конспект-arduino:терменвокс|Терменвокс →]] В этом эксперименте мы меняем яркость светодиода, вращая ручку переменного резистора. ===== Прочтите перед выполнением ===== * [[конспект-arduino:делитель-напряжения|Делитель напряжения]] ===== Список деталей для эксперимента ===== * 1 плата [[amp>product/arduino-uno|Arduino Uno]] * 1 беспаечная [[amp>collection/breadboards|макетная плата]] * 1 [[amp>product/led-5mm|светодиод]] * 1 [[amp>product/resistor-220r|резистор]] номиналом 220 Ом * 6 проводов [[amp>product/wire-mm|«папа-папа»]] * 1 [[amp>product/potentiometer|потенциометр]] ====Для дополнительного задания==== * еще 1 светодиод * еще 1 резистор номиналом 220 Ом * еще 2 провода ===== Принципиальная схема ===== {{ :конспект-arduino:3_scheme.svg.png?nolink& |}} ===== Схема на макетке ===== {{ :конспект-arduino:3_bread.svg.png?nolink& |}} ===== Обратите внимание ===== * Мы подключили «землю» светодиода и переменного резистора (потенциометра) к длинной рельсе «-» макетной платы, и уже ее соединили с входом GND микроконтроллера. Таким образом мы использовали меньше входов и от макетки к контроллеру тянется меньше проводов. * Подписи «+» и «-» на макетке не обязывают вас использовать их строго для питания, просто чаще всего они используются именно так и маркировка нам помогает * Не важно, какая из крайних ножек потенциометра будет подключена к 5 В, а какая к GND, поменяется только направление, в котором нужно крутить ручку для увеличения напряжения. Запомните, что сигнал мы считываем со средней ножки * Для считывания аналогового сигнала, принимающего широкий спектр значений, а не просто 0 или 1, как цифровой, подходят только порты, помеченные на плате как «ANALOG IN» и пронумерованные с префиксом ''A''. Для Arduino Uno — это A0-A5. ===== Скетч ===== // даём разумные имена для пинов со светодиодом // и потенциометром (англ potentiometer или просто «pot») #define LED_PIN 9 #define POT_PIN A0 void setup() { // пин со светодиодом — выход, как и раньше... pinMode(LED_PIN, OUTPUT); // ...а вот пин с потенциометром должен быть входом // (англ. «input»): мы хотим считывать напряжение, // выдаваемое им pinMode(POT_PIN, INPUT); } void loop() { // заявляем, что далее мы будем использовать 2 переменные с // именами rotation и brightness, и что хранить в них будем // целые числа (англ. «integer», сокращённо просто «int») int rotation, brightness; // считываем в rotation напряжение с потенциометра: // микроконтроллер выдаст число от 0 до 1023 // пропорциональное углу поворота ручки rotation = analogRead(POT_PIN); // в brightness записываем полученное ранее значение rotation // делённое на 4. Поскольку в переменных мы пожелали хранить // целые значения, дробная часть от деления будет отброшена. // В итоге мы получим целое число от 0 до 255 brightness = rotation / 4; // выдаём результат на светодиод analogWrite(LED_PIN, brightness); } ===== Пояснения к коду ===== * С помощью директивы ''#define'' мы сказали компилятору заменять идентификатор ''POT_PIN'' на ''A0'' — номер аналогового входа. Вы можете встретить код, где обращение к аналоговому порту будет по номеру без индекса ''A''. Такой код будет работать, но во избежание путаницы с цифровыми портами используйте индекс. * Переменным принято давать названия, начинающиеся со строчной буквы. * Чтобы использовать переменную, необходимо ее объявить, что мы и делаем инструкцией: 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)''? - Зачем мы делим значение, полученное с аналогового входа перед тем, как задать яркость светодиода? что будет, если этого не сделать? ===== Задания для самостоятельного решения ===== - Отключите питание платы, подключите к порту 5 еще один светодиод. Измените код таким образом, чтобы второй светодиод светился на 1/8 от яркости первого ---- [[конспект-arduino:маячок-с-нарастающей-яркостью|← Маячок с нарастающей яркостью]] | [[конспект-arduino:|Оглавление]] | [[конспект-arduino:терменвокс|Терменвокс →]]