помогите добавить новую функцию в скетч.

vovka1021
Offline
Зарегистрирован: 02.02.2016

нужно добавить определение баланса и отправки его по смс

в этот код

#include <SoftwareSerial.h>
#include "DHT.h"
#define DHTPIN 7       // pin на котором висит датчик температуры
#define DHTTYPE DHT22  // 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;          // Датчик периметра 220 Ом к +5V
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 mySerial(2, 3);// RX, TX
 
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);
    mySerial.begin(960);
    delay(300);
// Настраиваем приём сообщений с других устройств
// Между командами даём время на их обработку
    mySerial.begin(9600);
    mySerial.println("AT+CMGF=1");  //режим кодировки СМС - обычный (для англ.)
    delay(100);
    mySerial.println("AT+CLIP=1");  //включаем АОН
    delay(100);
    mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
    delay(100);
    mySerial.println("AT+CMGL=ALL");
    delay(300);
    mySerial.println("AT+CNMI=2,2");
    delay(300);

//Инициализация температурного датчика
    Serial.begin(9600);
    Serial.println("DHTxx test!");
    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(";STEWART");
    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 (mySerial.available()){
    char currSymb = mySerial.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")||currStr.startsWith("1")) {
    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);
    sendSMS==false;
  }
//  Контроль температуры!!!
  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 OFF");
    } else {
    unit1status=true;
    digitalWrite(unit1, HIGH);
    Serial.println("1 ON");
    }
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Устройства 2
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
    unit2status=false;
    digitalWrite(unit2, LOW);
    Serial.println("2 OFF");
    } else {
    unit2status=true;
    digitalWrite(unit2, HIGH);
    Serial.println("2 ON");
    }
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Устройства 3
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
    unit3status=false;
    digitalWrite(unit3, LOW);
    Serial.println("3 OFF");
    } else {
    unit3status=true;
    digitalWrite(unit3, HIGH);
    Serial.println("3 ON");
    }
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Устройства 4
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
    unit4status=false;
    digitalWrite(unit4, LOW);
    Serial.println("4 OFF");
    } else {
    unit4status=true;
    digitalWrite(unit4, HIGH);
    Serial.println("4 ON");
    } 
  }
 
/*
* Функция отправки SMS-сообщения
*/
void sendTextMessage(String text) {
// Устанавливает текстовый режим для SMS-сообщений
    mySerial.print("AT+CMGF=1\r");
    delay(100); // даём время на усваивание команды
// Устанавливаем адресата: телефонный номер в международном формате
    mySerial.println("AT + CMGS = \"+79677360000\""); //Телефон нужно откорректировать
    delay(100);
// Пишем текст сообщения
    mySerial.println(text);
    delay(100);
// Отправляем Ctrl+Z, обозначая, что сообщение готово
    mySerial.println((char)26);
    delay(300);
    Serial.print("sendTextMessage FINISH");
}

//Функция преобразовангия 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;
}

 

vovka1021
Offline
Зарегистрирован: 02.02.2016

нашел вот этот код но как вставить непонял

#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");       //устанавливает программный контроль потоком передачи данных 
  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('UAH');
        String balance=currStr.substring(10,zzz-3); //баланс на сим карте
        Serial.print(balance);
      }
      currStr = "";
    } 
    else if ('\n' != currSymb) { //если символ НЕ новая строка
      currStr += String(currSymb);
    }          
  }
}

void balance () {
  gprsSerial.println("ATD*102#");  //запрос баланса
  delay(300);
  Serial.println("zapros balansa");
}

 

vovka1021
Offline
Зарегистрирован: 02.02.2016

в терминал приходит ответ вот такового вида

+CUSD: 0," Vash balans 0.23 r.
Poluchite 500 rublej na schet za znanie russkogo! Podklyuchit': *310#",15

 

как этот баланс 0.23 отправить в смс по в функции balanse(); ?????
 

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015
#include <SoftwareSerial.h>
#include "DHT.h"
#define DHTPIN 7       // pin на котором висит датчик температуры
#define DHTTYPE DHT22  // 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;          // Датчик периметра 220 Ом к +5V
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 mySerial(2, 3);// RX, TX

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);
  mySerial.begin(960);
  delay(300);
  // Настраиваем приём сообщений с других устройств
  // Между командами даём время на их обработку
  mySerial.begin(9600);
  mySerial.println("AT+CMGF=1");  //режим кодировки СМС - обычный (для англ.)
  delay(100);
  mySerial.println("AT+CLIP=1");  //включаем АОН
  delay(100);
  mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
  delay(100);
  mySerial.println("AT+CMGL=ALL");
  delay(300);
  mySerial.println("AT+CNMI=2,2");
  delay(300);

  //Инициализация температурного датчика
  Serial.begin(9600);
  Serial.println("DHTxx test!");
  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(";STEWART");
    sendTextMessage(statusHome);
    Serial.print("H"); //Влажность
    Serial.print(h);
    Serial.print(";");
    Serial.print("T"); //Температура
    Serial.print(t);
    Serial.println(";");
    Serial.println(statusHome);
  }
}




      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  

void getBalanse() {
  mySerial.println("ATD*102#");  //запрос баланса
  delay(300);
  Serial.println("zapros balansa");
}
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  





