LED индикатор уровня

Тема в разделе "Глядите, что я сделал", создана пользователем nepekyp, 21 фев 2012.

  1. nepekyp

    nepekyp Нерд

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

    Крутим потенциометр загораются/тухнут лампочки. в минимальном положении потенциометра не горит ни одна, в максимальном все, в других положениях идет расчет сколько лампочек зажечь.

    Код (Text):

    int potPin = 0;
    int i = 0;

    void setup()
    {
      pinMode(1, OUTPUT);
      pinMode(2, OUTPUT);
      pinMode(3, OUTPUT);
      pinMode(4, OUTPUT);
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      pinMode(7, OUTPUT);
      pinMode(8, OUTPUT);
      pinMode(9, OUTPUT);
      pinMode(10, OUTPUT);
      pinMode(11, OUTPUT);
      pinMode(12, OUTPUT);
      for (i = 1; i<=12; i++);
      digitalWrite(i, LOW);

    }

    void loop()
    {
      int val = analogRead(potPin);
      int count = map(val, 0, 1023, 0, 12);

      for (i = 1; i<=12; i++)
      if (i<=count)
      {
        digitalWrite(i, HIGH);
      }
      else
      {
        digitalWrite(i, LOW);
      }

    }
     
    PotMeter_bb.jpg 31012012543.jpg 31012012541.jpg 31012012542.jpg
     
    serge1peshcoff, Sashok26rus, eremej и ещё 1-му нравится это.
  2. Dmitriy Kunin

    Dmitriy Kunin Гик

    Очень миленько, я правда не стесняюсь и нулевой вывод порта задействовать...
     
  3. nepekyp

    nepekyp Нерд

    Впринице да можно, так для новичков нагляднее (путаются в циклах с 0 или с 1 начинать)
    Кстати если строку
    Код (Text):
    int count = map(val, 0, 1023, 0, 12);
    поменять на
    Код (Text):
    int count = map(val, 0, 1023, 1, 12);
    то на самом минимуме будет гореть 1я лампочка, какбы сообщая что все работает можно крутить )))
     
  4. Singrana

    Singrana Нуб

    В данной схеме есть нюанс - уж больно много ног задействовано. Практичнее было бы добавить сдвиговый регистр (или несколько, в зависимости от требуемого количества светодиодов - по 8 на регистр). И управлять через SPI. Итого задействованы были бы только 3 ноги +2 питание
     
  5. Корней

    Корней Гик

    А для индикации уровня никто не пробовал задействовать специализированные драйвера типа AN6884? Должно хватить одного PWM вывода.
     
  6. Singrana

    Singrana Нуб

    ну, тут про PWM речь не шла, но тогда в догонку могу еще один вариант драйвера предложить - MBI5026GD - управляется так же как и сдвиговый регистр - все просто и понятно
     
  7. Sashok26rus

    Sashok26rus Нерд

    Вопрос: а можно вместо потенциометра микрофон подключить, и использовать типа эквалайзера?
     
  8. nepekyp

    nepekyp Нерд

    конечно можно, по сути то лампочки загораются в зависимости от уровня входного аналогового сигнала, ничто не мешает заменить РОТ на микрофон и получить "шумомер"
     
  9. Я бы немножко код оптимизировал...
    Код (Text):
    int potPin = 0;
    int i = 0;
    void setup()
    {
    for (i = 1; i<=12; i++){
    pinMode(i, OUTPUT);}
    for (i = 1; i<=12; i++){
    digitalWrite(i, LOW);}
    }
     
    void loop()
    {
      int val = analogRead(potPin);
      int count = map(val, 0, 1023, 0, 12);
     
      for (i = 1; i<=12; i++)
      {
      if (i<=count)
      {
        digitalWrite(i, HIGH);
      }
      else
      {
        digitalWrite(i, LOW);
      }
      }
     
    }
     
  10. nailxx

    nailxx Официальный Нерд Администратор

    Можно ещё компактнее:

    Код (Text):

    int potPin = 0;
    int i = 0;
     
    void setup()
    {
        for (i = 1; i<=12; i++) {
            pinMode(i, OUTPUT);
            digitalWrite(i, LOW);
        }
    }
     
    void loop()
    {
        int val = analogRead(potPin);
        int count = map(val, 0, 1023, 0, 12);
     
        for (i = 1; i<=12; i++)
            digitalWrite(i, i <= count);
    }
     
     
  11. artik

    artik Нуб

    кто знает что значит строка int i = 0; что такое i ???
     
  12. Unixon

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

    Вам сначала сюда, а потом сюда в раздел "Программирование".
     
  13. Unixon

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

    Ой плохому учим, ой плохому учим.. :confused:
    Не зря в Object Pascal вообще запретили переменные цикла глобальными делать.
     
    hibiki нравится это.
  14. nailxx

    nailxx Официальный Нерд Администратор

    Каюсь. Просто рефакторил оригинальный код топиккастера. Конечно же итераторы логичнее прямо на месте объявлять.
     
  15. Корней

    Корней Гик

    При программировании микроконтроллеров, особенно таких "мелких" это не всегда логично. :rolleyes:
     
  16. Unixon

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

    Почему?
     
  17. Код (Text):
    int potPin = 0;
     
    void setup()
    {
        for (int i = 1; i<=12; i++) {
            pinMode(i, OUTPUT);
            digitalWrite(i, LOW);
        }
    }
     
    void loop()
    {
        int val = analogRead(potPin);
        int count = map(val, 0, 1023, 0, 12);
        int i = 0;
        for (i = 1; i<=12; i++)
            digitalWrite(i, i <= count);
    }
     
  18. Корней

    Корней Гик

    Судя по вашим постам, это риторический вопрос. ;)
    Но все же отвечу:
    Потому что при программировании в сильно ограниченных ресурсах бывает принципиально различие между регистровой и RAM переменной. Или между выделением памяти под переменные при передаче управления и статическим выделением.
     
  19. Dmitriy Kunin

    Dmitriy Kunin Гик

    Больше скажу, когда дойдёт до реального индикатора, а не шарообразного в вакууме, программа совсем станет непохожей на эту красоту.
    Да и схема может поменяться :)