Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Подключение семисегментного индикатора (1 разряд) к Arduino по SPI

Наверняка у многих валяется вот такая светодиодная панелька:

Правильное название: семисегментный индикатор

Он получил такое названия благодаря тому, что в его корпусе находится 7 сегментов - светодиодов (часто добавляют ещё 8-й - точку).

Сейчас они не актуальны. Проще LCD экран подключить, он меньше выводов занимает, да и работать с ним проще. Однако иногда такие индикаторы могут быть полезен. Например, когда нужно отобразить только какую-либо цифру и ничего более. Плюс, они дешевле экранчиков.

Работать с семисегментом надо как со сборкой светодиодов (с общим катодом или анодом). Распиновку можно узнать, прозванивая ножки мультиметром. У меня получилось так: ( общий катод)

Каждый сегмент - это отдельный светодиод (красный или зелёный). Если подключаем к источнику 5V, то последовательно с каждым из них нужно подключить по резистору (150-300 ом) - чтобы не перегорели.

А соединять с Arduino я предлагаю через сдвиговый регистр 74HC595N (интерфейс SPI)

74HC595N

схема на 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);
}

Результат:

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

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
Плата Arduino
Arduino Uno
1 Поиск в магазине ОтронВ блокнот
Сдвиговый регистр
CD74HC595
1 Поиск в магазине ОтронВ блокнот
Резистор100-300 Ом8 Поиск в магазине ОтронВ блокнот
Семисегментный индикатор1 Поиск в магазине ОтронВ блокнот
Добавить все

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

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

Теги:

Опубликована: 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (4) | Я собрал (0) | Подписаться

0
Алексей #
В скетче ошибка. начало вот так
#define CLOCK 13 //SH_CP
#define DATA 8 //DS
#define LATCH 12 //ST_CP
Ответить
0
Дмитрий #
Ноль это не 0b00000000, это должно быть 0b11111100
Да, ещё Алексей неправ у автора правильно
Ответить
0
arduinщик #
У меня код лучше чуть чуть. Я английские буквы добавил. Видео на жаль нет:
#define CLOCK 13 //SH_CP
#define DATA 12 //DS
#define LATCH 8 //ST_CP
int val = 0;

void setup() {

//настраиваем контакты на выход
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);


//отключаем LATCH (чтобы регистр не ждал данных)
digitalWrite(LATCH, HIGH);
}

void loop() {
//включаем LATCH (Начинаем общение)
digitalWrite(LATCH, LOW);
/*
1
----------
[ ]
6 [ ] 2
[ ]
[ 7 ]
----------
[ ]
5 [ ] 3
[ ]
[ ]
---------- {}
4 8

0b12345678
*/
switch (val) {
case -1: //точка
shiftOut(DATA, CLOCK, LSBFIRST, 0b00000001);
break;
case 0: //0
shiftOut(DATA, CLOCK, LSBFIRST, 0b11111100);
break;
case 1: //1
shiftOut(DATA, CLOCK, LSBFIRST, 0b01100000);
break;
case 2: //2
shiftOut(DATA, CLOCK, LSBFIRST, 0b11011010);
break;
case 3: //3
shiftOut(DATA, CLOCK, LSBFIRST, 0b11110010);
break;
case 4: //4
shiftOut(DATA, CLOCK, LSBFIRST, 0b01100110);
break;
case 5: //5
shiftOut(DATA, CLOCK, LSBFIRST, 0b10110110);
break;
case 6: //6
shiftOut(DATA, CLOCK, LSBFIRST, 0b10111110);
break;
case 7: //7
shiftOut(DATA, CLOCK, LSBFIRST, 0b11100000);
break;
case 8: //8
shiftOut(DATA, CLOCK, LSBFIRST, 0b11111110);
break;
case 9: //9
shiftOut(DATA, CLOCK, LSBFIRST, 0b11110110);
break;
case 10: //A
shiftOut(DATA, CLOCK, LSBFIRST, 0b11101110);
break;
case 11: //b
shiftOut(DATA, CLOCK, LSBFIRST, 0b00111110);
break;
case 12: //C
shiftOut(DATA, CLOCK, LSBFIRST, 0b10011100);
break;
case 13: //d
shiftOut(DATA, CLOCK, LSBFIRST, 0b01111010);
break;
case 14: //E
shiftOut(DATA, CLOCK, LSBFIRST, 0b10011110);
break;
case 15: //F
shiftOut(DATA, CLOCK, LSBFIRST, 0b10001110);
break;
case 16: //G
shiftOut(DATA, CLOCK, LSBFIRST, 0b10111100);
break;
case 17: //H
shiftOut(DATA, CLOCK, LSBFIRST, 0b01101110);
break;
case 18: //I
shiftOut(DATA, CLOCK, LSBFIRST, 0b01100000);
break;
case 19: //J
shiftOut(DATA, CLOCK, LSBFIRST, 0b01110000);
break;
case 20: //L
shiftOut(DATA, CLOCK, LSBFIRST, 0b00011100);
break;
case 21: //n
shiftOut(DATA, CLOCK, LSBFIRST, 0b00101010);
break;
case 22: //O
shiftOut(DATA, CLOCK, LSBFIRST, 0b11111100);
break;
case 23: //P
shiftOut(DATA, CLOCK, LSBFIRST, 0b11001110);
break;
case 24: //q
shiftOut(DATA, CLOCK, LSBFIRST, 0b11100110);
break;
case 25: //S
shiftOut(DATA, CLOCK, LSBFIRST, 0b10110110);
break;
case 26: //U
shiftOut(DATA, CLOCK, LSBFIRST, 0b01111100);
break;
//некоторые буквы невозможно отобразить. их нет в списке
}

//включаем LATCH (Начинаем общение)
digitalWrite(LATCH, HIGH);
if(val==26){
val=-2;
}
delay(1000);
val=val+1;
}
Ответить
0
AchMarat #
#define CLOCK 13 //SH_CP 11 74СН
#define DATA 12 //DS 14 74СН
#define LATCH 8 //ST_CP 12 74СН

//{A, B, C, D, E, F, G,DP} - распиновка сегментов
byte numberSegments[10] = {
0b11111101, 0b01100000, 0b11011010, 0b11110010, 0b01100110,
0b10110110, 0b10111110, 0b11100000, 0b11111110, 0b11110110,
};

void setup() {

//настраиваем контакты на выход
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);

//отключаем LATCH (чтобы регистр не ждал данных)
digitalWrite(LATCH, HIGH);
}

void loop() {
for (int i = 0; i<=9; i++)
{
//включаем LATCH (Начинаем общение)
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[i]);
//включаем LATCH (Начинаем общение)
digitalWrite(LATCH, HIGH);
delay(1000);
}
}
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Raspberry Pi 2
Raspberry Pi 2
Сатфайндер Паяльная станция Hakko 936
вверх