void loop() {
  // delay(5000);
  // GetDatchik();
  int sostPerimetr; //Состояние периметра
  if (mySerial.available()) {
    char currSymb = mySerial.read();
    //  Serial.print(currSymb);
    //  return;
    //  char currSymb = gprsSerial.read();
    //  Serial.println(currSymb);
    if ('\r' == currSymb) {
      if (isStringMessage) {
        //если текущая строка - SMS-сообщение,
        //отреагируем на него соответствующим образом
        if (!currStr.compareTo("STATUS")) {
          GetDatchik();
        }





      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
        if (currStr.compareTo("BALANSE")) {
          getBalanse();
        }
        else if(currStr.startsWith("+CUSD: 0,")) {
          int zzz = currStr.indexOf('UAH');
          String balance=currStr.substring(10,zzz-3); //баланс на сим карте
          Serial.print(balance);

          //  Возвращаем смс с балансом
          sendTextMessage(balance)
        }
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      /////////////////////////////////////////////////////////////////////////////////////////////////////////////  



        
        else if (currStr.startsWith("0") || currStr.startsWith("1")) {
          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);
    sendSMS == false;
  }
  //  Контроль температуры!!!
  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 OFF");
  } else {
    unit1status = true;
    digitalWrite(unit1, HIGH);
    Serial.println("1 ON");
  }
  firstSemicolon = currStr.indexOf(';', firstSemicolon + 1 );

  //Получаем значение Устройства 2
  if ((currStr.substring(firstSemicolon + 1, currStr.indexOf(';', firstSemicolon + 1 )) == "0") && (isAuto == false)) {
    unit2status = false;
    digitalWrite(unit2, LOW);
    Serial.println("2 OFF");
  } else {
    unit2status = true;
    digitalWrite(unit2, HIGH);
    Serial.println("2 ON");
  }
  firstSemicolon = currStr.indexOf(';', firstSemicolon + 1 );

  //Получаем значение Устройства 3
  if ((currStr.substring(firstSemicolon + 1, currStr.indexOf(';', firstSemicolon + 1 )) == "0") && (isAuto == false)) {
    unit3status = false;
    digitalWrite(unit3, LOW);
    Serial.println("3 OFF");
  } else {
    unit3status = true;
    digitalWrite(unit3, HIGH);
    Serial.println("3 ON");
  }
  firstSemicolon = currStr.indexOf(';', firstSemicolon + 1 );

  //Получаем значение Устройства 4
  if ((currStr.substring(firstSemicolon + 1, currStr.indexOf(';', firstSemicolon + 1 )) == "0") && (isAuto == false)) {
    unit4status = false;
    digitalWrite(unit4, LOW);
    Serial.println("4 OFF");
  } else {
    unit4status = true;
    digitalWrite(unit4, HIGH);
    Serial.println("4 ON");
  }
}

/*
  Функция отправки SMS-сообщения
*/
void sendTextMessage(String text) {
  // Устанавливает текстовый режим для SMS-сообщений
  mySerial.print("AT+CMGF=1\r");
  delay(100); // даём время на усваивание команды
  // Устанавливаем адресата: телефонный номер в международном формате
  mySerial.println("AT + CMGS = \"+79677360000\""); //Телефон нужно откорректировать
  delay(100);
  // Пишем текст сообщения
  mySerial.println(text);
  delay(100);
  // Отправляем Ctrl+Z, обозначая, что сообщение готово
  mySerial.println((char)26);
  delay(300);
  Serial.print("sendTextMessage FINISH");
}

//Функция преобразовангия 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;
}

 

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Только не проверял --- библиотеки не хочу качать...

Если тот код где запрос баланса рабочий, тут тоже должно заработать.

При отправке СМС команды  "BALANSE" - должен прилететь ответ, если не ошибаюсь просто тоже сообщение что и пришло GSM модулю.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

p.masyukov пишет:
Только не проверял --- библиотеки не хочу качать
Очередной говнокод от p.masyukov - работать не будет по определению.

if (currentTime >= (loopTime + 60000))

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Andy пишет:

p.masyukov пишет:
Только не проверял --- библиотеки не хочу качать
Очередной говнокод от p.masyukov - работать не будет по определению.

if (currentTime >= (loopTime + 60000))

Откуда столько дебилов.

Для последующих тупых пенсионеров возомнивших себя гУРУ.

http://www.viva64.com/ru/t/0064/ - изучайте порядок.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

p.masyukov пишет:
Я в С не до конца еще разобрался... так основы..

Ты ведь первый в очереди дибилов. http://arduino.ru/forum/programmirovanie/pomogite-so-skobkami-0#comment-...

vovka1021
Offline
Зарегистрирован: 02.02.2016

спаасибо за помощь, но непроходит. идет без остановки запрос баланса

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

