Neoway 590 (как передать температуру?)

romiras
Offline
Зарегистрирован: 12.07.2015

Подскажите, пожалуйста, как правильно передать температуру с ds18b20 по sms через neoway 590. (текст отправляет и передает без проблем)Вот код:

 

#include <OneWire.h>
OneWire ds(7);
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);          // RX, TX
int ch = 0;
String val = "";
#define MASTER "+77777777777"          //укажите  телефон хозяина


void setup()
{

  Serial.begin(9600);                  //подключаем порт компьютера
  Serial.println("GSM Neoway M590 example");
  mySerial.begin(9600);                //подключаем порт модема (при других скоростях не отвечает)
  mySerial.println("ATI");              //вывести в терминал иноформацию о модеме
  delay(100);
  mySerial.println("AT+CSQ");          //вывести в терминал уровень сигнала (если 99, то связи нет)
  delay(100);
  mySerial.println("AT+CLIP=1");        //включаем АОН
  delay(100);
  mySerial.println("AT+CMGF=1");        //режим кодировки СМС - обычный (для англ.)
  delay(100);
  mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
  delay(100);
  mySerial.println("AT+CNMI=2,2");


}




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);

  if (mySerial.available()) {          //есть данные от GSM модуля
    delay(200);                        //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана
    while (mySerial.available()) {      //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      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("temp") > -1) {      // если обнаружено кодовое слово
        Serial.println("send you ok");      // сообщаем об этом в терминал (если нужно)
        sms("Temp", MASTER, Temp);            // отвечаем смской
      } else {                              // если другое слово или вообще пустое сообщение
        Serial.println("no send you");
        sms("wrong command", MASTER, Temp);

      }
      val = "";
    }
  }
}

void sms(String text, String phone, String Temp)  //процедура отправки СМС
{
  Serial.println("SMS send started");
  mySerial.println("AT+CMGS=\"" + phone + Temp"\"");
  delay(500);
  mySerial.print(text);
  delay(500);
  mySerial.print(Temp);
  delay(500);
  mySerial.print((char)26);
  delay(500);
  Serial.println("SMS send complete");
  delay(2000);
  mySerial.println("AT+CMGD=1");        //стираем память смс
  delay(100);
}

 

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Я так передаю, с аналогового датчика:

void sms(String text, String phone)  //Функция отправки SМS
{
  Serial.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  Serial.print(text);
  delay(500);
  Serial.print((char)26);
  delay(2000);

}




        if (val.indexOf("7xxxxxxxxxx") > -1) {  //если номер звонящего наш. Укажите свой номер без "+"
        Serial.println("ATH0");  //разрываем связь
        delay(1000);

          int tempmotor =0;
          for (int i=0; i<=99; i++){
          tempmotor = tempmotor + analogRead(temp_motor);
          }
         tempmotor=((tempmotor/100)*0.00488)*100;
        
        float akbvoltage =0;
        for (int i=0; i<=99; i++){
        akbvoltage = akbvoltage + analogRead(akb_voltage);  //Для усреднения значения делаем 100 измерений
        }
        
        akbvoltage=(((akbvoltage/100)*0.00488)/0.05)*0.2015; //Вычисляем среднее измеренное значение, потом пересчитываем значение из диапазона от 0 до 5 вольт,
                                                             
        String sms_string = "Statistic:"+'\n';
        sms_string = sms_string + "Motor T= "+tempmotor+'C'+'\n'+"Battery U= "+akbvoltage+'V';
        sms(String(sms_string), String("+7xxxxxxxxxx"));  //отправляем СМС на номер +7xxxxxxxxxx
      }

 

romiras
Offline
Зарегистрирован: 12.07.2015

А можно весь код от начала до конца, пожалуйста

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

У Вас цифровой датчик, там все будет иначе. Просто преобразуйте полученное с датчика значение в строку при отправке:

sms(String(текст_SMS_сообщения), String("+7хххххххххх"), String(Temp));  //отправляем СМС на номер +7хххххххххх

romiras
Offline
Зарегистрирован: 12.07.2015

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

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Вот Ваш кусок кода, Вы писали что он работает и отправляет SMS:

69
	      if (val.indexOf("temp") > -1) {      // если обнаружено кодовое слово
70
	        Serial.println("send you ok");      // сообщаем об этом в терминал (если нужно)
71
	        sms("Temp", MASTER, Temp);            // отвечаем смской
72
	      } else {                              // если другое слово или вообще пустое сообщение
73
	        Serial.println("no send you");
74
	        sms("wrong command", MASTER, Temp);

Попробуйте заменить строки

sms("wrong command", MASTER, Temp);

на

sms("wrong command", MASTER, String(Temp));

PS: Мне не жалко своего кода, просто Вы еще больше в нем запутаетесь, я прерывания по звонку аппаратно использую, для вывода из режима сна и сторожевой таймер.

romiras
Offline
Зарегистрирован: 12.07.2015

Спасибо ВАМ Большущее!!!! Все заработало!!!

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Поздравляю!

Я в своей конструкции нашел баг, пока еще не разобрался в чем причина. На столе все работает, после установки в авто, через несколько дней глухой висяк. Программно зависания обрабатываю сторожевым таймером, с Дуней все ок, она как положено засыпает и просыпается при активации модуля. А вот сам модуль, через несколько дней виснет наглухо. Есть подозрение на левые спам-SMS, вероятно виснет после них.

Несколько дней девайс работал безотказно, сегодня утром решил пополнить счет, смской с другого номера, пополнил и получил висяк модуля. Отключение и включение не принесло результата, телефон абонента выключен и т.д.. Антенну уже заменил. Может и сам модуль глючит, но нужно программно очищать его память от спама. Эту конструкцию лепил наскоряк, для дистанционного запуска котла и отчета, на макетке. Едет второй модуль, с тем уже не спеша буду делать основательно, на нормальной печатке и код доводить до ума, чтоб обрабатывать все возможные ошибки, в том числе и зависания модуля и его автоматическую перезагрузку.

romiras
Offline
Зарегистрирован: 12.07.2015

Модуль у вас запитан отдельно? Тоже из китая? У меня тоже глючил, пока от флюса не промыл и не пропаял

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Вся конструкция, времянка, накидана на макетке, все питается от DC-DC преобразователя, все пропаяно и отмыто. ХЗ, тестирую пока. Но ошибки программно обрабатывать в любом случае необходимо, иначе ни о какой безотказности устройства и речи быть не может.

Вообще девайс получился очень экономичным и по питанию и по деньгам в эксплуатации. Звонишь на него, он просто сбрасывает звонки, но команды выполняет. То есть я, звоня на него, не трачу средств вообще, а он  тратит только при отправке SMS. В режиме сна потребление всей конструкции получилось 12mA, большую часть ест преобразователь, нужно еще поколдовать, хоть аккумулятор и огромный у меня, а побереч его зимой стоит. :)

