Четырёх сегментный LED индикатор.

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем BAit, 1 мар 2014.

  1. BAit

    BAit Нерд

    Отпаял с микроволновки четырёх сегментный led индикатор примерно такой http://www.rcscomponents.kiev.ua/modules/Asers_Shop/images/datasheets/CA56-_.pdf
    Только нет точек DP
    Как вообще можно показывать на на каждом сегменте разные цифры
    Помогите пока не взорвался мозг или я не разобрал домашнюю микроволновку:eek::eek::eek::eek:
     
  2. lerik2703

    lerik2703 Гик

    изучйте http://chipenable.ru/index.php/prog...nyy-indikator-dinamicheskaya-indikatsiya.html
    http://radioparty.ru/index.php/prog-avr/program-c/279-lesson11-sevensegment
     
  3. geher

    geher Гуру

    Все просто. примерно так же, как при подключении семисегментных индикаторов.
    Собственно, если даташит именно от вашего индикатора, то мы имеем набор из четырех семисегментных индикаторов, выводы которых перенесены в два ряда пинов.
    По сути мы имеем набор сгруппированных светодиодов. В каждой группе они промаркированы от а до g плюс DP, и имеют в группе, в зависимости от конкретной модели индикатора, либо общий плюс, либо общий минус (в примере из вики общий минус, если общий плюс, то сигналы от микросхемы вроде как должны быть инвертированы).

    Соответствие пинов, включая групповые плюсы или минусы, конкретным диодам (и группам диодов, каждая из которых образует сегмент) расписано в даташите.

    Есть, правда, несколько тонкостей.
    В даташите расписано несколько вариантов индикаторов.
    Два из них, которые описаны дальше от начала текста, насколько я понял, не предусматривают одновременной индикации, поскольку имеют общие пины светодиодов у всех групп индикаторов.
    В этом случае требуется выбирать нужную группу, коммутируя общий вывод группы с плюсом или минусом (в соответствии с моделью индикатора) и подавать на входы, соответствующие диодам от а до DP, сигналы, образующие картинку. И проделывать это настолько быстро, чтобы для глаза диоды отключенного индикатора не успевали погаснуть, пока их общий вывод группы не скоммутирован.
    Если у вашего индикатора пинов меньше, чем 7*4+4, то это ваш случай.

    Вторая тонкость касается двух точек (UC и LC) между парами сегментов. Для первых двух вариантов индикатора я просто не нашел в даташите, куда они подключены. Для остальных эти точки привязаны к группам 3-го и 4-го сегментов и управляются соответствующим пином.

    А сначала все-таки надо определить, какой именно вариант у вас в наличии.
     
  4. Комар

    Комар Нуб

    Решил не плодить новую тему, у меня похожий вопрос.
    Подключил 7-ми сегментный индикатор (3-х разрядный) к Mega-nano через драйвер CD4026 и никак не могу справиться с выводом разных цифр в разные разряды... Замеряю температуру с аналогового датчика, температура меряется, исправно выводится в терминал, а на индикаторе полная ерунда.Изменяется только последняя цифра значения. Если температура 2-х значтая, то на индикаторе 2 цифры одинаковые и меняются одновременно, такое впечатление что где-то с циклом напортачил, но никак не пойму где, разные варианты пробовал, так и не смог понять в чем беда. Подскажите пожалуйста как быть...
    Для всего индикатора использовал 1 драйвер CD4026, а 3 вывода (к разным разрядам) подключаю к ногам контроллера чтобы в зависимости от значения включать и выключать их.
    Извините если в данной теме это флуд, я понимаю что вопрос больше относится к программированию чем к схемотехнике, но вдруг я гдето с подключениями все таки напортачил... не хотелось бы использовать 3 драйвера или подключать ноги напрямую к контроллеру, хочу сэкономить пины для других целей.
    Частично использовал Ваш код ( с wiki описания драйвера) частично дописывал сам
    вот что у меня получилось:

    Код (Text):
        #define CLOCK_PIN 4
        #define RESET_PIN 6
        #define dig1 12
        #define dig2 11
        #define dig3 10

    int k;
    int k1;
    int k2;
    int k3;

    int lm335=0;
    int temp;
    int m=2000;

    byte cif[3]={k1,k2,k3};
    /*
    * Функция resetNumber обнуляет текущее значение
    * на счётчике
    */
    void resetNumber()
    {
        // Для сброса на мгновение ставим контакт
        // reset в HIGH и возвращаем обратно в LOW
        digitalWrite(RESET_PIN, HIGH);
        digitalWrite(RESET_PIN, LOW);
    }
    /*
    * Функция showNumber устанавливает показания индикаторов
    * в заданное неотрицательное число `n` вне зависимости
    * от предыдущего значения
    */

    void showNumber(int h)
    {
      resetNumber();
        // Далее быстро «прокликиваем» счётчик до нужного
        // значения
    while (h--) {

            digitalWrite(CLOCK_PIN, HIGH);
            digitalWrite(CLOCK_PIN, LOW);
          }
      /*
        for (h;k1;){
            digitalWrite(dig1, LOW);
            digitalWrite(dig2, HIGH);
            digitalWrite(dig3, HIGH);
            while(h--) {
            digitalWrite(CLOCK_PIN, HIGH);
            digitalWrite(CLOCK_PIN, LOW);
            }
        for (h;k2;){
            digitalWrite(dig1, HIGH);
            digitalWrite(dig2, LOW);
            digitalWrite(dig3, HIGH);
            while (h--) {
            digitalWrite(CLOCK_PIN, HIGH);
            digitalWrite(CLOCK_PIN, LOW);
            }
          for (h;k3;) {
            digitalWrite(dig1, HIGH);
            digitalWrite(dig2, HIGH);
            digitalWrite(dig3, LOW);
            while (h--) {
            digitalWrite(CLOCK_PIN, HIGH);
            digitalWrite(CLOCK_PIN, LOW);
            }
          }
        }
        }
    */
    }

    void setup()
    {
      Serial.begin(9600);
      pinMode(RESET_PIN, OUTPUT);
      pinMode(CLOCK_PIN, OUTPUT);

      pinMode(dig1, OUTPUT);
      pinMode(dig2, OUTPUT);
      pinMode(dig3, OUTPUT);
      // Обнуляем счётчик при старте, чтобы он не оказался
      // в случайном состоянии
        resetNumber();
        }
    void loop()
    {
      for (;;) {
      double val = analogRead(lm335);
      double voltage = val*5.0/1024;
      temp = voltage*100 - 273.15;

      Serial.println(temp);
      k=temp;

    // --- разделяем полученную температуру по разрядам
      k1=k/100; // сотни
      k2=(k-k1*100)/10; // десятки
      k3=k-k1*100-k2*10; // еденицы
    //---

    //--- Убираем неиспользуемые разряды
      if (temp<=9) {
    showNumber(k1);
      digitalWrite(dig2, HIGH);
      digitalWrite(dig3, HIGH);
    }
      if (temp>=10, temp<=99) {
    showNumber(k2);
      digitalWrite(dig1, HIGH);
      }
    showNumber(k3);
    //---
    // проверка вывода сигналов
        Serial.println(k);
        Serial.println(k1);
        Serial.println(k2);
        Serial.println(k3);
    // ---
      delay(2000);
      }
      }
     
  5. Unixon

    Unixon Оракул Модератор

    Схема включения драйверов? Не забыли перенос по цепочке передать?
     
  6. BAit

    BAit Нерд

    Я уже термометр собрал на своей.
    От ардуино нужно чтобы она быстро переключало между ячейками и при переключении успевала передать значения на ячейку
     
  7. Комар

    Комар Нуб

    Дело не в том что забыл, а просто незнаю куда его тут подключить. По идее он же используется только когда больше одного драйвера стоит и по этому выводу передается сигнал о переносе разряда. Вот такая схема у меня (к сожалению в KiCAD нет в точности таких элементов, по этому пришлось импровизировать и показать схематично). В качестве индикатора у меня Kingbright BC56-12EWA.

    Вот в том и вопрос, разные варианты перепробовал, то ли я чего то делаю неправильно, то ли микросхема не успевает переключиться. Незнаю уже с какой стороны подойти даже...
    Если не трудно, поделитесь пожалуйста исходником.
     

    Вложения:

    • схема.JPG
      схема.JPG
      Размер файла:
      24 КБ
      Просмотров:
      853
    Последнее редактирование: 2 мар 2014
  8. Комар

    Комар Нуб

    Ну вот, не зря говорят "Утро вечера мудренее" =) Получилось выводить температуру правильно и даже счетчик сделал.
    Осталось только придумать как разобраться с таймерами и убрать мерцание и лишний символ "0" при показе 2-х значной температуры.
    А еще заметил одну странность, почему-то при работе счетчика иногда разряды перескакивают. например после 99 сразу идет 110. Может быть я в коде что-то напутал, подскажите пожалуйста.
    Код (Text):

    #define CLOCK_PIN 4
    #define RESET_PIN 6
     #define dig1 12
     #define dig2 11
     #define dig3 10

    int k;
    int k1;
    int k2;
    int k3;
    int lm335=0;
    int temp;
    int m=4; // m=4

    /*
    * Функция resetNumber обнуляет текущее значение
    * на счётчике
    */
    void resetNumber()
    {
      // Для сброса на мгновение ставим контакт
      // reset в HIGH и возвращаем обратно в LOW
      digitalWrite(RESET_PIN, HIGH);
      digitalWrite(RESET_PIN, LOW);
    }

    void raz1 () {
      digitalWrite(dig1, HIGH);
      digitalWrite(dig2, HIGH);
      digitalWrite(dig3, LOW);
    }

    void raz2 () {
      digitalWrite(dig1, HIGH);
      digitalWrite(dig2, LOW);
      digitalWrite(dig3, HIGH);

    }

    void raz3 () {
      digitalWrite(dig1, LOW);
      digitalWrite(dig2, HIGH);
      digitalWrite(dig3, HIGH);
    }

    /*
    * Функция showNumber устанавливает показания индикаторов
    * в заданное неотрицательное число `n` вне зависимости
    * от предыдущего значения
    */
    void showNumber(int h)
    {
      resetNumber();
      // Далее быстро «прокликиваем» счётчик до нужного
      // значения
    h=k1;
    raz3 ();
    while (h--) {
      digitalWrite(CLOCK_PIN, HIGH);
      digitalWrite(CLOCK_PIN, LOW);
      }
    delay (5);

    h=0;
    h=k2;
    raz2 ();
    while (h--) {
      digitalWrite(CLOCK_PIN, HIGH);
      digitalWrite(CLOCK_PIN, LOW);
      }
    delay (5);

    h=0;
    h=k3;
    raz1 ();
    while (h--) {
      digitalWrite(CLOCK_PIN, HIGH);
      digitalWrite(CLOCK_PIN, LOW);
      }
    delay (5);
    }




    void setup()
    {
      Serial.begin(9600);
      pinMode(RESET_PIN, OUTPUT);
      pinMode(CLOCK_PIN, OUTPUT);
      pinMode(dig1, OUTPUT);
      pinMode(dig2, OUTPUT);
      pinMode(dig3, OUTPUT);
      // Обнуляем счётчик при старте, чтобы он не оказался
      // в случайном состоянии
      resetNumber();
      }
    void loop()
    {
      double val = analogRead(lm335);
      double voltage = val*5.0/1024;
      temp = voltage*100 - 273.15;
      Serial.println(temp);
    k=temp;
    // --- разделяем полученную температуру по разрядам
      k1=k/100; // сотни
      k2=(k-k1*100)/10; // десятки
      k3=k-((k1*100)+(k2*10)); // еденицы
    //---

    showNumber(k); // выводим температуру на индикатор

    //--- Убираем неиспользуемые разряды
      if (temp<=9) {
      digitalWrite(dig2, HIGH);
      digitalWrite(dig1, HIGH);
    }
      if (temp>=10, temp<=99) {
      digitalWrite(dig1, HIGH);
      }
    //---
    // проверка вывода сигналов
      Serial.println(k);
      Serial.println(k1);
      Serial.println(k2);
      Serial.println(k3);
    // ---
      delay(m);
      }
     
     
    Последнее редактирование: 2 мар 2014
  9. BAit

    BAit Нерд