Система управления и мониторинга по СМС
- Войдите на сайт для отправки комментариев
Добрый вечер.
Вдохновленный трудами форумчан, решил собрать себе на лето систему полива по смс ну и так по мелочам .
Для это цели были приобретены
Ардуино uno
3 датчика температуры один на улицу другой в дом третий на подающую трубу газового котла Dh11
SIM900a mini без проблем адаптировал на наши сети
DC - понижающий на модуль SIM с 12в до 4.1в
Блок на 4 реле.
На данный момент сделано :
при отправки смс 1on 2on.....4on включает соответствующее реле
в ответ присылает отчет что реле включил
Для яблока есть смс командер там все смс можно прописать
Так же сделано если отправляешь allon или alloff выполняются действие со всеми реле.
По звонку на модуль звонок сбрасывается и выводится в монитор порта на отправку в смс не наладил,пока тестил весь баланс сожрал.






#include <SoftwareSerial.h> #include "stDHT.h" String statusHome; DHT sens(DHT11); // Указать датчик DHT11, DHT21 или DHT22. (несколько датчиков вписывать не нужно) // Подключать можно только одинаковые датчики, то есть нельзя использовать одновременно DHT11 и DHT22 SoftwareSerial GsmSerial(2, 3); // RX-2 pin, TX-3 pin String AdminPhone="79051111111"; // Телефон админа int pinReley1=8; // Номер порта светодиода, который будем включать/выключать int pinReley2=9; int pinReley3=10; int pinReley4=11; void setup() { pinMode(A0, INPUT); digitalWrite(A0, HIGH); pinMode(A1, INPUT); digitalWrite(A1, HIGH); pinMode(A2, INPUT); digitalWrite(A2, HIGH); pinMode(pinReley1, OUTPUT); // Режим порта на вывод pinMode(pinReley2, OUTPUT); pinMode(pinReley3, OUTPUT); pinMode(pinReley4, OUTPUT); digitalWrite(pinReley1, HIGH); digitalWrite(pinReley2, HIGH); digitalWrite(pinReley3, HIGH); digitalWrite(pinReley4, HIGH); Serial.begin(9600); GsmSerial.begin(9600); // Устанавливаем скорость связи Ардуино и модема GsmSerial.println("ATE0"); // выключаем эхо delay(100); GsmSerial.println("AT+CLIP=1"); // Включаем АОН delay(100); GsmSerial.println("AT+CMGF=1"); // Формат СМС = ASCII текст delay(100); GsmSerial.println("AT+CSCS=\"GSM\""); // Режим кодировки текста = GSM (только англ.) delay(100); GsmSerial.println("AT+CNMI=2,2"); // Текст смс выводится в com-порт delay(100); String str=""; while(str.indexOf("+COPS: 0") == -1) { // Ждем пока модем будет готов GsmSerial.println("AT+COPS?"); str=ReadCom(); delay(300); } } void loop() { String strSms = ReadCom(); // Читаем смс, если есть while (strSms.length()==0) { delay(500); strSms = ReadCom(); } // Если телефон админа, то читаем дальше if (strSms.indexOf(AdminPhone) > -1) { if (strSms.indexOf("+CMT") > -1) { // Если смс // Кодовое слово "1on" первое реле зажигаем if (strSms.indexOf("1on") > -1) { // Если обнаружено ключевое слово на включение digitalWrite(pinReley1,LOW); // Включаем 1реле SendSms("Reley1=on", AdminPhone); // Можем отправить смс, что включили Serial.println("Reley1=on"); } // Кодовое слово "1off" отключем первое реле if (strSms.indexOf("1off") > -1){ // Если обнаружено ключевое слово на выключение digitalWrite(pinReley1,HIGH); // Выключаем светодиод SendSms("Reley1=off", AdminPhone); // Можем отправить смс, что выключили Serial.println("Reley1=off"); } // Кодовое слово "2on" 2 реле зажигаем if (strSms.indexOf("2on") > -1) { // Если обнаружено ключевое слово на включение digitalWrite(pinReley2,LOW); // Включаем светодиод SendSms("Reley2=on", AdminPhone); // Можем отправить смс, что включили Serial.println("Reley2=on"); } // Кодовое слово "2off" отключем первое реле if (strSms.indexOf("2off") > -1){ // Если обнаружено ключевое слово на выключение digitalWrite(pinReley2,HIGH); // Выключаем светодиод SendSms("Reley2=off", AdminPhone); // Можем отправить смс, что выключили Serial.println("Reley2=off"); } // Кодовое слово "3on" 3 реле зажигаем if (strSms.indexOf("3on") > -1) { // Если обнаружено ключевое слово на включение digitalWrite(pinReley3,LOW); // Включаем светодиод SendSms("Reley3=on", AdminPhone); // Можем отправить смс, что включили Serial.println("Reley3=on"); } // Кодовое слово "3off" отключем первое реле if (strSms.indexOf("3off") > -1){ // Если обнаружено ключевое слово на выключение digitalWrite(pinReley3,HIGH); // Выключаем светодиод SendSms("Reley3=off", AdminPhone); // Можем отправить смс, что выключили Serial.println("Reley3=off"); } // Кодовое слово "4on" первое реле зажигаем if (strSms.indexOf("4on") > -1) { // Если обнаружено ключевое слово на включение digitalWrite(pinReley4,LOW); // Включаем светодиод SendSms("Reley4=on", AdminPhone); // Можем отправить смс, что включили Serial.println("Reley4=on"); } // Кодовое слово "4off" отключем первое реле if (strSms.indexOf("4off") > -1){ // Если обнаружено ключевое слово на выключение digitalWrite(pinReley4,HIGH); // Выключаем светодиод SendSms("Reley4=off", AdminPhone); // Можем отправить смс, что выключили Serial.println("Reley4=off"); } // Кодовое слово "allon" все реле зажигаем if (strSms.indexOf("allon") > -1) { // Если обнаружено ключевое слово на включение digitalWrite(pinReley1,LOW); delay(1500); digitalWrite(pinReley2,LOW); delay(1500); digitalWrite(pinReley3,LOW); delay(1500); digitalWrite(pinReley4,LOW); // Включаем светодиод SendSms("Reley=all-on", AdminPhone); // Можем отправить смс, что включили Serial.println("Reley=all-on"); } // Кодовое слово "alloff" все реле зажигаем if (strSms.indexOf("alloff") > -1) { // Если обнаружено ключевое слово на включение digitalWrite(pinReley1,HIGH); delay(1500); digitalWrite(pinReley2,HIGH); delay(1500); digitalWrite(pinReley3,HIGH); delay(1500); digitalWrite(pinReley4,HIGH); // Включаем светодиод SendSms("Reley=all-on", AdminPhone); // Можем отправить смс, что включили Serial.println("Reley=all-on"); } } if (strSms.indexOf("RING") > -1) { // Если звонят (выполняется на каждый гудок) GsmSerial.println("ATD#100#;\r"); // делаем запрос баланса delay(2500); GsmSerial.println("ATH0"); // Сброс после гудка // Можем, что нибудь выполнить int t = sens.readTemperature(A0); // чтение датчика на пине 2 int h = sens.readHumidity(A0); // чтение датчика на пине 2 delay(2000); int t2 = sens.readTemperature(A1); // чтение датчика на пине 3 int h2 = sens.readHumidity(A1); // чтение датчика на пине 3 delay(2000); int t3 = sens.readTemperature(A2); // чтение датчика на пине 3 int h3 = sens.readHumidity(A2); // чтение датчика на пине 3 delay(2000); Serial.print("Home: "); Serial.print(h); Serial.print(" %"); Serial.print("Home: "); Serial.print(t); Serial.println(" C "); Serial.print("Out: "); Serial.print(h2); Serial.print(" %"); Serial.print("Out: "); Serial.print(t2); Serial.println(" C "); Serial.print("Kotel: "); Serial.print(h3); Serial.print(" %"); Serial.print("Out: "); Serial.print(t3); Serial.println(" C "); int Reley1status = digitalRead(8); // Получить состояние пина 8: int Reley2status = digitalRead(9); //Управляемое устройство 9 int Reley3status = digitalRead(10);//Управляемое устройство 10 int Reley4status = digitalRead(11);//Управляемое устройство 11 statusHome = String("Home")+int(h)+String("%")+String("Home")+int(t)+String("C")+String("Out")+int(h2)+String("%")+String("Out")+int(t2)+String("C")+String("Kotel")+int(h3)+String("%")+String("Kotel")+int(t3)+String("C")+int(Reley1status)+int(Reley2status)+int(Reley3status)+int(Reley4status); Serial.print(Reley1status); Serial.print(Reley2status); Serial.print(Reley3status); Serial.print(Reley4status); Serial.print(statusHome); //Serial.println("start call"); } if (strSms.indexOf("NO CARRIER") > -1){ // Если звонок окончен //SendSms("called", AdminPhone); // Можем отправить смс, что нам звонили Serial.println("end call"); } } } // Читает смс String ReadCom() { int chCode = 0; // Код символа String strSms = ""; // Текст if (GsmSerial.available()) { // Есть данные от модема delay(300); // Считываем смс с com-порта модема while (GsmSerial.available()) { // Если есть еще символы, то читаем chCode = GsmSerial.read(); // Считываем очередной символ strSms += char(chCode); // Добавляем к строке delay(10); } } if (strSms.length()>0) { Serial.println("++++++++++"); //Serial.println(); Serial.println(strSms.length()); Serial.println(strSms); } return strSms; } // Отправляет текст смс на определенный номер void SendSms(String text, String phone) { phone="+"+phone; GsmSerial.println("AT+CMGS=\"" + phone + "\""); // Заголовок АТ команды и номер телефона delay(500); GsmSerial.print(text); // Текст смс delay(500); GsmSerial.print((char)26); // Конец сообщения и отправляем смс delay(500); }#include <SoftwareSerial.h> #include "stDHT.h" String statusHome; DHT sens(DHT11); // Указать датчик DHT11, DHT21 или DHT22. (несколько датчиков вписывать не нужно) // Подключать можно только одинаковые датчики, то есть нельзя использовать одновременно DHT11 и DHT22 SoftwareSerial GsmSerial(2, 3); // RX-2 pin, TX-3 pin String AdminPhone="790511111111"; // Телефон админа int pinReley1=8; // Номер порта светодиода, который будем включать/выключать int pinReley2=9; int pinReley3=10; int pinReley4=11; int But1Pin = 4; // Подключаем кнопку к выходу 4 int But2Pin = 5; // Подключаем кнопку к выходу 5 int But3Pin = 6; // Подключаем кнопку к выходу 6 int But4Pin = 7; // Подключаем кнопку к выходу 7 int flag=0; //////////////////////////////////////////////////////////////////////////////////////////////////////// void setup() { pinMode(A0, INPUT); // Подключаем температурные датчики DHT11 на A0 digitalWrite(A0, HIGH); // На пин А0-5вольт pinMode(A1, INPUT); // Подключаем температурные датчики DHT11 на A0 digitalWrite(A1, HIGH); // На пин А0-5вольт pinMode(A2, INPUT); // Подключаем температурные датчики DHT11 на A0 digitalWrite(A2, HIGH); // На пин А0-5вольт pinMode(pinReley1, OUTPUT); // Режим порта реле1 на вывод pinMode(pinReley2, OUTPUT); // Режим порта реле2 на вывод pinMode(pinReley3, OUTPUT); // Режим порта реле3 на вывод pinMode(pinReley4, OUTPUT); // Режим порта реле4 на вывод digitalWrite(pinReley1, HIGH); // Режим порта реле1 выкл на старте digitalWrite(pinReley2, HIGH); // Режим порта реле2 выкл на старте digitalWrite(pinReley3, HIGH); // Режим порта реле3 выкл на старте digitalWrite(pinReley4, HIGH); // Режим порта реле4 выкл на старте pinMode(But1Pin, INPUT); // Режим порта кнопки1 на вход (на замыкание) pinMode(But2Pin, INPUT); // Режим порта кнопки2 на вход (на замыкание) pinMode(But3Pin, INPUT); // Режим порта кнопки3 на вход (на замыкание) pinMode(But4Pin, INPUT); // Режим порта кнопки4 на вход (на замыкание) /////////////////////////////////////////////////////////////////////////////////////////////// Serial.begin(9600); // Скорость порта 9600 GsmSerial.begin(9600); // Устанавливаем скорость связи Ардуино и модема GsmSerial.println("ATE0"); // выключаем эхо delay(100); GsmSerial.println("AT+CLIP=1"); // Включаем АОН delay(100); GsmSerial.println("AT+CMGF=1"); // Формат СМС = ASCII текст delay(100); GsmSerial.println("AT+CSCS=\"GSM\""); // Режим кодировки текста = GSM (только англ.) delay(100); GsmSerial.println("AT+CNMI=2,2"); // Текст смс выводится в com-порт delay(100); String str=""; while(str.indexOf("+COPS: 0") == -1) // Ждем пока модем будет готов { GsmSerial.println("AT+COPS?"); // Информация об операторе str=ReadCom(); delay(300); } } void loop() { String strSms = ReadCom(); // Читаем смс, если есть while (strSms.length()==0) { if(digitalRead(But1Pin) == HIGH && flag == 0) { digitalWrite(pinReley1, !digitalRead(pinReley1)); flag = 1; delay(500); } if(digitalRead(But1Pin) == LOW && flag == 1) { flag = 0; delay(500); int Reley1status = digitalRead(8); Serial.print(pinReley1); } if(digitalRead(But2Pin) == HIGH && flag == 0) { digitalWrite(pinReley2, !digitalRead(pinReley2)); flag = 1; delay(500); } if(digitalRead(But2Pin) == LOW && flag == 1) { flag = 0; delay(500); int Reley2status = digitalRead(9); Serial.print(pinReley2); } if(digitalRead(But3Pin) == HIGH && flag == 0) { digitalWrite(pinReley3, !digitalRead(pinReley3)); flag = 1; delay(500); } if(digitalRead(But3Pin) == LOW && flag == 1) { flag = 0; delay(500); int Reley3status = digitalRead(10); Serial.print(pinReley3); } if(digitalRead(But4Pin) == HIGH && flag == 0) { digitalWrite(pinReley4, !digitalRead(pinReley4)); flag = 1; delay(500); } if(digitalRead(But4Pin) == LOW && flag == 1) { flag = 0; delay(500); int Reley4status = digitalRead(11); Serial.print(pinReley4); } else delay(500); strSms = ReadCom(); } // Если телефон админа, то читаем дальше if (strSms.indexOf(AdminPhone) > -1) { if (strSms.indexOf("+CMT") > -1) // Если смс { // Кодовое слово "1on" первое реле зажигаем if (strSms.indexOf("1on") > -1) // Если обнаружено ключевое слово на включение { digitalWrite(pinReley1,LOW); // Включаем 1реле SendSms("Reley1=on", AdminPhone); // Можем отправить смс, что включили Serial.println("Reley1=on"); } // Кодовое слово "1off" отключем первое реле if (strSms.indexOf("1off") > -1) // Если обнаружено ключевое слово на выключение { digitalWrite(pinReley1,HIGH); // Выключаем светодиод SendSms("Reley1=off", AdminPhone); // Можем отправить смс, что выключили Serial.println("Reley1=off"); } // Кодовое слово "2on" 2 реле зажигаем if (strSms.indexOf("2on") > -1) // Если обнаружено ключевое слово на включение { digitalWrite(pinReley2,LOW); // Включаем светодиод SendSms("Reley2=on", AdminPhone); // Можем отправить смс, что включили Serial.println("Reley2=on"); } // Кодовое слово "2off" отключем первое реле if (strSms.indexOf("2off") > -1) // Если обнаружено ключевое слово на выключение { digitalWrite(pinReley2,HIGH); // Выключаем светодиод SendSms("Reley2=off", AdminPhone); // Можем отправить смс, что выключили Serial.println("Reley2=off"); } // Кодовое слово "3on" 3 реле зажигаем if (strSms.indexOf("3on") > -1) // Если обнаружено ключевое слово на включение { digitalWrite(pinReley3,LOW); // Включаем светодиод SendSms("Reley3=on", AdminPhone); // Можем отправить смс, что включили Serial.println("Reley3=on"); } // Кодовое слово "3off" отключем первое реле if (strSms.indexOf("3off") > -1) // Если обнаружено ключевое слово на выключение { digitalWrite(pinReley3,HIGH); // Выключаем светодиод SendSms("Reley3=off", AdminPhone); // Можем отправить смс, что выключили Serial.println("Reley3=off"); } // Кодовое слово "4on" первое реле зажигаем if (strSms.indexOf("4on") > -1) // Если обнаружено ключевое слово на включение { digitalWrite(pinReley4,LOW); // Включаем светодиод SendSms("Reley4=on", AdminPhone); // Можем отправить смс, что включили Serial.println("Reley4=on"); } // Кодовое слово "4off" отключем первое реле if (strSms.indexOf("4off") > -1) // Если обнаружено ключевое слово на выключение { digitalWrite(pinReley4,HIGH); // Выключаем светодиод SendSms("Reley4=off", AdminPhone); // Можем отправить смс, что выключили Serial.println("Reley4=off"); } // Кодовое слово "allon" все реле зажигаем if (strSms.indexOf("allon") > -1) // Если обнаружено ключевое слово на включение { digitalWrite(pinReley1,LOW); delay(1500); digitalWrite(pinReley2,LOW); delay(1500); digitalWrite(pinReley3,LOW); delay(1500); digitalWrite(pinReley4,LOW); SendSms("Reley=all-on", AdminPhone); Serial.println("Reley=all-on"); } // Кодовое слово "alloff" все реле зажигаем if (strSms.indexOf("alloff") > -1) // Если обнаружено ключевое слово на включение { digitalWrite(pinReley1,HIGH); delay(1500); digitalWrite(pinReley2,HIGH); delay(1500); digitalWrite(pinReley3,HIGH); delay(1500); digitalWrite(pinReley4,HIGH); // Включаем светодиод SendSms("Reley=all-on", AdminPhone); // Можем отправить смс, что включили Serial.println("Reley=all-on"); } //// Кодовое слово "bal" проверка баланса // if (strSms.indexOf("bal") > -1) // Если обнаружено ключевое слово на включение // GsmSerial.println("ATD#100#;\r"); // делаем запрос баланса // delay(5000); } } if (strSms.indexOf("RING") > -1) // Если звонят (выполняется на каждый гудок) { GsmSerial.println("ATD#100#;\r"); // делаем запрос баланса delay(2500); GsmSerial.println("ATH0"); // Сброс после гудка // Можем, что нибудь выполнить int t = sens.readTemperature(A0); // чтение датчика на пине 2 int h = sens.readHumidity(A0); // чтение датчика на пине 2 delay(2000); int t2 = sens.readTemperature(A1); // чтение датчика на пине 3 int h2 = sens.readHumidity(A1); // чтение датчика на пине 3 delay(2000); int t3 = sens.readTemperature(A2); // чтение датчика на пине 3 int h3 = sens.readHumidity(A2); // чтение датчика на пине 3 delay(2000); Serial.print("Home: "); Serial.print(h); Serial.print(" %"); Serial.print("Home: "); Serial.print(t); Serial.println(" C "); Serial.print("Out: "); Serial.print(h2); Serial.print(" %"); Serial.print("Out: "); Serial.print(t2); Serial.println(" C "); Serial.print("Kotel: "); Serial.print(h3); Serial.print(" %"); Serial.print("Out: "); Serial.print(t3); Serial.println(" C "); int Reley1status = digitalRead(8); // Получить состояние пина 8: int Reley2status = digitalRead(9); //Управляемое устройство 9 int Reley3status = digitalRead(10);//Управляемое устройство 10 int Reley4status = digitalRead(11);//Управляемое устройство 11 statusHome = String("Home")+int(h)+String("%")+String("Home")+int(t)+String("C")+String("Out")+int(h2)+String("%")+String("Out")+int(t2)+String("C")+String("Kotel")+int(h3)+String("%")+String("Kotel")+int(t3)+String("C")+int(Reley1status)+int(Reley2status)+int(Reley3status)+int(Reley4status); Serial.print(Reley1status); Serial.print(Reley2status); Serial.print(Reley3status); Serial.print(Reley4status); Serial.print(statusHome); SendSms((statusHome), AdminPhone); // Отправка смс со статусами //Serial.println("start call"); } if (strSms.indexOf("NO CARRIER") > -1) // Если звонок окончен { //SendSms("called", AdminPhone); // Можем отправить смс, что нам звонили Serial.println("end call"); } } // LOOP закрылся // Читает смс String ReadCom() { int chCode = 0; // Код символа String strSms = ""; // Текст if (GsmSerial.available()) // Есть данные от модема { delay(300); // Считываем смс с com-порта модема while (GsmSerial.available()) // Если есть еще символы, то читаем { chCode = GsmSerial.read(); // Считываем очередной символ strSms += char(chCode); // Добавляем к строке delay(10); } } if (strSms.length()>0) { Serial.println("++++++++++"); //Serial.println(); Serial.println(strSms.length()); Serial.println(strSms); } return strSms; } // Отправляет текст смс на определенный номер void SendSms(String text, String phone) { phone="+"+phone; GsmSerial.println("AT+CMGS=\"" + phone + "\""); // Заголовок АТ команды и номер телефона delay(500); GsmSerial.print(text); // Текст смс delay(500); GsmSerial.print((char)26); // Конец сообщения и отправляем смс delay(500); }Какое приложение на смартфоне используете? Проект, я так понимаю, не закончен...
При таком коде у вас очень скоро начнутся проблемы с памятью. Подозреваю, что уже сейчас переменные используют порядка 50% доступного ОЗУ.
Для того, чтобы решить проблему, вам надо:
а) перенести все статичные строки (команды модема, диагностические сообщения. тексты СМС) во флеш-память
б) перестать использовать класс String
Кроме того, в коде куча операторов delay. причем с большими задержками. Это означает, что например кнопки к этому скетчу уже не прикрутить.
Ну и сам код, сорри, выглядит как-то... - по-детски. что ли. Избегайте повторения одного и того же кода - если какой-то код встречается в программе больше двух раз - используйте циклы и подпрограммы. Переменные одинакового типа - команды модема, номера пинов и тп - организуйте в массивы и структуры.
При таком коде у вас очень скоро начнутся проблемы с памятью. Подозреваю, что уже сейчас переменные используют порядка 50% доступного ОЗУ.
Нет, пока всего только 33% что не так критично. Но согласен, если развивать проект то с объектом String скоро понадобится MEGA.
Кроме того, в коде куча операторов delay. причем с большими задержками. Это означает, что например кнопки к этому скетчу уже не прикрутить.
Дело не только в том что кнопки не прикрутить, тут еще беда в абсолютной нестабильности.
GsmSerial.println("AT+CMGS=\"" + phone + "\""); // Заголовок АТ команды и номер телефона delay(500); GsmSerial.print(text); // Текст смс delay(500); GsmSerial.print((char)26); // Конец сообщения и отправляем смс delay(500);А вы уверены что в течении delay(500) SIM ответит? И ответит правильно? То есть ответ вы не мониторите и надеетесь что всегда в ответ приходит ОК?
Причем у вас после всех обращений к SIM стоит delay а не разбор ответа модема.
Хотя в одном месте есть ожидание ответа, но тоже не есть правильно, причем тут оператор и готовность к работе?
while(str.indexOf("+COPS: 0") == -1) // Ждем пока модем будет готов { GsmSerial.println("AT+COPS?"); // Информация об операторе str=ReadCom(); delay(300); }У SIM900 есть команда AT+CPAS Информация о состояние модуля и ответы которые подучаем от SIM:
Благодарю за замечания. Я в курсе что там не идеал. С учетом того что это мой первый проект и летний период отработал на твёрдую 4ку. Было что пару раз зависим Gsm модуль. А так я в целом информацию по датчикам получаю полив включается. Единственное что не получилось реализовать так это открытие теплицы. И то проблем возникла в падении напряжения мотор стеклоподъемника бмв даже не дернулся на расстоянии 20м. В этом году кину старый акум рядом и драйвер мотора поставлю