romiras
Offline
Зарегистрирован: 12.07.2015

Желаю победы над этим китайским монстром! Удачи в проектах!

Станислав
Offline
Зарегистрирован: 07.12.2015

Прошу помощи!  Уже 2 недели бьюсь с проблемой  отправки sms с neoway m590. Получаю переменную с датчика температуры в переменную "t". В терминал все выводит но строка отправки (разные варианты кода)  sms либо выдает ошибку, либо приходит sms в виде TEMP t. Т.е. проблема в преобразовании переменной. Правильно преобразовать не получается. У других, смотрю все работает - не пойму где у меня ошибка.

#include <SoftwareSerial.h>
#include "stDHT.h"
#define DHTPIN 6    // данные с датчика температуры
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);
SoftwareSerial mySerial(2, 3); // RX, TX
int ch = 0;
char a;
char w;
int t;
int led = 13;
int pit = 7;
String val = "";

void setup()
{
  //int h = dht.readHumidity(6);
  int t = dht.readTemperature(6);
 // pinMode(led, OUTPUT);
  pinMode(pit, OUTPUT); //пин 7 работает на выход для питания датчика DHT
  digitalWrite(led, LOW);
  digitalWrite(pit, HIGH); //включаем питание на DHT11
  Serial.begin(115200);  //скорость порта
  Serial.println("GSM tester v1.0");
  delay(500);
  mySerial.begin(115200);//скорость порта общение с модулем GSM
  delay(500);
  mySerial.println("AT+CLIP=1");  //включаем АОН
  delay(500);
  mySerial.println("AT+CMGF=1");  //режим кодировки СМС - обычный (для англ.)
  delay(500);
  mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
  delay(100);
}

void loop()
{
  if (mySerial.available()) {  //если GSM модуль что-то послал нам, то
    while (mySerial.available()) {  //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      a += char(w);
      delay(10);
    }
    if (val.indexOf("RING") > -1) {  //если звонок обнаружен
      if (val.indexOf("71234567890") > -1) {  //если номер совпадает
        Serial.println("--- MASTER RING DETECTED ---");
        mySerial.println("ATH0");  //разрываем связь
        //digitalWrite(led, HIGH);  //включаем светодиод на 3 сек
        delay(3000);
        // String a = atoi (t); // попытка преобразовать
        //sms("TEMP" t, "+71234567890"); // 1 попытка отправить
        //sms(String("TEMP: " t , String("+71234567890"));  //отправляем СМС с температурой мне 2 попытка

        //digitalWrite(led, LOW);  //выключаем светодиод 
        sms(String("TEMP"), String("+71234567890"), String(t)); // 3 попытка

      }
    } else
      Serial.println(val);  //печатаем в монитор порта пришедшую строку
    val = "";
  }
  if (Serial.available()) {  //если в мониторе порта ввели что-то
    while (Serial.available()) {  //сохраняем строку в переменную val
      ch = Serial.read();
      val += char(ch);
      delay(10);
    }
    //mySerial.println(val);  //передача всех команд, набранных в мониторе порта в GSM модуль
    if (val.indexOf("sendsms") > -1) {  //если увидели команду отправки СМС
      sms(String("hello world"), String("+71234567890"));  //отправляем СМС на номер +71234567890
    }
    val = "";  //очищаем
  }
}

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

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

строка 56 попробуйте так

sms(String("TEMP: " + t), String("+71234567890")):

 

Станислав
Offline
Зарегистрирован: 07.12.2015

Пока приходит "TEMP" и далее пусто. Разбираюсь где я ошибся.....

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

строка 18, температуру вы считываете 1 раз при старте?

Станислав
Offline
Зарегистрирован: 07.12.2015

Спасибо большое! Увидел ошибку. Исправил. Появилась новая проблема... теперь слово "TEMP" не приходит,  выполнение кода перебрасывается на строку 71 и мне приходит сообщение "hello world". Если убираю строку int t = dht.readTemperature(); то работет все как обычно т.е. при звонке в ответ приходит  слово "TEMP" но без температуры. 

#include <SoftwareSerial.h>
#include "DHT.h"
#define DHTPIN 6    // данные с датчика температуры
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);
SoftwareSerial mySerial(2, 3); // RX, TX
int ch = 0;
char a;
int h;
int t;
int led = 13;
int pit = 7;
String val = "";

void setup()
{
  //int h = dht.readHumidity(6);
  //int t = dht.readTemperature(6);
  // pinMode(led, OUTPUT);
  pinMode(pit, OUTPUT); //пин 7 работает на выход для питания датчика DHT
  digitalWrite(led, LOW);
  digitalWrite(pit, HIGH); //включаем питание на DHT11
  Serial.begin(115200);  //скорость порта
  Serial.println("GSM tester v1.0");
  delay(500);
  mySerial.begin(115200);//скорость порта общение с модулем GSM
  delay(500);
  mySerial.println("AT+CLIP=1");  //включаем АОН
  delay(500);
  mySerial.println("AT+CMGF=1");  //режим кодировки СМС - обычный (для англ.)
  delay(500);
  mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
  delay(100);
}

void loop()
{
  int t = dht.readTemperature();
  if (mySerial.available()) {  //если GSM модуль что-то послал нам, то
    while (mySerial.available()) {  //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      a += char(h);
      delay(10);
    }
    if (val.indexOf("RING") > -1) {  //если звонок обнаружен
      if (val.indexOf("71234567890") > -1) {  //если номер совпадает
        //Serial.println("--- MASTER RING DETECTED ---");
        mySerial.println("ATH0");  //разрываем связь
        //digitalWrite(led, HIGH);  //включаем светодиод на 3 сек
        delay(3000);
        // String a = atoi (h);
        sms("TEMP" + t, "+71234567890");
        //sms(String("Humidity: " t , String("+71234567890"));  //отправляем СМС с влажностью мне
        //digitalWrite(led, LOW);  //выключаем светодиод

      }
    } else
      Serial.println(val);  //печатаем в монитор порта пришедшую строку
    val = "";
  }
  if (Serial.available()) {  //если в мониторе порта ввели что-то
    while (Serial.available()) {  //сохраняем строку в переменную val
      ch = Serial.read();
      val += char(ch);
      delay(10);
    }
    //mySerial.println(val);  //передача всех команд, набранных в мониторе порта в GSM модуль
    if (val.indexOf("sendsms") > -1) {  //если увидели команду отправки СМС
      sms(String("hello world"), String("+71234567890"));  //отправляем СМС на номер +71234567890
    }
    val = "";  //очищаем
  }
}

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

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