161        if (currStr.compareTo("BALANSE")) {

замени на 

161        if (!currStr.compareTo("BALANSE")) {

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

p.masyukov, в строке 219 тоже ошибку исправляй, должно быть:

if (currentTime - loopTime > 60000)

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Если нет сброса или обнуления значений переменных времени, то есть при переполнении loopTime и устройство будет работать более 49 дней без перезагрузки, то замени на строке 219  код на 

if (currentTime - loopTime > 60000)
 

И перенеси currentTime = millis(); в начало функции loop, который в свой очередь оберни в цикл while(1)

vovka1021
Offline
Зарегистрирован: 02.02.2016

непроходит.

нашел в инете еще код. там баланс приходит уже после того как смс со статусом уйдет . как его исправить

/* --- */

#include <SoftwareSerial.h>
#include "DHT.h"
#include <Wire.h>
#include <Adafruit_BMP085.h>
#define DHT_1_PIN 4
#define DHT_2_PIN 5
#define DHT_3_PIN 6
#define DHT_4_PIN 7     // pin на котором висит датчик температуры
#define DHT_5_PIN 9     // Датчик температуры на улице
#define DHTTYPE DHT22   // DHT 22 тип датчика
//Отсылается смс в формате: влажность;температура;устройство1;устройство2;устройство3;устройство4;Контроль периметра;Состояние периметра;Контроль автотемпературы;Установленная температура;STEWARD;

int powerGSM = 8;    // Пин включения GSM
int unit1 = A1;      // Террасса
int unit2 = A2;      // Ванна
int unit3 = A3;      // Гостинная
int unit4 = A6;      // Комната
int unit5 = A7;      // Роутер
int perimetr = A0;   // Датчик периметра
int power = 10;      // Контроль внешнего питания
int svet = 11;       // Включение света на терассе и крыльце
int redLed = 13;     // Cветодиод работы всего девайса


String statusHome;
int t1=0;
int t2=0;
int t3=0;
int t4=0;
int us1=0;
int us2=0;
int us3=0;
int us4=0;
int u1st;
int u2st;
int u3st;
int u4st;
int svetsost=0;
char data;//Содержит символ полученый от сим модуля.

unsigned long currentTime;
unsigned long loopTime;
unsigned long currentTimeGSM;
unsigned long loopTimeGSM;
 
boolean unit1status = false; // tersost
boolean unit2status = false; // vannasost
boolean unit3status = false; // gostinsost
boolean unit4status = false; // roomsost
boolean unit5status = false; // router
int isPerimetr = 0;          // Контроль периметра
boolean sendSMS = false;     // Для проверки что смс отсылаем только один раз
boolean sendSMSPow = false;  // Для проверки что смс отсылаем только один раз для цикл контроля питания
int isAuto = 0;              // Автоматическое управление температурой
int autoTemp = 0;
int delta = 2;

DHT dht1(DHT_1_PIN, DHTTYPE);
DHT dht2(DHT_2_PIN, DHTTYPE);
DHT dht3(DHT_3_PIN, DHTTYPE);
DHT dht4(DHT_4_PIN, DHTTYPE);
DHT dht5(DHT_5_PIN, DHTTYPE);

Adafruit_BMP085 bmp; 
SoftwareSerial gprsSerial(2, 3);

String currStr = "";
String bal = "";

// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
 
void setup()
{
    pinMode(unit1, OUTPUT);
    pinMode(unit2, OUTPUT);
    pinMode(unit3, OUTPUT);
    pinMode(unit4, OUTPUT);
    pinMode(unit5, OUTPUT);
    pinMode(powerGSM, OUTPUT);
    pinMode(perimetr, INPUT);
    pinMode(svet, OUTPUT);
    pinMode(redLed, OUTPUT);
 
    digitalWrite(unit1, LOW);
    digitalWrite(unit2, LOW);
    digitalWrite(unit3, LOW);
    digitalWrite(unit4, LOW);
    digitalWrite(svet, LOW);
    digitalWrite(powerGSM, LOW);
    digitalWrite(redLed, LOW);
    
    Serial.begin(9600);
    //Включаю GSM Модуль
    delay(1000);
    digitalWrite(powerGSM, LOW);
    delay(1000);
    digitalWrite(powerGSM, HIGH);
    delay(1000);
    Serial.println("modem on");
    
    gprsSerial.begin(9600);
    delay(500);
    // Настраиваем приём сообщений с других устройств
    // Между командами даём время на их обработку
    gprsSerial.println("AT+CMGF=1\r");
    delay(100);
    gprsSerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
    delay(100);
    gprsSerial.println("AT+IFC=1, 1\r");
    delay(100);
    gprsSerial.println("AT+CPBS=\"SM\"\r");
    delay(100);
    gprsSerial.println("AT+CNMI=1,2,2,1,0\r");//включает оповещение о новых сообщениях,
    delay(100);
    gprsSerial.println("ATD#102#\r");
    delay(100);
    
    //Инициализация температурного датчика
    Serial.println("DHT22 test!");
 
    dht1.begin();
    !bmp.begin();
    delay(3000);
    currentTime = millis();
    loopTime = currentTime;
    currentTimeGSM = millis();
    loopTimeGSM = currentTimeGSM;
}

void loop(){  
  currentTimeGSM = millis();
  if(currentTimeGSM >= (loopTimeGSM + 600000)){ 
    if (testGsmOn()==1){  
    gsmOn();}       
    loopTimeGSM = currentTimeGSM;}
      
int sostPerimetr; // Состояние периметра
int sostPower;    // Сосотояние внешнего питания

  if (gprsSerial.available()){
  char currSymb = gprsSerial.read();
  Serial.print(currSymb); 
 // 
 //   return;
 //   char currSymb = gprsSerial.read();
 //   Serial.println(gprsSerial.read());
 //
    if ('\r' == currSymb) {
        if (isStringMessage) {
            //если текущая строка - SMS-сообщение,
            //отреагируем на него соответствующим образом
            if (!currStr.compareTo("Zapros"))
            {
             balance();
             GetDatchik();
             }
             else if (currStr.startsWith("Ardu")) {
             ParseSMS(currStr); }
             isStringMessage = false;
             } else {
             if (currStr.startsWith("+CMT")) {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
             isStringMessage = true;
            }
        }
      currStr = "";
      } else if ('\n' != currSymb) {
      currStr += String(currSymb);
    }
  }
  
//  Контроль периметра !!!
  if (isPerimetr==1){      //Проверка Включен ли контроль периметра
  digitalWrite(redLed, HIGH);
  sostPerimetr = digitalRead(perimetr);
  if (sostPerimetr==LOW){  //Проверка на разомкнутый периметри отсылаем СМС
// и отсылаем СМС
  if (sendSMS==false) {
  sendTextMessage("WARNING! Valdai door open!");
  sendSMS=true; }
  }         
  } else { digitalWrite(redLed, LOW);  
  sendSMS=false;
  } 
  
//  Контроль внешнего питания
  sostPower = digitalRead(power);
  if (sostPower==LOW) {           //Проверка отключения внешнего питания
  if (sendSMSPow==false){
  sendTextMessage("WARNING! Valdai, MAIN POWER OFF!");
  sendSMSPow=true;}
  } else { sendSMSPow=false;}

//  Контроль температуры!!!
  if (isAuto==1) { //Проверка Включен автоуправление батареями
//  Замер температуры можно проводить не чаще раз в 5 минут
  currentTime = millis();
  if(currentTime >= (loopTime + 10000)){
  t1 = int(dht1.readTemperature());
  t2 = int(dht2.readTemperature());
  t3 = int(dht3.readTemperature());
  t4 = int(dht4.readTemperature()); 
  loopTime = currentTime;
  }

//  Serial.print("t=");
//  Serial.println(t);
//  Serial.print("autoTemp+delta=");
//  Serial.println(autoTemp+delta);
      if (unit1status==true){
      if (t1 < autoTemp-delta){
      digitalWrite(unit1, HIGH); us1=0;}
      else if  (t1 > autoTemp+delta){
      digitalWrite(unit1, LOW); us1=1;}
      }
       
      if (unit2status==true){
      if (t2 < autoTemp-delta){
      digitalWrite(unit2, HIGH); us2=0;}
      else if  (t2 > autoTemp+delta){
      digitalWrite(unit2, LOW); us2=1;}
      } 
       
      if (unit3status==true){
      if (t3 < autoTemp-delta){
      digitalWrite(unit3, HIGH); us3=0;}
      else if  (t3 > autoTemp+delta){
      digitalWrite(unit3, LOW); us3=1;}
      } 
       
      if (unit4status==true){
      if (t4 < autoTemp-delta){
      digitalWrite(unit4, HIGH); us4=0;}
      else if  (t4 > autoTemp+delta){
      digitalWrite(unit4, LOW); us4=1;}
      }      
}
}
 
void GetDatchik() {
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
 
  float h1 = dht1.readHumidity();
  float t1 = dht1.readTemperature();
  float h2 = dht2.readHumidity();
  float t2 = dht2.readTemperature();
  float h3 = dht3.readHumidity();
  float t3 = dht3.readTemperature();
  float h4 = dht4.readHumidity();
  float t4 = dht4.readTemperature();
  float h5 = dht5.readHumidity();
  float t5 = dht5.readTemperature();
  float p1 = (bmp.readPressure()/133.3);
   
  u1st = unit1status - us1;
  u2st = unit2status - us2;
  u3st = unit3status - us3;
  u4st = unit4status - us4;

  Serial.print("Unit1status="); 
  Serial.println(u1st);
  Serial.print("Unit2status="); 
  Serial.println(u2st);
  Serial.print("Unit3status="); 
  Serial.println(u3st);
  Serial.print("Unit4status="); 
  Serial.println(u4st);
  Serial.print("Temperature street="); 
  Serial.println(t5);
  Serial.print("Vlazhnost street="); 
  Serial.println(h5);
  Serial.print("Pressure="); 
  Serial.println(p1);
   
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  //if (isnan(t1) || isnan(h1)) {
  //  Serial.println("Failed to read from DHT");
  //} else {
    statusHome = String("Valdai")+String(";")+int(u1st)+String(";")+int(t1)+String(";")+int(h1)+String(";")+int(u2st)+String(";")+int(t2)+String(";")+int(h2)+String(";")+int(u3st)+String(";")+int(t3)+String(";")+int(h3)+String(";")+int(u4st)+String(";")+int(t4)+String(";")+int(h4)+String(";")+int(unit5status)+String(";")+int(isPerimetr)+String(";")+int(autoTemp)+String(";")+String(bal)+String(";")+int(t5)+String(";")+int(svetsost)+String(";")+int(p1)+String(";")+int(h5);
    sendTextMessage(statusHome);
    bal = "";
   // Serial.flush();

  Serial.print("Message send: ");
//  Serial.print("T-"); 
//  Serial.print(t1);  //Температура
//  Serial.print(";");
//  Serial.print("H-"); 
//  Serial.print(h1);  //Влажность
//  Serial.println(";");
//  Serial.print("Pressure:");
//  Serial.print(p1);  //атмосферное давление
//  Serial.print(" mm");
  Serial.println(statusHome);
 // }
}

void ParseSMS(String currStr) {
  
us1=0;
us2=0;
us3=0;
us4=0;

  int firstSemicolon;
//Распарсиваем SMS
  firstSemicolon = 1;//находим первую ;
//Получаем значение Автоматического режима контроля температуры

//Serial.println(currStr);
 
  firstSemicolon = currStr.indexOf(';');
//Получаем значение Автоматического уровня температуры
  autoTemp = stringToNumber(currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )));
  if (autoTemp > 0) { isAuto=1; } else { isAuto=0; }
  
  Serial.print("autoTemp=");
  Serial.println(autoTemp);
  Serial.print("isAuto=");
  Serial.println(isAuto);
 
  firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Терассы
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){
    unit1status=false;
    digitalWrite(unit1, LOW);
    Serial.println("Terassa OFF");
  } else {
      unit1status=true;
      digitalWrite(unit1, HIGH);
      Serial.println("Terassa ON");
      }
      Serial.print("Terassa=");
      Serial.println(unit1status);
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Ванной 
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){
    unit2status=false;
    digitalWrite(unit2, LOW);
    Serial.println("Vanna OFF");
  } else {
    unit2status=true;
    digitalWrite(unit2, HIGH);
    Serial.println("Vanna ON");  
    }
    Serial.print("Vanna=");
    Serial.println(unit2status);
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Гостинная
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){
    unit3status=false;
    digitalWrite(unit3, LOW);
    Serial.println("Gostin OFF");
  } else {
      unit3status=true;
      digitalWrite(unit3, HIGH);
      Serial.println("Gostin ON");
      }
      Serial.print("Gostin=");
      Serial.println(unit3status);
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Комната
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){
    unit4status=false;
    digitalWrite(unit4, LOW);
    Serial.println("Komnata OFF");
  } else {
      unit4status=true;
      digitalWrite(unit4, HIGH);
      Serial.println("Komnata ON");
      }
      Serial.print("Komnata=");
      Serial.println(unit4status);
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );

