Arduino Mega 2560+SIM 900+DS18B20 помогите поправить скетч.
- Войдите на сайт для отправки комментариев
Добрый вечер. Програмированием ни когда не занимался поэтому в этой теме я скажем мягко говоря валенок. Понадобилось для собственных нужд передать показания температуры и поуправлять пару реле через 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); //процедура отправки СМС
}
Ошибка в 169 строке.
Спасибо но я не пойму как ее изменить я понимаю что там должно быть == или < или > но все равно смс сыпится пачками пока температура не знизится до 50 градусов. И причину я тоже в принципе понял как только отправленно 3 смс так флаг отправки сбрасывает счетчик на 0 а условие выше заданого значения поэтому смс отправляется по новому кругу пока не снизится температура.
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); //отправка СМС с температурой } }