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 а условие выше заданого значения поэтому смс отправляется по новому кругу пока не снизится температура.
Каждый раз, если температура больше предел+1, сбрасываем флаг и счетчик СМС ?
Нужно определить другое условие для сброса - например, температура стала меньше 50 (повтор отправки после возврата в норму). У меня когда то вышло что то такое: