Реле с кнопкой
- Войдите на сайт для отправки комментариев
Втр, 15/11/2016 - 06:50
Есть ардуино 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);}//ждем отпускания кнопки
}
}
}
Но этот скетч ведет себя как то странно при нажатии на кнопку реле включается и тут же выключается.
Помогите как подключить реле что бы управлять с кнопки безфиксации.
button_state == LOW ненужно в условии вашем т.к digitalRead(BUTTON) == LOW && button_state == LOW вот это условие тоже самое что вот это digitalRead(BUTTON) == LOW &&digitalRead(BUTTON) == LOW
Как вариант
/* #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); } }