строка 26, следует умнньшить  до 19200, так как софвтварный сериал глючит при скорости больше 38400

и строка 86 увеличить до 5000

Станислав
Offline
Зарегистрирован: 07.12.2015

Скорость пытался снизить, в мониторе порта какой-то мусор и на звонки не отвечает . Пробовал поиграться скоростями... кроме как на 115200 не работает (хотя и встречаются ошибки, к примеру не спервого раза номер правильно в порт приходит). При этом скорости должны быть одинаковыми что serial что работа с модулем (может особенность neoway). У меня два модуля neoway M590- ведут себя одинаково. По 86 строке - увеличил.  К сожалению ничего не изменилось. Изменял строку  "sms("TEMP" +t , "+71234567890");" на  "sms("TEMP" , "+71234567890") " т.е удаляю отправку переменной, начинает приходить слово "TEMP". что-то видимо с "t" не так.... 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

погуглите как установить скорость М590 в 19200 с помощью АТ команд

Станислав
Offline
Зарегистрирован: 07.12.2015

Спасибо большое! На одну проблему меньше :-) !  После установки скорости с помощью AT команды (AT+IPR=19200) ошибки в мониторе порта пропали полностью. Теперь на звонок реагирует с первого раза. Но проблема  с отправкой температуры осталась..... Подключал разные библиотеки работы с DHT11. С #include "stDHT.h" в монитор порта выдаёт 

MODEM:STARTUP

AT+CMGS="+71234567890"

> TEMP
ERROR
 
с библиотекой "DHT.h" в порт выдаёт
 
 SMS send started
SMS send complete
ATH0
OK
AT+CMGS="+71234567890"
>
+CMGS: 69
OK
 
но sms приходит пустое, даже без слова "TEMP". И цифра "69" в мониторе порта меня смущает.....  
 
Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

Попрбуйте
String smska = String("Temp:") + String(t));
sms(smska, "+71234567890");

 

Станислав
Offline
Зарегистрирован: 07.12.2015

УРА !!! Всё заработало при : 

#define MASTER "+71234567890"          //мой телелфон

void loop()
{
  int Temp = dht.readTemperature();
.
.
.
.
sms("temperatura  ", MASTER, String(Temp));

в чем разница пока не понимаю! Библиоку использовал #include <DHT.h>. Большое Вам спасибо за помощь!

allform
Offline
Зарегистрирован: 28.01.2016

Здравствуйте форумчане. Вот прочитал я эту ветку и решил повторить как описано. Вот странно - ничего не получилось, постоянно ругается на - sms("temperatura  ", MASTER, String(Temp)); Ну никак ... Долго ломал голову поскольку я  начинающий в таком деле. Набрался решимости,попытался скомпановать свой код и получилось! Прошу у вас совета по выявлению ошибок и совершенствованию кода. Хочу еще заставить сообщать sms-кой при понижении температуры ниже определенного значения, но незнаю как. Очень нужно для контроля котла в деревне, поскольку конструкцией не предусмотрен автоподжиг а котел тухнет в самый неподходящий момент, и когда старики в отъезде, можно разморозить отопление. Заранее спасибо за советы и помощь.

String stringOne, stringTwo, stringThree;
#include <OneWire.h>
#include <SoftwareSerial.h>
OneWire ds(4);
#define MASTER "+70000000000"          //мой телефон
SoftwareSerial mySerial(2, 3); // RX, TX
int ch = 0;
char a;
int h;
int t;
int led = 13;
int pit = 7;
String val = "";

void setup()
{
    
  Serial.begin(9600);  //скорость порта
  Serial.println("GSM tester v1.0");
  delay(500);
  mySerial.begin(115200);//скорость порта общение с модулем GSM
  delay(500);
  mySerial.println("AT+CLIP=1");  //включаем АОН
  delay(500);
  mySerial.println("AT+CMGF=1");  //режим кодировки СМС - обычный (для англ.)
  delay(500);
  mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
  delay(100);

  
  }
  
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: ";
  stringThree = stringOne  + sensorValue;
  Serial.println(stringThree); 
  if (mySerial.available()) {  //если GSM модуль что-то послал нам, то
    while (mySerial.available()) {  //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      a += char(h);
      delay(10);

      
    }
    if (val.indexOf("RING") > -1) {  //если звонок обнаружен
      if (val.indexOf("70000000000") > -1) {  //если номер совпадает
        Serial.println("--- MASTER RING DETECTED ---");
        mySerial.println("ATH0");  //разрываем связь
        digitalWrite(led, HIGH);  //включаем светодиод на 15 сек
        delay(15000);
        sms(String (stringThree) , MASTER);
        digitalWrite(led, LOW);  //выключаем светодиод

      }
    } else
      Serial.println(val);  //печатаем в монитор порта пришедшую строку
    val = "";
  }
  if (Serial.available()) {  //если в мониторе порта ввели что-то
    while (Serial.available()) {  //сохраняем строку в переменную val
      ch = Serial.read();
      val += char(ch);
      delay(10);
    }
    //mySerial.println(val);  //передача всех команд, набранных в мониторе порта в GSM модуль
    if (val.indexOf("sendsms") > -1) {  //если увидели команду отправки СМС
      //sms(String("hello world"), String("+70000000000"));  //отправляем СМС на номер +70000000000
    }
    val = "";  //очищаем
  }
}

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

 

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Секция loop постоянно крутиться по кругу, с начала и до конца, что собственно и следует из названия. Тоесть код постоянно выполняется по кругу и если скажем в конце этого круга вставить измерение температуры и проверку условия(температура ниже предела), то отправляет смс. Но тут есть одно но!!! Код работает по кругу и на следующий круг, при низкой температуре снова будет отправлена смс, по этому нужно ещё использовать флаг отправки смс. Тоесть отправили смс алярма и выставили флаг- отправлено, на следующем круге проверили, если отправлено, то просто идём дальше по кругу. Весь вопрос в том, что нужно обдумать условие снятия этого флага, скажем личное присутствие и нажатие на кнопку. Тут уж Вам карты в руки. Подумайте и хорошо обдумайте алгоритм, а уж по нему код накидать самое простое занятие.

allform
Offline
Зарегистрирован: 28.01.2016

А Вас не затруднит дать какой либо пример такого кода, или ссылочку на таковой. Мне как начинающему наверное проще будет разобраться на примере, попытаться прикрутить к уже готовому и посмотреть как он себя реализовывает, а вот потом уже можно и с алгоритмом покумекать. Не сочтите за наглость, но познания у меня в програмировании начальные.

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Рабочий пример с отправкой температуры есть в самом начале этой темы, там только одну строку нужно заменить, какую, так же есть выше. А дальше в теле Loop просто всталяете проверку и если условие выполняется отправляете sms.

