Управление отоплением в загородном доме (GSM)

Тема в разделе "Глядите, что я сделал", создана пользователем Вячеслав, 6 дек 2012.

  1. vovka1021

    vovka1021 Нерд

    так баланс и в мониторе нормально отображается, вот только не ловиться и не вставляется в смс
    +CMT: "+79677360000",,"16/11/09,00:37:31+32"
    Zapros
    zapros balansa
    Read failRead failRead failRead fail
    Unit1status=0
    Unit2status=0
    Unit3status=0
    Unit4status=0
    Temperature street=0.00
    Vlazhnost street=nan
    Pressure=715.75
    send Text Message FINISH
    Message send:
    Valdai;0;0;0;0;20;40;0;0;0;0;0;0;0;0;0;++++должен попасть сюда +++;0;0;715;0

    +CUSD: 0," Vash balans 13.10 r.
    SMS-napominaniya: Vy ne zabu
     
  2. Aleks_NN

    Aleks_NN Нерд

    Самое первое, что приходит на ум - увеличить паузу (delay(5000);), вот тут:
    ...
    gprsSerial.print("ATD#102#\r");
    delay(5000);
    while(gprsSerial.available()>0){
    ...
    это в районе 429 строки. Пробовали?
     
  3. vovka1021

    vovka1021 Нерд

    все пробовал, уже устал. вот нашел другой код. он работает, но когда вставляешь его в валдай работать отказывается. хотя может я что то не нак вставляю. х.з
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(2, 3);

    String currStr = "";

    void setup(){
      Serial.begin(9600);
      gprsSerial.begin(9600);
      //   Настраиваем приём сообщений
      //   Между командами даём время на их обработку
      gprsSerial.println("AT+CMGF=1");        //устанавливает текстовый режим смс-сообщения
      delay(300);
      gprsSerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
      delay(500);
    // gprsSerial.println("AT+IFC=1, 1\r");    //устанавливает программный контроль потоком передачи данных
    // delay(300);
    // gprsSerial.print("AT+CPBS=");           //открывает доступ к данным телефонной книги
    // gprsSerial.print((char)34);
    // gprsSerial.print("SM");                 // SIM-карты
    // gprsSerial.print((char)34);
    // gprsSerial.println("");
    // gprsSerial.print((char)13);
    // delay(300);
      gprsSerial.println("AT+CNMI=1,2,2,1,0");//включает оповещение о новых сообщениях,
      // новые сообщения приходят в следующем формате:
      // +CMT: "<номер телефона>", "", "<дата, время>",
      // а на следующей строчке с первого символа идёт содержимое сообщения
      delay(300);

      balance();
    }

    void loop()
    {
      if (gprsSerial.available()){
        char currSymb = gprsSerial.read();
        if ('\r' == currSymb) {  //если символ перевод каретки
          if  (currStr.startsWith("+CUSD: 0,")) {
            int zzz = currStr.indexOf('?.?');
            String bal=currStr.substring(10,zzz-3); //баланс на сим карте
            Serial.print(bal);
          }
          currStr = "";
        }
        else if ('\n' != currSymb) { //если символ НЕ новая строка
          currStr += String(currSymb);
        }        
      }
    }

    void balance () {
      gprsSerial.println("ATD*102#");  //запрос баланса
      delay(300);
      Serial.println("zapros balansa");
    }
    попробуйте его вставить в валдай, может у вас получится
     
  4. Aleks_NN

    Aleks_NN Нерд

    Но и старый же работает, просто вставляет данные о балансе не туда. Надо родной код ковырять. У меня такой возможности сейчас нет, собран другой проект... И, эта беда, если я правильно понял проблему, она может зависеть от оператора, если ответ не соответствует тому, с чем работал автор, ждать нормального результата сложно.

    Блин :))) кажись все очень просто. Попробуй заменить вот это:
    if(data == 'e'){
    вот на это:
    if(data == 's'){

    я про старый код.
     
  5. vovka1021

    vovka1021 Нерд

    не проходит.
     
  6. Aleks_NN

    Aleks_NN Нерд

    Угу, это от того, что в строке "+CUSD: 0," Vash balans 13.10 r." две буквы 's'. Видимо автору повезло и его ОПСОС отвечает на английском, что то вроде - Your balanse 13.10 r. Вот и выбирает он между буквами 'e' и 'r'.
    Надо учиться пользоваться indexOf() и substring().
     
  7. vovka1021

    vovka1021 Нерд

    Впринципе получилось сделать отправку баланса, но только по отдельному запросу. Вот теперь сижу думаю как заставить его в общую команду ответа вставить. Screenshot_20161111-025655.png
     
  8. vovka1021

    vovka1021 Нерд

    вот как у меня получилось визуально преобразить валдай Screenshot_2.png . вот только как то не серьезно реализован периметр на проволочки. кто поможет прикрутить датчик движения???
     
  9. dwk26111974

    dwk26111974 Гик

    Всем доброго дня. уважаемые амперщикиж. Перед повторной сборке данного чудного девайса, задался вопросом, как реализовать (скетч 1 от Вячеслава) охранную систему не на герконе, а на датчике движения PIR HC-SR 501, может кто то уже делал подобное? Буду благодарен за совет.
     
  10. vovka1021

    vovka1021 Нерд

    тотже вопрос интересует. Может вместе осилим???
     
  11. dwk26111974

    dwk26111974 Гик

    Я бы с радостью, но из меня помошник в скетчах никакой))) Если не помогут коллеги, сделаю через реле, ну а если что узнаю обязательно напишу.
     
  12. alp69

    alp69 Форумчанин

    А в чем проблема? Обрыв провода (срабатывание геркона) вызывает изменение состояния пина. Точнее изменение логического уровня на пине. Датчик то же самое делает.
     
  13. dwk26111974

    dwk26111974 Гик

    Отличная новость))) Те я правильно понял, что переделки скетч не потребует?
     
  14. alp69

    alp69 Форумчанин

    Если судить по первому скетчу - нет. Но будет работать не совсем комфортно в плане перевзятия под охрану. Остальные 37 страниц вычитывать с телефона... не осилю :) Выложите вариант, используемый Вами.
    Единственное, что нужно учесть - это то, что датчик выдает при сработке. Ноль или единицу.
     
    Последнее редактирование: 16 ноя 2016
  15. alp69

    alp69 Форумчанин

    Другой вопрос в том, что в первом скетче проблема с перевзятием под охрану (учтено на последующих страницах). И нужно определяться с логикой работы:
    1. В течение какого периода времени устройство все поступившие сработки будет интерпретировать как одну. И как реагировать - смс после первой же сработки и потом утихнуть на заданное время. Или подсчет количества сработок за интервал времени, а потом смс (плюс варианта - возможно организовать фильтрацию "ложняков").

    Или

    2. После первого срабатывания и отправки смс устройство остановит реакцию на сработки до получения команды "сброс" (взятие под охрану повторно).

    3. Или сборная солянка из вариантов.

    Вот тогда нужно допиливать скетч.
     
    Последнее редактирование: 16 ноя 2016
  16. dwk26111974

    dwk26111974 Гик

    Благодарю за совет! В ближайшее время буду пробовать. Узнаю 0 или 1 )))
     
  17. vovka1021

    vovka1021 Нерд

    А как же инициализация и калибровка датчика? 0 и 1 это само собой. Вот только на что и как он будет срабатывать без калибровки это вопрос. Все же нужно переделывать код!!!
     
  18. ИгорьК

    ИгорьК Гуру

    Тоже хотел попробовать этот датчик. Не поделитесь ссылкой как его калибровать?
     
  19. alp69

    alp69 Форумчанин

    Большинство из сказанного в п.1 в плане логики обработки срабатываний, реализуется аппаратно самим датчиком, его настройками с помощью джампера и потенциометров. Так что если и изменять код - то только в отношении его действий при повторном взятии на охрану (автомат или ручной) после сработки.
    Какая инициализация? Какая калибровка? О чем Вы? Калибруется он сам после включения. Просто в течение минуты после холодного старта не рекомендуется провоцировать сработки.
     
    Последнее редактирование: 16 ноя 2016
  20. vovka1021

    vovka1021 Нерд

    не совсем согласен с вами, но все же кодом как то надежнее, вот пример
    Код (C++):
    int calibrationTime = 30;        //Время калибровки датчика (10-60 сек. по даташиту)    
    long unsigned int lowIn;         //Время, в которое был принят сигнал отсутствия движения(LOW)      
    long unsigned int pause = 5000;  //Пауза, после которой движение считается оконченным
    boolean lockLow = true;          //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
    boolean takeLowTime;             //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
    int pirPin = 12;                  //вывод подключения PIR датчика
    int ledPin = 13;                 //вывод сигнального диода
    int relayPin = 4;                //реле пин

    void setup()
    {
      pinMode(pirPin, INPUT);
      pinMode(ledPin, OUTPUT);
      pinMode(relayPin, OUTPUT);

    //!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять HIGH на LOW
      digitalWrite(relayPin, HIGH);
      delay(4000);
      digitalWrite(pirPin, LOW);
    //дадим датчику время на калибровку
      for(int i = 0; i < calibrationTime; i++){
    //Во время калибровки будет мигать сигнальный диод
         i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW);
         delay(1000);}
      digitalWrite(ledPin, HIGH);//По окончанию калибровки зажжем сигнальный диод
      delay(50);
    }

    void loop()
    {
      if(digitalRead(pirPin) == HIGH){   //Если обнаружено движение
        if(lockLow)//Если до этого момента еще не включили реле
        {
          lockLow = false;    
          digitalWrite(relayPin, LOW);//Включаем реле.
          delay(50);//!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять LOW на HIGH
        }      
        takeLowTime = true;
      }
      if(digitalRead(pirPin) == LOW){  //Ели движения нет
        if(takeLowTime)                //Если время окончания движения еще не записано
        {
          lowIn = millis();            //Сохраним время окончания движения
          takeLowTime = false;         //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
        }
        if(!lockLow && millis() - lowIn > pause){ //Если время без движение превышает паузу => движение окончено
          lockLow = true;                         //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения              
          digitalWrite(relayPin, HIGH);
          delay(50);
        }
      }
    }