Курс Arduino — Отображение данных на LCD

Куда вывести данные?

С помощью чего можно вывести показания разных датчиков? Что такое LCD дисплей и как с ним работать? Это мы и рассмотрим в этом уроке.

Сегодня нам понадобятся

  • LCD дисплей
  • Светодиодная шкала , 7-сегментный индикатор и Светодиод.
  • Потенциометр
  • Резисторы на 220 Ом
  • Соединительные провода  «Папа-Папа»

Светодиодная шкала

Светодиодная шкала – это сборка из нескольких светодиодов в одном корпусе. У каждого из них есть свой анод и свой катод. Для тех, кто не знал или забыл — анод подключается к плюсу, катод к минусу. Как правило, более длинная ножка светодиода – анод. Бывает, что в сборках ножки одинаковые. В таком случае, положение анода и катода определяются экспериментальным путем.

Давайте соберем схему со светодиодной шкалой. Задача по сбору схемы достаточно тривиальна, нужно немного внимательности.

 

А теперь заставим наше устройство работать.

 #define POT A0 #define FIRST 2 //Первый пин на шкале. #define NUM 10 //Это количество пинов на шкале.  void setup()  {      //Чтобы не описывать каждый пин по отдельности, создадим цикл со счетчиком      //Здесь пропишем общее количество пинов шкалы.   for (int i = 0; i < NUM; ++i)       //Каждый из пинов шкалы обозначим как выход.    pinMode(i + FIRST, OUTPUT);  }  void loop() {      //Определим уровень сигнала для включения светодиода   int val = analogRead(POT) / 93;      //Создадим цикл для выведения значения на шкалу.   for( int i = 0; i < NUM; ++i)   {     //Определим, какой светодиод зажигать.     boolean Segment = (val > 0 + i);     digitalWrite(i + FIRST, Segment);   } }

Пояснения

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

Boolean Segment  С помощью этой логической переменной мы определили условие, при котором включается следующий сегмент.

 LCD

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

 

Код

 #include <LiquidCrystal.h> //Подключим библиотеку для дисплея. //Покажем, к каким выводам мы подключили дисплей LiquidCrystal lcd(13, 12, 11, 10, 9 ,8);    #define POT A5 #define LED 7 void setup()  {   lcd.begin(16, 2); //Сообщаем кол-во строк и столбцов.   lcd.print ("Command's name:"); //В первую строку выводим сообщение.   pinMode(LED, OUTPUT);  }  void loop() {   int val = analogRead(POT);   val = map(val, 0, 1023, 0, 4);    //Ставим курсор на 1 строку, колонку 0.   //Это соответствует левому квадрату 2-й строки.   lcd.setCursor(0, 1);     //Выводим сообщения параллельно с выполнением задач.   if( val == 1)   {   //Если не поставить пробелы, последняя буква f при переключении потенциометра   // не будет стираться.     lcd.print ("Led on   ");     digitalWrite(LED, HIGH);   }   else if(val == 2)   {     lcd.print ("Led off");     digitalWrite(LED, LOW);   }   else if(val ==3)   {     lcd.print ("Blink   ");     for( int i = 0; i < 3; i++)     {       digitalWrite(LED, HIGH);       delay(600);       digitalWrite(LED, LOW);       delay(600);     }   } }

Пояснения

LiquidCrystal     О том, почему подключать LCD экран именно так, читай здесь.

Lcd.begin(x; y)   Эта функция сообщает LiquidCrystal, сколько строк(x) и столбцов(y) у нашего экрана.

Lcd.print   Эта функция печатает сообщение на экран.

Lcd.setCursor(x, y)  Эта функция ставит курсор на 1 строку в колонку 0.Это левый квадрат 2-й строки, т.к. нумерация начинается с нуля.

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

7-сегментный индикатор

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

Внимание на схему.

 

Код

 #define FIRST  2 #define COUNT  7 #define POT A5   //Создадим массив в который пропишем кодировки выводимых чисел. byte Segments[10] =  {   0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010,   0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110, };   void setup() {   for (int i = 0; i < COUNT; ++i)     pinMode(i + FIRST, OUTPUT); }   void loop() {   // определяем число, которое собираемся отображать.    int number = analogRead(POT) / 103;   // получаем код, в котором зашифрована арабская цифра   int value = Segments[number];   // для каждого из 7 сегментов индикатора определяем: должен ли он быть включён.   for (int i = 0; i < COUNT; ++i)    {     // Для этого считываем бит (англ. read bit), соответствующий текущему     // сегменту «i». Истина — он установлен (1), ложь — нет (0)     boolean Segment = bitRead(value, i);     // включаем/выключаем сегмент на основе полученного значения     digitalWrite(i + FIRST, Segment);   } }

Пояснения

Byte – Тип данных byte позволяет сохранить до 1 байта данных. С помощью этого типа данных мы описывали цифры, выводимые на 7-сегментном индикаторе. Часть 0b говорит, что используется двоичная система счисления.

Массивы – Массив – это набор однотипных данных. Есть два типа массивов. Массив переменных и массив символов. В нашем коде мы создали массив, в котором прописали кодировки чисел. Потом мы просто брали нужную кодировку и выводили на экран.

bitRead(номер бита, сегмент) — Функция позволяет считать нужный бит, чтобы определить, должен ли быть включен сегмент индикатора.

Вывод

На сегодня, пожалуй, хватит. Теперь мы умеем выводить данные на монитор и визуализировать показания на шкале и 7-сегментном индикаторе. 

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

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Плата Arduino Arduino Uno 1
Светодиод АЛ102Б 1
Светодиодная сборка 7-сегментный индикатор 1
Светодиодная сборка Светодиодная шкала 1
LCD-дисплей MT-16S2H 1
Резистор 220 Ом 10
Переменный резистор 10кОм 1
Соединительные провода "Папа-Папа" 1
Макетная плата Breadboard-half 1