//Получаем значение Роутер
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){
    unit5status=false;
    digitalWrite(unit5, LOW);
    Serial.println("Router OFF");
  } else {
      unit5status=true;
      digitalWrite(unit5, HIGH);
      Serial.println("Router ON");
      }
      Serial.print("Router=");
      Serial.println(unit5status);
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Периметр
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 ))) == "0"){
    isPerimetr=0;
    Serial.println("Perim OFF");
  } else {
    isPerimetr=1;
    Serial.println("Perim ON");
    }
    Serial.print("Perim=");
    Serial.println(isPerimetr);
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение включение света 
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 ))) == "0"){
    svetsost=0;
    digitalWrite(svet, LOW);
    Serial.println("Svet OFF");
  }  else {
    svetsost=1;
    digitalWrite(svet, HIGH);
    Serial.println("Svet ON");
    }
    Serial.print("Svet=");
    Serial.println(svetsost);
}
 
/* Функция отправки SMS-сообщения  */

void sendTextMessage(String text) {
//    gprsSerial.println("AT+CMGF=1\r");
//    delay(5000);
//    gprsSerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
//    delay(5000);
    // Устанавливаем адресата: телефонный номер в международном формате
    gprsSerial.println("AT + CMGS = \"+79677364050\""); //Телефон нужно откорректировать
    delay(100);
    // Пишем текст сообщения
    gprsSerial.println(text);
    delay(100);
    // Отправляем Ctrl+Z, обозначая, что сообщение готово
    gprsSerial.println((char)26);
    delay(18000);
    Serial.print("sendTextMessage FINISH");
}

void balance(){  
//  currStr = "";
//  gprsSerial.println("AT+CMGF=1\r");
//  delay(500);
//  gprsSerial.println("AT+CSCS=\"GSM\"");
//  delay(500);
  gprsSerial.println("ATD#102#\r");
        while(gprsSerial.available()>0){
          data = gprsSerial.read();
        if(data == 'e'){
          data = gprsSerial.read();
        while(data != 'r'){
          bal += data;
          data = gprsSerial.read();}
   Serial.print("BALANCE=");
   Serial.println(bal);
            return;
          }
        }
        delay(500);
      }
      
int testGsmOn(){ //Функция опроса модема. Возвращает "0" если связь с модемом есть или "1" если нет.
    gprsSerial.println("AT");
    delay(100);
    gprsSerial.println("AT");
    delay(500);
    if(gprsSerial.available()>0){
    return 0;
    } else {
    return 1;   
    }
}

void gsmOn(){ //Функция включения модема.
    Serial.print(" TESTgsm= ");
    Serial.println(testGsmOn());
    digitalWrite(powerGSM, HIGH);
    delay(800);
    digitalWrite(powerGSM, LOW);
}
 
