Arduino: управление 7-сегментным дисплеем по SPI
Шина SPI
SPI (Serial Peripheral Interface) – это последовательный синхронный стандарт передачи данных, который предназначен для общения контроллера с периферией. Большинство современных микроконтроллеров поддерживают SPI, поскольку она очень проста и удобна в использовании. У Arduino есть библиотека для работы с SPI, которая состоит всего из шести простых функций.
Одно из устройств на шине является ведущим (чаще всего, сам контроллер), а остальные – ведомыми. Данные передаются по шине от ведущего к одному выбранному ведомому или от ведомого к ведущему синхронно по тактирующему сигналу ведущего.
Шина SPI состоит из 4х проводов: MOSI, MISO, CS и SCLK:
MOSI (Master Out Slave In) или просто SI – передача данных от ведущего к ведомому.
MISO (Master In Slave Out) или просто SO – передача данных от ведомого к ведущему.
CS (Chip Select) или SS (Slave Select) – выбор ведомого устройства.
SCLK (Serial CLocK) или просто SCK – передача тактового сигнала от ведущего к ведомому.Передача данных от ведущего производится так: ведущий выставляет низкий уровень на проводе CS ведомого устройства, с которым он собирается общаться, после чего по MOSI передаются биты. По окончании передачи ведущий “отпускает” провод CS – возвращает его на высокий уровень.
Чтобы подключить несколько устройств к шине SPI, для каждого устройства заводится свой провод CS, и ведущий, поочередная “дергая” ими, общается с тем или иным устройством. Подробнее подключение нескольких устройств мы рассмотрим в следующей статье, а пока двинемся дальше.
Сдвиговый регистр 74РС595
Мы будем использовать в качестве ведомого устройства сдвиговый регистр 74HC595, к которому подключим 7-сегментный дисплей.
Полное его название – “8-bit serial-in, serial or parallel-out shift register with output latches” – “восьмибитный регистр с последовательным вводом и последовательным или параллельным выводом и с выходными защелками”.
Принцип действия такого регистра заключается в том, что он последовательно получает биты по проводу DS, а при выставлении низкого уровня на проводе STCP «защелкивает» полученные биты так, что на его параллелных выводах аккуратно формируется весь полученный байт.
Выход Q7S “повторяет” биты на входе DS, что делает возможным работу регистра как бы в режиме bypass, что пригождается в случае последовательного соединения нескольких регистров (это мы будем использовать в следующий раз).
Здесь:
VCC – питание;
GND – земля;
DS – последовательный ввод. Должен подключаться к проводу MOSI шины SPI;
Q0:Q7 – параллельные выходы;
SHCP – тактовый вход.
Должен подключаться к проводу SCK шины SPI;
STCP – защелкивание выводов. Должен подключаться к проводу CS шины SPI;
OE – разрешение работы выходов.
При низком уровне выходы работают;
Q7S – последовательный вывод;
MR – общий сброс. Если притянуть его к земле – входы обнулятся.
7-сегментный дисплей
Обычно одиночный семисегментник имеет 10 контактов, из которых 2 – общие, а остальные 8 – отдельные сегменты, включая точку в правом нижнем углу. Семисегментники могут быть с общим анодом или с общим катодом. Необходимо четко понимать, какого именно типа семисегментник у вас в руках!
У меня оказался семисегментник с маркировкой SM111201K, у него общий анод и следующее расположение контактов (весьма непопулярное):
Здесь com – общие контакты. Tсли приложить к (любой) ноге com потенциал +5, а к ноге А – 0, то загорится, соответственно, сегмент А. Если у дисплея общий катод, то потенциалы нужно подлючать наоборот!
Если мы представим цифры на 7-сегментном дисплее в виде байтов, то, «пропихивая» их по SPI в регистр побитово, в момент защелкивания будем получать нужную цифру. Таким образом, мы получаем возможность управлять семисегментным дисплеем по четырем проводам, причем каждый последующий семисегментник в плане проводов будет доставаться нам почти бесплатно.
Работа с байтами
В даташите к вашему семисегментнику несомненно есть таблица, какой логический уровень нужно подавать на тот или иной вход, чтобы загорелась та или иная цифра. Скорее всего, эта таблица выглядит так (вместо и 1 могут быть L и H, соответственно):
A | B | C | D | E | F | G | dp | hex | |
1 | 1 | C0 | |||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | F9 | ||
2 | 1 | 1 | 1 | A4 | |||||
3 | 1 | 1 | 1 | B0 | |||||
4 | 1 | 1 | 1 | 1 | 99 | ||||
5 | 1 | 1 | 1 | 92 | |||||
6 | 1 | 1 | 82 | ||||||
7 | 1 | 1 | 1 | 1 | 1 | F8 | |||
8 | 1 | 80 | |||||||
9 | 1 | 1 | 90 | ||||||
a | 1 | 1 | 88 | ||||||
b | 1 | 1 | 1 | 83 | |||||
c | 1 | 1 | 1 | 1 | C6 | ||||
d | 1 | 1 | 1 | A1 | |||||
e | 1 | 1 | 1 | 86 | |||||
f | 1 | 1 | 1 | 1 | 8E |
Если у дисплея общий катод, то 1 нужно заменить на 0, а 0 – на 1!
Самый правый столбец под названием hex – это и есть представление цифры в байтовом виде. Его в даташите нет, нужно рассчитывать самостоятельно. Сделать это очень просто: помня, что байт передается со старшего бита (в нашем случае – самого правого), разбить его на два числа по четыре бита и перевести их в шестнадцатеричное представление.
Разберем цифру 5. В таблице – это 01001001. Разворачиваем и разбиваем пополам, получаем 1001 0010, видим, что это 9 и 2. Кто подзабыл перевод из двоичной системы в шестнадцатеричную – смотрим таблицу:
0000 | |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
Схема соединений
DS счетчика подключаем к 11 пину Arduino (желтый провод); выходы мы всегда разрешаем, поэтому садим OE сразу на землю; STCP подключаем к 8 пину Arduino (зеленый провод); SHCP (тактирующий вход) подключаем к 13 пину Arduino (оранжевый провод); MR садим на питание, так как не планируем использовать сброс; Q7S оставляем болтаться, в данный момент он нам не нужен.
С подключением семисегментника все просто: нужно аккуратно подключить ногу А к выходу регистра Q0, ногу B к выходу Q1 и т.д., ногу dp к Q7.
Код Arduino
Запишем все полученные байты в массив так, что нулевой элемент массива соответствует цифре 0, первый – цифре 1 и т.д.
static uint8_t digit[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
Теперь для отрисовки, например, цифры 2, нужно просто выполнить передачу в регистр digit[2]. Вот код для Arduino, который выводит подряд все шестнадцатеричные числа:
#include // подключаем библиотеку SPI
enum { reg = 8 }; // провод CS подсоединяем к 8-му пину Arduino
void setup()
{
SPI.
begin(); // инициализируем SPI
pinMode(reg, OUTPUT); // настраиваем 8-й пин как выход
}
void loop()
{
// храним в массиве все цифры
static uint8_t digit[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
// выводим цифры по одной
for (int i=0;i
Источник: http://greenoakst.blogspot.com/2011/11/arduino-7-spi.html
Подключение семисегментного индикатора (1 разряд) к Arduino по SPI
Наверняка у многих валяется вот такая светодиодная панелька:
Правильное название: семисегментный индикатор
Он получил такое названия благодаря тому, что в его корпусе находится 7 сегментов – светодиодов (часто добавляют ещё 8-й – точку).
Сейчас они не актуальны. Проще LCD экран подключить, он меньше выводов занимает, да и работать с ним проще. Однако иногда такие индикаторы могут быть полезен. Например, когда нужно отобразить только какую-либо цифру и ничего более. Плюс, они дешевле экранчиков.
Работать с семисегментом надо как со сборкой светодиодов (с общим катодом или анодом). Распиновку можно узнать, прозванивая ножки мультиметром. У меня получилось так: ( общий катод)
Каждый сегмент – это отдельный светодиод (красный или зелёный). Если подключаем к источнику 5V, то последовательно с каждым из них нужно подключить по резистору (150-300 ом) – чтобы не перегорели.
А соединять с Arduino я предлагаю через сдвиговый регистр 74HC595N (интерфейс SPI)
схема на BreadBoard:
Принципиальную схему не смог нарисовать в sPlan (нет 28-пиновой Atmega), так-что сделал в Fritzing:
Описание схемы:
– ноги 15,1,2,3,4.5,6,7 – это выходы регистра. Их подключаем к соответствующим ногам индикатора (A к Q0, B к Q1, C к Q3, ну и т. д..
Главное, чтобы было по порядку – тогда часть программирования будет проще)
– ноги 8 и 16 – это питание микросхемы (подключаем к GND и +5V Arduino)
– 10 ногу к +5V
– 13 ногу к GND
– Ноги 14, 12, 11 – управляющие пины шины SPI.
11 (SH_CP) – тактовая шина (clock) к 13 контакту Arduino (не принципиально)
12 (ST_CP) – защёлка (latch) к 12 контакту Arduino (не принципиально)
14 (DS) – данные (data) к 8 контакту Arduino (не принципиально)
Прошивка
Код очень простой. Мы даже не будем использовать библиотеку SPI. Посылать данные будем функцией shiftOut()
Она будет отправлять регистру 1 байт (8 бит). Каждый сегмент – это 1 бит. ( Если отправить вот такой байт: 0b10000000, то получим такую вот картину: (зажжётся первый сегмент – А)
Суть: Зажигая определённую комбинацию сегментов, мы получаем на экране цифру. Так, например, если зажечь сегменты B и С то загорится единичка. A, B, C – семёрка, и т. д..
Сам код: SevSeg1_SPI.ino
#define CLOCK 13 //SH_CP
#define DATA 12 //DS
#define LATCH 8 //ST_CP void setup() { //настраиваем контакты на выход pinMode(CLOCK, OUTPUT); pinMode(DATA, OUTPUT); pinMode(LATCH, OUTPUT); //отключаем LATCH (чтобы регистр не ждал данных) digitalWrite(LATCH, HIGH);
} void loop() { //включаем LATCH (Начинаем общение) digitalWrite(LATCH, LOW); //посылаем данные функцией shiftOut ( http://arduino.ru/Reference/ShiftOut ) /* Цифра | байт 0 | 0b00000000 1 | 0b01100000 2 | 0b11011010 3 | 0b11110010 4 | 0b01100110 5 | 0b10110110 6 | 0b10111110 7 | 0b11100000 8 | 0b11111110 9 | 0b11110110 */ shiftOut(DATA, CLOCK, LSBFIRST, 0b10110110); //включаем LATCH (Начинаем общение) digitalWrite(LATCH, HIGH);
}
Результат:
Список радиоэлементов
Скачать список элементов (PDF)
Прикрепленные файлы:
Источник: http://cxem.net/arduino/arduino164.php
Как подключить семисегментный индикатор к Arduino
Семисегментный индикатор
Семисегментный индикатор — это набор светодиодов, собранных в едином корпусе. Светодиоды образуют сегменты-палочки, путём подсвечивания которых можно формировать цифры. Индикатор можно напрямую подключать к Ардуино (см.
Светодиод), но при этом будет задействовано целых 7 выводов контроллера на один дисплей, и придется озаботится добавлением в программу кода, реализующего отображение цифр на индикаторе. Этот способ плох также и тем, что ограничено количество подключенных индикаторов — больше двух разрядов отобразить уже не получится, на контроллере не хватит выводов.
Для решения этой проблемы мы предлагаем использовать специальную микросхему, называемую 7-ми сегментным драйвером (CD4026). В статье рассмотрено подключение драйвера к arduino.
Суть работы микросхемы проста: на вход микросхемы clock (1) подаются импульсы HIGH, каждый импульс соответствует увеличению внутреннего счетчика на единицу. Значение этого счетчика и будет отображаться на индикаторе.
Вывод clock (1) рекомендуется снабдить стягивающим резистором для избежания ложных срабатываний. Для сброса счетчика подается импульс на вход reset clock (15). На пины enable display (3) должен подаваться сигнал HIGH, иначе все выводы окажутся выключенными.
Если вы не собираетесь включать и выключать отображение цифр на индикаторе — просто подключите этот вывод к рельсе питания. К пину 16 следует подключить питание. Пины disable clock (2) и 0V (8) подключаются к земле.
У драйвера 7 выходов (a, b, c, d, e, f, g) для подключения к соответствующим ножкам индикатора через токоограничительные резисторы. Особого внимания заслуживает выход ÷10 output (5).
При переполнении внутреннего счетчика (в момент подачи сигнала HIGH на clock (1) при текущем значении счетчика 9) на него подается сигнал HIGH до момента следующего увеличения счётчика. Это позволяет подключить этот выход ко входу clock (1) следующего драйвера, и получить возможность выводить почти неограниченное количество разрядов за счет всего 3-х выходов Arduino.
Микросхема работает на частоте 16 МГц, за счет чего изменение напряжения на выходах, а, соответственно, и изображения на индикаторе происходит очень быстро, и его нельзя заметить невооруженным глазом.
Распиновка микросхемы CD4026
Схема подключения семисегментного индикатора LD-5161AG
Установите микросхему на макетную плату и подключите выводы микросхемы к выводам контроллера следующим образом:
- 1 «clock» ко 2 выводу ардуино. Дополнительно, через резистор 10 кОм к земле. Резистор исключит влияние помех на отображение числа.
- 2 «disable clock» к рельсе земли.
- 3 «enable display» к рельсе питания.
- 5 «÷10» можно оставить неподключённым. При увеличении числа драйверов, к этому выводу следует подключить вывод 1 «clock» второго драйвера.
- 8 «0V» — к рельсе земли.
- 15 «reset» к 3 выводу ардуино. Дополнительно, через резистор 10 кОм к земле. Резистор исключит возможный сброс значения из-за помех.
- 16 вывод микросхемы к рельсе питания.
Выводы микросхемы 6,7 и с 9 по 13 соединить с выводами семисегментного индикатора, ориентируясь на буквенный обозначения на схемах выше. Средние выводы индикатора — это общие катоды, их нужно подключить к рельсе земли.
Вот так это должно выглядеть:
Семисегментный драйвер CD4026 установлен на макетную плату
Семисегментный драйвер CD4026 с подключённым к нему семисегментным индикатором
Теперь загрузите в плату Arduino следующий код:
// Обнуляет текущее значение// Просто последовательно выдаём HIGH и LOW на вывод resetdigitalWrite(RESET_PIN, HIGH);digitalWrite(RESET_PIN, LOW);//Выводит на индикаторе переданное в параметрах число// Обнуляем текущее значение// "Помигаем" выводом счётчика до нужного значенияfor (byte i=0; i<n; i++) {digitalWrite(CLOCK_PIN, HIGH);digitalWrite(CLOCK_PIN, LOW);//Настраиваем выводы на выходpinMode(RESET_PIN, OUTPUT);pinMode(CLOCK_PIN, OUTPUT);// Обнуляем счётчик при старте// Получаем количество секунд с момента старта// и выводим его на индикаторыshowNumber((millis() / 1000) % 60); |
Этот код отображает количество целых секунд, прошедших с момента запуска платы. То есть, отображает числа от 0 до 60. При одном подключённом индикаторе, вы увидите, что индикатор отображает только цифры от 0 до 9.
Семисегментный драйвер CD4026 отображает числа от 0 до 9
Для добавления второго разряда, нам понадобится ещё один семисегментный индикатор и ещё один драйвер к нему.
Установите на макетную плату ещё один индикатор и ещё один драйвер. Подключите второй драйвер к рельсам питания и земли точно так же, как первый.
Вывод 1 «clock» не нужно подключать к контроллеру Arduino, просто подключите его к выводу 5 «÷10» первого драйвера. Этого достаточно, чтобы второй драйвер начал отображать десятки на подключённом к нему индикаторе.
Выводы 15 «reset» обоих драйверов должны быть соединены между собой.
Семисегментный драйвер CD4026 с двумя подключёнными к нему семисегментными индикатороми
Теперь наш счётчик показывает 2 разряда,а вы восхитительны!
P.S. На видео есть небольшая странность. Первый, кто в комментариях предложит правильную причину, почему это произошло, получит бесплатно набор из 2х индикаторов и 2х микросхем CD4026. Подсказка: это не монтаж. Именно так всё и отображалось в реальности. В плату был залит именно тот скетч, что предлагается выше.
В комментариях уже есть правильный ответ.
Таким образом можно множить цепочку индикаторов до бесконечности. Управлять всем этим по прежнему будут всего 2 вывода контроллера.
Источник: https://uscr.ru/kak-podklyuchit-semisegmentnyj-indikator-k-arduino/
Arduino. Динамическая индикация
Динамическая индикация — это метод отображения целостной картины путем последовательного отображения отдельных элементов этой картины.
Эта статья научит вас выводить на дисплее сегментного индикатора одновременно несколько цифр. Достигается это за счет «инерционности» человеческого зрения.
Подготовка к работе
В предыдущей статье мы разобрали пример работы с одним разрядом. В ней использовалась статическая индикация.
Увеличить количество разрядов можно, если использовать еще один дисплей и еще семь выводов микроконтроллера, но гораздо выгоднее отображать разряды индикатора по очереди с высокой скоростью.
Так, чтобы это стало не заметно для глаза.
Для этого на индикаторе должны быть объединены аноды разрядов и катоды сегментов.
Индикатор с динамической индикацией
Все примеры выполнены с использованием EduBoard и TutorShield. На нашем шилде именно такой индикатор. Для его использования установите перемычки, выделенные на рисунке:
Перемычки для включения индикатора
Принципиальная схема подключения индикатора:
Принципиальная схема подключения индикатора
Первый пример
Для начала выведите два разных числа на индикаторе, используя следующий код:
#define DIG1 4 #define DIG2 5 #define A 6 #define B 7 #define C 8 #define D 9 #define E 10 #define FF 11 #define G 12 #define TAKT 1000 void setup() { pinMode(A, OUTPUT); pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); pinMode(E, OUTPUT); pinMode(FF, OUTPUT); pinMode(G, OUTPUT); pinMode(DIG1, OUTPUT); pinMode(DIG2, OUTPUT); digitalWrite(A,HIGH); digitalWrite(B,HIGH); digitalWrite(C,HIGH); digitalWrite(D,HIGH); digitalWrite(E,HIGH); digitalWrite(FF,HIGH); digitalWrite(G,HIGH); digitalWrite(DIG1,HIGH); digitalWrite(DIG2,HIGH); } void loop() { digitalWrite(DIG1,LOW); Show(3); delay(TAKT); Clean(); digitalWrite(DIG1,HIGH); digitalWrite(DIG2,LOW); Show(4); delay(TAKT); Clean(); digitalWrite(DIG2,HIGH); } void Show(int digit) { switch(digit) { case 0: { digitalWrite(A,LOW); digitalWrite(B,LOW); digitalWrite(C,LOW); digitalWrite(D,LOW); digitalWrite(E,LOW); digitalWrite(FF,LOW); } break; case 1: { digitalWrite(B,LOW); digitalWrite(C,LOW); } break; case 2: { digitalWrite(A,LOW); digitalWrite(B,LOW); digitalWrite(D,LOW); digitalWrite(E,LOW); digitalWrite(G,LOW); } break; case 3: { digitalWrite(A,LOW); digitalWrite(B,LOW); digitalWrite(C,LOW); digitalWrite(D,LOW); digitalWrite(G,LOW); } break; case 4: { digitalWrite(B,LOW); digitalWrite(C,LOW); digitalWrite(FF,LOW); digitalWrite(G,LOW); } break; case 5: { digitalWrite(A,LOW); digitalWrite(C,LOW); digitalWrite(D,LOW); digitalWrite(FF,LOW); digitalWrite(G,LOW); } break; case 6: { digitalWrite(A,LOW); digitalWrite(C,LOW); digitalWrite(D,LOW); digitalWrite(E,LOW); digitalWrite(FF,LOW); digitalWrite(G,LOW); } break; case 7: { digitalWrite(A,LOW); digitalWrite(B,LOW); digitalWrite(C,LOW); } break; case 8: { digitalWrite(A,LOW); digitalWrite(B,LOW); digitalWrite(C,LOW); digitalWrite(D,LOW); digitalWrite(E,LOW); digitalWrite(FF,LOW); digitalWrite(G,LOW); } break; case 9: { digitalWrite(A,LOW); digitalWrite(B,LOW); digitalWrite(C,LOW); digitalWrite(D,LOW); digitalWrite(FF,LOW); digitalWrite(G,LOW); } break; } } void Clean() { digitalWrite(A,HIGH); digitalWrite(B,HIGH); digitalWrite(C,HIGH); digitalWrite(D,HIGH); digitalWrite(E,HIGH); digitalWrite(FF,HIGH); digitalWrite(G,HIGH); }
Основной цикл этого примера линеен и прост. Сначала в первом разряде на одну секунду выводится цифра 3, затем во втором 4.
Если уменьшить интервал TAKT, то можно добиться того, чтобы за счет инерционности зрения казалось, что цифра 34 горит непрерывно.
Какую длительность поставить? С одной стороны она должна быть как можно больше, чтобы осталось время на выполнение других задач, с другой стороны как можно меньше, чтобы глаз не видел мерцания.
Эмпирическим путем установлено, что обновления изображения с частотой 50 раз в секунду вполне достаточно для приемлемого восприятия. Это значит, что идентификатор TAKT должен иметь значение меньше 10мс.
Попробуйте запустить программу с этим числом, а затем попробуйте увеличить его до 20мс и понаблюдайте за разницей.
Не забудьте после оставить значение TAKT 10.
Управление яркостью
При динамической индикации разряды горят не на протяжении всего времени и светятся лишь на половину (при двух разрядах). Это нужно учитывать при подборе токоограничивающих резисторов индикатора.
Также можно управлять яркостью. В предыдущем примере добавьте еще один идентификатор BRIGHT и замените основной цикл:
#define BRIGHT 2 void loop() { digitalWrite(DIG1,LOW); Show(3); delay(BRIGHT); Clean(); digitalWrite(DIG1,HIGH); delay(TAKT-BRIGHT); digitalWrite(DIG2,LOW); Show(4); delay(BRIGHT); Clean(); digitalWrite(DIG2,HIGH); delay(TAKT-BRIGHT); }
Переопределение идентификатора BRIGHT от 0 до 10 будет приводить к изменению яркости. На время BRIGHT индикатор будет включен, а на время TAKT-BRIGHT выключен. Надо понимать, что эта константа будет справедлива только для ситуаций, когда TAKT равен 10мс.
Упрощение использования
На данный момент программа в основном цикле занимается только тем, что выводит числа. Для дальнейшего ее упрощения нужно понимать для чего будет использоваться сегментный индикатор.
С применением индикатора можно сделать, например, вольтметр.
В нем блок АЦП микроконтроллера периодически делает замер и сохраняет результат в память. Это результат можно из памяти вытащить и показать на индикаторе. То есть желательно иметь функцию, которая будет разделять двухразрядные числа две цифры.
Назовем эту функцию DisplayMath():
void DisplayMath(int data) { dig1 = dig2 = 0; if (data = 10) { data -= 10; dig1++; } dig2 = data; } }
В эту функцию будет передаваться число, которое нужно разобрать по разрядам. Результат обработки функция записывает в глобальные переменные dig1 и dig2.
Для начала происходит проверка входных данных.
Если переданное значение больше 100, то функция не будет делать ничего и переменные dig1 и dig2 обнулятся. Если меньше 100, то запускается пересчет.
Далее локальная переменная data декрементируется с шагом 10 и подсчитывается количество итераций.
Например, если функции передано значение 48 цикл while будет выполнен 4 раза и концу его выполнения переменные будут иметь состояние dig1=4, data=8. Далее остается только записать остаток data в переменную dig2.
В итоге после запуска этой функции в переменных dig1 и dig2 окажутся значения разрядов.
Сам вывод цифр на дисплей тоже лучше вынести в отдельную функцию. Назовем ее DisplayShow():
void DisplayShow() { digitalWrite(DIG1,LOW); Show(dig1); delay(BRIGHT); Clean(); digitalWrite(DIG1,HIGH); delay(TAKT-BRIGHT); digitalWrite(DIG2,LOW); Show(dig2); delay(BRIGHT); Clean(); digitalWrite(DIG2,HIGH); delay(TAKT-BRIGHT); }
Окончательный код с использованием этих функций:
#define DIG1 4 #define DIG2 5 #define A 6 #define B 7 #define C 8 #define D 9 #define E 10 #define FF 11 #define G 12 #define TAKT 10 #define BRIGHT 2 int dig1 = 0; int dig2 = 0; void setup() { pinMode(A, OUTPUT); pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); pinMode(E, OUTPUT); pinMode(FF, OUTPUT); pinMode(G, OUTPUT); pinMode(DIG1, OUTPUT); pinMode(DIG2, OUTPUT); digitalWrite(A,HIGH); digitalWrite(B,HIGH); digitalWrite(C,HIGH); digitalWrite(D,HIGH); digitalWrite(E,HIGH); digitalWrite(FF,HIGH); digitalWrite(G,HIGH); digitalWrite(DIG1,HIGH); digitalWrite(DIG2,HIGH); } void loop() { DisplayMath(34); DisplayShow(); } void DisplayMath(int data) { dig1 = dig2 = 0; if (data = 10) { data -= 10; dig1++; } dig2 = data; } } void DisplayShow() { digitalWrite(DIG1,LOW); Show(dig1); delay(BRIGHT); Clean(); digitalWrite(DIG1,HIGH); delay(TAKT-BRIGHT); digitalWrite(DIG2,LOW); Show(dig2); delay(BRIGHT); Clean(); digitalWrite(DIG2,HIGH); delay(TAKT-BRIGHT); } void Show(int digit) { switch(digit) { case 0: { digitalWrite(A,LOW); digitalWrite(B,LOW); digitalWrite(C,LOW); digitalWrite(D,LOW); digitalWrite(E,LOW); digitalWrite(FF,LOW); } break; case 1: { digitalWrite(B,LOW); digitalWrite(C,LOW); } break; case 2: { digitalWrite(A,LOW); digitalWrite(B,LOW); digitalWrite(D,LOW); digitalWrite(E,LOW); digitalWrite(G,LOW); } break; case 3: { digitalWrite(A,LOW); digitalWrite(B,LOW); digitalWrite(C,LOW); digitalWrite(D,LOW); digitalWrite(G,LOW); } break; case 4: { digitalWrite(B,LOW); digitalWrite(C,LOW); digitalWrite(FF,LOW); digitalWrite(G,LOW); } break; case 5: { digitalWrite(A,LOW); digitalWrite(C,LOW); digitalWrite(D,LOW); digitalWrite(FF,LOW); digitalWrite(G,LOW); } break; case 6: { digitalWrite(A,LOW); digitalWrite(C,LOW); digitalWrite(D,LOW); digitalWrite(E,LOW); digitalWrite(FF,LOW); digitalWrite(G,LOW); } break; case 7: { digitalWrite(A,LOW); digitalWrite(B,LOW); digitalWrite(C,LOW); } break; case 8: { digitalWrite(A,LOW); digitalWrite(B,LOW); digitalWrite(C,LOW); digitalWrite(D,LOW); digitalWrite(E,LOW); digitalWrite(FF,LOW); digitalWrite(G,LOW); } break; case 9: { digitalWrite(A,LOW); digitalWrite(B,LOW); digitalWrite(C,LOW); digitalWrite(D,LOW); digitalWrite(FF,LOW); digitalWrite(G,LOW); } break; } } void Clean() { digitalWrite(A,HIGH); digitalWrite(B,HIGH); digitalWrite(C,HIGH); digitalWrite(D,HIGH); digitalWrite(E,HIGH); digitalWrite(FF,HIGH); digitalWrite(G,HIGH); }
Обратите внимание насколько прост основной цикл loop(). В нем всего две строки. Если вы измените значение 34 на любое другое, то оно будет отображено на индикаторе.
Для демонстрации работы индикатора запустим счетчик с произвольной скоростью и будем выводить его состояние. Замените основной цикл и добавьте две переменных:
int value = 0; int i = 0; void loop() { i++; if (i == 7) { i = 0; value ++; if (value == 100) value = 0; } DisplayMath(value); DisplayShow(); }
Вы увидите как на экране побегут цифры от 0 до 99.
Заключение
В результате выполнения работы вы написали еще две функции для работы с индикатором. В перспективе мы уберем ее в отдельный файл, который легко будет подключить и начать работать с сегментным индикатором.
Индивидуальные задания
- Увеличьте модуль счета. Подключите четыре дополнительных светодиода на выводах A0-A5 и допишите программу так, чтобы счетчик считал от 0 до 699.
- Если в старшем разряде 0, то его нет смысла показывать.
Доработайте программу так, чтобы старший разряд был погашен, если нужно показать число меньше 10
- Сделайте так, чтобы если функции DisplayMath() передано число больше 99 на дисплее отображалось -0 (overflow, переполнение)
Остальные статьи цикла можно найти здесь.
Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.
Источник: http://www.customelectronics.ru/arduino-dinamicheskaya-indikatsiya/
Программируем с Ардуино: основы работы со скетчами
- Информация о курсе
- График
- Вебинары
- Отзывы
Темы |
Кол-во академ. часов |
Что такое ARDUINO IDE. Разновидности ARDUINO и принципы работы. Робототехника и мехатроника (основные понятия). Знакомство с платформой ARDUINO. Аппаратная часть. Знакомство с набором АМПЕРКА и подбор комплектующих ARDUINO IDE Составление технологической карты. Составление простых программ для ARDUINO. Микроконтроллеры Atmel |
2 |
Среда программирования ARDUINO и (интерфейсы программирования). Мозговой штурм. Разработка системы. Написание руководства для учителя и карточки учащегося
|
2 |
Запускаем первую программу. Анализируем программу (Blink) Подключение внешнего светодиода. Работа с макетной платой. Закон Ома и формула для расчёта мощности |
2 |
Работа с экраном. ARDUINO. Работа со звуком. Программные структуры ARDUINO. Структура «переключатель» |
2 |
Двигатель постоянного тока. Борьба с выбросами напряжения. Использование транзистора в качестве переключателя. Написание схемотехники для ARDUINO |
2 |
|
2 |
Методика организации проектной работы с использованием ARDUINO и Матрешка Z. Мозговой штурм для формулирования темы проекта |
2 |
История создания протокола I²C. Особенности написания программ. Аппаратная реализация. Знакомство со средой программирования ROBOTC |
2 |
Взаимодействие и идентификация устройств. Общие сведения о протоколе SPI.Библиотека LiquidCristal. Отображение данных на ЖК – |
2 |
|
2 |
Робототехника и мехатроника в учебном процессе. Интегрирование на уроках физики и информатики |
2 |
Рассмотрение методик. Мозговой штурм для формулирования темы проекта. Подведение итогов. Творческое задание для самостоятельного выполнения |
2 |
Итого: |
24 |
Данный курс доступен в режиме офлайн. Просмотреть можно в любое удобное для Вас время.
На данный момент у курса нет отзывов
Источник: https://xn--j1amdg6b.xn--c1awjj.xn--p1ai/courses/programmiruem-s-arduino-osnovy-raboty-so-skretchami/