volatile boolean flag_alarm_sms = false; //Флаг отправки SMS, если сброшен,
                                         //то sms не отправлялась
void setup() {
}

void loop() {
if (Temp<15 && flag_alarm_sms==false) // если температура меньше 15 и флаг sms сброшен, то
{
sms("wrong command", MASTER, String(Temp)); //отправить sms с температурой
flag_alarm_sms=true; // и установить флаг - sms отправлена
}
}

И как для начинающего! Начинать нужно с алгоритма, а уже код по нему напиасать совсем не сложно.

Это код так, для примера просто. Правильней всего обрабатывать все ошибки, то есть, после отправки sms, перекурить немного и считать данные с сериала, если отправка прошла без ошибок, то установить флаг, если нет, на следующем обороте будет сделана следующая попытка отправки. Нужно учитывать перекуры. Еще нужно определить условие сброса флага вновь, так как если не будет отключено питание, sms больше не будет отправлена при вновь понизившейся или далее понижающейся температуре. Нужно либо выключить и включить питание или скажем какое то другое условие должно выполниться, или кнопку поставить и повесить ее на прерывание, при ее нажати просто сбрасывать флаг. А еще ведь могут обесточить все, флаг сбосится и вновь придет sms если температура низкая, хотя в этом есть и свои плюсы, большая надежность и информативность, а можно и в еепром статус флага хранить, но думаю лишнее это. Тут уж на что фантазии у Вас хватит.

allform
Offline
Зарегистрирован: 28.01.2016

Огромное спасибо за пример и разъяснение. Буду пытаться сделать сброс флага по сравнению температуры во времени. Если температура изменилась  на -1, то сброс и снова отправк sms. Про обесточивание уже решено введением дополнительного резервного питания от аккумулятора. Ну или на худой конец попытаюсь сделать сброс флага  с последующим условием отправки sms при изменении температуры на -1 посредством отправки кодового слова по sms

allform
Offline
Зарегистрирован: 28.01.2016

Ну вот наконец похоже довел до логического конца свою задумку. Дополнительно ввел датчик воды (появилась такая задача), поскольку пока делал наступила весна и начал таять снег...;) Пивожу полнйс скетч для обсуждения и использования, поскольку возможно кому и пригодиться.

String stringOne, stringTwo, stringThree, stringFour, stringFive,  stringSix,  stringSeven,  stringEight;
#include <OneWire.h>
#include <SoftwareSerial.h>
#include <string.h>
OneWire ds(4);
#define MASTER "+77777777777"     //мой номер телефона
SoftwareSerial mySerial(2, 3);    // RX, TX
int ch = 0;
char a;
int h;
int t;
int ledr1 = 11;             // переменная управления реле 1
int ledr2 = 12;             // переменная управления реле 2
int led = 10;               // переменная управления светодиодом
int pit = 7;                // переменная датчика температуры
//Вводим датчик воды -----------------------------------------------
int waterPin = 7;          // переменная датчика воды
int min_temp_water = 550;  // допустимый уровень воды в приямке (от 0 до 1023)
int temp_water;            // переменная для занесения уровня воды в приямке
boolean waterSended = false;
//------------------------------------------------------------------
String val = "";
//Добавлены к инициализации ----------------------------------------
int Step = 0;
int minTemp = 14;           // порог температуры для начала отправки SMS тревоги
boolean isSended = false;
//Конец добавленых -------------------------------------------------

void setup()
{
  Serial.begin(9600);         //подключаем порт компьютера
  pinMode(led, OUTPUT);       //назначение pin 13 как выход
  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);
  mySerial.println("AT+IPR=19200"); //задаем скорость работы порта M590 равной 19200
    mySerial.begin(19200);
    mySerial.println("AT+IPR?");
    mySerial.println("AT&W");
    delay(500);
  mySerial.println("AT+CMGF=1");     //режим кодировки СМС - обычный (для англ.)
   delay(200);
  mySerial.println("AT+CMGD=1,4");   //удаление всех SMS с SIM карты
   delay(1000);   
  mySerial.println("AT+CLIP=1");    //включаем АОН
   delay(200);
  mySerial.println("AT+CSQ");       //вывести в терминал уровень сигнала (если 99, то связи нет)
   delay(200);
  mySerial.println("AT+CPAS");      //Команда проверки статуса модуля +
   delay(200);
  mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
   delay(200);
  mySerial.println("AT+CNMI=2,2");
   delay(500);  
}

void loop()
{
  // ввод уровня воды ------------------------------------
  temp_water = analogRead(waterPin);
   Serial.print("WATER-");
   Serial.println(temp_water);
   delay(1000);
   if (temp_water < (min_temp_water - 50)){
  waterSended = false;
  digitalWrite(led, HIGH); //выкдючение индикации воды в приямке (светодиод pin 13)     
    }
  if (waterSended == false){ //если СМСки не отправлялись 
    if ( temp_water >= min_temp_water){   //если temp_water выше порога
    Serial.println("ALARM WATER!!!");
    digitalWrite(led, LOW); //вкдючение индикации воды в приямке (светодиод pin 13)
    //sms(String (stringSix) , MASTER);   //отправка СМС с температурой
    waterSended = true;                   //флаг "СМСки отправлены"
    }
 
  }
   
 // ------------------------------------------------------ 
  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 (mySerial.available()) {        //если GSM модуль что-то послал нам, то
    while (mySerial.available()) {   //сохраняем входную строку в переменную val
      ch = mySerial.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);       // отвечаем смской

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

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

      }
    } 
    
    val = "";

  
      if (Serial.available()) {                //если в мониторе порта ввели что-то
      while (Serial.available()) {             //сохраняем строку в переменную val
      ch = Serial.read();
      val += char(ch);
      delay(10);
    }
    //mySerial.println(val);                   //передача всех команд, набранных в мониторе порта в GSM модуль
    if (val.indexOf("sendsms") > -1) {         //если увидели команду отправки СМС
      //sms(String("hello world"), String("+77777777777"));  //отправляем СМС на номер +71234567890
    }
    val = "";  //очищаем
  }
    //Добавлено в LOOP: отправка СМС при снижении температуры
  //Serial.println("TEMP =/=");
  //Serial.print("Step=");
  //Serial.print(Step);
  //Serial.print("isSended=");
  //Serial.print(isSended);
  
  if (sensorValue > (minTemp +1)){
  isSended = false;     
  Step = 0;
  }
  if (isSended == false){ //если СМСки не отправлялись 
    if ( sensorValue == (minTemp - 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");
  mySerial.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  mySerial.print(text);
  delay(500);
  mySerial.print((char)26);
  delay(500);
  Serial.println("SMS send complete");
  delay(2000); //процедура отправки СМС
}

 

sha111
Offline
Зарегистрирован: 27.02.2016

allform пишет:

Ну вот наконец похоже довел до логического конца свою задумку....

Прямо-таки и я о такой думал... :) спасибо, я возьму этот скетч за основу, буду тестировать...

 

sha111
Offline
Зарегистрирован: 27.02.2016

Комментарии к коду из сообщения №27.
Посидел- собрал макет, посмотрел как работает и заодно посмотрел скетч (когда-то надо ведь ;)).
В общем, сырой очень он.
Некоторые объявленные переменные "повисли" (не используются), структура (т.е логика работы) программы не  очень четкая.
Это не критика, все равно автору спасибо, что начал это дело. Если будут желающие обсуждать, то будем продолжать дорабатывать здесь. :)
 

