Официальный сайт компании Arduino по адресу arduino.cc
помогите добавить новую функцию в скетч.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Сб, 05/11/2016 - 21:08
нужно добавить определение баланса и отправки его по смс
в этот код
#include <SoftwareSerial.h> #include "DHT.h" #define DHTPIN 7 // pin на котором висит датчик температуры #define DHTTYPE DHT22 // DHT 22 тип датчика //Отсылается смс в формате: //влажность;температура;устройство1;устройство2;устройство3;устройство4;Контроль периметра;Состояние периметра;Контроль автотемпературы;Установленная температура;STEWARD; int greenLed = 13; // Зеленый светодиод на PIN13 int powerGSM = 6; // Пин включения GSM int unit1 = 8; // Управляемое устройство 1 int unit2 = 9; // Управляемое устройство 2 int unit3 = 10; // Управляемое устройство 3 int unit4 = 11; // Управляемое устройство 4 int perimetr = 12; // Датчик периметра 220 Ом к +5V String statusHome; int t=0; unsigned long currentTime; unsigned long loopTime; boolean unit1status = false; //Управляемое устройство 1 boolean unit2status = false; //Управляемое устройство 2 boolean unit3status = false; //Управляемое устройство 3 boolean unit4status = false; //Управляемое устройство 4 boolean isPerimetr = false; //Контроль периметра boolean sendSMS = false; //Для проверки что смс отсылаем только один раз boolean isAuto = false; //Автоматическое управление температурой int autoTemp = 0; int delta=2; DHT dht(DHTPIN, DHTTYPE); SoftwareSerial mySerial(2, 3);// RX, TX boolean prevBtn = LOW; String currStr = ""; // Переменная принимает значение True, если текущая строка является сообщением boolean isStringMessage = false; void setup() { pinMode(unit1, OUTPUT); pinMode(unit2, OUTPUT); pinMode(unit3, OUTPUT); pinMode(unit4, OUTPUT); pinMode(powerGSM, OUTPUT); pinMode(perimetr, INPUT); pinMode(greenLed, OUTPUT); digitalWrite(unit1, LOW); digitalWrite(unit2, LOW); digitalWrite(unit3, LOW); digitalWrite(unit4, LOW); digitalWrite(powerGSM, LOW); digitalWrite(greenLed, LOW); //Включаю GSM Модуль digitalWrite(powerGSM, HIGH); delay(1000); digitalWrite(powerGSM, LOW); delay(5000); mySerial.begin(960); delay(300); // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку mySerial.begin(9600); mySerial.println("AT+CMGF=1"); //режим кодировки СМС - обычный (для англ.) delay(100); mySerial.println("AT+CLIP=1"); //включаем АОН delay(100); mySerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста delay(100); mySerial.println("AT+CMGL=ALL"); delay(300); mySerial.println("AT+CNMI=2,2"); delay(300); //Инициализация температурного датчика Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); delay(3000); // ParseSMS("1;20;0;1;1;1;1"); currentTime = millis(); loopTime = currentTime; } void GetDatchik() { // Пол // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); float t = dht.readTemperature(); // check if returns are valid, if they are NaN (not a number) then something went wrong! if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { statusHome = int(h)+String(";")+int(t)+String(";")+int(unit1status)+String(";")+int(unit2status)+String(";")+int(unit3status)+String(";")+int(unit4status)+String(";")+int(isPerimetr)+String(";")+digitalRead(perimetr)+String(";")+int(isAuto)+String(";")+int(autoTemp)+String(";STEWART"); sendTextMessage(statusHome); Serial.print("H"); //Влажность Serial.print(h); Serial.print(";"); Serial.print("T"); //Температура Serial.print(t); Serial.println(";"); Serial.println(statusHome); } } void loop(){ // delay(5000); // GetDatchik(); int sostPerimetr; //Состояние периметра if (mySerial.available()){ char currSymb = mySerial.read(); // Serial.print(currSymb); // return; // char currSymb = gprsSerial.read(); // Serial.println(currSymb); if ('\r' == currSymb) { if (isStringMessage) { //если текущая строка - SMS-сообщение, //отреагируем на него соответствующим образом if (!currStr.compareTo("STATUS")){ GetDatchik();} else if (currStr.startsWith("0")||currStr.startsWith("1")) { ParseSMS(currStr);} isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } } // Контроль периметра!!! if (isPerimetr) { //Проверка Включен ли контроль периметра digitalWrite(greenLed, HIGH); sostPerimetr = digitalRead(perimetr); if (sostPerimetr==LOW) { //Проверка на разомкнутый периметр digitalWrite(greenLed, LOW); delay(200); digitalWrite(greenLed, HIGH); delay(200); //и отсылаем СМС if (sendSMS==false){ sendTextMessage("WARNING! The perimeter of the broken!"); sendSMS=true; } } } else { digitalWrite(greenLed, LOW); sendSMS==false; } // Контроль температуры!!! if (isAuto==true) { //Проверка Включен автоуправление батареями //Замер температуры можно проводить не чаще раз в 5 минут currentTime = millis(); if(currentTime >= (loopTime + 60000)){ t = int(dht.readTemperature()); loopTime = currentTime; } // Serial.print("t="); // Serial.println(t); // Serial.print("autoTemp+delta="); // Serial.println(autoTemp+delta); if (t > autoTemp+delta) { if ( unit1status==true){ digitalWrite(unit1, LOW); unit1status=false; } if ( unit2status==true){ digitalWrite(unit2, LOW); unit2status=false; } if ( unit3status==true){ digitalWrite(unit3, LOW); unit3status=false; } if ( unit4status==true){ digitalWrite(unit4, LOW); unit4status=false; } } else if (t < autoTemp-delta) { if ( unit1status==false){ digitalWrite(unit1, HIGH); unit1status=true; } if ( unit2status==false){ digitalWrite(unit2, HIGH); unit2status=true; } if ( unit3status==false){ digitalWrite(unit3, HIGH); unit3status=true; } if ( unit4status==false){ digitalWrite(unit4, HIGH); unit4status=true; } } } } void ParseSMS(String currStr) { int firstSemicolon; //Распарсиваем SMS firstSemicolon = 1;//находим первую ; //Получаем значение Автоматического режима контроля температуры // if (currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0"){ if (currStr.substring(0,1) == "0"){ isAuto=false; } else { isAuto=true; } // Serial.println(currStr.substring(0,1)); // Serial.print("isAuto="); // Serial.println(isAuto); firstSemicolon = currStr.indexOf(';'); //Получаем значение Автоматического уровня температуры autoTemp = stringToNumber(currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 ))); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); // Serial.println(autoTemp); //Получаем значение Контроля периметра if (currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0"){ isPerimetr=false; } else { isPerimetr=true; } // Serial.println(isPerimetr); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Устройства 1 if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){ unit1status=false; digitalWrite(unit1, LOW); Serial.println("1 OFF"); } else { unit1status=true; digitalWrite(unit1, HIGH); Serial.println("1 ON"); } firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Устройства 2 if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){ unit2status=false; digitalWrite(unit2, LOW); Serial.println("2 OFF"); } else { unit2status=true; digitalWrite(unit2, HIGH); Serial.println("2 ON"); } firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Устройства 3 if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){ unit3status=false; digitalWrite(unit3, LOW); Serial.println("3 OFF"); } else { unit3status=true; digitalWrite(unit3, HIGH); Serial.println("3 ON"); } firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Устройства 4 if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")&&(isAuto==false)){ unit4status=false; digitalWrite(unit4, LOW); Serial.println("4 OFF"); } else { unit4status=true; digitalWrite(unit4, HIGH); Serial.println("4 ON"); } } /* * Функция отправки SMS-сообщения */ void sendTextMessage(String text) { // Устанавливает текстовый режим для SMS-сообщений mySerial.print("AT+CMGF=1\r"); delay(100); // даём время на усваивание команды // Устанавливаем адресата: телефонный номер в международном формате mySerial.println("AT + CMGS = \"+79677360000\""); //Телефон нужно откорректировать delay(100); // Пишем текст сообщения mySerial.println(text); delay(100); // Отправляем Ctrl+Z, обозначая, что сообщение готово mySerial.println((char)26); delay(300); Serial.print("sendTextMessage FINISH"); } //Функция преобразовангия STRING в INT int stringToNumber(String thisString) { int i, value = 0, length; length = thisString.length(); for(i=0; i<length; i++) { value = (10*value) + thisString.charAt(i)-(int) '0';; } return value; }
нашел вот этот код но как вставить непонял
в терминал приходит ответ вот такового вида
+CUSD: 0," Vash balans 0.23 r.
Poluchite 500 rublej na schet za znanie russkogo! Podklyuchit': *310#",15
как этот баланс 0.23 отправить в смс по в функции balanse(); ?????
Только не проверял --- библиотеки не хочу качать...
Если тот код где запрос баланса рабочий, тут тоже должно заработать.
При отправке СМС команды "BALANSE" - должен прилететь ответ, если не ошибаюсь просто тоже сообщение что и пришло GSM модулю.
if
(currentTime >= (loopTime + 60000))
if
(currentTime >= (loopTime + 60000))
Откуда столько дебилов.
Для последующих тупых пенсионеров возомнивших себя гУРУ.
http://www.viva64.com/ru/t/0064/ - изучайте порядок.
Ты ведь первый в очереди дибилов. http://arduino.ru/forum/programmirovanie/pomogite-so-skobkami-0#comment-...
спаасибо за помощь, но непроходит. идет без остановки запрос баланса
161
if
(currStr.compareTo(
"BALANSE"
)) {
замени на
161
if
(!currStr.compareTo(
"BALANSE"
)) {
p.masyukov, в строке 219 тоже ошибку исправляй, должно быть:
if
(currentTime -
loopTime
> 60000)Если нет сброса или обнуления значений переменных времени, то есть при переполнении loopTime и устройство будет работать более 49 дней без перезагрузки, то замени на строке 219 код на
if
(currentTime -
loopTime
> 60000)И перенеси currentTime = millis(); в начало функции loop, который в свой очередь оберни в цикл while(1)
непроходит.
нашел в инете еще код. там баланс приходит уже после того как смс со статусом уйдет . как его исправить
Не проходит что?
В сериал порт выводит сообщение с текстом ответа на запрос баланса?
нет. непроходит
нет. непроходит
Если отправляешь смс BALANSE
В сериал порт что выводит ?
GSM какой? SIM800l или M590 ?
M590
DHTxx test! и все. пусто
mySerial.println(
"ATD*102#"
);
//запрос баланса
Где *102# замени на запрос для своего оператора - например *100#; (в конце не забудь ; )
Должно выглядеть так:
mySerial.println(
"ATD*100#;"
);
//запрос баланса
А вот с чтением не помогу..
Почитай тут может есть http://www.2150692.ru/faq/36-otpravka-sms-cherez-arduino-i-gsm-modul-neoway-m590
набор номера. (";" обязательно)
Модуль позвонит по указанному номеру и вернет один из вариантов
BUSY - номер занят
NO DIALTONE - нет сигнала на линии
NO CARRIER - нет сети или другая проблема (например, нет денег на счету)
NA ANSWER - нет ответа
CONNECT - есть контакт!
может этот исправить будет легче. там все отображается, но вот только баланс приходит с опозданием.
там идет в мониторе такого формата
+CMT: "+79677364050",,"16/11/07,00:22:02+32"
Zapros
Read failRead failRead failRead failUnit1status=0
Unit2status=0
Unit3status=0
Unit4status=0
Temperature street=0.00
Vlazhnost street=nan
Pressure=719.02
sendTextMessage FINISHMessage send: Valdai;0;0;0;0;21;31;0;0;0;0;0;0;0;0;0;;0;0;719;0
ATD#102#
+CUSD: 0," Vash balans -13.10 r.
Gudok "Ty ne takoj"
а мне нужно чтобы баланс успел попасть так
+CMT: "+79677364050",,"16/11/07,00:22:02+32"
Zapros
ATD#102#
+CUSD: 0," Vash balans 13.10 r.
Gudok "Ty ne takoj"
Read failRead failRead failRead failUnit1status=0
Unit2status=0
Unit3status=0
Unit4status=0
Temperature street=0.00
Vlazhnost street=nan
Pressure=719.02
sendTextMessage FINISHMessage send: Valdai;0;0;0;0;21;31;0;0;0;0;0;0;0;0;0;13;0;0;719;0
Что значит с опозданием?
я наглядно показал как идет, и как мне надо
мне нужно чтобы было так
+CMT: "+79677364050",,"16/11/07,00:22:02+32"
Zapros
ATD#102#
+CUSD: 0," Vash balans 13.10 r.
Gudok "Ty ne takoj"
Read failRead failRead failRead failUnit1status=0
Unit2status=0
Unit3status=0
Unit4status=0
Temperature street=0.00
Vlazhnost street=nan
Pressure=719.02
sendTextMessage FINISHMessage send: Valdai;0;0;0;0;21;31;0;0;0;0;0;0;0;0;0;13;0;0;719;0
а идет сейчас так
+CMT: "+79677364050",,"16/11/07,00:22:02+32"
Zapros
Read failRead failRead failRead failUnit1status=0
Unit2status=0
Unit3status=0
Unit4status=0
Temperature street=0.00
Vlazhnost street=nan
Pressure=719.02
sendTextMessage FINISHMessage send: Valdai;0;0;0;0;21;31;0;0;0;0;0;0;0;0;0;;0;0;719;0
ATD#102#
+CUSD: 0," Vash balans 13.10 r.
Gudok "Ty ne takoj"
Тоесть ты хочешь в каждом сообщении отправлять балнс?
да, при каждом запросе, в ответ должен быть баланс
при команде Zapros
должен быть запрос баланса и ответ такого формата Valdai;0;0;0;0;21;31;0;0;0;0;0;0;0;0;0;13;0;0;719;0
Значит баланс нужно запрашивать в функции setup и помещать текст куда нибудь в переменную и обновлять после каждой отправки смс.
(ну или еще каждый день, в зависимости от тарифного плана)
посмотрите последнирй код пост #18 может поймете что там нетак
посмотрите последнирй код пост #18 может поймете что там нетак
Не. Я спать пошел.
Я уже написал выше - при инициализации запрашивать баланс и поместить в глобальную переменную.
После запрашивать после каждой отправки смс обновлять ту самую переменную, так как за смс сняли деньги...
да я тоже спать. завтра на работу. будет время посмотрите.
да я тоже спать. завтра на работу. будет время посмотрите.
Вам лучше в раздел "Ищу исполнителя", в любом случае мои GSM еще где то на почте валяются, а в слепую трудновато...
вообщем сам добился ответа баланса по запросу.
теперь другой вопрос: как прикрутить датчик движения в этот код?
а вот собственно визульное отображение скетча