//Функция преобразовангия 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;
}

 

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

vovka1021 пишет:

Не проходит что?

В сериал порт выводит сообщение с текстом ответа на запрос баланса?

vovka1021
Offline
Зарегистрирован: 02.02.2016

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

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

vovka1021 пишет:

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

Если отправляешь смс BALANSE

В сериал порт что выводит ?

GSM какой? SIM800l или M590 ?

vovka1021
Offline
Зарегистрирован: 02.02.2016

M590

DHTxx test! и все. пусто

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015
  mySerial.println("ATD*102#");  //запрос баланса
 

Где *102# замени на запрос для своего оператора - например *100#; (в конце не забудь ; )

Должно выглядеть так:  mySerial.println("ATD*100#;");  //запрос баланса

А вот с чтением не помогу..

Почитай тут может есть http://www.2150692.ru/faq/36-otpravka-sms-cherez-arduino-i-gsm-modul-neoway-m590

набор номера. (";" обязательно) 

Модуль позвонит по указанному номеру и вернет один из вариантов 

BUSY - номер занят

NO DIALTONE - нет сигнала на линии 

NO CARRIER - нет сети или другая проблема (например, нет денег на счету)

NA ANSWER - нет ответа 

CONNECT - есть контакт!

vovka1021
Offline
Зарегистрирован: 02.02.2016

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

/* --- */

#include <SoftwareSerial.h>
#include "DHT.h"
#include <Wire.h>
#include <Adafruit_BMP085.h>
#define DHT_1_PIN 4
#define DHT_2_PIN 5
#define DHT_3_PIN 6
#define DHT_4_PIN 7     // pin на котором висит датчик температуры
#define DHT_5_PIN 9     // Датчик температуры на улице
#define DHTTYPE DHT22   // DHT 22 тип датчика
//Отсылается смс в формате: влажность;температура;устройство1;устройство2;устройство3;устройство4;Контроль периметра;Состояние периметра;Контроль автотемпературы;Установленная температура;STEWARD;

int powerGSM = 8;    // Пин включения GSM
int unit1 = A1;      // Террасса
int unit2 = A2;      // Ванна
int unit3 = A3;      // Гостинная
int unit4 = A6;      // Комната
int unit5 = A7;      // Роутер
int perimetr = A0;   // Датчик периметра
int power = 10;      // Контроль внешнего питания
int svet = 11;       // Включение света на терассе и крыльце
int redLed = 13;     // Cветодиод работы всего девайса


String statusHome;
int t1=0;
int t2=0;
int t3=0;
int t4=0;
int us1=0;
int us2=0;
int us3=0;
int us4=0;
int u1st;
int u2st;
int u3st;
int u4st;
int svetsost=0;
char data;//Содержит символ полученый от сим модуля.

unsigned long currentTime;
unsigned long loopTime;
unsigned long currentTimeGSM;
unsigned long loopTimeGSM;
 
boolean unit1status = false; // tersost
boolean unit2status = false; // vannasost
boolean unit3status = false; // gostinsost
boolean unit4status = false; // roomsost
boolean unit5status = false; // router
int isPerimetr = 0;          // Контроль периметра
boolean sendSMS = false;     // Для проверки что смс отсылаем только один раз
boolean sendSMSPow = false;  // Для проверки что смс отсылаем только один раз для цикл контроля питания
int isAuto = 0;              // Автоматическое управление температурой
int autoTemp = 0;
int delta = 2;

DHT dht1(DHT_1_PIN, DHTTYPE);
DHT dht2(DHT_2_PIN, DHTTYPE);
DHT dht3(DHT_3_PIN, DHTTYPE);
DHT dht4(DHT_4_PIN, DHTTYPE);
DHT dht5(DHT_5_PIN, DHTTYPE);

Adafruit_BMP085 bmp; 
SoftwareSerial gprsSerial(2, 3);

String currStr = "";
String bal = "";

// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
 
void setup()
{
    pinMode(unit1, OUTPUT);
    pinMode(unit2, OUTPUT);
    pinMode(unit3, OUTPUT);
    pinMode(unit4, OUTPUT);
    pinMode(unit5, OUTPUT);
    pinMode(powerGSM, OUTPUT);
    pinMode(perimetr, INPUT);
    pinMode(svet, OUTPUT);
    pinMode(redLed, OUTPUT);
 
    digitalWrite(unit1, LOW);
    digitalWrite(unit2, LOW);
    digitalWrite(unit3, LOW);
    digitalWrite(unit4, LOW);
    digitalWrite(svet, LOW);
    digitalWrite(powerGSM, LOW);
    digitalWrite(redLed, LOW);
    
    Serial.begin(9600);
    //Включаю GSM Модуль
    digitalWrite(powerGSM, HIGH);
    delay(1000);
    digitalWrite(powerGSM, LOW);
    delay(5000);
    Serial.println("modem on");
    
    gprsSerial.begin(9600);
    delay(500);
    // Настраиваем приём сообщений с других устройств
    // Между командами даём время на их обработку
    gprsSerial.println("AT+CMGF=1\r");
    delay(100);
    gprsSerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
    delay(100);
    gprsSerial.println("AT+IFC=1, 1\r");
    delay(100);
    gprsSerial.println("AT+CPBS=\"SM\"\r");
    delay(100);
    gprsSerial.println("AT+CNMI=1,2,2,1,0\r");//включает оповещение о новых сообщениях,
    delay(100);
    gprsSerial.println("ATD#102#\r");
    delay(100);
    
    //Инициализация температурного датчика
    Serial.println("DHT22 test!");
 
    dht1.begin();
    !bmp.begin();
    delay(3000);
    currentTime = millis();
    loopTime = currentTime;
    currentTimeGSM = millis();
    loopTimeGSM = currentTimeGSM;
}