sha111
Offline
Зарегистрирован: 27.02.2016

Привет!
Вот, немного помалякал с кодом от одного из наших коллег. Пока для обсуждения, внутри скетча постарался комментировать важные моменты.
Как говорится, приглашаю к обсуждению :)
PS. Вспоминаю свою прошлую жизнь с бейсиком и турбо паскалем, гуру попрошу потерпеть и мягко указать на возможные импрувменты или ляпы.
 

// выводы реле перенаправляю на светодиоды test6, можно передавать команды на М590 через ком-порт (д.б. скорость 19200 + возврат каретки)
// также к pin 8 присоединяем прово линию сторожа-растяжки GND-pin8 на Ардуине
// добавлено автономное время RCT - в сетапе потом нужно убрать установку времени, если уже сделано один раз для используемого модуля RTC
// добавлен LCD дисплей
// Внимание скетч тестовый, но рабочий. Ориентирован на UNO - один из самых дешевых (из-за проблем с памятью пришлось отказаться от OLED дисплея)
//  
   
#include <OneWire.h>
#include <SoftwareSerial.h>
#include <string.h>
#include <DS1302.h>

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27

OneWire ds(10);                   // pin 10 датчик температуры     
#define MASTER "+79111111111"     // мой номер телефона
SoftwareSerial mySerial(2, 3);    // RX, TX
int ch = 0;
int waterPin = 7;           // pin 7 - переменная датчика воды
int ledr1 = 11;             // pin 11 переменная управления реле 1 светодиод красный справа на макете
int ledr2 = 12;             // pin 12 переменная управления реле 2 светодиод красный левый на макете
int led = 13;               // pin 13 переменная управления светодиодом - желтым

// подключение модуля реального времени DS1302, ниже показаны сотвествие обозначаениям в примере и плате модуля
//      RST = CE             pin  4
//      DAT = I/O            pin  5
//      CLK = SCLK           pin  6


DS1302 rtc(4, 5, 6); // Init the DS1302 пины: 4, 5, 6

String stringThree, stringFour, stringSix;
int min_temp_water = 550;  // допустимый уровень воды в приямке (от 0 до 1023)
int temp_water;            // переменная для занесения уровня воды в приямке
boolean waterSended = false;
boolean WatchAlarmSended = false;
boolean WatchLine = true;
String val = "";
int Step = 0;
int minTemp = 14;           // порог температуры для начала отправки SMS тревоги
boolean isSended = false;
int  count = 0;

void setup()
{


// Set the clock to run-mode, and disable the write protection
  rtc.halt(false);
  rtc.writeProtect(false);
  // The following lines can be commented out to use the values already stored in the DS1302
  rtc.setDOW(FRIDAY);        // Set Day-of-Week to FRIDAY
  rtc.setTime(12, 0, 0);     // Set the time to 12:00:00 (24hr format)
  rtc.setDate(6, 8, 2010);   // Set the date to August 6th, 2010
/////////////////////////////////////////////////////////////////////////////	
	
	
  Serial.begin(19200);        // подключаем порт компьютера
  pinMode(8, INPUT_PULLUP);   // нога pin 8 на растяжку
  pinMode(led, OUTPUT);       // назначение pin 13 как выход
  pinMode(ledr1, OUTPUT);     // назначение pin 11 как выход
  pinMode(ledr2, OUTPUT);     // назначение pin 12 как выход
  digitalWrite(ledr1, LOW);  // установка уровня на выходе управления реле 1
  digitalWrite(ledr2, LOW);  // установка уровня на выходе управления реле 2 
  Serial.println("Neoway M590 test06: WatchAlarm, T-sensor; Rele1, Rele2, RTC, LCD");
  delay(500);
  mySerial.println("AT+IPR=19200"); //задаем скорость работы порта M590 равной 19200
    mySerial.begin(19200);
  //  mySerial.println("AT+IPR?");
  //  mySerial.println("AT&W");
    delay(500);
  mySerial.println("AT+CMGF=1");    // режим кодировки СМС - обычный (для англ.)
   delay(200);
  mySerial.println("AT+CMGD=1,4");  // удаление всех SMS с SIM карты
   delay(1000);   
  mySerial.println("AT+CLIP=1");    // включаем АОН
   delay(400);
//  mySerial.println("AT+CSQ");       // вывести в терминал уровень сигнала (если 99, то связи нет)
//   delay(200);
//  mySerial.println("AT+CPAS");      // Команда проверки статуса модуля +
//   delay(200);
  mySerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста
   delay(200);
  mySerial.println("AT+CNMI=2,2");
   delay(500);  
}

