Arduino Mega 2560+SIM 900+DS18B20 помогите поправить скетч.

aik18
Offline
Зарегистрирован: 18.01.2017

Добрый вечер. Програмированием ни когда не занимался поэтому в этой теме я скажем мягко говоря валенок. Понадобилось для собственных нужд передать показания температуры и поуправлять пару реле через GSM SMS. Нашел в этой теме http://arduino.ru/forum/programmirovanie/neoway-590-kak-peredat-temperaturu скетч более менее попадающий под мои нужды. Только мне требуется запрос температуры по смс, управление каналами по смс, и оповещение по смс при достижении определенной температуры. Это основные задачи в планах хотелось бы добавить статус всех каналов и контроль канала но пока не понимаю сам каким образом буду это реализовывать. В общем взял я скетч с темы по ссылке маленько поправил под свои нужды , но понимаю что поправил я его как рукожопый. В общем при превышении температуры смс сыпятся пачками пока температура не достигнет указаного значения. Я не прошу написать за меня скетч я прошу вас помочь если можно с коментами как сделать чтобы при достижении температуры например 50 градусов и подьеме температуры выше было разовое опевещение что достигнут предел в 50 градусов?


[code]
String stringOne, stringTwo, stringThree, stringFour, stringFive,  stringSix,  stringSeven,  stringEight;
#include <OneWire.h>
#include <SoftwareSerial.h>
#include <string.h>
#include <GPRS_Shield_Arduino.h>
OneWire ds(10);
#define MASTER "+79291109959"          //мой телефон
GPRS gprs(Serial1);
int ch = 0;
char a;
int h;
int t;
int ledr1 = 11;             // переменная управления реле 1
int ledr2 = 12;             // переменная управления реле 2
int pit = 7;                // переменная датчика температуры
//------------------------------------------------------------------
String val = "";
//Добавлены к инициализации ----------------------------------------
int Step = 0;
int maxTemp = 50;           // порог температуры для начала отправки SMS тревоги
boolean isSended = false;
//Конец добавленых -------------------------------------------------

void setup()
{
  Serial.begin(9600);         //подключаем порт компьютера
  pinMode(ledr1, OUTPUT);     // назначение pin 11 как выход
  digitalWrite(ledr1, HIGH);  // установка высокого уровня на выходе управления реле 1
  pinMode(ledr2, OUTPUT);     // назначение pin 12 как выход
  digitalWrite(ledr2, HIGH);  // установка высокого уровня на выходе управления реле 2 
  Serial.println("GSM tester v1.0");
  delay(500);
  Serial1.println("AT+IPR=9600"); //задаем скорость работы порта M590 равной 19200
    Serial1.begin(9600);
    Serial1.println("AT+IPR?");
    Serial1.println("AT&W");
    delay(500);
  Serial1.println("AT+CMGF=1");     //режим кодировки СМС - обычный (для англ.)
   delay(200);
  Serial1.println("AT+CMGD=1,4");   //удаление всех SMS с SIM карты
   delay(1000);   
  Serial1.println("AT+CLIP=1");    //включаем АОН
   delay(200);
  Serial1.println("AT+CSQ");       //вывести в терминал уровень сигнала (если 99, то связи нет)
   delay(200);
  Serial1.println("AT+CPAS");      //Команда проверки статуса модуля +
   delay(200);
  Serial1.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
   delay(200);
  Serial1.println("AT+CNMI=2,2");
   delay(500);  
}

