Ардуино и кнопка. - ФОРУМ ДВ Робот dvrobot.ru
Среда, 26.07.2017, 08:37
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    Страница 1 из 11
    Модератор форума: GRACH, Serg 
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Ардуино и кнопка. (Работа с кнопками)
    Ардуино и кнопка.
    nestandartДата: Суббота, 17.11.2012, 21:05 | Сообщение # 1
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 23
    Репутация: 0
    Статус: Offline
    Ардуино и кнопка.

    Кнопка – простейшее электромеханическое устройство.
    Кнопки бывают двух видов.

    1.Кнопки (переключатели) с фиксированным положением.
    2.Так называемые тактовые кнопки (которые возвращаются в исходное положение).



    С первыми все ясно, а вот как работать со вторыми ?

    В этой статье я расскажу, как правильно подключить кнопку к МК и как работать с ней программно. Так же расскажу, как подключить несколько кнопок к одному пину МК.

    Обычно, самый первый раз, кнопку пытаются подключить вот так.
    Это НЕ ПРАВИЛЬНОЕ подключение.



    Дело в том, что пин МК (в режиме входа) должен иметь заранее известное состояние (1или 0).
    В «подвешенном» состоянии будет собирать внешние наводки (статические, электрические и электромагнитные излучения).
    Чтобы привести пин в заранее известное состояние и используют подтягивающие резисторы.
    Они бывают двух видов, верхние и нижние подтяжки.
    Верхние (pull-up) подключаются к плюсу питания и нижние (pull-down) к минусу.
    В ардуино есть встроенные подтягивающие резисторы (pull-up) которые можно включить программно, но я не советую их использовать.


    ПРАВИЛЬНОЕ подключение кнопки.




    В данном случае, когда кнопка отключена, пин будет подключен к земле через резистор, сопротивление которого заведомо меньше внутреннего сопротивления пина.
    Поэтому наводка, попавшая на пин, стечет в землю. Если же подключен полезный сигнал (+5в) то он будет стекать в пин (незначительная часть сигнала стечет в землю через подтяжку).

    В итоге, при нажатой кнопке, у нас будет стабильный сигнал (+5в), а при отпущенной кнопке будет стабильный ноль.

    Рассмотрим несколько простых программных примеров.

    Code
    void setup()
    {

    pinMode(13, OUTPUT);

    }

    void loop()

    {

    digitalWrite(13,analogRead(14)); //состояние входа равно состоянию выхода

    }

    Это самый простой пример. Немного усложним его

    Code
    void setup()
    {

    pinMode(13, OUTPUT);

    }

    void loop()

    {
    if(digitalRead(14)==HIGH)//если кнопка нажата ...
    {
    digitalWrite(13,HIGH);//включаем светодиод
    }
    else//если не нажата...
    {
    digitalWrite(13,LOW);//выключаем
    }

    }

    Этот пример можно инвертировать. Когда кнопка не жата светодиод горит, когда нажата – нет.

    Идем дальше.

    Code

    void setup()     
    {
              
          pinMode(13, OUTPUT);          
             
               
    }

    void loop()

    {
          if(digitalRead(14)==HIGH)//если кнопка нажата ...
          {
          digitalWrite(13,!digitalRead(13));//инвертируем состояние пина

          delay(500);//небольшая защита от "дребезга" контактов кнопки
          }
              
              
    }



    Если удерживать кнопку, то получим мерцание светодиода с частотой заданной функией delay.

    А если нам нужно включить что то по удержанию кнопки?

    Для этого введем переменную val.

    Code
    int val=0;

    void setup()     
    {
              
          pinMode(13, OUTPUT);          
             
               
    }

    void loop()

    {
          if(digitalRead(14)==HIGH)//если кнопка нажата ...
          {
            val++;// прибавляем к переменной 1 при каждой смене цикла.
              
          delay(500);//небольшая защита от "дребезга" контактов кнопки
          }
          else
          {
            val=0;
          }
              
          if(val>=5)
          {
            digitalWrite(13,!digitalRead(13));//инвертируем состояние пина
            val=0;
          }
              
              
    }


    Здесь я использовал простейший «самодельный» таймер.

    Рассмотрим пример с более сложным таймером.

    Code
    long previousMillis = 0;
    int val=0;

    void setup()    
    {
            
         pinMode(13, OUTPUT);         
           
             
    }

    void loop()

    {
         if(digitalRead(14)==HIGH)//если кнопка нажата ...
         {
             
          if (millis() -previousMillis >500)    
         {
            previousMillis = millis();     
            val++;
         }
         }
         else
         {
           val=0;
         }
            
         if(val>=5)
         {
           digitalWrite(13,!digitalRead(13));//инвертируем состояние пина
           val=0;
         }
            
            
    }


    Основной плюс этого таймера это то, что он не использует паразитную функцию delay и, соответственно, не тормозит программу.
    Очень не советую использовать функцию pulseIn для данных целей (да и вообще не советую).
    Потому что эта функция использует все программные таймеры ардуино.
    С функцией pulseIn НЕ будут работать
    Tone()
    Millis()
    analogWrite()
    Так же не будут работать сервоприводы.

    Теперь рассмотрим вариант, когда нам нужно сделать лишь одно действие по одному нажатию кнопки (предыдущие программы циклично повторяли действие при удержании)
    Для этого введем новую переменную flag (названия переменных могут быть какими угодно).

    Code

    int flag=0;

    void setup()    
    {
            
         pinMode(13, OUTPUT);         
           
             
    }

    void loop()

    {
             
          if(digitalRead(14)==HIGH&&flag==0)//если кнопка нажата    
          // и перемення flag равна 0 , то ...
          {
                
            digitalWrite(13,!digitalRead(13));
            flag=1;
             //это нужно для того что бы с каждым нажатием кнопки
             //происходило только одно действие
             // плюс защита от "дребезга"  100%
             
          }
             
           if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата
          //и переменная flag равна - 1 ,то ...
          {
                
             flag=0;//обнуляем переменную flag
          }
    }



    Алгоритм такой. Нажали кнопку – загорелся светодиод, удерживаем кнопку – ничего не происходит (светодиод горит). Отпустили кнопку – светодиод горит.
    Для того чтобы погасить светодиод нужно повторно нажать кнопку.
    Т.е. нажали – горит, отпустили, нажали – не горит.

    Можно инвертировать действие вот так

    Code
    int flag=0;

    void setup()   
    {
          
        pinMode(13, OUTPUT);        
         
           
    }

    void loop()

    {
           
         if(digitalRead(14)==HIGH&&flag==0)//если кнопка нажата   
         // и перемення flag равна 0 , то ...
         {
              
            
           flag=1;
            //это нужно для того что бы с каждым нажатием кнопки
            //происходило только одно действие
            // плюс защита от "дребезга"  100%
           
         }
           
          if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата
         //и переменная flag равна - 1 ,то ...
         {
             digitalWrite(13,!digitalRead(13));
            flag=0;//обнуляем переменную flag
         }
    }



    Нажали – ничего, отпустили – горит. Повторно нажали, отпустили – не горит.

    Теперь сделаем небольшое меню.
    Меню будет содержать четыре режима (можно сколько угодно, но для примера хватит и четырех).
    Меню будет управлять двумя светодиодами.
    Введем еще одну переменную – regim.

    Добавлено (17.11.2012, 21:05)
    ---------------------------------------------

    Code
    int regim=1;
    int flag=0;

    void setup()   
    {
        pinMode(10,OUTPUT);    
    pinMode(9,OUTPUT);    
           
    }

    void loop()

    {
           
         if(digitalRead(14)==HIGH&&flag==0)//если кнопка нажата   
         // и перемення flag равна 0 , то ...
         {
           regim++;   
           flag=1;
             
            //это нужно для того что бы с каждым нажатием кнопки
            //происходило только одно действие
            // плюс защита от "дребезга"  100%
              
            if(regim>4)//ограничим количество режимов
            {
              regim=1;//так как мы используем только одну кнопку,
                        // то переключать режимы будем циклично
            }
           
         }
           
          if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата
         //и переменная flag равна - 1 ,то ...
         {
              
            flag=0;//обнуляем переменную "knopka"
         }
          
           
           
        if(regim==1)//первый режим
        {
          digitalWrite(9,LOW);//выключаем все светодиоды
          digitalWrite(10,LOW);
            
            
          //здесь может быть любое ваше действие
        }
        if(regim==2)//второй режим
        {
          digitalWrite(10,HIGH);//включае красный светодиод
          digitalWrite(9,LOW);
            
          //здесь может быть любое ваше действие
        }
          
        if(regim==3)//третий режим
        {
            
          digitalWrite(9,HIGH);//включае зеленый светодиод
          digitalWrite(10,LOW);
            
            
          //здесь может быть любое ваше действие
        }
          
        if(regim==4)//четвертый режим
        {
            
          digitalWrite(9,HIGH);//включаем светодиоды одновременно
          digitalWrite(10,HIGH);
          //здесь может быть любое ваше действие
        }
          
    }

    Прикрепления: 9723144.jpeg(11Kb) · 4331219.jpg(94Kb) · 4650180.jpg(77Kb)


    Сообщение отредактировал nestandart - Суббота, 17.11.2012, 21:05
     
    nestandartДата: Суббота, 17.11.2012, 21:06 | Сообщение # 2
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 23
    Репутация: 0
    Статус: Offline
    Делитель напряжения и ЦАП.

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

    Вот так.



    Данный делитель рассчитывается по формуле



    Пример расчета

    Примем Uвх = 5в , R1 = 1К, R2 = 1К.

    5*1/1+1=2.5в

    Резисторы делителя называют плечами. Верхнее плечо – Uвх, нижнее - GND.
    Т.е. R1 – верхнее плечо, R2 – нижнее плечо.
    Если номиналы обоих резисторов равны напряжение будет поделено пополам.

    Важно знать, что общее сопротивление делителя должно быть значительно меньше сопротивления нагрузки подключенной к нему (примерно в 100 раз).
    НО общее сопротивление делителя не должно быть и слишком низким. В этом случае мы получим нагрев делителя и расход тока в пустую.
    Не опускайте общее сопротивление ниже 4.7К.
    Вобщем, идеальный диапазон сопротивлений от 4.7К до 50К

    Теперь рассмотрим ЦАП на основе делителя напряжения.

    ЦАП - Цифро-аналоговый преобразователь.
    Устройство преобразует цифровой сигнал в аналоговый.

    Подключение двух кнопок к одному пину.

    На этой схеме изображен простой двух канальный резистивный ЦАП.



    Рассмотрим некоторые важные моменты.

    Резистор R3 является подтягивающим и его номинал не стоит опускать ниже 4.7К.
    В то же время R3 является нижним плечом делителя напряжения.

    Когда кнопки не нажаты на пине АЦП – лог 0.

    Нажатая кнопка К1 образует делитель напряжения с номиналами плеч R1=4.7K, R2=10K.

    Считаем по формуле.
    5*10/4.7+10 = 3.4в

    Когда нажата кнопка К2 номиналы делителя будут R1=3 , R2=10K.
    5*10/3+10 = 3.8в.
    Но что произойдет, если обе кнопки будут нажаты одновременно?

    В этом случае верхнее плечо делителя будет состоять из двух резисторов R1 и R2 включенных параллельно.

    Общий номинал параллельно включенных резисторов считаем по формуле



    Rобщ = 4.7*3/4.7+3 = 1.83K

    Считаем выходное напряжение делителя

    5*10/1.83+10 = 4.22в.

    Напишем простую программу.

    Code
    int analog=0;
    void setup()    
    {                   
         pinMode(9, OUTPUT);     
         pinMode(10, OUTPUT);      
           
    }

    void loop()    
    {
            
         analog=analogRead(14);//считываем сигнал с пина АЦП
            
            
         if(analog>690&&analog<700)//здесь я сравниваю    
         //значение входящего сигнала не с конкретной цифрой
         //а с определенным диапазоном от 690 до 700    
         //это нужно для того чтобы исключить влияние погрешностей резисторов
         {
           digitalWrite(9,HIGH);
           digitalWrite(10,LOW);
         }
            
          if(analog>785&&analog<795)
         {
           digitalWrite(9,LOW);
           digitalWrite(10,HIGH);
         }
            
         if(analog>860&&analog<870)
         {
           digitalWrite(9,HIGH);
           digitalWrite(10,HIGH);
         }
            
         if(analog<100)
         {
           digitalWrite(9,LOW);
           digitalWrite(10,LOW);
         }
    }


    Количество каналов ЦАПа может быть сколь угодно большим (и соответственно количество кнопок).
    Нужно точно рассчитывать номиналы резисторов. И уделять особенное внимание соотношениям номиналов между собой.

    Ну, вот и все (или почти все) о кнопках.

    Nestandart 2012
    Прикрепления: 5138734.jpg(62Kb) · 7028241.jpg(80Kb) · 6605930.gif(2Kb) · 9250751.png(1Kb)


    Сообщение отредактировал nestandart - Воскресенье, 18.11.2012, 04:53
     
    Ivan-771Дата: Воскресенье, 27.01.2013, 21:52 | Сообщение # 3
    5 Вольт
    Группа: Пользователи
    Сообщений: 39
    Репутация: 0
    Статус: Offline
    Есть ещё один способ, сделать матричную клавиатуру.
    Вот видео      http://youtu.be/bOyAusJzKPo


    Данный код был написан для ATMEGA8. В программе CodeVisionAVR.

    Код
    #include <mega8.h>
    #include <delay.h>                

    void main(void)
    {       int  i=0;          
                  DDRD=0x00;   //   порт D ставим на чтение
                  DDRB=0xFF;   //   порт B ставим на вывод
                  DDRC=0xFF;   //   порт С ставим на вывод
                  PORTC=0b00000000; //   все пины порта  С ставим на 0
                  PORTB=0b00000000; //   все пины порта  B ставим на 0         
                  goto klava;     //   переходим к программе klava,  можно и не ставить привычка=)        
            while(1)
            {
    klava:    if (i==0) // сейчас обрабатывается только первый ряд кнопок       
                    {         
                    i+=1;
                    PORTC=0b00000000;       
                    }        
                    if (PIND == 0b00000001 & i==1)    //   ПРОБЕЛ
                     {       
                     delay_ms (300);       
                     PORTB=0b00001000;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }       
                     if (PIND == 0b00000010 & i==1)    //     ЧТЕНИЕ
                     {       
                     delay_ms (300);       
                     PORTB=0b00000111;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }       
                     if (PIND == 0b00000100 & i==1)   //   СТОП
                     {       
                     delay_ms (300);       
                     PORTB=0b00000110;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }        
                     if (PIND == 0b00001000 & i==1)   //   ВЫХОД ИЗ ПРИЛОЖЕНИЯ
                     {       
                     delay_ms (300);       
                     PORTB=0b00000101;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }       
                     if (PIND == 0b00010000 & i==1)   //   ВЫХОД
                     {       
                     delay_ms (300);       
                     PORTB=0b00000100;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }
                     if (PIND == 0b00100000 & i==1)   //   ВВОД
                     {       
                     delay_ms (300);       
                     PORTB=0b00000011;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }
                     if (PIND == 0b01000000 & i==1)   //   ВНИЗ
                     {       
                     delay_ms (300);       
                     PORTB=0b00000010;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }
                     if (PIND == 0b10000000 & i==1)   //   ВВЕРХ
                     {       
                     delay_ms (300);       
                     PORTB=0b00000001;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }        
                     if (i==1)  //   ПЕРЕКЛЮЧЕНИЕ НА ВТОРОЙ РЯД КНОПОК
                    {         
                    i+=1;
                    PORTC=0b00000001;       
                    }        
                     if (PIND == 0b00000001 & i==2)    //   H
                     {       
                     delay_ms (300);       
                     PORTB=0b00010000;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }       
                     if (PIND == 0b00000010 & i==2)    //     G
                     {       
                     delay_ms (300);       
                     PORTB=0b00001111;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }       
                     if (PIND == 0b00000100 & i==2)   //  F
                     {       
                     delay_ms (300);       
                     PORTB=0b00001110;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }        
                     if (PIND == 0b00001000 & i==2)   //   E
                     {       
                     delay_ms (300);       
                     PORTB=0b00001101;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }       
                     if (PIND == 0b00010000 & i==2)   //   D
                     {       
                     delay_ms (300);       
                     PORTB=0b00001100;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }
                     if (PIND == 0b00100000 & i==2)   //   C
                     {       
                     delay_ms (300);       
                     PORTB=0b00001011;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }
                     if (PIND == 0b01000000 & i==2)   //   B
                     {       
                     delay_ms (300);       
                     PORTB=0b00001010;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }
                     if (PIND == 0b10000000 & i==2)   //   A
                     {       
                     delay_ms (300);       
                     PORTB=0b00001001;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }        
                          
                    if (i==2)      //   ПЕРЕКЛЮЧЕНИЕ НА ТРЕТИЙ РЯД КНОПОК
                    {         
                    i+=1;
                    PORTC=0b00000010;       
                    }        
                     if (PIND == 0b10000000 & i==3)   //   I
                     {       
                     delay_ms (300);       
                     PORTB=0b00010001;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }        
                     if (PIND == 0b01000000 & i==3)   //   J
                     {       
                     delay_ms (300);       
                     PORTB=0b00010010;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }       
                     if (PIND == 0b00100000 & i==3)   //   K
                     {       
                     delay_ms (300);       
                     PORTB=0b00010011;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }        
                     if (PIND == 0b00010000 & i==3)   //   L
                     {       
                     delay_ms (300);       
                     PORTB=0b00010100;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }        
                     if (PIND == 0b00001000 & i==3)   //   M
                     {       
                     delay_ms (300);       
                     PORTB=0b00010101;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }        
                     if (PIND == 0b00000100 & i==3)   //   N
                     {       
                     delay_ms (300);       
                     PORTB=0b00010110;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }        
                     if (PIND == 0b00000010 & i==3)   //   O
                     {       
                     delay_ms (300);       
                     PORTB=0b00010111;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }           
                     if (PIND == 0b00000001 & i==3)   //   P
                     {       
                     delay_ms (300);       
                     PORTB=0b00011000;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }        
                     if (i==3)      //   ПЕРЕКЛЮЧЕНИЕ НА ЧЕТВЁРТЫЙ РЯД КНОПОК
                    {         
                    i+=1;
                    PORTC=0b00000011;       
                    }        
                     if (PIND == 0b10000000 & i==4)   //   Q
                     {       
                     delay_ms (300);       
                     PORTB=0b00011001;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }         
                     if (PIND == 0b01000000 & i==4)   //   R
                     {       
                     delay_ms (300);       
                     PORTB=0b00011010;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }         
                     if (PIND == 0b00100000 & i==4)   //   S
                     {       
                     delay_ms (300);       
                     PORTB=0b00011011;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }         
                     if (PIND == 0b00010000 & i==4)   //   T
                     {       
                     delay_ms (300);       
                     PORTB=0b00011100;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }         
                     if (PIND == 0b00001000 & i==4)   //   U
                     {       
                     delay_ms (300);       
                     PORTB=0b00011101;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }         
                     if (PIND == 0b00000100 & i==4)   //  V
                     {       
                     delay_ms (300);       
                     PORTB=0b00011110;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }         
                     if (PIND == 0b00000010 & i==4)   //  W
                     {       
                     delay_ms (300);       
                     PORTB=0b00011111;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }        
                     if (PIND == 0b00000001 & i==4)   //  X
                     {       
                     delay_ms (300);       
                     PORTB=0b00100000;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }        
                     if (i==4)      //   ПЕРЕКЛЮЧЕНИЕ НА ПЯТЫЙ РЯД КНОПОК
                    {         
                    i+=1;
                    PORTC=0b00000100;       
                    }        
                      if (PIND == 0b10000000 & i==5)   //   Y
                     {       
                     delay_ms (300);       
                     PORTB=0b00100001;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }        
                     if (PIND == 0b01000000 & i==5)   //   Z
                     {       
                     delay_ms (300);       
                     PORTB=0b00100010;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }
                     if (PIND == 0b00100000 & i==5)   //   .
                     {       
                     delay_ms (300);       
                     PORTB=0b00100011;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }
                     if (PIND == 0b00010000 & i==5)   //   ,
                     {       
                     delay_ms (300);       
                     PORTB=0b00100100;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }
                     if (PIND == 0b00001000 & i==5)   //   !
                     {       
                     delay_ms (300);       
                     PORTB=0b00100101;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }
                     if (PIND == 0b00000100 & i==5)   //   ?
                     {       
                     delay_ms (300);       
                     PORTB=0b00100110;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }
                     if (PIND == 0b00000010 & i==5)   //   (
                     {       
                     delay_ms (300);       
                     PORTB=0b00100111;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }
                     if (PIND == 0b00000001 & i==5)   //   )
                     {       
                     delay_ms (300);       
                     PORTB=0b00101000;
                     delay_ms (45);       
                     PORTB=0b00000000;
                     }       
                    if (i==5)       
                    {         
                    i-=5;
                    PORTC=0b00000011;         
                    goto klava;
                    }        
            }
    }


    Дешифратор, можно конечно, использовать и отечественный будь то К176ИД1, или К561ИД1, разницы нет.

     
    Прикрепления: 8036692.jpg(315Kb)


    Сообщение отредактировал Ivan-771 - Воскресенье, 27.01.2013, 22:04
     
    balbesДата: Вторник, 05.03.2013, 18:44 | Сообщение # 4
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 10
    Репутация: 0
    Статус: Offline
    а можно пример на 2 кнопки = 2 входа . принцип таков нажал первую выполняется одна программа нажал вторую выполняется вторая программа ну итак далее

    вал
     
    SergДата: Вторник, 05.03.2013, 19:02 | Сообщение # 5
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Вот тут хоть десять кнопок и десять программ можно сделать.
     
    balbesДата: Среда, 06.03.2013, 02:53 | Сообщение # 6
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 10
    Репутация: 0
    Статус: Offline
    здесь я все прочел и взял на вооружение спосибо. Но надо две кнопки на два пина а не на один и чтоб запускали 
    каждая свою програму


    вал
     
    Ivan-771Дата: Среда, 06.03.2013, 12:38 | Сообщение # 7
    5 Вольт
    Группа: Пользователи
    Сообщений: 39
    Репутация: 0
    Статус: Offline
    Цитата (balbes)
    здесь я все прочел и взял на вооружение спосибо. Но надо две кнопки на два пина а не на один и чтоб запускали каждая свою програму
     В коде вижн так  это выглядит.

    Код
    void main (void)
         {goto start;
    while(1)     
    {
        start:  if (PIND.1== 1)
    {delay_ms (300)
         goto proga1;
         if (PIND.2== 1)
    {delay_ms (300)
         goto proga2;
    }
    goto start;
    }
       proga1: while(1)     
       { твоя программа №1

        if (PIND.2== 1)
    {delay_ms (300)
         goto proga2;
    }
    }

    proga2: while(1)     
    { твоя программа №2

    if (PIND.1== 1)
    {delay_ms (300)
         goto proga1;
    }
    }
    }

    Пример, можно легко переделать для дулины.


    Сообщение отредактировал Ivan-771 - Среда, 06.03.2013, 12:47
     
    enastoyashchiyДата: Четверг, 26.05.2016, 23:32 | Сообщение # 8
    1.5 Вольт
    Группа: Пользователи
    Сообщений: 2
    Репутация: 0
    Статус: Offline
    Нашол статью о подключении кнопки к Arduino http://geekmatic.in.ua/articles/arduino_button_pull_up

    Так там чувак пишет, что сначала хотел про борьбу с дребезгом кнопки написать, но так дребезга и не добился со своей программой.
     
    deftvkДата: Пятница, 30.12.2016, 03:36 | Сообщение # 9
    1.5 Вольт
    Группа: Пользователи
    Сообщений: 1
    Репутация: 0
    Статус: Offline
    Вот написал статейку о подключении нескольких кнопок к одному аналоговому входу Arduino - http://codius.ru/articles/221. C подробностями разные схемы подключения, достоинства, недостатки схем, алгоритмы расчета номиналов и т.д.
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Ардуино и кнопка. (Работа с кнопками)
    Страница 1 из 11
    Поиск:

    ДВ Робот - Чат