Что это за индикатор?

Тема в разделе "Посоветуйте детальки", создана пользователем DrProg, 18 апр 2015.

  1. DrProg

    DrProg Вечный нерд

    Купил для своего Ардуино, думал то же самое что стандартный сегментный. Но только дома заметил, что у него на две цифровые панели все те же 10 ног. И никакой маркировки. Как им пользоваться? Как найти описание?
    [​IMG]
     
  2. ANV

    ANV Гуру

    Вот и весь фокус:
    [​IMG]
    Сначала проверить он с общим анодом или общим катодом, а потом прочитать про динамическую индикацию
     
    DrProg нравится это.
  3. DrProg

    DrProg Вечный нерд

    Спасибо! А как безопасно узнать с общим он анодом или катодом?
     
  4. ANV

    ANV Гуру

    Надо вбить в поисковике "<буковки на корпусе> Datasheet", тк распиновка может отличаться от приведенной мною.

    Если не найдется, то вызванивать тестером в режиме проверки диода. Когда "угадаете", у Вас загорится сегмент.
     
  5. DrProg

    DrProg Вечный нерд

    Этот способ мне знаком, проблема в том, что маркировки нет вообще никакой. Распиновка совсем не такая как на схеме, нашел ноги методом научного тыка.

    Теперь главный вопрос: как на подобном индикаторе создать независимое отображение цифр, если первый и второй разряд отличается только землей. То есть сейчас я могу сделать работу первого или второго разряда или синхронную работу обоих, а независимо как?
     
    Последнее редактирование: 19 апр 2015
  6. geher

    geher Гуру

    Если общая у каждого разряда там "земля", то подавать на общий контакт активного разряда низкий уровень, на общий контакт другого - высокий.
    Выставлять на остальные контакты уровни в соответствии с ожидаемым состоянием (вкл/выкл) сегментов разряда индикатора, подержать сколько-то микросекунд.
    Потом все на низкий уровень, и быстро поменять уровни на общих контактах разрядов, после чего выставить уровни для сегментов второго разряда, подержать сколько-то микросекунд и опять все на низкий уровень.
    И так быстро по кругу. Для глаза сегменты не будут успевать погаснуть, в результате будет устойчивая индикация.
    Конкретнее смотреть в сети.

    Например, тут http://malatok.at.ua/forum/36-50-1
    Только, насколько я понимаю, токоограничивающие резисторы лучше не на общий контакт, как на схеме по ссылке, а на контакты сегментов.
     
    DrProg нравится это.
  7. DrProg

    DrProg Вечный нерд

    Спасибо, принцип понял, попробую сделать счетчик от 0 до 99. Даже не знаю что проще, так или два независимых индикатора со сдиговыми регистрами, например. Но идея сама по себе интересная.
     
  8. DrProg

    DrProg Вечный нерд

    На основе примера "Секундомер" со штатным индикатором сделал секундомер с двухразрядным от 0 до 99 при помощи динамической индикации. Задержка в изображении 8мс, при бОльшей цифры трясет, но фантомные свечения сегментов в соседних разрядах видны при любом значении. В принципе использовать можно, правда большой экономии в пинах при таком методе нет, используется 10 штук если вместе с точкой.

     
  9. ANV

    ANV Гуру

    А где транзисторы на общих выводах?
     
  10. DrProg

    DrProg Вечный нерд

    Есть они там,
     
  11. Максим B

    Максим B Гуру

    А исходник ??? )))
     
  12. DrProg

    DrProg Вечный нерд

    Сейчас вижу, что через регистры было бы проще и быстрее.

    Код (Text):
    #define FIRST_SEGMENT_PIN  2
    #define SEGMENT_COUNT      7
    #define DOT_PIN            10
    #define DIG_1              12
    #define DIG_2              11

    byte numberSegments[10] = {
      0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010,
      0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110,
    };

    void setup()
    {
      for (int i = 0; i < SEGMENT_COUNT; ++i)
        pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
      pinMode(DOT_PIN, OUTPUT);
      pinMode(DIG_1, OUTPUT);
      pinMode(DIG_2, OUTPUT);
      digitalWrite(DIG_1, 1);
      digitalWrite(DIG_2, 1);
    }


    void loop()
    {

      int number2 = (millis() / 1000) % 10;
      int number1 = (millis() / 10000) % 10;
      int dot = (millis() / 500) % 2;
      digitalWrite(DOT_PIN, dot);

      digitalWrite(DIG_1, 0);
      digitalWrite(DIG_2, 1);
      indication (number2);
      delay (8);
      digitalWrite(DIG_1, 1);
      digitalWrite(DIG_2, 0);
      indication(number1);
      delay (8);
    }



    // вывод цифры на индикатор
    void indication (int number)
    {
      int mask = numberSegments[number];
      for (int i = 0; i < SEGMENT_COUNT; ++i) {
      boolean enableSegment = bitRead(mask, i);
      digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment);
      }
    }