7-сегментный индикатор

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#1 Дим » 7 июня 2019, 0:02

Решил сделать из синих светодиодов 7-сегментный индикатор. Для этого в этой теме буду оставлять всевозможные материалы, которые мне пригодятся в дальнейшем.

Принципиальная схема.png
Принципиальная схема
Принципиальная схема.png (5.49 КБ) 2060 просмотров


На каждом светодиоде должен быть свой резистор 220om. Общий катод соединен с GND, аноды у всех отдельные.

Общий катод соединен с GND, аноды у всех отдельные.png
Общий катод соединен с GND, аноды у всех отдельные
Общий катод соединен с GND, аноды у всех отдельные.png (4.82 КБ) 2060 просмотров


на макетной плате.png
на макетной плате
на макетной плате.png (33.69 КБ) 2060 просмотров


С помощью millis получаем число секунд, прошедших с запуска скетча, но выводим только последнюю цифру из прошедших секунд.

Код: Выделить всё

// список выводов Arduino для подключения к разрядам a-g
// семисегментного индикатора
int pins[7]={2,3,4,5,6,7,8};
// значения для вывода цифр 0-9
byte numbers[10] = { B11111100B01100000B11011010B11110010B01100110,
B10110110B10111110B11100000B11111110B11100110};
// переменная для хранения значения текущей цифры
int number=0;
void setup()
{
// Сконфигурировать контакты как выходы
for(int i=0;i<7;i++)
pinMode(pins[i],OUTPUT);
}
void loop()
{
showNumber(number);
delay(1000);
number=(number+1)%10;
}
// функция вывода цифры на семисегментный индикатор
void showNumber(int num)
{
for(
int i=0;i<7;i++)
{
if(
bitRead(numbers[num],7-i)==HIGH// зажечь сегмент
digitalWrite(pins[i],HIGH);
else 
// потушить сегмент
digitalWrite(pins[i],LOW);
}
[center]i love you [s]mxIni[/s] Mysql[/center]


Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#2 Дим » 7 июня 2019, 18:28

Полярность светодиода, как определить плюс и минус

Ну вот почти и готово - светодиоды моргают, но не возможно понять чего :grin: . Нужно теперь разместить их на плате как показано на первом рисунке.

phpBB [media]
[center]i love you [s]mxIni[/s] Mysql[/center]

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#3 Дим » 7 июня 2019, 22:04

7-сегментный индикатор.PNG
7-сегментный индикатор
7-сегментный индикатор.PNG (36.84 КБ) 2041 просмотр

7-сегментный индикатор на макетной плате.png
7-сегментный индикатор на макетной плате
7-сегментный индикатор на макетной плате.png (38.57 КБ) 2041 просмотр


Набросал схему на макетной плате, завтра прикуплю smd резисторов и буду ваять.
[center]i love you [s]mxIni[/s] Mysql[/center]

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#4 Дим » 7 июня 2019, 23:17

Вспомнил что у меня завалялась лента 100 штук SMD 5730 светодиодов 0.5W-150Ma. Заказал для них сотню SMD 0603 резисторов на 220om. Светить будут тускловато, но зато надолго хватит.  :hammer:

SMD 5730.png
SMD 5730
SMD 5730.png (115.72 КБ) 2039 просмотров
[center]i love you [s]mxIni[/s] Mysql[/center]

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

7-сегментный индикатор своими руками

#5 Дим » 8 июня 2019, 23:01

Все спаяно, но теперь не подходят скетчи что были опубликованы ранее. Теперь буду переделывать под свой "дисплей".
Дело было в наборе байт для вывода символов. Для меня схема подключения будет следующая.

Принципиальная схема.png
схема подключения
Принципиальная схема.png (47.45 КБ) 2022 просмотра
7-сегментный индикатор.PNG
7-сегментный индикатор
7-сегментный индикатор.PNG (37.7 КБ) 2021 просмотр


Код: Выделить всё

0b1111111

Первые два символа 0b дают понять, что речь идёт о двоичном счёте. Все нули означают, что все светодиоды будут включены.
Какая цифра за какой символ отвечает, разделены запятой

Код: Выделить всё

0b q, f, a, b, d, c, e

Чтобы написать цифру 1 нужно зажечь b и c. Код будет таким:

Код: Выделить всё

0b0001010

С этим скетчем горят все светодиоды.

Код: Выделить всё

#define FIRST_SEGMENT_PIN   2
#define SEGMENT_COUNT       8


byte number0 = 0b1111111;//горят все светодиоды


void setup() {
  for (int i = 0; i < SEGMENT_COUNT; ++i)
    pinMode(+ FIRST_SEGMENT_PIN, OUTPUT);
}

void loop() {
  int mask = number0;
  // для каждого из 7 сегментов индикатора определяем:
  // должен ли он быть включён. 
  // Для этого считываем бит, соответствующий текущему
  // сегменту «i». Истина — он установлен (1), ложь — нет (0)
  for (int i = 0; i < SEGMENT_COUNT; ++i) {
    boolean enableSegment = bitRead(mask, i);
    // включаем/выключаем сегмент на основе полученного значения
    digitalWrite(+ FIRST_SEGMENT_PIN, enableSegment);
  }

Теперь напишу коды для всех цифр

Код: Выделить всё

0b0111111, //0
0b0001010, //1
0b1011101, //2
0b1011110, //3
0b1101010, //4
0b1110110, //5
0b1110111, //6
0b0011010, //7
0b1111111, //8
0b1111110, //9          

С этим скетчем будет идти бесконечный счёт от 0 до 9.

Код: Выделить всё

#define FIRST_SEGMENT_PIN   2
#define SEGMENT_COUNT       8

// Всего цифр 10, поэтому в массиве 10 чисел.
byte numberSegments[10] = {
0b0111111, //0
0b0001010, //1
0b1011101, //2
0b1011110, //3
0b1101010, //4
0b1110110, //5
0b1110111, //6
0b0011010, //7
0b1111111, //8
0b1111110, //9
};
 
void setup
()
{
  for (int i = 0; i < SEGMENT_COUNT; ++i)
    pinMode(+ FIRST_SEGMENT_PIN, OUTPUT);
}
 
void loop
()
{
  // определяем число, которое следует отобразить.
  //  Пусть им будет номер текущей секунды, зацикленный на десятке
  int number = (millis() / 1000) % 10;
  // получаем код из массива, в котором содержится полученная цифра
  int mask = numberSegments[number];
  // для каждого из 7 сегментов индикатора
  for (int i = 0; i < SEGMENT_COUNT; ++i) {
    // определяем: должен ли он быть включён.
    boolean enableSegment = bitRead(mask, i);
    // включаем/выключаем сегмент на основе полученного значения
    digitalWrite(+ FIRST_SEGMENT_PIN, enableSegment);
  }


phpBB [media]

_http://developer.alexanderklimov.ru/arduino/7segment_display.php
[center]i love you [s]mxIni[/s] Mysql[/center]

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#6 Дим » 9 июня 2019, 20:21

Еще видео и картинки поделки :grin:
phpBB [media]


Для сегментов использовал плоские светодиоды, вырванные из старого двух кассетного магнитофона.
Спойлер
Семисегментный индикатор своими руками.JPG
Семисегментный индикатор своими руками
Так как загубил две штуки smd резисторов, а в магазин больше идти не хотелось, то впаял один плёночный.
Спойлер
Семисегментный индикатор своими руками 2.JPG
Семисегментный индикатор своими руками
[center]i love you [s]mxIni[/s] Mysql[/center]


Вернуться в «Прочая электроника»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 3 гостя