void loop(){  
  currentTimeGSM = millis();
  if(currentTimeGSM >= (loopTimeGSM + 600000)){ 
    if (testGsmOn()==1){  
    gsmOn();}       
    loopTimeGSM = currentTimeGSM;}
      
int sostPerimetr; // Состояние периметра
int sostPower;    // Сосотояние внешнего питания

  if (gprsSerial.available()){
  char currSymb = gprsSerial.read();
  Serial.print(currSymb); 
 // 
 //   return;
 //   char currSymb = gprsSerial.read();
 //   Serial.println(gprsSerial.read());
 //
    if ('\r' == currSymb) {
        if (isStringMessage) {
            //если текущая строка - SMS-сообщение,
            //отреагируем на него соответствующим образом
            if (!currStr.compareTo("Zapros"))
            {
             balance();
             GetDatchik();
             }
             else if (currStr.startsWith("Ardu")) {
             ParseSMS(currStr); }
             isStringMessage = false;
             } else {
             if (currStr.startsWith("+CMT")) {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
             isStringMessage = true;
            }
        }
      currStr = "";
      } else if ('\n' != currSymb) {
      currStr += String(currSymb);
    }
  }
  
//  Контроль периметра !!!
  if (isPerimetr==1){      //Проверка Включен ли контроль периметра
  digitalWrite(redLed, HIGH);
  sostPerimetr = digitalRead(perimetr);
  if (sostPerimetr==LOW){  //Проверка на разомкнутый периметри отсылаем СМС
// и отсылаем СМС
  if (sendSMS==false) {
  sendTextMessage("WARNING! Valdai door open!");
  sendSMS=true; }
  }         
  } else { digitalWrite(redLed, LOW);  
  sendSMS=false;
  } 
  
//  Контроль внешнего питания
  sostPower = digitalRead(power);
  if (sostPower==LOW) {           //Проверка отключения внешнего питания
  if (sendSMSPow==false){
  sendTextMessage("WARNING! Valdai, MAIN POWER OFF!");
  sendSMSPow=true;}
  } else { sendSMSPow=false;}

//  Контроль температуры!!!
  if (isAuto==1) { //Проверка Включен автоуправление батареями
//  Замер температуры можно проводить не чаще раз в 5 минут
  currentTime = millis();
  if(currentTime >= (loopTime + 10000)){
  t1 = int(dht1.readTemperature());
  t2 = int(dht2.readTemperature());
  t3 = int(dht3.readTemperature());
  t4 = int(dht4.readTemperature()); 
  loopTime = currentTime;
  }

//  Serial.print("t=");
//  Serial.println(t);
//  Serial.print("autoTemp+delta=");
//  Serial.println(autoTemp+delta);
      if (unit1status==true){
      if (t1 < autoTemp-delta){
      digitalWrite(unit1, HIGH); us1=0;}
      else if  (t1 > autoTemp+delta){
      digitalWrite(unit1, LOW); us1=1;}
      }
       
      if (unit2status==true){
      if (t2 < autoTemp-delta){
      digitalWrite(unit2, HIGH); us2=0;}
      else if  (t2 > autoTemp+delta){
      digitalWrite(unit2, LOW); us2=1;}
      } 
       
      if (unit3status==true){
      if (t3 < autoTemp-delta){
      digitalWrite(unit3, HIGH); us3=0;}
      else if  (t3 > autoTemp+delta){
      digitalWrite(unit3, LOW); us3=1;}
      } 
       
      if (unit4status==true){
      if (t4 < autoTemp-delta){
      digitalWrite(unit4, HIGH); us4=0;}
      else if  (t4 > autoTemp+delta){
      digitalWrite(unit4, LOW); us4=1;}
      }      
}
}
 
void GetDatchik() {
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
 
  float h1 = dht1.readHumidity();
  float t1 = dht1.readTemperature();
  float h2 = dht2.readHumidity();
  float t2 = dht2.readTemperature();
  float h3 = dht3.readHumidity();
  float t3 = dht3.readTemperature();
  float h4 = dht4.readHumidity();
  float t4 = dht4.readTemperature();
  float h5 = dht5.readHumidity();
  float t5 = dht5.readTemperature();
  float p1 = (bmp.readPressure()/133.3);
   
  u1st = unit1status - us1;
  u2st = unit2status - us2;
  u3st = unit3status - us3;
  u4st = unit4status - us4;

  Serial.print("Unit1status="); 
  Serial.println(u1st);
  Serial.print("Unit2status="); 
  Serial.println(u2st);
  Serial.print("Unit3status="); 
  Serial.println(u3st);
  Serial.print("Unit4status="); 
  Serial.println(u4st);
  Serial.print("Temperature street="); 
  Serial.println(t5);
  Serial.print("Vlazhnost street="); 
  Serial.println(h5);
  Serial.print("Pressure="); 
  Serial.println(p1);
   
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  //if (isnan(t1) || isnan(h1)) {
  //  Serial.println("Failed to read from DHT");
  //} else {
    statusHome = String("Valdai")+String(";")+int(u1st)+String(";")+int(t1)+String(";")+int(h1)+String(";")+int(u2st)+String(";")+int(t2)+String(";")+int(h2)+String(";")+int(u3st)+String(";")+int(t3)+String(";")+int(h3)+String(";")+int(u4st)+String(";")+int(t4)+String(";")+int(h4)+String(";")+int(unit5status)+String(";")+int(isPerimetr)+String(";")+int(autoTemp)+String(";")+String(bal)+String(";")+int(t5)+String(";")+int(svetsost)+String(";")+int(p1)+String(";")+int(h5);
    sendTextMessage(statusHome);
    bal = "";
   // Serial.flush();

  Serial.print("Message send: ");
//  Serial.print("T-"); 
//  Serial.print(t1);  //Температура
//  Serial.print(";");
//  Serial.print("H-"); 
//  Serial.print(h1);  //Влажность
//  Serial.println(";");
//  Serial.print("Pressure:");
//  Serial.print(p1);  //атмосферное давление
//  Serial.print(" mm");
  Serial.println(statusHome);
 // }
}

void ParseSMS(String currStr) {
  
us1=0;
us2=0;
us3=0;
us4=0;

  int firstSemicolon;
//Распарсиваем SMS
  firstSemicolon = 1;//находим первую ;
//Получаем значение Автоматического режима контроля температуры

//Serial.println(currStr);
 
  firstSemicolon = currStr.indexOf(';');
//Получаем значение Автоматического уровня температуры
  autoTemp = stringToNumber(currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )));
  if (autoTemp > 0) { isAuto=1; } else { isAuto=0; }
  
  Serial.print("autoTemp=");
  Serial.println(autoTemp);
  Serial.print("isAuto=");
  Serial.println(isAuto);
 
  firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Терассы
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){
    unit1status=false;
    digitalWrite(unit1, LOW);
    Serial.println("Terassa OFF");
  } else {
      unit1status=true;
      digitalWrite(unit1, HIGH);
      Serial.println("Terassa ON");
      }
      Serial.print("Terassa=");
      Serial.println(unit1status);
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Ванной 
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){
    unit2status=false;
    digitalWrite(unit2, LOW);
    Serial.println("Vanna OFF");
  } else {
    unit2status=true;
    digitalWrite(unit2, HIGH);
    Serial.println("Vanna ON");  
    }
    Serial.print("Vanna=");
    Serial.println(unit2status);
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Гостинная
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){
    unit3status=false;
    digitalWrite(unit3, LOW);
    Serial.println("Gostin OFF");
  } else {
      unit3status=true;
      digitalWrite(unit3, HIGH);
      Serial.println("Gostin ON");
      }
      Serial.print("Gostin=");
      Serial.println(unit3status);
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Комната
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){
    unit4status=false;
    digitalWrite(unit4, LOW);
    Serial.println("Komnata OFF");
  } else {
      unit4status=true;
      digitalWrite(unit4, HIGH);
      Serial.println("Komnata ON");
      }
      Serial.print("Komnata=");
      Serial.println(unit4status);
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );

