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

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

  1. Serjay

    Serjay Нерд

    Спасибо большое за отзывчивость.
    С включение шилда разобрался, у меня ноги на включение это 7 и 8).
    А вот с СМС надо разбираться....
    Вот этот фокус нна включение светодиода не получился(( http://wiki.amperka.ru/беспроводная-связь:gprs-shield
    Может СИМ карта переполнилась смс и не хочет больше их принемать....
     
  2. sharp

    sharp Нерд

    СИМку в любом случае надо очистить ото всех платных "благ", интернета и прочей "полезной" ерунды, я думаю в памяти сим должен быть всего один номер.
     
  3. sharp

    sharp Нерд

    geher поясните пожалуйста, зачем у вас вот эта строка Serial.println("Init GPRS");
    в исходном скетче ее нет
    Код (Text):
    #include <SoftwareSerial.h>
    #include "DHT.h"
    #define DHTPIN 7    // pin на котором висит датчик температуры
    #define DHTTYPE DHT11  // DHT 22 тип датчика
    //Отсылается смс в формате: влажность;температура;устройство1;устройство2;устройство3;устройство4;Контроль периметра;Состояние периметра;Контроль автотемпературы;Установленная температура;STEWARD;
    int greenLed = 13; //Зеленый светодиод на PIN13
    int powerGSM = 6; //Пин включения GSM
    int unit1 = 8; //Управляемое устройство 1
    int unit2 = 9; //Управляемое устройство 2
    int unit3 = 10;//Управляемое устройство 3
    int unit4 = 11;//Управляемое устройство 4
    int perimetr = 12;// Датчик периметра
    String statusHome;
    int t=0;
    unsigned long currentTime;
    unsigned long loopTime;
    boolean unit1status = false; //Управляемое устройство 1
    boolean unit2status = false; //Управляемое устройство 2
    boolean unit3status = false;//Управляемое устройство 3
    boolean unit4status = false;//Управляемое устройство 4
    boolean isPerimetr = false; //Контроль периметра
    boolean sendSMS = false; //Для проверки что смс отсылаем только один раз
    boolean isAuto = false; //Автоматическое управление температурой
    int autoTemp = 0;
    int delta=2;
    DHT dht(DHTPIN, DHTTYPE);
    SoftwareSerial gprsSerial(2, 3);
    boolean prevBtn = LOW;
    String currStr = "";
    // Переменная принимает значение True, если текущая строка является сообщением
    boolean isStringMessage = false;
    void setup()
    {
        pinMode(unit1, OUTPUT);
        pinMode(unit2, OUTPUT);
        pinMode(unit3, OUTPUT);
        pinMode(unit4, OUTPUT);
        pinMode(powerGSM, OUTPUT);
        pinMode(perimetr, INPUT);
        pinMode(greenLed, OUTPUT);
        digitalWrite(unit1, LOW);
        digitalWrite(unit2, LOW);
        digitalWrite(unit3, LOW);
        digitalWrite(unit4, LOW);
        digitalWrite(powerGSM, LOW);
        digitalWrite(greenLed, LOW);
        //Включаю GSM Модуль
        digitalWrite(powerGSM, HIGH);
        delay(1000);
        digitalWrite(powerGSM, LOW);
        delay(5000);
        gprsSerial.begin(19200);
        delay(300);
        // Настраиваем приём сообщений с других устройств
        // Между командами даём время на их обработку
        gprsSerial.print("AT+CMGF=1\r");
        delay(300);
        gprsSerial.print("AT+IFC=1, 1\r");
        delay(300);
        gprsSerial.print("AT+CPBS=\"SM\"\r");
        delay(300);
        gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
        delay(500);
        //Инициализация температурного датчика
        Serial.begin(9600);
        Serial.println(dht.readTemperature());
        dht.begin();
        delay(3000);
    // ParseSMS("1;20;0;1;1;1;1");
      currentTime = millis();
      loopTime = currentTime;
    }
    void GetDatchik() {
      // Пол
      // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
      float h = dht.readHumidity();
      float t = dht.readTemperature();
      // check if returns are valid, if they are NaN (not a number) then something went wrong!
      if (isnan(t) || isnan(h)) {
        Serial.println("Failed to read from DHT");
      } else {
        statusHome = int(h)+String(";")+int(t)+String(";")+int(unit1status)+String(";")+int(unit2status)+String(";")+int(unit3status)+String(";")+int(unit4status)+String(";")+int(isPerimetr)+String(";")+digitalRead(perimetr)+String(";")+int(isAuto)+String(";")+int(autoTemp)+String(";STEWARD");
        sendTextMessage(statusHome);
    //  Serial.print("H"); //Влажность
    //  Serial.print(h);
    //  Serial.print(";");
    //  Serial.print("T"); //Температура
    //  Serial.print(t);
    //  Serial.println(";");
    //  Serial.println(statusHome);
      }
    }
    void loop()
    {
    // delay(5000);
    // GetDatchik();
    int sostPerimetr; //Состояние периметра
      if (gprsSerial.available()){
      char currSymb = gprsSerial.read();
    Serial.print(currSymb);// для просмотра через монитор
          //  return;
      //  char currSymb = gprsSerial.read();
      //  Serial.println(currSymb);
        if ('\r' == currSymb) {
            if (isStringMessage) {
                //если текущая строка - SMS-сообщение,
                //отреагируем на него соответствующим образом
                if (!currStr.compareTo("STATUS"))
                {
                  GetDatchik();
                }
                else if (currStr.startsWith("0#todo#")||currStr.startsWith("1#todo#")) {
                  ParseSMS(currStr);
                }
           
                isStringMessage = false;
            } else {
                if (currStr.startsWith("+CMT")) {
                    //если текущая строка начинается с "+CMT",
                    //то следующая строка является сообщением
                    isStringMessage = true;
                }
            }
            currStr = "";
        } else if ('\n' != currSymb) {
            currStr += String(currSymb);
        }
      }
    //  Контроль периметра!!!
      if (isPerimetr) { //Проверка Включен ли контроль периметра
          digitalWrite(greenLed, HIGH);
          sostPerimetr = digitalRead(perimetr);
            if (sostPerimetr==LOW) { //Проверка на разомкнутый периметр
              digitalWrite(greenLed, LOW);
              delay(200);
              digitalWrite(greenLed, HIGH);
              delay(200);
              //и отсылаем СМС
              if (sendSMS==false){
                sendTextMessage("WARNING! The perimeter of the broken!");
                sendSMS=true;
              }
          }
      } else {
        digitalWrite(greenLed, LOW);
      }
    //  Контроль температуры!!!
      if (isAuto==true) { //Проверка Включен автоуправление батареями
      //Замер температуры можно проводить не чаще раз в 5 минут
          currentTime = millis();
      if(currentTime >= (loopTime + 60000)){
      t = int(dht.readTemperature());
      loopTime = currentTime;
      }
    //
    //  Serial.print("t=");
    //  Serial.println(t);
    //  Serial.print("autoTemp+delta=");
    //  Serial.println(autoTemp+delta);
        if (t > autoTemp+delta) {
            if ( unit1status==true){
            digitalWrite(unit1, LOW);
            unit1status=false;
            }
            if ( unit2status==true){
            digitalWrite(unit2, LOW);
            unit2status=false;
            }
            if ( unit3status==true){
            digitalWrite(unit3, LOW);
            unit3status=false;
            }
            if ( unit4status==true){
            digitalWrite(unit4, LOW);
            unit4status=false;
            }
            } else if (t < autoTemp-delta) {
            if ( unit1status==false){
            digitalWrite(unit1, HIGH);
            unit1status=true;
            }
            if ( unit2status==false){
            digitalWrite(unit2, HIGH);
            unit2status=true;
            }
            if ( unit3status==false){
            digitalWrite(unit3, HIGH);
            unit3status=true;
            }
            if ( unit4status==false){
            digitalWrite(unit4, HIGH);
            unit4status=true;
            }
            }
      }
    }
    void ParseSMS(String currStr) {
      int firstSemicolon;
      //Распарсиваем SMS
      firstSemicolon = 1;//находим первую ;
      //Получаем значение Автоматического режима контроля температуры
      // if (currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0"){
        if (currStr.substring(0,1) == "0"){
        isAuto=false;
      }
        else{
          isAuto=true;
        }
      //  Serial.println(currStr.substring(0,1));
    //  Serial.print("isAuto=");
    //  Serial.println(isAuto);
      firstSemicolon = currStr.indexOf(';');
      //Получаем значение Автоматического уровня температуры
      autoTemp = stringToNumber(currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )));
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
    // Serial.println(autoTemp);
      //Получаем значение Контроля периметра
      if (currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0"){
        isPerimetr=false;
      } else {
          isPerimetr=true;
        }
    //  Serial.println(isPerimetr);
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
      //Получаем значение Устройства 1
    if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
        unit1status=false;
        digitalWrite(unit1, LOW);
    //  Serial.println("Устройство 1 ВЫКЛ");
      } else{
          unit1status=true;
          digitalWrite(unit1, HIGH);
      //    Serial.println("Устройство 1 ВКЛ");
        }
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
      //Получаем значение Устройства 2
    if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
        unit2status=false;
        digitalWrite(unit2, LOW);
      } else {
          unit2status=true;
          digitalWrite(unit2, HIGH);
        }
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
      //Получаем значение Устройства 3
    if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
        unit3status=false;
        digitalWrite(unit3, LOW);
      } else {
          unit3status=true;
          digitalWrite(unit3, HIGH);
        }
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
      //Получаем значение Устройства 4
    if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
        unit4status=false;
        digitalWrite(unit4, LOW);
      } else {
          unit4status=true;
          digitalWrite(unit4, HIGH);
        }
      }
    /*
    * Функция отправки SMS-сообщения
    */
    void sendTextMessage(String text) {
        // Устанавливает текстовый режим для SMS-сообщений
        gprsSerial.print("AT+CMGF=1\r");
        delay(100); // даём время на усваивание команды
        // Устанавливаем адресата: телефонный номер в международном формате
        gprsSerial.println("AT + CMGS = \"+79135049157\""); //Телефон нужно указать свой
        delay(100);
        // Пишем текст сообщения
        gprsSerial.println(text);
        delay(100);
        // Отправляем Ctrl+Z, обозначая, что сообщение готово
        gprsSerial.println((char)26);
    }
    //Функция преобразовангия STRING в INT
    int stringToNumber(String thisString) {
      int i, value = 0, length;
      length = thisString.length();
      for(i=0; i<length; i++) {
        value = (10*value) + thisString.charAt(i)-(int) '0';;
      }
      return value;
    }
     
  4. geher

    geher Гуру

    Это просто фрагмент инициализации GPRS шилда для корректной работы с СМС, взятый совсем из другого скетча. В нем главное - АТ команды, которые должны поступить на шилд, дабы ввести его в нужный режим. Данная строка добавлена для отладочной выдачи.

    В приведенном вами скетче, кстати, последовательность АТ команд при инициализации идентична, значит, проблема не в этом.
     
  5. sharp

    sharp Нерд

    Я идентичность команд тоже увидел, поэтому и засомневался.
    Спасибо за ответ
     
  6. Serjay

    Serjay Нерд

    Скажите пожалуйста, а при контакте GSM борьба и Ardujno должны ли на самом Arduino светится или мигать светодиоды? Например ТХ?
     
  7. sharp

    sharp Нерд

    Это для меня открытый вопрос, мой первый шилд, как я уже говорил.....работать не начал
    теоретически должно
     
  8. Serjay

    Serjay Нерд

    Ура! У меня все получилось! Точнее отправлять смс и включать диод как описанно тут http://wiki.amperka.ru/беспроводная-связь:gprs-shield.
    Я пока на своем шилде выяснил такую закономерность:
    1. SoftwareSerial gprsSerial(2, 3); а не SoftwareSerial gprsSerial(7, 8);
    2. я добавил в скетч Serial.println("GSM Shield testing.");
    3. и самое главное, мой шилд включается с кнопки, потом я нажимаю на 3 кнопку (на моем шилде 3 кнопки) и тока после всего этого диодом можно управлять через смс.

    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(2, 3);
    //для зелёного светодиода будем использовать второй цифровой вход,
    //а для жёлтого - третий
    int greenPin = 13;
    int yellowPin = 12;
    void setup()
    {
    gprsSerial.begin(19200);
    Serial.println("GSM Shield testing.");
    pinMode(greenPin, OUTPUT);
    pinMode(yellowPin, OUTPUT);
    // Настраиваем приём сообщений с других устройств
    // Между командами даём время на их обработку
    gprsSerial.print("AT+CMGF=1\r");
    delay(1000);
    gprsSerial.print("AT+IFC=1, 1\r");
    delay(1000);
    gprsSerial.print("AT+CPBS=\"SM\"\r");
    delay(1000);
    gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
    delay(1000);
    }
    String currStr = "";
    // Переменная принимает значение True, если текущая строка является сообщением
    boolean isStringMessage = false;
    void loop()
    {
    if (!gprsSerial.available())
    return;
    char currSymb = gprsSerial.read();
    if ('\r' == currSymb) {
    if (isStringMessage) {
    //если текущая строка - SMS-сообщение,
    //отреагируем на него соответствующим образом
    if (!currStr.compareTo("1")) {
    digitalWrite(greenPin, HIGH);
    } else if (!currStr.compareTo("2")) {
    digitalWrite(greenPin, LOW);
    } else if (!currStr.compareTo("3")) {
    digitalWrite(yellowPin, HIGH);
    } else if (!currStr.compareTo("4")) {
    digitalWrite(yellowPin, LOW);
    }
    isStringMessage = false;
    } else {
    if (currStr.startsWith("+CMT")) {
    //если текущая строка начинается с "+CMT",
    //то следующая строка является сообщением
    isStringMessage = true;
    }
    }
    currStr = "";
    } else if ('\n' != currSymb) {
    currStr += String(currSymb);
    }
    }
     
    Последнее редактирование: 13 мар 2015
  9. sharp

    sharp Нерд

    Поздравляю, оформляйте сообщение правильно, пока камнями не закидали;);)
     
  10. Jonson

    Jonson Нерд

    Помогите реализовать запрос баланса сим карты, зппрос отправляю atd#100#, ответ получаю , нужные значения выбираю, но это в отдельном скетче, как правильно вставить в наш, у меня не успевает считывать ответ , подскажите плиз
     
  11. Jonson

    Jonson Нерд

    Все )) вопрос снят )) сам разобрался ))
     
  12. sharp

    sharp Нерд

    Где капать не приходит ответ с дуни, но на прием работает, проверял по монитору порта. И ещё, как реализовать прослушку, вызов идет, а подключения нет.
     
  13. sharp

    sharp Нерд

    Все заработало, почему не работало не понял. Прослушку вставил, работает.
    Появилась другая проблема, при длительной работе зависает перестает принимать, передавать и соответственно управлять. Передергиваешь питание, начинает работать и через время опять виснет.
     
  14. sharp

    sharp Нерд

    Ну вообщем сам себе отвечу, проблема кроется видимо в сотовых операторах. Испытания продолжаются, пока работает. Остался вопрос по запросу баланса, а спросить здесь видимо не у кого.
    Мертвая ветка, тема всем надоела.
     
  15. trancer

    trancer Нуб

    Всем доброго времени суток! Во-первых большое спасибо автору проекта за столь большую проделанную работу! Пошёл по стопам автора, хотелось просто повторить проект дабы изучить GSM-шилд и App Inventor. но, как обычно, с первого пинка ничего не заработало. И со второго тоже. В общем прошла неделя исследований, и теперь у меня рабочая связка Mega2560 - GSM-шилд от Seeed Studio (на SIM900) - Stewart (портированый в App Inventor 2). Плюс небольшие доработки. Если кому интересно - помогу и постараюсь собрать все подводные камни:)

    P.S: исполнительных механизмов не подключал, только светодиоды как индикация наличия управляющих сигналов. В процессе дебаггинга скетча многое вырезал и закомментировал, зато разобрался))
     

    Вложения:

    Последнее редактирование: 15 май 2015
  16. flyteran

    flyteran Нерд

    Очень занятно скинь App Inventor 2, посмотрим.
     
  17. flyteran

    flyteran Нерд

    У Дмитрия много задумок.они работают с 1 раза и не отваливается ничего. я с этим шилдом намаялся и в итоге лежит в коробке. как и с голосовой платой.
     
  18. flyteran

    flyteran Нерд

    а Stewart портированый в App Inventor 2. рабочий или тока оболочка?
     
  19. trancer

    trancer Нуб

    Всё рабочее вроде бы
    Единственный момент - контроль периметра не всегда правильно отображается в программке, не успел разобраться что к чему.Держите .aia
    Будут вопросы - задавайте
     

    Вложения:

    • steward.zip
      Размер файла:
      113,9 КБ
      Просмотров:
      633
  20. flyteran

    flyteran Нерд

    дак это не 2 а 1