Аналоговые входы Arduino UNO

Тема в разделе "Arduino & Shields", создана пользователем GOODZM, 10 май 2019.

  1. GOODZM

    GOODZM Нуб

    Уважаемые жители этого форума, абсолютно недавно начал изучать вселенную программирования и мир Arduino.

    Пытаюсь разобраться с аналоговыми входами и RGB-светодиами , но ничего не выходит :(

    Подскажите , пожалуйста, какие команды необходимо использовать, дабы при каждом следующем нажатии кнопки , подключенной к аналоговому входу , RGB-светодиод изменял цвет с красного на зеленый, и , само собой, с зеленого на красный.
    На цифровых входах сделать подобный скетч не составило труда. Но как его доработать под аналоговые входы ?
    Код (C++):
    const int  green=8;
    const int  green1=7;
    const int  red=13;
    const int  red1=12;
    const int  BUTTON=2;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledMode = 0;
    void setup()
    {
      pinMode (green, OUTPUT);
      pinMode (green1, OUTPUT);
      pinMode (red, OUTPUT);
      pinMode (red1, OUTPUT);
      pinMode (BUTTON, INPUT);
    }
    void loop()
    {
      currentButton = debounce(lastButton);
      if (lastButton == LOW && currentButton == HIGH)
      {
        ledMode++;
      }
      lastButton = currentButton;
      if (ledMode == 3) ledMode = 1;
      setMode(ledMode);
    }

    boolean debounce(boolean last)
    {
      boolean current = digitalRead(BUTTON);
      if (last != current)
      {
        delay(5);
        current = digitalRead(BUTTON);
      }
      return current;
    }

    void setMode(int mode)
    {
      if (mode == 1)
      {
        digitalWrite(red,LOW);
        digitalWrite(red1,LOW);
        digitalWrite(green, HIGH);
        delay(1000);
        digitalWrite(green1, HIGH);
      }
      else if  (mode == 2)
       {
        digitalWrite(green,LOW);
        digitalWrite(green1,LOW);
        digitalWrite(red, HIGH);
        delay(1000);
        digitalWrite(red1,HIGH);
       }
    }
     
  2. NikitOS

    NikitOS Король шутов Администратор

    А что дорабатывать?
    Заменить в коде номер пина и все :)
     
    Tomasina и GOODZM нравится это.
  3. GOODZM

    GOODZM Нуб

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

    То есть суть заключается в том, что я к одному аналоговому входу подключаю , допустим, 2е кнопки. И одна из этих кнопок зажигает один RBG-светодиод в начале красным светом, а после повторного нажатия зеленым , и затем при следующем нажатии опять зажигает его красным.
    Вторая же кнопка делает всё тоже самое, только с другим светодиодом
     
    Последнее редактирование модератором: 10 май 2019
  4. Airbus

    Airbus Радиохулиган Модератор

    По-другому как?Все "аналоговые" пины работают также как и цифровые.и также надо их прописывать на вход/выход.Их номера 15-19.Если вы хотите использовать один пин на несколько кнопок то придётся использовать его как аналоговый-считывать напряжение в зависимости от нажатой кнопки и потом с этим что то делать.
     
    NikitOS и GOODZM нравится это.
  5. vvr

    vvr Инженерище

    у вас что, цифровых входов не хватает ?
     
  6. GOODZM

    GOODZM Нуб

    Вот. да. С этим и загвоздка. У меня есть скетч как подключать несколько кнопок а одному аналоговому входу, но у меня не выходит дотумкать , как сделать отдельные обращения к каждой кнопке
    Код (C++):
    void setup ()
      {
      Serial.begin(9600);
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      pinMode(7, OUTPUT);
      pinMode(8, OUTPUT);
      }

    void loop() {
      int sensorValue = analogRead(A0);
      if (sensorValue >=100 && sensorValue <300)
      {
      digitalWrite(8,HIGH);
      digitalWrite(7,LOW);
      digitalWrite(6,LOW);
      digitalWrite(5,LOW);
      }
      else if (sensorValue >= 300 && sensorValue < 450)
      {
      digitalWrite(8,LOW);
      digitalWrite(7,HIGH);
      digitalWrite(6,LOW);
      digitalWrite(5,LOW);
      }
      else if (sensorValue >= 450 && sensorValue < 700)
      {
      digitalWrite(8,LOW);
      digitalWrite(7,LOW);
      digitalWrite(6,HIGH);
      digitalWrite(5,LOW);
      }
      else if (sensorValue >= 700 && sensorValue < 1023)
      {
      digitalWrite(8,LOW);
      digitalWrite(7,LOW);
      digitalWrite(6,LOW);
      digitalWrite(5,HIGH);
      }
      else
      {
      digitalWrite(8,LOW);
      digitalWrite(7,LOW);
      digitalWrite(6,LOW);
      digitalWrite(5,LOW);
      }
      delay(20);
    }

     
     
  7. GOODZM

    GOODZM Нуб

    К сожалению, не хватает :( . Ибо цифровые входы будут использоваться исключительно под светодиоды
     
  8. Airbus

    Airbus Радиохулиган Модератор

    Типо так
    Код (C++):
    // Нажатые кнопки
    int button;
    const int BUTTON_NONE = 0;
    const int BUTTON_RIGHT = 1;
    const int BUTTON_UP = 2;
    const int BUTTON_DOWN = 3;
    const int BUTTON_LEFT = 4;
    const int BUTTON_SELECT = 5;

    int getPressedButton()
    {
      int buttonValue = analogRead(0); // Считываем значения с аналогового входа(A0)
      if (buttonValue < 100) {
        return BUTTON_RIGHT;
      }
      else if (buttonValue < 200) {
        return BUTTON_UP;
      }
      else if (buttonValue < 400){
        return BUTTON_DOWN;
      }
      else if (buttonValue < 600){
        return BUTTON_LEFT;
      }
      else if (buttonValue < 800){
        return BUTTON_SELECT;
      }
      return BUTTON_NONE;
    }

    void setup()
    {
    Serial.begin(9600);
      }
    void loop()
    {
      button = getPressedButton();
      switch (button)
      {
      case BUTTON_RIGHT: // при нажатии кнопки выводим следующий текст
        Serial.print("BUTTON: RIGHT");
        break;
      case BUTTON_LEFT:
        Serial.print("BUTTON: LEFT");
        break;
      case BUTTON_UP:
        Serial.print("BUTTON: UP");
        break;
      case BUTTON_DOWN:
        Serial.print("BUTTON: DOWN");
        break;
      case BUTTON_SELECT:
        Serial.print("BUTTON: SELECT");
        break;
      }
    }
     
    GOODZM нравится это.
  9. GOODZM

    GOODZM Нуб

    Благодарю. Сейчас пойду что-то пробовать с этим сделать!
     
  10. parovoZZ

    parovoZZ Гуру

    Это утопия. А если будут нажаты две, три кнопки одновременно? Не хватает входов - берётся расширитель портов в виде копеечного сдвигового регистра. Если кнопок совсем много, то уже по принципу матрицы считывать значение.
     
    NikitOS нравится это.
  11. GOODZM

    GOODZM Нуб

    Все кнопки будут нажиматься поочередно. Одновременно две, три и тд...кнопки нажиматься не будут.
     
  12. Belkin

    Belkin Гик

    Т.н. "аналоговые" входы становятся аналоговыми, если использовать их в качестве АЦП.
    В обычном случае - это цифровые входы/выходы.
    Изучайте даташиты, а не амперкины вики, если хотите что-то понять в работе МК.
     
    GOODZM и NikitOS нравится это.
  13. parovoZZ

    parovoZZ Гуру

    сколько всего кнопок?

    Ага. С дребезгом продумана обработка?
     
  14. b707

    b707 Гуру

    откройте для себя адрессные RGB-светодиоды. Их к одномк пину Ардуино можно подключить несколько сотен и каждым управлять отдельно
     
    GOODZM и NikitOS нравится это.
  15. GOODZM

    GOODZM Нуб

    С дребезгом всё продумано. Количество кнопок в конечном итоге должно быть 25
     
  16. GOODZM

    GOODZM Нуб

    Ух ты. Впервые слышу о таких. Спасибо за идею!
     
  17. parovoZZ

    parovoZZ Гуру

    матрица 5х5 спасет отца еврейской демокртии. Итого - 10 входов.
     
  18. GOODZM

    GOODZM Нуб

    Честно говоря, я Вас не понял :))
     
  19. GOODZM

    GOODZM Нуб

    Код (C++):
    const int  green=8;
    const int  green1=7;
    const int  green2=6;
    const int  green3=5;
    const int  red=13;
    const int  red1=12;
    const int  red2=11;
    const int  red3=10;
    const int  BUTTON=2;
    const int  BUTTON1=3;

    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledMode = 0;
    void setup()
    {
      pinMode (green, OUTPUT);
      pinMode (green1, OUTPUT);
      pinMode (green2, OUTPUT);
      pinMode (green3, OUTPUT);
      pinMode (red, OUTPUT);
      pinMode (red1, OUTPUT);
      pinMode (red2, OUTPUT);
      pinMode (red3, OUTPUT);
      pinMode (BUTTON, INPUT);
      pinMode (BUTTON1, INPUT);
    }
    void loop()
    {
      int c;
      for(;;)
      {
      if(digitalRead (BUTTON) == HIGH)
      {
      c=gg(BUTTON);
      setMode(c,green,green1,red,red1);
      }
      if(digitalRead (BUTTON1) == HIGH)
      {
      c=gg(BUTTON1);
      setMode(c,green2,green3,red2,red3);
      }
     
      }

    }
    int gg(int BUTTONX)
    {
      currentButton = debounce(lastButton,BUTTONX);
      if (lastButton == LOW && currentButton == HIGH)
      {
        ledMode++;
      }
      lastButton = currentButton;
      if (ledMode == 3) ledMode = 1;
      return(ledMode);
    }

    boolean debounce(boolean last,int BUTTONX)
    {
      boolean current = digitalRead(BUTTONX);
      if (last != current)
      {
        delay(5);
        current = digitalRead(BUTTONX);
      }
      return current;
    }

    void setMode(int mode,int svet,int svet1,int svet2,int svet3)
    {
      if (mode == 1)
      {
        digitalWrite(svet,LOW);
        digitalWrite(svet1,LOW);
        digitalWrite(svet2, HIGH);
        delay(1000);
        digitalWrite(svet3, HIGH);
      }
      else if  (mode == 2)
       {
        digitalWrite(svet2,LOW);
        digitalWrite(svet3,LOW);
        digitalWrite(svet, HIGH);
        delay(1000);
        digitalWrite(svet1,HIGH);
       }
    }
     
  20. GOODZM

    GOODZM Нуб

    То, что вышло у меня под цифровые пины. Суть такая : каждая отдельная кнопка зажигает отдельные два RBG-светодиода, которые при повторном нажатии этой же кнопки изменяют свой цвет и так по кругу. Остальные кнопки выполняют тоже самое.
    Кстати говоря, аналоговые кнопки я так и не смог реализовать xD