две кнопки, три реле

Тема в разделе "Arduino & Shields", создана пользователем vankenshtein, 27 мар 2015.

  1. vankenshtein

    vankenshtein Нерд

    Добрый день форумчане. Задача состоит в следующем: Нажимаем (назовем ее) кнопка1, реле1 и реле2 включаются, нажимаем кнопка2 выключается реле1, при повторном нажатии на кнопка 2 выключается реле2
     
  2. acos

    acos Официальный гик Администратор

    Конечный автомат)

    Есть три состояния
    1 Ждём когда нажмут кнопку 1
    2 ждем когда нажмут кнопку 2
    3 Ждем когда нажмут кнопку 2 второй раз.

    А что должно случится если в состоянии 1 нажмут кнопку 2?
    А что будет если в состоянии 2 и 3 нажмут кнопку 1?
     
  3. vankenshtein

    vankenshtein Нерд

    Если в состоянии1 нажмут кнопку 2 ничего не произойдет
    в состоянии 2 и 3 если нажмут кнопку один опять два реле включаться.

    Не могли бы вы подсказать програмно как написать?
     
  4. vvr

    vvr Инженерище

    получаются взаимоисключающие условия
    надо бы с алгоритмом работы кнопок определиться:)
     
  5. X-Dron

    X-Dron Гик

    Вроде никаких взаимоисключающих условий.
    Первая кнопка всегда включает оба реле.
    Вторая, по очереди отключает сначала первое, потом второе.
    Вечером сделаю.
     
    MESS нравится это.
  6. vvr

    vvr Инженерище

    кнопка 2 выключает во втором режиме, при этом кнопку 1 нажать - включает
     
  7. acos

    acos Официальный гик Администратор

  8. X-Dron

    X-Dron Гик

    где-то так. Компилируется, но на железе не проверял.
    Код (Text):
    #include <DI.h>

    #define KEY1_PIN 5
    #define KEY2_PIN 6
    #define RELAY1_PIN 7
    #define RELAY2_PIN 8

    DI Key1(KEY1_PIN, 10), Key2(KEY2_PIN, 10);
    int Mode=0; //0 - оба реле Off, 1 - оба реле On, 2 - только второе реле On
    bool Key2_old;

    void setup()
    {
      pinMode(RELAY1_PIN, OUTPUT), pinMode(RELAY2_PIN, OUTPUT);
    }

    void loop()
    {
      Key1.DI_Refresh();
      Key2.DI_Refresh();

      if (!(Key1.DI_Read() && Key2.DI_Read())){ //игнор одновременно нажатых клавиш
        if (Key1.DI_Read()) Mode=1;
        if (Key2.DI_Read() && !Key2_old && Mode==2) Mode=0;
        if (Key2.DI_Read() && !Key2_old && Mode==1) Mode=2;
      }

      digitalWrite(RELAY1_PIN, Mode==1);
      digitalWrite(RELAY2_PIN, Mode!=0);

      Key2_old = Key2.DI_Read();
    }
    понадобится эта библиотека.
    https://yadi.sk/d/hGQy8xu1fZNks
    класс DI считывает входы клавиш и фильтрует дребезг. Кнопки должны быть подключены как здесь:
    http://wiki.amperka.ru/конспект-arduino:миксер
    Upd
    Переставил 2 строки местами, в исходном варианте режим 2 никогда не включался, сразу сбрасывался на 0
     
    Последнее редактирование: 27 мар 2015
    acos нравится это.
  9. X-Dron

    X-Dron Гик

    Видео работы

     
    MESS и Tomasina нравится это.
  10. vankenshtein

    vankenshtein Нерд

    Большое Всем спасибо за помощь, щас буду разбираться.