Подключение дисплея.
На прошлом уроке мы придумали как будут технически реализованы подключения модулей к Ардуино и установили две библиотеки на RTC и I2C для LCD. Теперь пришла пора сделать так чтобы эти блоки у нас заработали по отдельности. Т.е. LCD что нибудь отображал, контроллер корректно срабатывал на нажатия кнопок, звук выводился и т.д.
Как вы помните я решил использовать I2C для LCD. В принципе можно использовать без I2C но я хочу попробовать данную библиотеку. Поэтому я сначала приведу пример и код для тех кто будет использовать I2C, код подключения дисплея напрямую будет ниже. Если вы не хотите использовать I2C то подключите библиотеку LCD как написано в уроке. У вас должно получится что то типа этого:
#include <LiquidCrystal_I2C.h>// подключаем библиотеку
LiquidCrystal_I2C lcd(0x27,16,2); // объявляем дисплей, указываем адрес, затем количество знаков- 16, и количество рядов-2
Далее в секции setup
void setup()
{
lcd.init(); // инициализируем дисплей
lcd.backlight();// Включаем подсветку дисплея
}
Вообще набор для LCD может отличаться от тех что я привожу здесь. Это зависит в первую очередь от подключаемой библиотеки. Т.е. если ваша библиотека для LCD не поддерживает указанных команд то вероятнее всего компиляция скетча выдаст ошибку. Узнать, какие команды поддерживает библиотека, можно перейдя в папку с установленной оболочкой программы Arduino- Libraries- (Папка подключаемого модуля)- keywords.txt. Обычно в данном файле и выкладываются ключевые команды для использования библиотеки.
Далее по нашей программе часов. В секции Setup вы можете указать уже что будет отображаться при загрузке и инициализации ваших часов. Т.е. например ваш e-mail, имя и вообще любую информацию которая появится только один раз при загрузке.
Пример использования:
void setup()
{
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
lcd.print(«www.samosdel.ru»); // пишем в первой строке с самого начала
lcd.setCursor(5, 1); // устанавливаем курсор на 5 позицию второй строки
lcd.print(«Test LCD»); // пишем с указанной выше позиции
delay(3000); //отображаем 3 секунды
lcd.clear; //очищает экран
}
При загрузке текст отображается 3 секунды и затем переходит к исполнению основной программы в секции loop().
Для работы без модуля I2C листинг программы будет выглядеть следующим образом:
#include <LiquidCrystal.h>// подключаем библиотеку
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// объявляем дисплей
void setup()
{
lcd.begin(16, 2); // указываем какой дисплей будем использовать
lcd.print(«www.samosdel.ru»); // пишем в первой строке с самого начала
lcd.setCursor(5, 1); // устанавливаем курсор на 5 позицию второй строки
lcd.print(«Test LCD»); // пишем с указанной выше позиции
delay(3000); //отображаем 3 секунды
lcd.clear; //очищает экран
}
Разница лишь в первых строках секции setup. Далее работаем так же как и с модулем I2C.
Секция вывода звука.
Т.к. договорились с самого начала выводить прерывистый звук на буззер частотой 1 кГц то и для этой подпрограммы можно использовать просто несколько строк кода но можно пойти дальше и написать функцию которая будет работать по заданным параметрам. Рассмотрим оба варианта.
Первый- простой. Просто добавляем в место где будет использоваться вызов звукового сигнала следующие строки:
tone (8, 1000); //включаем на 8 цифровом пине частоту 1000 Гц
delay(500); //ждем 500 мс или полсекунды
noTone (8); //выключаем на 8 цифровом пине частоту
delay(500); //ждем 500 мс или полсекунды
В принципе ничего сложного в данной функции нет и данная код подойдет практически в 95% случаев но я хотел бы предложить вам более интересный и более практичный способ который я использую уже довольно длительное время. Напишем подпрограмму вывода звука которая может использоваться много раз из разных мест вашей основной программы. Этот вариант является более практичным в случае многократного использования. Например: при нажатии кнопок- один короткий звук одной частоты, при срабатывании будильника- прерывистый звук другой частоты, если вы проспали первое срабатывание то на втором звук будет более высоким и более прерывистей (т.е. чаще повторяться) что ли и т.д. Если для каждого варианта срабатываний звука писать выше указанный код то программа разрастется просто до гигантских размеров. Поэтому лучше все таки использовать отдельную подпрограмму и вызывать её буквально одной строкой кода. Приступаем.

Для начала давайте выведем функцию в отдельную вкладку типа браузеров Mozzila, Opera и т.д. что бы не прыгать по коду в поисках нужной функции и не искать ее постоянно. Делаем следующее: под кнопкой «Монитор порта» в оболочке Ардуино кликаем на флажок в форме треугольника отмеченный на картинке красным прямоугольником, затем кликаем на Новая вкладка или нажимаем Ctrl+Shift+N как и написано на картинке. Почти в самом низу появится панель с предложением задать имя для нового файла.

Программа создаст еще один файл с указанным именем и включит его в ваш текущий проект. Теперь весь код, который вы напишете будет использоваться в вашей программе. На данном рисунке предоставлена как раз функция вывода звука в моем делающемся проекте паяльной станции. К названиям нет никаких ограничений но я предпочитаю использовать в названиях первые буквы от используемых данных как написано ЗДЕСЬ. Т.е. в данном случае написано fSound что в моем понимании сразу расшифровывается как Function Sound, иначе говоря функция звука. Как видите в моей программе уже 4 вкладки не считая самой первой, которая собственно содержит все рабочие секции, и используются они для более удобного чтения и анализа кода.
Затем во вкладке идет объявление функции которая будет использоваться в вашей программе.
void Sound (int x, int y)
{
tone (8, x); //включаем на частоту х Гц
delay(y); //ждем y Мс
noTone(8);
delay(y); //ждем y Мс
}
Теперь при вызове функции Sound указываем в скобках 2 параметра типа integer как и написано в параметрах функции. Т.е. если мы напишем Sound (1521,10000); то на 8 выводе, используемом для вывода звука мы получим звуковой сигнал частотой 1521 Гц и длительностью 10 сек. Вы можете ввести еще множество аргументов функций (это то что написано в скобках при объявлении функции) и использовать их как вам удобно. Заметьте что после отключения звука по программе управление и вообще доступ к микроконтроллеру будет закрыт на те же 10 сек оператором delay(10000). В этом случае можете добавить еще один аргумент или жестко прописать время в функции например вот так:
void Sound (int x, int y, int z)
{
tone (8, x); //включаем на частоту х Гц
delay(y); //ждем y Мс
noTone(8);
delay(z); //ждем z Мс
}
Теперь функции требуется уже 3 параметра и при её вызове в формате Sound (1521,10000,100); микроконтроллер будет доступен к управлению через 0,1 секунды! Это равносильно такому коду:
void Sound (int x, int y)
{
tone (8, x); //включаем на частоту х Гц
delay(y); //ждем y Мс
noTone(8);
delay(100); //ждем 100 Мс
}
Опять же вы должны исходить из того что вы хотите получить в итоге и отталкиваться уже от требуемых условий. В итоге мы избегаем написания здоровенной кучи кода для вывода звука и заменяем весь этот индийский код буквально одной строкой! Кстати, не забудьте объявить 8 цифровой вывод как выход.
<-Урок 7.1 | Урок 7.3-> |