void loop()
{
   if (count==0)
   count=1;
   myRTC();  
   WatchLine = digitalRead(8);
   if(WatchLine == true) {
      Serial.print("ALARM Watch Line!");
      WatchAlarmSended = true;
   }  
   // ввод уровня воды ------------------------------------
   temp_water = analogRead(waterPin);
  // Serial.print("WATER-");
  // Serial.println(temp_water);
   delay(1000);
   if (temp_water < (min_temp_water - 50)){
  waterSended = false;
  // digitalWrite(led, HIGH);             //выключение индикации воды в приямке (светодиод pin 13)     
    }
  if (waterSended == false){              //если СМСки не отправлялись 
    if ( temp_water >= min_temp_water){   //если temp_water выше порога
    Serial.println("ALARM WATER!!!");
    // digitalWrite(led, LOW);               //включение индикации воды в приямке (светодиод pin 13)
    //sms(String (stringSix) , MASTER);   //отправка СМС с температурой
    waterSended = true;                   //флаг "СМСки отправлены"
    }
  }
   
 // ------------------------------------------------------ 
  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;

  int sensorValue = Temp;
  stringThree = "TEMP " + sensorValue;
  stringFour = "Alarm! TEMP " + sensorValue;
  stringSix = "Alarm! Water! ";
  Serial.println(stringThree); 
  Disp(stringThree);

  if (mySerial.available()) {        // если GSM модуль что-то послал, то сохраняем входную строку в переменную val
    while (mySerial.available()) {   
      ch = mySerial.read();
      val += char(ch);
      delay(10);
      }
   Serial.println(val);                      // дублируем сообщение в терминал
  
    if (val.indexOf("+CMT") > -1) {          // если обнаружен СМС 
      if (val.indexOf(MASTER) > -1) {        // если СМС от хозяина
        Serial.println("--- MASTER SMS DETECTED ---");
      }   else {
           Serial.println("NO MASTER SMS");
      }
          if (val.indexOf("rele1on") > -1) {      // если обнаружено кодовое слово
          Serial.println("rele1 ON ok");          // сообщаем об этом в терминал
          digitalWrite(ledr1, HIGH);              // включаем светодиод rele1
		      led3sec();
		  //sms("rele1 ON ok!", MASTER);  // отвечаем смской
      } 
             else if (val.indexOf("rele1off") > -1) {      // если обнаружено кодовое слово
             Serial.println("rele1 OFF ok");               // сообщаем об этом в терминал
             digitalWrite(ledr1, LOW);                    // выключаем светодиод
             //sms("rele1 OFF ok!", MASTER);               // отвечаем смской
      }
         if (val.indexOf("rele2on") > -1) {      // если обнаружено кодовое слово
         Serial.println("rele2 ON ok");          // сообщаем об этом в терминал (если нужно)
         digitalWrite(ledr2, HIGH);               // включаем светодиод
		     led3sec();  
         //sms("rele2 ON ok!", MASTER);          // отвечаем смской
         }
             else if (val.indexOf("rele2off") > -1) {      // если обнаружено кодовое слово
             Serial.println("rele2 OFF ok");               // сообщаем об этом в терминал (если нужно)
             digitalWrite(ledr2, LOW);                    // выключаем светодиод
             //sms("rele2 OFF ok!", MASTER);               // отвечаем смской
      }
	} 
    if (val.indexOf("RING") > -1) {            // если звонок обнаружен
       if (val.indexOf("79111111111") > -1) {  // если номер совпадает
        Serial.println("--- MASTER RING DETECTED ---");
        mySerial.println("ATH0");              // разрываем связь
        led3sec();
		// sms(String (stringThree) , MASTER);
      }
     }
	val = "";
  }
      if (Serial.available()) {                //если в мониторе порта ввели что-то
      while (Serial.available()) {             //сохраняем строку в переменную val
      ch = Serial.read();
      val += char(ch);
      delay(10);
    }
    mySerial.println(val);                     // передача всех команд, набранных в мониторе порта в GSM модуль
    if (val.indexOf("rele1on") > -1) {         // если увидели команду
        digitalWrite(ledr1, HIGH);             // включаем светодиод на rele1
		  led3sec();                // включаем-выключаем светодиод led
		 		
     }
     if (val.indexOf("rele1off") > -1) {       // если увидели команду 
        digitalWrite(ledr1, LOW);              // выключаем светодиод на rele1
     }
	   if (val.indexOf("rele2on") > -1) {        // если увидели команду
        digitalWrite(ledr2, HIGH);             // включаем светодиод на rele2
		 led3sec();                // включаем-выключаем светодиод led
		 
     //   mySerial.println("ATD+79111111111;"); 	   
	   }
     if (val.indexOf("rele2off") > -1) {        // если увидели команду
        digitalWrite(ledr2, LOW);               // выключаем светодиод на rele2
     }
    val = ""; 
  }
  
  if (sensorValue > (minTemp +1)){
  isSended = false;     
  Step = 0;
  }
  if (isSended == false){                      // если СМСки не отправлялись 
    if ( sensorValue == (minTemp - Step) ){    // если Temp ниже порога
    Serial.println("ALARM!!!");
  //  sms(String (stringFour) , MASTER);       // отправка СМС с температурой
    Disp(stringFour);
    Step = Step + 1;                           // счетчик шагов
    }
    isSended = true;                           // флаг "СМС отправлена"
    }
  
}

void led3sec()    //процедура вклчения на 3 секунды led13
 {
  digitalWrite(led, HIGH);
  delay(3000);
  digitalWrite(led, LOW);
 }

void Disp(String text) 
 {
  lcd.init();                      // initialize the lcd 
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Hello, Watcher!");
  lcd.setCursor(0,1);
  lcd.print(stringThree);
  lcd.setCursor(0,2);
  lcd.print("Reserved");
  lcd.setCursor(0,3);
  lcd.print("Reserved");
  }

void myRTC()           // процедура выводв реального времени на ком-порт
 { // Send Day-of-Week
  Serial.print(rtc.getDOWStr());
  Serial.print(" ");
    delay (500);
  // Send date
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");
  // Send time
  Serial.println(rtc.getTimeStr());
 }    

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

/*
void WatchLine()                 // процедура запуска сторожа-растяжки
{
    mySerial.println("ATD+79111111111;");  // звоним по указаному номеру
    delay(10000);
    mySerial.println("ATH0");
   
}   
*/


 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

скетч оставили на таком уровне, или еще улучшали?

sha111
Offline
Зарегистрирован: 27.02.2016

Short Circuit пишет:

скетч оставили на таком уровне, или еще улучшали?

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

 

nokiabox
Offline
Зарегистрирован: 22.07.2016

Ребята, всем привет, подсобите пожалуйста скетчем для обычного термистора. Нужно контролировать температуру подачи воды в батареи, и температу в помещении. Если температура подачи воды упадет до заданного значения - отправлять смс уведомление, что температура подачи такая-то, температура в помещении такая-то. в итоге имеем 2 термистора. 

Отправка смс на 2 номера. Также чтоб отправляла смс со значениями температур при входящем вызове с указанных номеров, позвонили, модуль определил номер, если номер хозяина, сбрасываем вызов и отправляем смс с температурами. Помогите, совсем не шарю, но попробую разобраться в готовом скетче, в наличие m590 ардуино уно, микро про, и 2 NTC датчика.

Заранее благодарен

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

а дс1820 ??

nokiabox
Offline
Зарегистрирован: 22.07.2016

Short Circuit пишет:

а дс1820 ??

не совсем понял вопрос? нету у меня такого датчика, живу у черта на рогах, купить негде, есть только обычные NTC датчики, на днях отключился котел при минус 20, нет возможности туда постоянно ездить проверять, в доме никто не проживает

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