//Получаем значение Роутер
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){
    unit5status=false;
    digitalWrite(unit5, LOW);
    Serial.println("Router OFF");
  } else {
      unit5status=true;
      digitalWrite(unit5, HIGH);
      Serial.println("Router ON");
      }
      Serial.print("Router=");
      Serial.println(unit5status);
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Периметр
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 ))) == "0"){
    isPerimetr=0;
    Serial.println("Perim OFF");
  } else {
    isPerimetr=1;
    Serial.println("Perim ON");
    }
    Serial.print("Perim=");
    Serial.println(isPerimetr);
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение включение света 
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 ))) == "0"){
    svetsost=0;
    digitalWrite(svet, LOW);
    Serial.println("Svet OFF");
  }  else {
    svetsost=1;
    digitalWrite(svet, HIGH);
    Serial.println("Svet ON");
    }
    Serial.print("Svet=");
    Serial.println(svetsost);
}
 
/* Функция отправки SMS-сообщения  */

void sendTextMessage(String text) {
//    gprsSerial.println("AT+CMGF=1\r");
//    delay(5000);
//    gprsSerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
//    delay(5000);
    // Устанавливаем адресата: телефонный номер в международном формате
    gprsSerial.println("AT + CMGS = \"+79677364050\""); //Телефон нужно откорректировать
    delay(100);
    // Пишем текст сообщения
    gprsSerial.println(text);
    delay(100);
    // Отправляем Ctrl+Z, обозначая, что сообщение готово
    gprsSerial.println((char)26);
    delay(18000);
    Serial.print("sendTextMessage FINISH");
}

void balance(){  
//  currStr = "";
//  gprsSerial.println("AT+CMGF=1\r");
//  delay(500);
//  gprsSerial.println("AT+CSCS=\"GSM\"");
//  delay(500);
  gprsSerial.println("ATD#102#\r");
        while(gprsSerial.available()>0){
          data = gprsSerial.read();
        if(data == 'e'){
          data = gprsSerial.read();
        while(data != 'r'){
          bal += data;
          data = gprsSerial.read();
          }
   Serial.print(" BALANCE= ");
   Serial.println(bal);
            return;
          }
        }
      }
      
int testGsmOn(){ //Функция опроса модема. Возвращает "0" если связь с модемом есть или "1" если нет.
    gprsSerial.println("AT");
    delay(100);
    gprsSerial.println("AT");
    delay(500);
    if(gprsSerial.available()>0){
    return 0;
    } else {
    return 1;   
    }
}

void gsmOn(){ //Функция включения модема.
    Serial.print(" TESTgsm= ");
    Serial.println(testGsmOn());
    digitalWrite(powerGSM, HIGH);
    delay(800);
    digitalWrite(powerGSM, LOW);
}
 
//Функция преобразовангия 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;
}

 

vovka1021
Offline
Зарегистрирован: 02.02.2016

там идет в мониторе такого формата

+CMT: "+79677364050",,"16/11/07,00:22:02+32"
Zapros
Read failRead failRead failRead failUnit1status=0
Unit2status=0
Unit3status=0
Unit4status=0
Temperature street=0.00
Vlazhnost street=nan
Pressure=719.02
sendTextMessage FINISHMessage send: Valdai;0;0;0;0;21;31;0;0;0;0;0;0;0;0;0;;0;0;719;0
ATD#102#

+CUSD: 0," Vash balans -13.10 r.
Gudok "Ty ne takoj"

а мне нужно чтобы баланс успел попасть так

+CMT: "+79677364050",,"16/11/07,00:22:02+32"
Zapros

ATD#102#

+CUSD: 0," Vash balans 13.10 r.
Gudok "Ty ne takoj"

Read failRead failRead failRead failUnit1status=0
Unit2status=0
Unit3status=0
Unit4status=0
Temperature street=0.00
Vlazhnost street=nan
Pressure=719.02
sendTextMessage FINISHMessage send: Valdai;0;0;0;0;21;31;0;0;0;0;0;0;0;0;0;13;0;0;719;0
 

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Что значит с опозданием?

vovka1021
Offline
Зарегистрирован: 02.02.2016

я наглядно показал как идет, и как мне надо

мне нужно чтобы было так

+CMT: "+79677364050",,"16/11/07,00:22:02+32"
Zapros

ATD#102#

+CUSD: 0," Vash balans 13.10 r.
Gudok "Ty ne takoj"

Read failRead failRead failRead failUnit1status=0
Unit2status=0
Unit3status=0
Unit4status=0
Temperature street=0.00
Vlazhnost street=nan
Pressure=719.02
sendTextMessage FINISHMessage send: Valdai;0;0;0;0;21;31;0;0;0;0;0;0;0;0;0;13;0;0;719;0

 

vovka1021
Offline
Зарегистрирован: 02.02.2016

а идет сейчас так

+CMT: "+79677364050",,"16/11/07,00:22:02+32"
Zapros
Read failRead failRead failRead failUnit1status=0
Unit2status=0
Unit3status=0
Unit4status=0
Temperature street=0.00
Vlazhnost street=nan
Pressure=719.02
sendTextMessage FINISHMessage send: Valdai;0;0;0;0;21;31;0;0;0;0;0;0;0;0;0;;0;0;719;0
ATD#102#

+CUSD: 0," Vash balans 13.10 r.
Gudok "Ty ne takoj"

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Тоесть ты хочешь в каждом сообщении отправлять балнс?

vovka1021
Offline
Зарегистрирован: 02.02.2016

