Куда вывести данные?
С помощью чего можно вывести показания разных датчиков? Что такое 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 | ||||