void loop()
{
 // ------------------------------------------------------ 
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  delay(750);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read();
  data[1] = ds.read();
  int Temp = (data[1] << 8) + data[0];
  Temp = Temp >> 4;
  //Serial.println(Temp);
  int sensorValue = Temp;
  stringOne = "Temp: ";
  stringTwo = "Alarm!!! ";
  stringFive = "WATER!";
  stringThree = stringOne + sensorValue;
  stringFour = stringTwo + stringOne + sensorValue;
  stringSix = stringTwo + stringFive;
  Serial.println(stringThree); 
  if (Serial1.available()) {        //если GSM модуль что-то послал нам, то
    while (Serial1.available()) {   //сохраняем входную строку в переменную val
      ch = Serial1.read();
      val += char(ch);
      a += char(h);
      delay(10);
      
    }
   Serial.println(val);                      // дублируем сообщение в терминал
  
    if (val.indexOf("+CMT") > -1) {          //если обнаружен СМС (для определения звонка вместо "+CMT" вписать "RING", трубку он не берет, но реагировать на факт звонка можно)
      if (val.indexOf(MASTER) > -1) {        //если СМС от хозяина
        Serial.println("--- MASTER SMS DETECTED ---");
      }   else {
           Serial.println("NO MASTER SMS");
      }
          if (val.indexOf("send1on") > -1) {      // если обнаружено кодовое слово
          Serial.println("send1 on ok");          // сообщаем об этом в терминал (если нужно)
          digitalWrite(ledr1, LOW);               //включаем светодиод
          sms("yes sir send1 on ok!", MASTER);  // отвечаем смской
      } 
             else if (val.indexOf("send1off") > -1) {      // если обнаружено кодовое слово
             Serial.println("send1 off ok");               // сообщаем об этом в терминал (если нужно)
             digitalWrite(ledr1, HIGH);                    //выключаем светодиод
             sms("yes sir send1 off ok!", MASTER);       // отвечаем смской
      }
         if (val.indexOf("send2on") > -1) {      // если обнаружено кодовое слово
         Serial.println("send2 on ok");          // сообщаем об этом в терминал (если нужно)
         digitalWrite(ledr2, LOW);               //включаем светодиод
         sms("yes sir send2 on ok!", MASTER);  // отвечаем смской
         }
             else if (val.indexOf("send2off") > -1) {      // если обнаружено кодовое слово
             Serial.println("send2 off ok");               // сообщаем об этом в терминал (если нужно)
             digitalWrite(ledr2, HIGH);                    //выключаем светодиод
             sms("yes sir send2 off ok!", MASTER);       // отвечаем смской
              }
         if (val.indexOf("temp") > -1) {      // если обнаружено кодовое слово
         sms(String (stringThree) , MASTER);  // отвечаем смской
       

      // sms("no sir!", MASTER);
 

      }
      val = "";
      } 
       }
      
      if (val.indexOf("RING") > -1) {          //если звонок обнаружен
       if (val.indexOf("79291109959") > -1) {  //если номер совпадает
        Serial.println("--- MASTER RING DETECTED ---");
        Serial1.println("ATH0");              //разрываем связь
        delay(3000);
        sms(String (stringThree) , MASTER);
        
      }
    } 
    
    val = "";

  
      if (Serial.available()) {                //если в мониторе порта ввели что-то
      while (Serial.available()) {             //сохраняем строку в переменную val
      ch = Serial.read();
      val += char(ch);
      delay(10);
    }
    //Serial1.println(val);                   //передача всех команд, набранных в мониторе порта в GSM модуль
    if (val.indexOf("sendsms") > -1) {         //если увидели команду отправки СМС
      //sms(String("hello world"), String("+79291109959"));  //отправляем СМС на номер +71234567890
    }
    val = "";  //очищаем
  }
    //Добавлено в LOOP: отправка СМС при снижении температуры
  //Serial.println("TEMP =/=");
  //Serial.print("Step=");
  //Serial.print(Step);
  //Serial.print("isSended=");
  //Serial.print(isSended);
  
  if (sensorValue > (maxTemp +1)){
  isSended = false;     
  Step = 0;
  }
  if (isSended == false){ //если СМСки не отправлялись 
    if ( sensorValue > (maxTemp - Step) ){ //если Temp ниже порога
    Serial.println("ALARM!!!");
    sms(String (stringFour) , MASTER);//отправка СМС с температурой
    Step = Step + 1; //счетчик шагов
    }
    if (Step = 3){ //если отправлены 3 СМСки
    Step = 0;
    isSended = true; //флаг "СМСки отправлены"
    
}
  
  
  }
//Конец Добавленного в LOOP: отправка СМС при снижении температуры
}

 
void sms(String text, String phone)
{
  Serial.println("SMS send started");
  Serial1.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  Serial1.print(text);
  delay(500);
  Serial1.print((char)26);
  delay(500);
  Serial.println("SMS send complete");
  delay(2000); //процедура отправки СМС
}
AG
Offline
Зарегистрирован: 19.01.2017

Ошибка в 169 строке.

aik18
Offline
Зарегистрирован: 18.01.2017

Спасибо но я не пойму как ее изменить я понимаю что там должно быть == или < или > но все равно смс сыпится пачками пока температура не знизится до 50 градусов. И причину я тоже в принципе понял как только отправленно 3 смс так флаг отправки сбрасывает счетчик на 0 а условие выше заданого значения поэтому смс отправляется по новому кругу пока не снизится температура.

AG
Offline
Зарегистрирован: 19.01.2017
if (sensorValue > (maxTemp +1)){
	  isSended = false;    
	  Step = 0;
}

Каждый раз, если температура больше предел+1, сбрасываем флаг и счетчик СМС ?

Нужно определить другое условие для сброса - например, температура стала меньше 50 (повтор отправки после возврата в норму). У меня когда то вышло что то такое:

  if (sensorValue < maxTemp){
    AlarmTemp=maxTemp;  // температура тревоги в начальное значение
    Step=0;
  }

  if (sensorValue > AlarmTemp ){ //если СМСки не отправлялись
    if ( Step < 3 ){  
      AlarmTemp=AlarmTemp+1; // увеличим температуру тревоги
      Step = Step + 1; //счетчик шагов
      Serial.println("ALARM!!!");
      sms(String (stringFour) , MASTER);  //отправка СМС с температурой
    }
  }