ардуино есть, а дс1820 нету?  его проще чем ардуино достать, намного.

nokiabox
Offline
Зарегистрирован: 22.07.2016

Short Circuit пишет:

ардуино есть, а дс1820 нету?  его проще чем ардуино достать, намного.

ну ардуину ка-то давно на али купил, а датчики только на али могу купить, но нет времени ждать, ну или в город ехать за 200 км

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Всем привет, помогите дорабоать код, есть GSM розетка, собиралась для вкл выкл и перезагрузки  роутера, сервера и чего угодно)
Хотелось бы сделать еще одну розетку которая могла бы не только реагировать на команды (ON,OFF,REB) но и по запросу (#temp) передавала температуру в смс ( temp: 24°C).
Вот собственно код, может кому тоже пригодиться)) датчик температуры есть dht11 можно и DS18B20
 

#include <SoftwareSerial.h>
#include <EEPROM.h>
SoftwareSerial mySerial(2, 3); // M590

String val = "";
String master = "+77777777777";
int Pins[] = {4, 5, 6, 7}; // Массив задействованных номеров Pins Arduino, для управления реле. 
int PinStatus[4]; // Массив для фиксации изменений.
int numPins = 4; // количество выходов
int ch = 0; 

void setup() {
  delay(2000);  //время на инициализацию модуля
  Serial.begin(9600);  //скорость порта
  Serial.println("GSM rozetka");
  mySerial.begin(19200);
  delay(200);
  mySerial.println("AT+CSQ");          //вывести в терминал уровень сигнала (если 99, то связи нет)
  delay(100);
  //mySerial.begin(19200); delay(200); mySerial.println("AT+IPR=9600");delay(200);mySerial.begin(38400);delay(200); mySerial.println("AT+IPR=9600");delay(200);mySerial.begin(57600);delay(200); mySerial.println("AT+IPR=9600");delay(200);mySerial.begin(74880);delay(200); mySerial.println("AT+IPR=9600");delay(200);mySerial.begin(115200); delay(200);mySerial.println("AT+IPR=9600");delay(200);
  mySerial.println("AT+CSQ");          //вывести в терминал уровень сигнала (если 99, то связи нет)
  delay(200);
  mySerial.println("AT+CLIP=1");  //включаем АОН
  delay(200);
  mySerial.println("AT+CMGF=1");  //режим кодировки СМС - обычный (для англ.)
  delay(200);
  mySerial.println("AT+CSCS=\"GSM\"");  //режим кодировки текста
  delay(200);
  mySerial.println("AT+CNMI=2,2"); //вывод сообщений 
  delay(200);  
  for(int i = 0; i <= numPins -1; i++)
    {
    pinMode(Pins[i],OUTPUT); 
    PinStatus[i]=EEPROM.read( i + 10 ); 
    digitalWrite(Pins[i],PinStatus[i]);  
    delay(10); 
    }
}

void loop() {
  if (mySerial.available()) 
  {  //если GSM модуль что-то послал нам, то
    delay(200);
    while (mySerial.available()) //сохраняем входную строку в переменную val
      {  
      ch = mySerial.read();
      val += char(ch);
      delay(10);
      }
   
   if (val.indexOf("+CMT") > -1) // если пришло смс
      {  
      Serial.println(val);  //печатаем в монитор порта пришедшую смску 
     // if (val.indexOf(master) > -1) // если смс от мастера
      //  { 
        if (val.indexOf("#") > -1) //если в смс есть символ #
          {
         if (val.indexOf("on") > -1) //a1 - вкл, a0 - выкл
            {  
            PinStatus[0] = HIGH; 
            digitalWrite(Pins[0],PinStatus[0]); 
            EEPROM.write(10,PinStatus[0]);  //сохраняем состояние пина в энергонезависимую память
            Serial.println("1 ON");
            }
         if (val.indexOf("off") > -1) 
            {
            PinStatus[0] = LOW; 
            digitalWrite(Pins[0],PinStatus[0]); 
            EEPROM.write(10,PinStatus[0]);   
            Serial.println("1 OFF");
            }

 if (val.indexOf("reb") > -1) 
            {
             
            digitalWrite(Pins[0],LOW); 
            EEPROM.write(10,PinStatus[0]);
            delay(1000);  
            digitalWrite(Pins[0],HIGH); 
            EEPROM.write(10,PinStatus[0]);   
            Serial.println("reboot");
            }
            
         if (val.indexOf("b1") > -1)
            {  
            PinStatus[1] = HIGH; 
            digitalWrite(Pins[1],PinStatus[1]); 
            EEPROM.write(11,PinStatus[1]);  
            Serial.println("2 ON");
            }
         if (val.indexOf("b0") > -1) 
            {
            PinStatus[1] = LOW; 
            digitalWrite(Pins[1],PinStatus[1]); 
            EEPROM.write(11,PinStatus[1]);   
            Serial.println("2 OFF");
            }
         if (val.indexOf("c1") > -1)
            {  
            PinStatus[2] = HIGH; 
            digitalWrite(Pins[2],PinStatus[2]); 
            EEPROM.write(12,PinStatus[2]);  
            Serial.println("3 ON");
            }
         if (val.indexOf("c0") > -1) 
            {
            PinStatus[2] = LOW; 
            digitalWrite(Pins[2],PinStatus[2]); 
            EEPROM.write(12,PinStatus[2]);   
            Serial.println("3 OFF");
            }
         if (val.indexOf("d1") > -1)
            {  
            PinStatus[3] = HIGH; 
            digitalWrite(Pins[3],PinStatus[3]); 
            EEPROM.write(13,PinStatus[3]);  
            Serial.println("4 ON");
            }
         if (val.indexOf("d0") > -1) 
            {
            PinStatus[3] = LOW; 
            digitalWrite(Pins[3],PinStatus[3]); 
            EEPROM.write(13,PinStatus[3]);   
            Serial.println("4 OFF");
            }
          }
          
      }
    else
      Serial.println(val); 
    val = "";
  }
}

 

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Можете помочь?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

вы же готовое ищите, сами даже не пытаетесь чтото сделать..

таким помогают за вознаграждание..

nokiabox
Offline
Зарегистрирован: 22.07.2016

Я так и не нашел помощи как передать инфу с NTC датчика по смс, сижу вот тыкаюсь, но знаний нет, читаю описание в разделе "программирование", датчик температуры подключил, поставил 2 светодиода, поставил условие на включение лед 1, если температура ниже заданного значения и условие на включение светодиода 2, если температура выше заданной.На этом с датчиком температуры пока остановился.  Нашел простенький скетч для отправки смс по условию, там в примере условием является нажатие кнопки, вроде все просто, но вот пока не получилось переделать, чтоб смс отправлялась после вызова, пока только светодиод зажигаю при входящем вызове, а вот смс отправить пока не получилось, но че-нить рожу в итоге, надеюсь

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

