#1 2020-09-25 11:16:15

martinways
Учасник
Зареєстрований: 2015-03-11
Повідомлень: 91

Помогите написать скетч для двух реле и кнопок

Друзья, помогите доделать скетч, так как я в программировании "ардуин" чуть менее чем 0, методом тыка пытался поменять под себя скетч из соседних тем, но не получается. Значит есть 2 кнопки без фиксации типа "микрик" и 2 реле, к каждому input кнопки подтянул по резистору 1кОм с плюса, чтобы сделать там высокий уровень по умолчанию, а микриком замыкаю их на Ground, это правильно я сделал? Просто без подтяжки резистором на плюс или минус у входа очень высокая чувствительность и он меняет свое состояние даже при при приближении руки к проводу, с резюками такого уже не происходит.
Итак, хочу возить  картошку и цемент на Lamborghini, так как лень паять такой функционал из транзисторов-триггеров.
Суть работы скетча. Дефолтное состояние - relay1, LOW и relay2, LOW. Вариант событий 1 - При замыкании кнопки 1 на минус (Button1 LOW) должно стать relay1, HIGH, при отпускании кнопки так и должно оставаться relay1, HIGH. Вариант событий 2 - При нажатии второй кнопки (Button2 LOW) высокие уровни должны становиться на обеих выходах (relay1, HIGH и relay2, HIGH), а при отпускании этой кнопки (возвращение её на высокий уровень) реле должны вернуться в дефолтное состояние, то есть relay1, LOW и relay2, LOW. Вот и всё. Вот мой скетч, но подозреваю, что он полностью неправильный

int button1 = 10; // кнопка1
int button2 = 11; // кнопка2
int relay1 = 12; // реле1
int relay2 = 13; // реле2
int  state;

void setup() {
   pinMode(button1, INPUT);
   pinMode(button2, INPUT);
   pinMode(relay1, OUTPUT);
   pinMode(relay2, OUTPUT);

state = 0;
}
void loop()
{
  
  switch ( state )
  {
  default:
  case 0: 
    digitalWrite(relay1, LOW);
    digitalWrite(relay2, LOW);
      state = 1;
    break;
    
  case 1:
   if (digitalRead(button1) == LOW)    
    {
        digitalWrite(relay1, HIGH);
        state = 2;
  }
  break;
  
  case 2:
    if (digitalRead(button2) == LOW)
     {
        digitalWrite(relay1, HIGH);
        digitalWrite(relay2, HIGH);
      state = 0;
   }
  break;
  }
}

Остання редакція martinways (2020-09-25 11:19:39)

Неактивний

#2 2020-09-25 12:46:56

г0сть
Гість

Re: Помогите написать скетч для двух реле и кнопок

Резисторы поставить 10 кОм или можно использовать внутреннюю подтяжку. Для этого просто заменить INPUT на INPUT_PULLUP. По поводу кода - зачем там switch-case? ИМХО достаточно простого if-else.

#3 2020-09-25 14:26:42

martinways
Учасник
Зареєстрований: 2015-03-11
Повідомлень: 91

Re: Помогите написать скетч для двух реле и кнопок

г0сть пише:

Резисторы поставить 10 кОм или можно использовать внутреннюю подтяжку. Для этого просто заменить INPUT на INPUT_PULLUP. По поводу кода - зачем там switch-case? ИМХО достаточно простого if-else.

Дружище, а можете помочь переписать код? Если нужна оплата напишите сколько, я просто вообще не в курсе принципов и синтаксиса, буду тыкать наугад целую вечность. Надо еще защиту от дребезга встроить.

Остання редакція martinways (2020-09-25 14:34:36)

Неактивний

#4 2020-09-25 22:31:34

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: Помогите написать скетч для двух реле и кнопок

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

Неактивний

#5 2020-09-26 12:24:09

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 429

Re: Помогите написать скетч для двух реле и кнопок

#define button1 10 // кнопка1
#define button2 11 // кнопка2
#define relay1  12 // реле1
#define relay2  13 // реле2

int  state;

void setup() {
   pinMode(button1, INPUT_PULLUP);
   pinMode(button2, INPUT_PULLUP);
   pinMode(relay1, OUTPUT);
   pinMode(relay2, OUTPUT);

   state = 0;
}

void loop() {
    switch (state) {

    case 0:
       digitalWrite(relay1, LOW);
       digitalWrite(relay2, LOW);
       if (digitalRead(button1) == LOW) {
           state = 1;
           break;
       }
       if (digitalRead(button2) == LOW) {
           state = 2;
           break;
       }
       break;

    case 1:
       digitalWrite(relay1, HIGH);
       digitalWrite(relay2, LOW);
       if (digitalRead(button2) == LOW) {
           state = 2;
           break;
       }
       break;

    case 2:
       digitalWrite(relay1, HIGH);
       digitalWrite(relay2, HIGH);
       if (digitalRead(button2) == HIGH) {
           state = 0;
           break;
       }
       break;

    }
}

Внешние резисторы подтяжки не нужны - использованы встроенные.
Защита от дребезга - конденсатор от 100нФ между входом и землей.
В привате отвечу, куда слать шоколадку)

Остання редакція Honey (2020-09-26 12:50:05)

Неактивний

#6 2020-09-26 15:06:25

г0сть
Гість

Re: Помогите написать скетч для двух реле и кнопок

Налетели пчелы на мед. Уже никто никаких шоколадок не получит. ТС-у на смежном форуме еще вчера все расписали.

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму