Главная » Arduino
Призовой фонд
на октябрь 2021 г.
1. Рюкзак Mean Well
Компэл
2. Инвертор авто Mean Well 150 Ватт
Компэл
3. Термос MeanWell
Компэл
4. 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

Arduino UNO
Arduino UNO
ELM327 OBD II — адаптер с поддержкой CAN Мини гравер 125 Ватт
вверх