да, при каждом запросе, в ответ должен быть баланс

 

vovka1021
Offline
Зарегистрирован: 02.02.2016

при команде Zapros

должен быть запрос баланса и ответ такого формата Valdai;0;0;0;0;21;31;0;0;0;0;0;0;0;0;0;13;0;0;719;0

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Значит баланс нужно запрашивать в функции setup и помещать текст куда нибудь в переменную и обновлять после каждой отправки смс.

(ну или еще каждый день, в зависимости от тарифного плана)

vovka1021
Offline
Зарегистрирован: 02.02.2016

посмотрите последнирй код пост #18 может поймете что там нетак

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

vovka1021 пишет:

посмотрите последнирй код пост #18 может поймете что там нетак

Не. Я спать пошел.

Я уже написал выше - при инициализации запрашивать баланс и поместить в глобальную переменную.

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

vovka1021
Offline
Зарегистрирован: 02.02.2016

да я тоже спать. завтра на работу. будет время посмотрите.

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

vovka1021 пишет:

да я тоже спать. завтра на работу. будет время посмотрите.

Вам лучше в раздел "Ищу исполнителя", в любом случае мои GSM еще где то на почте валяются, а в слепую трудновато...

vovka1021
Offline
Зарегистрирован: 02.02.2016

вообщем сам добился ответа баланса по запросу.

  if (gprsSerial.available())//если модуль что-то послал
  {
  char currSymb = gprsSerial.read();
  Serial.print(currSymb);
//    return;
//    char currSymb = gprsSerial.read();
//    Serial.println(gprsSerial.read());
    if ('\r' == currSymb) {                //если символ перевод каретки
        if (isStringMessage) {
            //если текущая строка - SMS-сообщение,
            //отреагируем на него соответствующим образом
            if (!currStr.compareTo("STATUS"))
            {
             //balance();
             delay(1000);
             GetDatchik();
             }
             else if (currStr.startsWith("Ardu")) {
             ParseSMS(currStr); }
             isStringMessage = false;
             } else {
             if (currStr.startsWith("+CMT")) {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
             isStringMessage = true;
            }
        }
          if (!currStr.compareTo("BALANSE")) {
          balance();
          }
          else if(currStr.startsWith("+CUSD: 0,")) {
            int zzz = currStr.indexOf('?.');
            String bal=currStr.substring(10,zzz);     //баланс на сим карте
            Serial.println(bal);
            sendTextMessage("BALANSE = "+bal+".rub"); //Возвращаем смс с балансом
            }
      currStr = "";
      } else if ('\n' != currSymb) {   //если символ НЕ новая строка
      currStr += String(currSymb);
    }
  }

теперь другой вопрос: как прикрутить датчик движения в этот код?

#include <SoftwareSerial.h>
#include "DHT.h"
#define DHTPIN 7       // pin на котором висит датчик температуры
#define DHTTYPE DHT22  // 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;          // Датчик периметра 220 Ом к +5V
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 mySerial(2, 3);// RX, TX
 
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);
    mySerial.begin(9600);
    delay(300);
// Настраиваем приём сообщений с других устройств
// Между командами даём время на их обработку
    mySerial.println("AT+CMGF=1");  //режим кодировки СМС - обычный (для англ.)
    delay(100);
    mySerial.println("AT+CLIP=1");  //включаем АОН
    delay(100);
    mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
    delay(100);
    mySerial.println("AT+CMGL=ALL");
    delay(300);
    mySerial.println("AT+CNMI=2,2");
    delay(300);

//Инициализация температурного датчика
    Serial.begin(9600);
    Serial.println("DHTxx test!");
    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(";STEWART");
    sendTextMessage(statusHome);
    Serial.print("H"); //Влажность
    Serial.print(h);
    Serial.print(";");
    Serial.print("T"); //Температура
    Serial.print(t);
    Serial.println(";");
    Serial.println(statusHome);
  }
}
void getBalanse() {
    mySerial.println("ATD*102#");  //запрос баланса
    delay(300);
    Serial.println("zapros balansa");
  }
  
void loop(){
// delay(5000);
// GetDatchik();
int sostPerimetr; //Состояние периметра
  if (mySerial.available()){
    char currSymb = mySerial.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")||currStr.startsWith("1")) {
    ParseSMS(currStr);}
    isStringMessage = false;
    } else {
      if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
      isStringMessage = true;
      }
      }
      if (!currStr.compareTo("BALANSE")) {
            getBalanse();
          }
          else if(currStr.startsWith("+CUSD: 0,")) {
            int zzz = currStr.indexOf('?.?');
            String balance=currStr.substring(10,zzz); //баланс на сим карте
            Serial.print(balance);
            //  Возвращаем смс с балансом
//    sendTextMessage(balance)
 }
      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);
    sendSMS==false;
  }
//  Контроль температуры!!!
  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 OFF");
    } else {
    unit1status=true;
    digitalWrite(unit1, HIGH);
    Serial.println("1 ON");
    }
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Устройства 2
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
    unit2status=false;
    digitalWrite(unit2, LOW);
    Serial.println("2 OFF");
    } else {
    unit2status=true;
    digitalWrite(unit2, HIGH);
    Serial.println("2 ON");
    }
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Устройства 3
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
    unit3status=false;
    digitalWrite(unit3, LOW);
    Serial.println("3 OFF");
    } else {
    unit3status=true;
    digitalWrite(unit3, HIGH);
    Serial.println("3 ON");
    }
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
 
//Получаем значение Устройства 4
  if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){
    unit4status=false;
    digitalWrite(unit4, LOW);
    Serial.println("4 OFF");
    } else {
    unit4status=true;
    digitalWrite(unit4, HIGH);
    Serial.println("4 ON");
    } 
  }
 
/*
* Функция отправки SMS-сообщения
*/
void sendTextMessage(String text) {
// Устанавливает текстовый режим для SMS-сообщений
    mySerial.print("AT+CMGF=1\r");
    delay(100); // даём время на усваивание команды
// Устанавливаем адресата: телефонный номер в международном формате
    mySerial.println("AT + CMGS = \"+79677360000\""); //Телефон нужно откорректировать
    delay(100);
// Пишем текст сообщения
    mySerial.println(text);
    delay(100);
// Отправляем Ctrl+Z, обозначая, что сообщение готово
    mySerial.println((char)26);
    delay(300);
    Serial.print("sendTextMessage FINISH");
}

//Функция преобразовангия 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;
}

а вот собственно визульное отображение скетча