на что надеетесь?

странно както, народ ходит сюда  чтобы за них программу написали, странно  надеятся..

nokiabox
Offline
Зарегистрирован: 22.07.2016

Short Circuit пишет:

на что надеетесь?

странно както, народ ходит сюда  чтобы за них программу написали, странно  надеятся..

 

проще же ничего не делать ))))

 

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

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

запуск обратно - если температура вернулась в норму.

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

nokiabox
Offline
Зарегистрирован: 22.07.2016

Всем привет, возможно ли пользовать этот модуль с китайской ардуино про микро? 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

Gres пишет:

Я так передаю, с аналогового датчика:

void sms(String text, String phone)  //Функция отправки SМS
{
  Serial.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  Serial.print(text);
  delay(500);
  Serial.print((char)26);
  delay(2000);

}




        if (val.indexOf("7xxxxxxxxxx") > -1) {  //если номер звонящего наш. Укажите свой номер без "+"
        Serial.println("ATH0");  //разрываем связь
        delay(1000);

          int tempmotor =0;
          for (int i=0; i<=99; i++){
          tempmotor = tempmotor + analogRead(temp_motor);
          }
         tempmotor=((tempmotor/100)*0.00488)*100;
        
        float akbvoltage =0;
        for (int i=0; i<=99; i++){
        akbvoltage = akbvoltage + analogRead(akb_voltage);  //Для усреднения значения делаем 100 измерений
        }
        
        akbvoltage=(((akbvoltage/100)*0.00488)/0.05)*0.2015; //Вычисляем среднее измеренное значение, потом пересчитываем значение из диапазона от 0 до 5 вольт,
                                                             
        String sms_string = "Statistic:"+'\n';
        sms_string = sms_string + "Motor T= "+tempmotor+'C'+'\n'+"Battery U= "+akbvoltage+'V';
        sms(String(sms_string), String("+7xxxxxxxxxx"));  //отправляем СМС на номер +7xxxxxxxxxx
      }

 

насколько точно и стабильно получается?

нет ли сбоем при длинном проводе метров 10-15?

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Short Circuit пишет:

вы же готовое ищите, сами даже не пытаетесь чтото сделать..

таким помогают за вознаграждание..

Я написал прошу помочь а не написать за меня, куда смотреть и как лучше сделать, может где ошибки или еще что то. Всем так нравится писать что то вроде ( вот, всем готовое давай бла бла, зачем вообще отвечать тогда? если все так разбирются и круты) вместо того чтобы ответить нужно копать туда, смотри сюда, и т д, вести дилог на форуме так сказать. Люди учаться, деляться мнение, другие что то узнают. Я просто попросил помощи, может что то упустил ,чтобы те кто знают ткнули туда где что то не понял.

nokiabox
Offline
Зарегистрирован: 22.07.2016

7am пишет:

Short Circuit пишет:

вы же готовое ищите, сами даже не пытаетесь чтото сделать..

таким помогают за вознаграждание..

Я написал прошу помочь а не написать за меня, куда смотреть и как лучше сделать, может где ошибки или еще что то. Всем так нравится писать что то вроде ( вот, всем готовое давай бла бла, зачем вообще отвечать тогда? если все так разбирются и круты) вместо того чтобы ответить нужно копать туда, смотри сюда, и т д, вести дилог на форуме так сказать. Люди учаться, деляться мнение, другие что то узнают. Я просто попросил помощи, может что то упустил ,чтобы те кто знают ткнули туда где что то не понял.

 

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

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

nokiabox пишет:

7am пишет:

Short Circuit пишет:

вы же готовое ищите, сами даже не пытаетесь чтото сделать..

таким помогают за вознаграждание..

Я написал прошу помочь а не написать за меня, куда смотреть и как лучше сделать, может где ошибки или еще что то. Всем так нравится писать что то вроде ( вот, всем готовое давай бла бла, зачем вообще отвечать тогда? если все так разбирются и круты) вместо того чтобы ответить нужно копать туда, смотри сюда, и т д, вести дилог на форуме так сказать. Люди учаться, деляться мнение, другие что то узнают. Я просто попросил помощи, может что то упустил ,чтобы те кто знают ткнули туда где что то не понял.

 

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

Да прям будто все такие умные сидят и ждут кто не понимает или где то запутался, что бы написать подобные высказывания, это ФОРУМ, обсуждения и место чтобы делитсья опытом, обмениваться знаниями а не мериться *** и показывать у кого какое эго, будто у всех такие проекты авторские   аля "как автоматизировать атомный реактор" мол не покажу не подскажу, киньте монетку. А ты делал что то подобное уже с температурой?

nokiabox
Offline
Зарегистрирован: 22.07.2016

7am пишет:

Да прям будто все такие умные сидят и ждут кто не понимает или где то запутался, что бы написать подобные высказывания, это ФОРУМ, обсуждения и место чтобы делитсья опытом, обмениваться знаниями а не мериться *** и показывать у кого какое эго, будто у всех такие проекты авторские   аля "как автоматизировать атомный реактор" мол не покажу не подскажу, киньте монетку. А ты делал что то подобное уже с температурой?

 

Не, у меня все попроще и не так наворочено, я сделал исходящий вызов на номер хозяина, при снижении температуры подачи воды в батареи с котла (использовал обычный термистор), добавил дисплей 1602, с выводом текущей температуры в помещении и температуры подачи воды из котла, светодиод, тип когда температура упала, зажигается светодиод, на дисплее появляется надпись Авария - звонок ну модуль звонит мне на номер. В целом девайс уже помог, падало давление в системе и котел выключался, после выключения котла, соответственно падала температура подачи (трубы пластик) падала быстро, приезжал и подпитывал, в итоге обнаружил, что давление падает в кухне, где-то течь в стене, пока кухню отрубил, ща все в норме, придется по теплу бить стену

:-( 

А второй модуль поставил на ворота, при звонке с 3-х мастеров номеров открываются въездные ворота во двор. Поставил симку без абонетской платы, забросил туда 7 баксов и оператор в итоге кинул меня на бабло,списали деньги за якобы подключенную мною лично какую-то там услугу, беда только в том что у модуля нет кнопок и дисплея, чтоб что-то подтвердить и подключить, лохотронщики, бабки обещали вернуть через 30 дней после разбирательства

Я вообще новичек в ардуино, потихоньку вникаю в свободное время