Курс 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-сегментном индикаторе. 

Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот

Плата ArduinoArduino Uno1

СветодиодАЛ102Б1

Светодиодная сборка7-сегментный индикатор1

Светодиодная сборкаСветодиодная шкала1

LCD-дисплейMT-16S2H1

Резистор220 Ом10

Переменный резистор10кОм1

Соединительные провода"Папа-Папа"1

Макетная платаBreadboard-half1
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Добавить комментарий

Ваш адрес email не будет опубликован.