ARDUINO домофон. Требуется помощь со скетчем

Тема в разделе "Arduino & Shields", создана пользователем nevikat, 28 май 2018.

  1. nevikat

    nevikat Нерд

    Понял в чём дело. Не туда поставил flag_mil. Но
    Код (C++):
    if (r == 1 || t == 1 && flag == 1)
    - значит, (если r = 1 или (t = 1 и flag = 1)) или (если (r = 1 или t = 1) и flag = 1) ?
     
  2. b707

    b707 Гуру

    нет, я не это имел в виду. У вас длинная строчка оказывается истинной, когда нажата любая кнопка, а должно быть - когда НИ ОДНА НЕ НАЖАТА.
    Но даже когда вы это исправите - так как надо работать не будет. Насколько я понял вашу задумку - вам надо, что бы звонок звенел, если в течении 2х секунд не нажимались кнопки. Вы же сейчас просто отсчитываете 2 сек от первой паузы в нажатиях - это совершенно разная логика.

    У вас не продуман алгоритм. Так по кусочкам править - это плохой подход. Отложите код и запроектируйте правильно блок-схему работы.
     
  3. nevikat

    nevikat Нерд

    Так я же проверяю, пустая ли строка, если нет, проверяю, нажата ли хоть одно кнопка, если нет, отсчитую. Или я что-то недопонимаю?

    Хорошо, попробую.
     
  4. b707

    b707 Гуру

    где выделенное мной "если нет" - в коде? - нету его
     
  5. nevikat

    nevikat Нерд

    У меня кнопки как PULLUP. Конда я проверяю, что кнопки НЕ нажаты, if (digitalRead() и тд) я не ставлю ничего. Если бы не было PULLUP, я бы поставил ! знак. Или я что-то не так понимаю?
     
  6. b707

    b707 Гуру

    Тогда строка тем более неверная.
    Возьмите для простоты две кнопки, У них всего 4 разных состояния. Подставьте все варианты в ваше выражение и посмотрите, что получается на выходе.Ваше условие должно возвращать истину, только когда обе кнопки возвращают HIGH
     
  7. parovoZZ

    parovoZZ Гуру

    HIGH - кнопка не нажата
    LOW - кнопка нажата

    Алгоритм когда мы увидим? Как только его составишь, сразу увидишь все свои ошибки.
     
  8. nevikat

    nevikat Нерд

    ОООООУУУУУУУ ЙЕС! Всё заработало. Во-первых, Arduino в условии if (num_kv) выдавало истину, хотя строка была пустая. Это решилось с помощью if (num_kv != ""), как Вы мне не советовали делать, но пришлось. Во-вторых, в условии if (digitalRead() и тд) всё-таки надо было поставить ! знак. Смысле что digitalRead() == 0. Но я так и не понял почему :( Но всё равно спасибо Вам!

    Сейчас протестирую весь функционал. Если что-то не заработает, придётся писать алгоритм на бумаге :(

    Хотя...
     
  9. b707

    b707 Гуру

    а откуда вы взяли условие if (num_kv) ? я ж вам советовал длину строки проверять
     
  10. nevikat

    nevikat Нерд

    if (num_kv) равносильно if (num_kv == 1). Или длину строки не так измерять? Я со строками ни в зуб.
     
  11. nevikat

    nevikat Нерд

    if (num_kv.length() >= 1) подойдёт? откопал на сайте arduino
     
  12. b707

    b707 Гуру

    ну есть же справка по командам, нафига выдумывать?
    if (num_kv.length() == 0)
     
    nevikat нравится это.
  13. nevikat

    nevikat Нерд

    Короче, я немного изменил скетч. Теперь почему-то когда я подаю сигнал на 12 пин ничего не происходит, т. е. светодиод дальше мигает. В чём дело?
    Код (C++):
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27, 16, 2);
    // -----ПЕРЕМЕННЫЕ-----
    String num_kv = "";
    unsigned long last_millis;
    boolean otvet_na_zvonok;
    boolean last_otvet_na_zvonok;
    boolean flag;
    boolean flag2;
    boolean flag3;
    boolean flag4;
    boolean flag5;
    boolean flag6;
    boolean flag7;
    boolean flag8;
    boolean flag9;
    boolean flag_mil;
    // -----ОСНОВ. КОД-----
    void setup() {
      lcd.init();
      lcd.backlight();
      lcd.setCursor(0, 0);
      for (byte i = 1; i <= 9; i++) {
        pinMode (i, INPUT_PULLUP);
      }
      pinMode(12, INPUT_PULLUP);
      pinMode(13, OUTPUT);
    }

    void loop() {
      otvet_na_zvonok = !digitalRead(12);
      lcd.setCursor(0, 0);
      lcd.print(num_kv);
      if (!digitalRead(1) && !flag) {
        num_kv += 1;
        flag = 1;
      }
      if (digitalRead(1) && flag) {
        flag = 0;
      }
      if (!digitalRead(2) && !flag2) {
        num_kv += 2;
        flag2 = 1;
      }
      if (digitalRead(2) && flag2) {
        flag2 = 0;
      }
      if (!digitalRead(3) && !flag3) {
        num_kv += 3;
        flag3 = 1;
      }
      if (digitalRead(3) && flag3) {
        flag3 = 0;
      }
      if (!digitalRead(4) && !flag4) {
        num_kv += 4;
        flag4 = 1;
      }
      if (digitalRead(4) && flag4) {
        flag4 = 0;
      }
      if (!digitalRead(5) && !flag5) {
        num_kv += 5;
        flag5 = 1;
      }
      if (digitalRead(5) && flag5) {
        flag5 = 0;
      }
      if (!digitalRead(6) && !flag6) {
        num_kv += 6;
        flag6 = 1;
      }
      if (digitalRead(6) && flag6) {
        flag6 = 0;
      }
      if (!digitalRead(7) && !flag7) {
        num_kv += 7;
        flag7 = 1;
      }
      if (digitalRead(7) && flag7) {
        flag7 = 0;
      }
      if (!digitalRead(8) && !flag8) {
        num_kv += 8;
        flag8 = 1;
      }
      if (digitalRead(8) && flag8) {
        flag8 = 0;
      }
      if (!digitalRead(9) && !flag9) {
        num_kv += 9;
        flag9 = 1;
      }
      if (digitalRead(9) && flag9) {
        flag9 = 0;
      }
      if (!otvet_na_zvonok) {
        if (num_kv.length() >= 1) {
          if (!digitalRead(2) || !digitalRead(3) || !digitalRead(4) || !digitalRead(5) || !digitalRead(6) || !digitalRead(7) || !digitalRead(8) || !digitalRead(9) || !digitalRead(10) && !flag_mil) {
            flag_mil = 1;
            last_millis = millis();        // начинаем отсчет времени
          }
          if (flag_mil == 1 && (millis() - last_millis > 2000 )) {
            while (!otvet_na_zvonok) {
              zvuk_blink();
            }
            flag_mil = 0;
          }
        }
      }
      if (otvet_na_zvonok == 1) {
        last_otvet_na_zvonok = 1;
      }
      if (last_otvet_na_zvonok == 1 && otvet_na_zvonok == 0) {
        num_kv = "";
      }
    }

    void zvuk_blink() {
      digitalWrite(13, HIGH);   // ти
      delay(30);                // ти
      digitalWrite(13, LOW);    // ти
      delay(120);               // ждём
      digitalWrite(13, HIGH);   // лии
      delay(100);               // лии
      digitalWrite(13, LOW);    // лии
      delay(150);               // ждём больше
    }
     
  14. parovoZZ

    parovoZZ Гуру

    Рисуй алгоритм, чудило))))
     
    nevikat нравится это.
  15. nevikat

    nevikat Нерд

    Сделал по алгоритму, спасибо. Всё работает почти как часы :) Но когда строка очистилась, Arduino не отображает цифры на дисплее, которые нажимаю. Что может быть не так в коде???
    Код (C++):
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27, 16, 2);
    String num_kv = "";
    boolean otvet_na_zvonok;
    boolean flag_mil;
    boolean flag_mil2;
    unsigned long last_millis;
    boolean last_otvet;
    boolean while_flag;
    boolean flag1;
    boolean flag2;
    boolean flag3;
    boolean flag4;
    boolean flag5;
    boolean flag6;
    boolean flag7;
    boolean flag8;
    boolean flag9;
    void setup() {
      lcd.init();
      lcd.backlight();
      lcd.setCursor(0, 0);
      for (byte i = 1; i <= 9; i++) {
        pinMode (i, INPUT_PULLUP);
      }
      pinMode(12, INPUT_PULLUP);
      pinMode(13, OUTPUT);
    }

    void loop() {
      lcd.setCursor(0, 0);
      lcd.print(num_kv);
      otvet_na_zvonok = !digitalRead(12);
      proverka_but();
      if (num_kv.length() >= 1 && digitalRead(1) == HIGH && digitalRead(2) == HIGH && digitalRead(3) == HIGH && digitalRead(4) == HIGH && digitalRead(5) == HIGH && digitalRead(6) == HIGH && digitalRead(7) == HIGH && digitalRead(8) == HIGH && digitalRead(9) == HIGH) {
        if (flag_mil == 0) {
          flag_mil = 1;
          last_millis = millis();        // начинаем отсчет времени
        }
        if (flag_mil && (millis() - last_millis > 5000 && flag_mil2 == 0)) {
          while (otvet_na_zvonok == 0 && while_flag == 0) {
            last_otvet = 1;
            otvet_na_zvonok = !digitalRead(12);
            if (otvet_na_zvonok == 1) {
              while_flag = 1;
            }
            zvuk_blink();
          }
          flag_mil2 = 1;
        }
      }
      if (last_otvet == 1 && otvet_na_zvonok == 0) {
        num_kv = "";
        while_flag = 0;
        flag_mil2 = 0;
        last_otvet = 0;
      }
    }

    void proverka_but() {
      if (digitalRead(1) == LOW && flag1 == 0) {
        num_kv += 1;
        flag1 = 1;
      }
      if (digitalRead(1) == HIGH && flag1 == 1) {
        flag1 = 0;
      }
      if (digitalRead(2) == LOW && flag2 == 0) {
        num_kv += 2;
        flag2 = 1;
      }
      if (digitalRead(2) == HIGH && flag2 == 1) {
        flag2 = 0;
      }
      if (digitalRead(3) == LOW && flag3 == 0) {
        num_kv += 3;
        flag3 = 1;
      }
      if (digitalRead(3) == HIGH && flag3 == 1) {
        flag3 = 0;
      }
      if (digitalRead(4) == LOW && flag4 == 0) {
        num_kv += 4;
        flag4 = 1;
      }
      if (digitalRead(4) == HIGH && flag4 == 1) {
        flag4 = 0;
      }
      if (digitalRead(5) == LOW && flag5 == 0) {
        num_kv += 5;
        flag5 = 1;
      }
      if (digitalRead(5) == HIGH && flag5 == 1) {
        flag5 = 0;
      }
      if (digitalRead(6) == LOW && flag6 == 0) {
        num_kv += 6;
        flag6 = 1;
      }
      if (digitalRead(6) == HIGH && flag6 == 1) {
        flag6 = 0;
      }
      if (digitalRead(7) == LOW && flag7 == 0) {
        num_kv += 7;
        flag7 = 1;
      }
      if (digitalRead(7) == HIGH && flag7 == 1) {
        flag7 = 0;
      }
      if (digitalRead(8) == LOW && flag8 == 0) {
        num_kv += 8;
        flag8 = 1;
      }
      if (digitalRead(8) == HIGH && flag8 == 1) {
        flag8 = 0;
      }
      if (digitalRead(9) == LOW && flag9 == 0) {
        num_kv += 9;
        flag9 = 1;
      }
      if (digitalRead(9) == HIGH && flag9 == 1) {
        flag9 = 0;
      }
    }

    void zvuk_blink() {
      digitalWrite(13, HIGH);   // ти
      delay(30);                // ти
      digitalWrite(13, LOW);    // ти
      delay(120);               // ждём
      digitalWrite(13, HIGH);   // лии
      delay(100);               // лии
      digitalWrite(13, LOW);    // лии
      delay(1000);               // ждём больше
    }
     
  16. Prochor

    Prochor Нерд

    День добрый.
    Это не ардуино но тоже решит вашу проблему.

    http://www.novosip.com/ru/

    Также потребуется Voip server на пример на Raspberry