Куда вывести данные?
С помощью чего можно вывести показания разных датчиков? Что такое 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)
Прикрепленные файлы:
- LCD.ino (1 Кб)
- Segment.ino (1 Кб)
- led.ino (1 Кб)