Проблемы с герконом и сигнализацией на ардуино

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

  1. DanilRyzhov

    DanilRyzhov Нерд

    Доброго времени суток! Занялся сигнализацией в гараж. Рфид работает исправно и модуль sim800l, но с герконом беда... А именно с кодом. 2 день шарюсь по интернету не могу понять как мне сделать так, чтобы после того как пройдет 20 сек после открытия двери и нужную карточку к рфид не приложили(любую из тех что есть в скетче), то ардуино отправляет смс на телефон с тревожным сообщением. Заранее спасибо за помощь!






    Код (C++):
    #include <SoftwareSerial.h>
    #include <MFRC522.h>
    #define SS_PIN 10
    #define RST_PIN 9
    #define gerkon 5
    int val = 0;
    int a = 2622968907,b = 3423428171, c = 3424607307, d = 1442582152, e = 2777746824;
    MFRC522 mfrc522(SS_PIN, RST_PIN);
    unsigned long uidDec, uidDecTemp;
    SoftwareSerial gprsSerial(8, 6);
    String _response = "";

    void setup() {
      SPI.begin();
      mfrc522.PCD_Init();    
      pinMode(gerkon, INPUT);
      SIM800.begin(9600);                          
      sendATCommand("AT", true);                  
      _response = sendATCommand("AT+CMGF=1;&W", true);
    }
    String sendATCommand(String cmd, bool waiting) {
      String _resp = "";                            // Переменная для хранения результата                         // Дублируем команду в монитор порта
      SIM800.println(cmd);                          // Отправляем команду модулю
      if (waiting) {                                // Если необходимо дождаться ответа...
        _resp = waitResponse();                     // ... ждем, когда будет передан ответ
        // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
        if (_resp.startsWith(cmd)) {                // Убираем из ответа дублирующуюся команду
          _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
        }                    // Дублируем ответ в монитор порта
      }
      return _resp;                                 // Возвращаем результат. Пусто, если проблема
    }

    String waitResponse() {                         // Функция ожидания ответа и возврата полученного результата
      String _resp = "";                            // Переменная для хранения результата
      long _timeout = millis() + 10000;             // Переменная для отслеживания таймаута (10 секунд)
      while (!SIM800.available() && millis() < _timeout)  {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
      if (SIM800.available()) {                     // Если есть, что считывать...
        _resp = SIM800.readString();                // ... считываем и запоминаем
      }
      return _resp;                                 // ... возвращаем результат. Пусто, если проблема
    }

    void loop() {
      val = digitalRead(gerkon);
         if (val == LOW){
           
      if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
      }
      if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
      }
      uidDec = 0;
      for (byte i = 0; i < mfrc522.uid.size; i++)
      {
        uidDecTemp = mfrc522.uid.uidByte[i];
        uidDec = uidDec * 256 + uidDecTemp;
      }
      if (SIM800.available())   {                   // Если модем, что-то отправил...
        _response = waitResponse();                 // Получаем ответ от модема для анализа
        _response.trim();                           // Убираем лишние пробелы в начале и конце                // Если нужно выводим в монитор порта
        //....
        if (_response.startsWith("+CMGS:")) {       // Пришло сообщение об отправке SMS
          int index = _response.lastIndexOf("\r\n");// Находим последний перенос строки, перед статусом
          String result = _response.substring(index + 2, _response.length()); // Получаем статус
          result.trim();                            // Убираем пробельные символы в начале/конце
        }
      }

    if (uidDec == 2622968907){
      sendSMS("+795", "Key1 join");
    delay(5000);
    goto stop;
    }
    if (uidDec == 3423428171){
      sendSMS("+795", "Key2 join");
      delay(5000);
      goto stop;}

    if (uidDec == 3424607307){
      sendSMS("+795", "Key3 join");
      delay(5000);
      goto stop;}

    if (uidDec == 1442582152){
      sendSMS("+795", "Key4 join");
      delay(5000);
      goto stop;}
    if (uidDec == 2777746824){
      sendSMS("+795", "Key5 join");
      delay(5000);
      goto stop;}

    if (uidDec == a || b || c || d || e){
      sendSMS("+795", "Lose key");
      delay(5000);
    }
    stop:
    delay(10);
       if (Serial.available())  {                    // Ожидаем команды по Serial...
        SIM800.write(Serial.read());                // ...и отправляем полученную команду модему
      };
    }


    }

    void sendSMS(String phone, String message)
    {
      sendATCommand("AT+CMGS=\"" + phone + "\"", true);             // Переходим в режим ввода текстового сообщения
      sendATCommand(message + "\r\n" + (String)((char)26), true);   // После текста отправляем перенос строки и Ctrl+Z
    }

     
     
  2. parovoZZ

    parovoZZ Гуру

    нарисуй алгоритм. По нему пиши программу. И никак не наоборот.
     
  3. Сильно не вникал в ваш "кот". Но имхо
    Код (C++):
    val = digitalRead(gerkon);
         if (val == LOW)
    по моему здесь и нужно засекать время , когда геркон разомкнулся. Можно ещё создать флаг собственно открытия двери и что метка не поднесена и сбросить этот флаг при поднесении "родной" метки . Если прошло 20 сек и флаг не сброшен, тогда развлекаться с gsm модулем на тему отправки сообщения. Я так предполагаю.
     
  4. Daniil

    Daniil Гуру

    goto не рекомендуется здесь использовать. Можно switch-case.
    А каим образом вы 20 сек отмеряете? У вас этого в коде не видно
     
  5. ostrov

    ostrov Гуру

    Это назыаается индийский код. А если бы меток было 100, так же писали бы каждую своим if?

    Ну и про геркон правильно спросили, если метку не поднести в течении нескольких мс, то считай попался. И конструкции с определением излишни, в одну строку можно упихать ваши три.
     
    Последнее редактирование: 29 июл 2018