Сделаем программу чуть более полезной. Например, создадим таймер для чистки зубов - при нажатии кнопки светодиод будет гореть ровно 2 минуты. Для создания задержки будем использовать функцию delay, которая в качестве параметра принимает длительность в миллисекундах.

Нам достаточно изменить функцию loop.

void loop() {

// Ждем пока кнопка будет нажата

while (digitalRead(buttonPin) == HIGH) delay(100);

// Зажигаем светодиод

digitalWrite(ledPin, HIGH);

delay(120*1000);

// Гасим светодиод

digitalWrite(ledPin, LOW);

}

Логика работы программы достаточно проста, и не требует отдельных пояснений. Программа ждет нажатия кнопки, для чего используется функция while - она выполняет нужный фрагмент кода, пока условие истинно. После нажатия кнопки, программа включает светодиод, затем запускается 2х-минутная пауза с помощью функции delay, затем цикл повторяется.

Самостоятельная работа #1: Изменить таймер так, чтобы во время 2х-минутного интервала светодиод мигал с частотой 1 раз в секунду. Для этого, функцию delay следует заменить на цикл, внутри которого светодиод будет включаться и выключаться.

Самостоятельная работа #2: Усложнить программу, сделав так, чтобы к концу интервала (например, последние 10 секунд) светодиод мигал чаще, показывая что время подходит к концу.

2.6 Ввод аналоговых величин

Как мы видели в предыдущей главе, получить состояние кнопки весьма просто - она или нажата или нет, что соответствует либо “0”, либо “1”. Но Arduino также имеет возможность измерять напряжение напрямую, для этого есть специальные аналоговые входы (analog Inputs). Это часто бывает полезно, например, сопротивление фоторезистора зависит от освещенности, и мы можем использовать это в программе для включения света, сопротивление датчика влажности может показывать, что пора полить цветок, и т.д.

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

Цифровая электроника для начинающих _70.jpg

Сам принцип основан на работе делителя напряжения: если переменный резистор подключить к источнику напряжения, то значение его выхода будет варьироваться от нуля до максимума.

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

Цифровая электроника для начинающих _71.jpg

Точное значение резистора не так уж важно, он может быть 5КОм, 10КОм, 50КОм - в делителе напряжения важно соотношение сопротивлений, а не их абсолютное значение.

Цифровая электроника для начинающих _72.jpg

Дополним таймер из предыдущей главы переменным резистором, которым можно будет регулировать интервал в диапазоне от 0 до 10 минут. Для подключения резистора нужно использовать входы, помеченные как Analog input, в нашем случае A3.

Цифровая электроника для начинающих _73.jpg

Теперь мы можем считывать положение ручки резистора, используя функцию analogRead. Есть лишь одна небольшая тонкость - analogRead возвращает значения от 0 до 1024. Чтобы преобразовать их в интервал от 0 до 600 секунд, мы домножаем полученные значения на 600/1024. Тип unsigned long используется потому, что максимальное значение 1024*600 = 614400, что уже превосходит диапазон значений int, который составляет в Arduino -32768...32767.

Код программы целиком:

int buttonPin = 2;

int analogPin = 3;

int ledPin = 13;

void setup() {

// Вывод настроен как “выход”

pinMode(ledPin, OUTPUT);

// Вывод настроен как “вход”

pinMode(buttonPin, INPUT);

}

void loop() {

// Читаем положение потенциометра (0..1023)

int pos = analogRead(analogPin);

unsigned long time_sec = pos*600/1024;

// Ждем пока кнопка будет нажата

while (digitalRead(buttonPin) == HIGH) delay(100);

// Зажигаем светодиод

digitalWrite(ledPin, HIGH);

delay(time_sec*1000);

// Гасим светодиод

digitalWrite(ledPin, LOW);

}

В следующей главе мы подключим к Arduino динамик, что позволит создать уже полноценное и законченное устройство: кухонный таймер.

Самостоятельная работа #1: сделать шкалу для переменного резистора, как показано на рисунке. Оценить точность работы таймера, например с помощью программы для смартфона.

Цифровая электроника для начинающих _74.jpg

Разумеется, есть множество других разнообразных устройств, напряжение от которых можно считывать с помощью analogRead.

Термистор - это резистор, сопротивление которого зависит от температуры. Его подключение аналогично переменному резистору.

Цифровая электроника для начинающих _75.jpg

Подключив его в схему как показано на рисунке, можно измерять, например, температуру воздуха на улице.

Фоторезистор - как понятно из названия, изменяет свое сопротивление в зависимости от освещенности.

Цифровая электроника для начинающих _76.jpg

Датчик атмосферного давления: напряжение на его выходе пропорционально давлению.

Цифровая электроника для начинающих _77.jpg

В продаже также есть датчики влажности воздуха или почвы. Все это позволяет создать несложные системы автоматизации, например для освещения или обогрева теплицы. Разумеется, Arduino не может напрямую управлять мощной нагрузкой, для этого в продаже есть специальные реле, вроде таких:

Цифровая электроника для начинающих _78.jpg

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

Самостоятельная работа #2: подключить к Arduino термистор, вывести значения принимаемые от analogRead в последовательный порт, что позволит просматривать их на компьютере. Погружая термистор в лед или кипяток, построить график зависимости значений от температуры. В следующих главах мы рассмотрим подключение ЖК-экрана, что позволит нам на этом принципе сделать термометр.

2.6 Вывод звука

Мы уже подключали светодиод к Arduino. Практически тем же способом можно подключить к Arduino пьезодинамик, что позволит нам создавать несложные звуки.

Пьезодинамик подключается к выводу Arduino примерно также, как и светодиод, через ограничительный резистор сопротивлением 100-200 Ом.

Цифровая электроника для начинающих _79.jpg

Для вывода звука используется функция tone, которая имеет два параметра - номер вывода и частоту звука. Для отключения звука есть функция со схожим названием noTone.

Простейший код, в котором Arduino будет издавать (весьма противные) звуки каждую секунду, выглядит так:

const int buzzer = 8; // arduino pin 8

void setup(){

pinMode(buzzer, OUTPUT);

}

void loop() {

tone(buzzer, 1000);       // 1000Гц = 1КГц

delay(1000);       // 1с

noTone(buzzer);       // стоп

delay(1000);       // пауза 1с

}

Кстати, в продаже бывают и так называемые “активные пьезодинамики” (active buzzer). Они имеют 3 входа, один из которых +5В, а второй управляющий.

Цифровая электроника для начинающих _80.jpg

Использование такого динамика проще - частоту можно не задавать, достаточно просто установить в “1” соответствующий вывод. Для этого достаточно заменить функцию tone(buzzer, 1000); на digitalWrite(buzzer, HIGH); и функцию noTone(buzzer); на digitalWrite(buzzer, LOW). Такой динамик обычно громче, но отсутствие возможности смены частоты звука может быть недостатком.

Самостоятельная работа #1: С помощью пьезодинамика воспроизвести гамму или несложную мелодию, воспользовавшись таблицей частот нот в герцах.

До

262

Соль

392

Ре