Реле с кнопкой

Dima0909
Offline
Зарегистрирован: 06.09.2015
Есть ардуино uno, реле, и кнопка без фиксации, есть скетч :
 
unsigned char  button_state;   //состояние кнопки 
unsigned char  button_mem;   //состояние реле
 
#define BUTTON 12  
#define RELAY 13  
void setup()  
{  
  pinMode(RELAY,OUTPUT);   
  pinMode(BUTTON,INPUT);  
  digitalWrite(BUTTON, HIGH); //подключить внутренний подтягивающий резистор  
}  
void loop()  
{  
    button_state = digitalRead(BUTTON); //прочитать состояние кнопки  
    delay(30); // пауза для проверки дребезга   
    if (digitalRead(BUTTON) == LOW && button_state == LOW  &&  button_mem == 0)  
    {  
       digitalWrite(RELAY, HIGH);   
       button_mem=255;  //запомнить состояние реле  
       while(digitalRead(BUTTON) == LOW){ delay(10);}//ждем отпускания кнопки  
    } else   
        {  
          if (digitalRead(BUTTON) == LOW && button_state == LOW  &&  button_mem == 255)  
          {  
           digitalWrite(RELAY, LOW);   
            button_mem=0; //запомнить состояние реле  
           while(digitalRead(BUTTON) == LOW){ delay(10);}//ждем отпускания кнопки  
          }  
        }     
}  
 
Но этот скетч ведет себя как то странно при нажатии на кнопку реле включается и тут же выключается.
Помогите как подключить реле что бы управлять с кнопки безфиксации.
Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

 button_state == LOW ненужно в условии вашем т.к digitalRead(BUTTON) == LOW && button_state == LOW  вот это условие тоже самое что вот это digitalRead(BUTTON) == LOW &&digitalRead(BUTTON) == LOW

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Dima0909 пишет:

Помогите как подключить реле что бы управлять с кнопки безфиксации.

Как вариант 

/*
#1 кнопка 1 -> 2 (btn1_pin) 0 нажата / 1 нет
            -> GND
  светодиод 1 -> 3 (led1_pin) 0 горит / 1 нет
             ->Ucc
#2 кнопка 2 -> 4 (btn1_pin) 0 нажата / 1 нет
            -> GND
  светодиод 2 -> 5 (led1_pin) 0 горит / 1 нет
             ->Ucc
*/
// #1
const int btn1_pin = 2; // нога кнопки 1
uint8_t btn1 = 0xFF; // сoстояние кнопки 1
const int led1_pin = 3; // светодиода 1
uint8_t led1 ; // сoстояние светодиода 1
// #2
const int btn2_pin = 4; // нога кнопки 2
uint8_t btn2 = 0xFF; // сoстояние кнопки 2
const int led2_pin = 5; // светодиода 2
uint8_t led2 ; // сoстояние светодиода 2

void setup() {
  //#1
  pinMode(btn1_pin, INPUT_PULLUP);   // инициализировать
  btn1 = btn1 << 1 | digitalRead(btn1_pin);
  pinMode(led1_pin, OUTPUT);   // инициализировать светодиод
  digitalWrite(led1_pin, led1 = 1); // и погасить
  //#2
  pinMode(btn2_pin, INPUT_PULLUP);   // инициализировать
  btn2 = btn2 << 1 | digitalRead(btn1_pin);
  pinMode(led2_pin, OUTPUT);   // инициализировать светодиод
  digitalWrite(led2_pin, led2 = 1); // и погасить
}

void loop() {
  //#1
  static uint32_t past_1 = 0 ;
  if (millis() - past_1 >= 200) { // если прошло 200 миллисек
    past_1 = millis() ;
    btn1 = btn1 << 1 | digitalRead(btn1_pin);
    if  ((btn1 & 3) == 2) digitalWrite(led1_pin, led1 = ! led1);
  }
  //#2
  static uint32_t past_2 = 0 ;
  if (millis() - past_2 >= 200) { // если прошло 200 миллисек
    past_2 = millis() ;
    btn2 = btn2 << 1 | digitalRead(btn2_pin);
    if  ((btn2 & 3) == 2) digitalWrite(led2_pin, led2 = ! led2);
  }
}