Кнопка

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

НАМ ПОНАДОБИТСЯ
  • Плата Arduino Uno.
  • Один светодиод.
  • Два резистора сопротивлением 220-270 Ом и 100 кОм.
  • Кнопка.
  • Провода.
  • Макетная плата.
СХЕМА ПОДКЛЮЧЕНИЯ
Untitled Sketch_button
Порт, к которому подключена кнопка, нужно подтянуть к земле через резистор. Чтобы на нем был низкий уровень (LOW).
Можно обойтись без внешнего светодиода с резистором. Т.к. к пину 13 подключен встроенный светодиод.
Вариант 1. Стандартный вариант из примеров.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const int buttonPin = 2;    // Присваиваем имя цифровому выводу 2 "buttonPin"
const int ledPin =  13;     // Присваиваем имя цифровому выводу 13  "ledPin"
 
int buttonState = 0;        // Переменная для чтения статуса кнопки
 
void setup() {
   pinMode(ledPin, OUTPUT);   //Инициализируем цифровой pin 13 как выход
   pinMode(buttonPin, INPUT); //Инициализируем цифровой pin 2 как вход
}
 
void loop() {
   buttonState = digitalRead(buttonPin); //считывание состояния значения кнопки
 
   if (buttonState == HIGH) { //если кнопка нажата (HIGH)
        digitalWrite(ledPin, HIGH); //включаем светодиод
  }
  else { //иначе
        digitalWrite(ledPin, LOW); //выключаем светодиод
  }
}

Вариант 2. Используем инвертирование. В данном примере, при удержании кнопки, светодиод будет моргать с частотой задержки

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const int buttonPin = 2;    // Присваиваем имя цифровому выводу 2 "buttonPin"
const int ledPin =  13;     // Присваиваем имя цифровому выводу 13  "ledPin"
 
int buttonState = 0;        // Переменная для чтения статуса кнопки
int ledState = 0;           // Переменная для чтения статуса светодиода
void setup() {
pinMode(ledPin, OUTPUT); //Инициализируем цифровой pin 13 как выход
pinMode(buttonPin, INPUT); //Инициализируем цифровой pin 2 как вход
}
 
void loop() {
buttonState = digitalRead(buttonPin); //считывание состояния значения кнопки
ledState = digitalRead(ledPin); //считывание состояния значения светодиода
 if (buttonState == HIGH) { //если кнопка нажата (HIGH)
 digitalWrite(ledPin, !ledState); //переключаем состояние светодиода
 delay(200); //задержка. При удержании кнопки в нажатом состоянии, светодиод будет моргать с частотой задержки
  }
}

Вариант 3. Одно действие при нажатии кнопки с использованием переменной flag. Защита от дребезга.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int flag=0;
 
void setup(){
pinMode(13, OUTPUT); //Инициализируем цифровой pin 13 как выход
pinMode(2, INPUT); //Инициализируем цифровой pin 2 как вход
 
}
 
void loop() {
if(digitalRead(2)==LOW&&flag==1)//если кнопка НЕ нажата И переменная flag равна 1, то выполняем следующее действие
{
flag=0;//переменную flag приравниваем к 0.
}
if(digitalRead(2)==HIGH&&flag==0)//если кнопка нажата И переменная flag равна 0 , то выполняем следующее действие
{
digitalWrite(13,!digitalRead(13));
flag=1; //переменную flag приравниваем к 1.
}
}

Подправим немного код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int LedPin = 13;             // Подключаем светодиод к порту 13
int ButPin = 2;             // Подключаем кнопку к выходу 2
int flag = 0;                // флаг состояния
 
void setup()
{
  pinMode(LedPin, OUTPUT);   // Инициализируем порт "ledPin" как выходной
}  
 
void loop()
{
  if(digitalRead(ButPin) == HIGH && flag == 0)      
    {                                              
      digitalWrite(LedPin, !digitalRead(LedPin));
      flag = 1;
    }
  
  if(digitalRead(ButPin) == LOW && flag == 1)
    {
      flag = 0;
    }  
}

Вариант 4. Включаем светодиоды по очереди. Используем дополнительную переменную regim

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
int regim=1; 
 int flag=0; 
 
 void setup()   
 { 
 pinMode(13,OUTPUT);    
 pinMode(12,OUTPUT);
 pinMode(11,OUTPUT);  
 } 
 
 void loop()  {        
     if(digitalRead(2)==HIGH&&flag==0)//если кнопка нажата и перемення flag равна 0 , то   
     { 
       regim++;   
       flag=1; 
 
        if(regim>5)//ограничим количество режимов 
        { 
          regim=1;//так как мы используем только одну кнопку, то переключать режимы будем циклично. 
        }        
     } 
 
      if(digitalRead(2)==LOW&&flag==1)//если кнопка НЕ нажата и переменная flag равна - 1 ,то ... 
     {           
        flag=0;//обнуляем переменную "knopka" 
     }        
 
    if(regim==1)//первый режим 
    { 
      digitalWrite(13,LOW);//выключаем все светодиоды 
      digitalWrite(12,LOW); 
      digitalWrite(11,LOW);  
 
      //здесь может быть любое ваше действие 
    } 
    if(regim==2)//второй режим 
    { 
      digitalWrite(11,HIGH);//включае красный светодиод 
      digitalWrite(12,LOW); 
      digitalWrite(13,LOW);  
      //здесь может быть любое ваше действие 
    } 
 
    if(regim==3)//третий режим 
    { 
 
      digitalWrite(12,HIGH);//включае зеленый светодиод 
      digitalWrite(13,LOW); 
      digitalWrite(11,LOW);  
 
      //здесь может быть любое ваше действие 
    } 
 
    if(regim==4)//четвертый режим 
    { 
 
      digitalWrite(13,HIGH);//включаем желтый светодиод 
      digitalWrite(12,LOW); 
      digitalWrite(11,LOW);
      //здесь может быть любое ваше действие 
    } 
  if(regim==5)//пятый режим 
    { 
 
      digitalWrite(11,HIGH);//включаем все светодиоды одновременно 
      digitalWrite(12,HIGH); 
      digitalWrite(13,HIGH);
      //здесь может быть любое ваше действие 
    } 
 
 }