Кто хорошо разбирается в матричных клавиатурах?

Тема в разделе "Arduino & Shields", создана пользователем Kumangozavr228, 20 фев 2019.

  1. Всем привет. Имею вот такой скетч
    Код (C++):
    #include <Keypad.h>

    const byte ROWS = 4;
    const byte COLS = 3;

    char keys[ROWS][COLS] = {

    {'#','0','*'},                
    {'9','8','7'},
    {'6','5','4'},
    {'3','2','1'},

    };

    byte rowPins[ROWS] = { 5, 4, 3, 2 };

    byte colPins[COLS] = { 8, 7 ,6};

    Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

    int Relay = 10;
    int Relay2 = 11;
    int Relay3 = 12;
    int Relay4 = 13;
    void setup()
    {              
      pinMode(Relay, OUTPUT);  
      pinMode(Relay2, OUTPUT);
       pinMode(Relay3, OUTPUT);
        pinMode(Relay4, OUTPUT);
    }
    void loop()
    {
    char key = kpd.getKey();


    if(key)
    {
    switch (key)
    {
    case '1':
    delay(50);
    digitalWrite(Relay, LOW);
    break;
    case '2':
    delay(50);
    digitalWrite(Relay, HIGH);
    break;
    }
    }
    if(key)
    {
    switch (key)
    {
    case '3':
    delay(50);
    digitalWrite(Relay2, LOW);
    break;
    case '4':
    delay(50);
    digitalWrite(Relay2, HIGH);
    break;
    }
    }
    if(key)
    {
    switch (key)
    {
    case '5':
    delay(50);
    digitalWrite(Relay3, LOW);
    break;
    case '6':
    delay(50);
    digitalWrite(Relay3, HIGH);
    break;
    }
    }
    if(key)
    {
    switch (key)
    {
    case '7':
    delay(50);
    digitalWrite(Relay4, LOW);
    break;
    case '8':
    delay(50);
    digitalWrite(Relay4, HIGH);
    break;
    }
    }
    }

    Подскажите пожалуйста, как осуществить включение/отключение реле с одной кнопки? Т.е. нажал 1-включилось реле 1, нажал еще раз 1-выключилось реле 1 и так далее.
     
  2. DetSimen

    DetSimen Guest

    сделать программный триггер
     
  3. Можете пожалуйста подсказать или пример кода привести?
     
  4. DetSimen

    DetSimen Guest

    ну или так:

    case
    '1':
    delay(50);
    digitalWrite(Relay, !digitalRead(Relay));
    break;
     
    Kumangozavr228 нравится это.
  5. DetSimen

    DetSimen Guest

    это для первого реле. для остальных пааналогии
     
    Kumangozavr228 нравится это.
  6. Проверил, огромное спасибо! У меня был такой же код, только я флаги зачем-то использовал... А оказалось настолько все просто
     
  7. DetSimen

    DetSimen Guest

    if-ы лишние поубирай, оставь 1 switch
     
    Igor68 нравится это.
  8. DetSimen

    DetSimen Guest

    какта так

    Код (C++):
    void loop()
    {
    char key = kpd.getKey();

    if (!key) return;


    switch (key)
    {
    case '1':
    delay(50);
    digitalWrite(Relay, !digtalRead(Relay));
    break;

    case '2':
    delay(50);
    digitalWrite(Relay2, !digtalRead(Relay2));
    break;

    case '3':
    delay(50);
    digitalWrite(Relay3, !digtalRead(Relay3));
    break;

    case '4':
    delay(50);
    digitalWrite(Relay4, !digtalRead(Relay4));
    break;
    }
    }
     
     
    Kumangozavr228 нравится это.
  9. DetSimen

    DetSimen Guest

    Нальёшь при случае.
     
    Kumangozavr228 нравится это.
  10. parovoZZ

    parovoZZ Гуру

    гиблое это. Филину до сих пор наливают. Всё никак налить не могут.
     
  11. Arduino_man

    Arduino_man Гик

    Сливает значит