помогите добавить новую функцию в скетч.
- Войдите на сайт для отправки комментариев
Сб, 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;
}
нашел вот этот код но как вставить непонял
#include <SoftwareSerial.h> SoftwareSerial gprsSerial(2, 3); String currStr = ""; void setup(){ Serial.begin(9600); gprsSerial.begin(9600); // Настраиваем приём сообщений // Между командами даём время на их обработку gprsSerial.println("AT+CMGF=1"); //устанавливает текстовый режим смс-сообщения delay(300); gprsSerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста delay(500); gprsSerial.println("AT+IFC=1,1"); //устанавливает программный контроль потоком передачи данных delay(300); gprsSerial.print("AT+CPBS="); //открывает доступ к данным телефонной книги gprsSerial.print((char)34); gprsSerial.print("SM"); // SIM-карты gprsSerial.print((char)34); gprsSerial.println(""); // gprsSerial.print((char)13); delay(300); gprsSerial.println("AT+CNMI=1,2,2,1,0");//включает оповещение о новых сообщениях, //новые сообщения приходят в следующем формате: // +CMT: "<номер телефона>", "", "<дата, время>", //а на следующей строчке с первого символа идёт содержимое сообщения delay(300); balance(); } void loop() { if (gprsSerial.available()){ char currSymb = gprsSerial.read(); if ('\r' == currSymb) { //если символ перевод каретки if (currStr.startsWith("+CUSD: 0,")) { int zzz = currStr.indexOf('UAH'); String balance=currStr.substring(10,zzz-3); //баланс на сим карте Serial.print(balance); } currStr = ""; } else if ('\n' != currSymb) { //если символ НЕ новая строка currStr += String(currSymb); } } } void balance () { gprsSerial.println("ATD*102#"); //запрос баланса delay(300); Serial.println("zapros balansa"); }в терминал приходит ответ вот такового вида
+CUSD: 0," Vash balans 0.23 r.
Poluchite 500 rublej na schet za znanie russkogo! Podklyuchit': *310#",15
как этот баланс 0.23 отправить в смс по в функции balanse(); ?????
#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 getBalanse() { mySerial.println("ATD*102#"); //запрос баланса delay(300); Serial.println("zapros balansa"); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////// 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(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////// if (currStr.compareTo("BALANSE")) { getBalanse(); } else if(currStr.startsWith("+CUSD: 0,")) { int zzz = currStr.indexOf('UAH'); String balance=currStr.substring(10,zzz-3); //баланс на сим карте Serial.print(balance); // Возвращаем смс с балансом sendTextMessage(balance) } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////// 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; }Только не проверял --- библиотеки не хочу качать...
Если тот код где запрос баланса рабочий, тут тоже должно заработать.
При отправке СМС команды "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-...
спаасибо за помощь, но непроходит. идет без остановки запрос баланса
161if(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)
непроходит.
нашел в инете еще код. там баланс приходит уже после того как смс со статусом уйдет . как его исправить
/* --- */ #include <SoftwareSerial.h> #include "DHT.h" #include <Wire.h> #include <Adafruit_BMP085.h> #define DHT_1_PIN 4 #define DHT_2_PIN 5 #define DHT_3_PIN 6 #define DHT_4_PIN 7 // pin на котором висит датчик температуры #define DHT_5_PIN 9 // Датчик температуры на улице #define DHTTYPE DHT22 // DHT 22 тип датчика //Отсылается смс в формате: влажность;температура;устройство1;устройство2;устройство3;устройство4;Контроль периметра;Состояние периметра;Контроль автотемпературы;Установленная температура;STEWARD; int powerGSM = 8; // Пин включения GSM int unit1 = A1; // Террасса int unit2 = A2; // Ванна int unit3 = A3; // Гостинная int unit4 = A6; // Комната int unit5 = A7; // Роутер int perimetr = A0; // Датчик периметра int power = 10; // Контроль внешнего питания int svet = 11; // Включение света на терассе и крыльце int redLed = 13; // Cветодиод работы всего девайса String statusHome; int t1=0; int t2=0; int t3=0; int t4=0; int us1=0; int us2=0; int us3=0; int us4=0; int u1st; int u2st; int u3st; int u4st; int svetsost=0; char data;//Содержит символ полученый от сим модуля. unsigned long currentTime; unsigned long loopTime; unsigned long currentTimeGSM; unsigned long loopTimeGSM; boolean unit1status = false; // tersost boolean unit2status = false; // vannasost boolean unit3status = false; // gostinsost boolean unit4status = false; // roomsost boolean unit5status = false; // router int isPerimetr = 0; // Контроль периметра boolean sendSMS = false; // Для проверки что смс отсылаем только один раз boolean sendSMSPow = false; // Для проверки что смс отсылаем только один раз для цикл контроля питания int isAuto = 0; // Автоматическое управление температурой int autoTemp = 0; int delta = 2; DHT dht1(DHT_1_PIN, DHTTYPE); DHT dht2(DHT_2_PIN, DHTTYPE); DHT dht3(DHT_3_PIN, DHTTYPE); DHT dht4(DHT_4_PIN, DHTTYPE); DHT dht5(DHT_5_PIN, DHTTYPE); Adafruit_BMP085 bmp; SoftwareSerial gprsSerial(2, 3); String currStr = ""; String bal = ""; // Переменная принимает значение True, если текущая строка является сообщением boolean isStringMessage = false; void setup() { pinMode(unit1, OUTPUT); pinMode(unit2, OUTPUT); pinMode(unit3, OUTPUT); pinMode(unit4, OUTPUT); pinMode(unit5, OUTPUT); pinMode(powerGSM, OUTPUT); pinMode(perimetr, INPUT); pinMode(svet, OUTPUT); pinMode(redLed, OUTPUT); digitalWrite(unit1, LOW); digitalWrite(unit2, LOW); digitalWrite(unit3, LOW); digitalWrite(unit4, LOW); digitalWrite(svet, LOW); digitalWrite(powerGSM, LOW); digitalWrite(redLed, LOW); Serial.begin(9600); //Включаю GSM Модуль delay(1000); digitalWrite(powerGSM, LOW); delay(1000); digitalWrite(powerGSM, HIGH); delay(1000); Serial.println("modem on"); gprsSerial.begin(9600); delay(500); // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку gprsSerial.println("AT+CMGF=1\r"); delay(100); gprsSerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста delay(100); gprsSerial.println("AT+IFC=1, 1\r"); delay(100); gprsSerial.println("AT+CPBS=\"SM\"\r"); delay(100); gprsSerial.println("AT+CNMI=1,2,2,1,0\r");//включает оповещение о новых сообщениях, delay(100); gprsSerial.println("ATD#102#\r"); delay(100); //Инициализация температурного датчика Serial.println("DHT22 test!"); dht1.begin(); !bmp.begin(); delay(3000); currentTime = millis(); loopTime = currentTime; currentTimeGSM = millis(); loopTimeGSM = currentTimeGSM; } void loop(){ currentTimeGSM = millis(); if(currentTimeGSM >= (loopTimeGSM + 600000)){ if (testGsmOn()==1){ gsmOn();} loopTimeGSM = currentTimeGSM;} int sostPerimetr; // Состояние периметра int sostPower; // Сосотояние внешнего питания if (gprsSerial.available()){ char currSymb = gprsSerial.read(); Serial.print(currSymb); // // return; // char currSymb = gprsSerial.read(); // Serial.println(gprsSerial.read()); // if ('\r' == currSymb) { if (isStringMessage) { //если текущая строка - SMS-сообщение, //отреагируем на него соответствующим образом if (!currStr.compareTo("Zapros")) { balance(); GetDatchik(); } else if (currStr.startsWith("Ardu")) { ParseSMS(currStr); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } } // Контроль периметра !!! if (isPerimetr==1){ //Проверка Включен ли контроль периметра digitalWrite(redLed, HIGH); sostPerimetr = digitalRead(perimetr); if (sostPerimetr==LOW){ //Проверка на разомкнутый периметри отсылаем СМС // и отсылаем СМС if (sendSMS==false) { sendTextMessage("WARNING! Valdai door open!"); sendSMS=true; } } } else { digitalWrite(redLed, LOW); sendSMS=false; } // Контроль внешнего питания sostPower = digitalRead(power); if (sostPower==LOW) { //Проверка отключения внешнего питания if (sendSMSPow==false){ sendTextMessage("WARNING! Valdai, MAIN POWER OFF!"); sendSMSPow=true;} } else { sendSMSPow=false;} // Контроль температуры!!! if (isAuto==1) { //Проверка Включен автоуправление батареями // Замер температуры можно проводить не чаще раз в 5 минут currentTime = millis(); if(currentTime >= (loopTime + 10000)){ t1 = int(dht1.readTemperature()); t2 = int(dht2.readTemperature()); t3 = int(dht3.readTemperature()); t4 = int(dht4.readTemperature()); loopTime = currentTime; } // Serial.print("t="); // Serial.println(t); // Serial.print("autoTemp+delta="); // Serial.println(autoTemp+delta); if (unit1status==true){ if (t1 < autoTemp-delta){ digitalWrite(unit1, HIGH); us1=0;} else if (t1 > autoTemp+delta){ digitalWrite(unit1, LOW); us1=1;} } if (unit2status==true){ if (t2 < autoTemp-delta){ digitalWrite(unit2, HIGH); us2=0;} else if (t2 > autoTemp+delta){ digitalWrite(unit2, LOW); us2=1;} } if (unit3status==true){ if (t3 < autoTemp-delta){ digitalWrite(unit3, HIGH); us3=0;} else if (t3 > autoTemp+delta){ digitalWrite(unit3, LOW); us3=1;} } if (unit4status==true){ if (t4 < autoTemp-delta){ digitalWrite(unit4, HIGH); us4=0;} else if (t4 > autoTemp+delta){ digitalWrite(unit4, LOW); us4=1;} } } } void GetDatchik() { // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h1 = dht1.readHumidity(); float t1 = dht1.readTemperature(); float h2 = dht2.readHumidity(); float t2 = dht2.readTemperature(); float h3 = dht3.readHumidity(); float t3 = dht3.readTemperature(); float h4 = dht4.readHumidity(); float t4 = dht4.readTemperature(); float h5 = dht5.readHumidity(); float t5 = dht5.readTemperature(); float p1 = (bmp.readPressure()/133.3); u1st = unit1status - us1; u2st = unit2status - us2; u3st = unit3status - us3; u4st = unit4status - us4; Serial.print("Unit1status="); Serial.println(u1st); Serial.print("Unit2status="); Serial.println(u2st); Serial.print("Unit3status="); Serial.println(u3st); Serial.print("Unit4status="); Serial.println(u4st); Serial.print("Temperature street="); Serial.println(t5); Serial.print("Vlazhnost street="); Serial.println(h5); Serial.print("Pressure="); Serial.println(p1); // check if returns are valid, if they are NaN (not a number) then something went wrong! //if (isnan(t1) || isnan(h1)) { // Serial.println("Failed to read from DHT"); //} else { statusHome = String("Valdai")+String(";")+int(u1st)+String(";")+int(t1)+String(";")+int(h1)+String(";")+int(u2st)+String(";")+int(t2)+String(";")+int(h2)+String(";")+int(u3st)+String(";")+int(t3)+String(";")+int(h3)+String(";")+int(u4st)+String(";")+int(t4)+String(";")+int(h4)+String(";")+int(unit5status)+String(";")+int(isPerimetr)+String(";")+int(autoTemp)+String(";")+String(bal)+String(";")+int(t5)+String(";")+int(svetsost)+String(";")+int(p1)+String(";")+int(h5); sendTextMessage(statusHome); bal = ""; // Serial.flush(); Serial.print("Message send: "); // Serial.print("T-"); // Serial.print(t1); //Температура // Serial.print(";"); // Serial.print("H-"); // Serial.print(h1); //Влажность // Serial.println(";"); // Serial.print("Pressure:"); // Serial.print(p1); //атмосферное давление // Serial.print(" mm"); Serial.println(statusHome); // } } void ParseSMS(String currStr) { us1=0; us2=0; us3=0; us4=0; int firstSemicolon; //Распарсиваем SMS firstSemicolon = 1;//находим первую ; //Получаем значение Автоматического режима контроля температуры //Serial.println(currStr); firstSemicolon = currStr.indexOf(';'); //Получаем значение Автоматического уровня температуры autoTemp = stringToNumber(currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 ))); if (autoTemp > 0) { isAuto=1; } else { isAuto=0; } Serial.print("autoTemp="); Serial.println(autoTemp); Serial.print("isAuto="); Serial.println(isAuto); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Терассы if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){ unit1status=false; digitalWrite(unit1, LOW); Serial.println("Terassa OFF"); } else { unit1status=true; digitalWrite(unit1, HIGH); Serial.println("Terassa ON"); } Serial.print("Terassa="); Serial.println(unit1status); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Ванной if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){ unit2status=false; digitalWrite(unit2, LOW); Serial.println("Vanna OFF"); } else { unit2status=true; digitalWrite(unit2, HIGH); Serial.println("Vanna ON"); } Serial.print("Vanna="); Serial.println(unit2status); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Гостинная if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){ unit3status=false; digitalWrite(unit3, LOW); Serial.println("Gostin OFF"); } else { unit3status=true; digitalWrite(unit3, HIGH); Serial.println("Gostin ON"); } Serial.print("Gostin="); Serial.println(unit3status); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Комната if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){ unit4status=false; digitalWrite(unit4, LOW); Serial.println("Komnata OFF"); } else { unit4status=true; digitalWrite(unit4, HIGH); Serial.println("Komnata ON"); } Serial.print("Komnata="); Serial.println(unit4status); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Роутер if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){ unit5status=false; digitalWrite(unit5, LOW); Serial.println("Router OFF"); } else { unit5status=true; digitalWrite(unit5, HIGH); Serial.println("Router ON"); } Serial.print("Router="); Serial.println(unit5status); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Периметр if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 ))) == "0"){ isPerimetr=0; Serial.println("Perim OFF"); } else { isPerimetr=1; Serial.println("Perim ON"); } Serial.print("Perim="); Serial.println(isPerimetr); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение включение света if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 ))) == "0"){ svetsost=0; digitalWrite(svet, LOW); Serial.println("Svet OFF"); } else { svetsost=1; digitalWrite(svet, HIGH); Serial.println("Svet ON"); } Serial.print("Svet="); Serial.println(svetsost); } /* Функция отправки SMS-сообщения */ void sendTextMessage(String text) { // gprsSerial.println("AT+CMGF=1\r"); // delay(5000); // gprsSerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста // delay(5000); // Устанавливаем адресата: телефонный номер в международном формате gprsSerial.println("AT + CMGS = \"+79677364050\""); //Телефон нужно откорректировать delay(100); // Пишем текст сообщения gprsSerial.println(text); delay(100); // Отправляем Ctrl+Z, обозначая, что сообщение готово gprsSerial.println((char)26); delay(18000); Serial.print("sendTextMessage FINISH"); } void balance(){ // currStr = ""; // gprsSerial.println("AT+CMGF=1\r"); // delay(500); // gprsSerial.println("AT+CSCS=\"GSM\""); // delay(500); gprsSerial.println("ATD#102#\r"); while(gprsSerial.available()>0){ data = gprsSerial.read(); if(data == 'e'){ data = gprsSerial.read(); while(data != 'r'){ bal += data; data = gprsSerial.read();} Serial.print("BALANCE="); Serial.println(bal); return; } } delay(500); } int testGsmOn(){ //Функция опроса модема. Возвращает "0" если связь с модемом есть или "1" если нет. gprsSerial.println("AT"); delay(100); gprsSerial.println("AT"); delay(500); if(gprsSerial.available()>0){ return 0; } else { return 1; } } void gsmOn(){ //Функция включения модема. Serial.print(" TESTgsm= "); Serial.println(testGsmOn()); digitalWrite(powerGSM, HIGH); delay(800); digitalWrite(powerGSM, LOW); } //Функция преобразовангия 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; }Не проходит что?
В сериал порт выводит сообщение с текстом ответа на запрос баланса?
нет. непроходит
нет. непроходит
Если отправляешь смс 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 - есть контакт!
может этот исправить будет легче. там все отображается, но вот только баланс приходит с опозданием.
/* --- */ #include <SoftwareSerial.h> #include "DHT.h" #include <Wire.h> #include <Adafruit_BMP085.h> #define DHT_1_PIN 4 #define DHT_2_PIN 5 #define DHT_3_PIN 6 #define DHT_4_PIN 7 // pin на котором висит датчик температуры #define DHT_5_PIN 9 // Датчик температуры на улице #define DHTTYPE DHT22 // DHT 22 тип датчика //Отсылается смс в формате: влажность;температура;устройство1;устройство2;устройство3;устройство4;Контроль периметра;Состояние периметра;Контроль автотемпературы;Установленная температура;STEWARD; int powerGSM = 8; // Пин включения GSM int unit1 = A1; // Террасса int unit2 = A2; // Ванна int unit3 = A3; // Гостинная int unit4 = A6; // Комната int unit5 = A7; // Роутер int perimetr = A0; // Датчик периметра int power = 10; // Контроль внешнего питания int svet = 11; // Включение света на терассе и крыльце int redLed = 13; // Cветодиод работы всего девайса String statusHome; int t1=0; int t2=0; int t3=0; int t4=0; int us1=0; int us2=0; int us3=0; int us4=0; int u1st; int u2st; int u3st; int u4st; int svetsost=0; char data;//Содержит символ полученый от сим модуля. unsigned long currentTime; unsigned long loopTime; unsigned long currentTimeGSM; unsigned long loopTimeGSM; boolean unit1status = false; // tersost boolean unit2status = false; // vannasost boolean unit3status = false; // gostinsost boolean unit4status = false; // roomsost boolean unit5status = false; // router int isPerimetr = 0; // Контроль периметра boolean sendSMS = false; // Для проверки что смс отсылаем только один раз boolean sendSMSPow = false; // Для проверки что смс отсылаем только один раз для цикл контроля питания int isAuto = 0; // Автоматическое управление температурой int autoTemp = 0; int delta = 2; DHT dht1(DHT_1_PIN, DHTTYPE); DHT dht2(DHT_2_PIN, DHTTYPE); DHT dht3(DHT_3_PIN, DHTTYPE); DHT dht4(DHT_4_PIN, DHTTYPE); DHT dht5(DHT_5_PIN, DHTTYPE); Adafruit_BMP085 bmp; SoftwareSerial gprsSerial(2, 3); String currStr = ""; String bal = ""; // Переменная принимает значение True, если текущая строка является сообщением boolean isStringMessage = false; void setup() { pinMode(unit1, OUTPUT); pinMode(unit2, OUTPUT); pinMode(unit3, OUTPUT); pinMode(unit4, OUTPUT); pinMode(unit5, OUTPUT); pinMode(powerGSM, OUTPUT); pinMode(perimetr, INPUT); pinMode(svet, OUTPUT); pinMode(redLed, OUTPUT); digitalWrite(unit1, LOW); digitalWrite(unit2, LOW); digitalWrite(unit3, LOW); digitalWrite(unit4, LOW); digitalWrite(svet, LOW); digitalWrite(powerGSM, LOW); digitalWrite(redLed, LOW); Serial.begin(9600); //Включаю GSM Модуль digitalWrite(powerGSM, HIGH); delay(1000); digitalWrite(powerGSM, LOW); delay(5000); Serial.println("modem on"); gprsSerial.begin(9600); delay(500); // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку gprsSerial.println("AT+CMGF=1\r"); delay(100); gprsSerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста delay(100); gprsSerial.println("AT+IFC=1, 1\r"); delay(100); gprsSerial.println("AT+CPBS=\"SM\"\r"); delay(100); gprsSerial.println("AT+CNMI=1,2,2,1,0\r");//включает оповещение о новых сообщениях, delay(100); gprsSerial.println("ATD#102#\r"); delay(100); //Инициализация температурного датчика Serial.println("DHT22 test!"); dht1.begin(); !bmp.begin(); delay(3000); currentTime = millis(); loopTime = currentTime; currentTimeGSM = millis(); loopTimeGSM = currentTimeGSM; } void loop(){ currentTimeGSM = millis(); if(currentTimeGSM >= (loopTimeGSM + 600000)){ if (testGsmOn()==1){ gsmOn();} loopTimeGSM = currentTimeGSM;} int sostPerimetr; // Состояние периметра int sostPower; // Сосотояние внешнего питания if (gprsSerial.available()){ char currSymb = gprsSerial.read(); Serial.print(currSymb); // // return; // char currSymb = gprsSerial.read(); // Serial.println(gprsSerial.read()); // if ('\r' == currSymb) { if (isStringMessage) { //если текущая строка - SMS-сообщение, //отреагируем на него соответствующим образом if (!currStr.compareTo("Zapros")) { balance(); GetDatchik(); } else if (currStr.startsWith("Ardu")) { ParseSMS(currStr); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } } // Контроль периметра !!! if (isPerimetr==1){ //Проверка Включен ли контроль периметра digitalWrite(redLed, HIGH); sostPerimetr = digitalRead(perimetr); if (sostPerimetr==LOW){ //Проверка на разомкнутый периметри отсылаем СМС // и отсылаем СМС if (sendSMS==false) { sendTextMessage("WARNING! Valdai door open!"); sendSMS=true; } } } else { digitalWrite(redLed, LOW); sendSMS=false; } // Контроль внешнего питания sostPower = digitalRead(power); if (sostPower==LOW) { //Проверка отключения внешнего питания if (sendSMSPow==false){ sendTextMessage("WARNING! Valdai, MAIN POWER OFF!"); sendSMSPow=true;} } else { sendSMSPow=false;} // Контроль температуры!!! if (isAuto==1) { //Проверка Включен автоуправление батареями // Замер температуры можно проводить не чаще раз в 5 минут currentTime = millis(); if(currentTime >= (loopTime + 10000)){ t1 = int(dht1.readTemperature()); t2 = int(dht2.readTemperature()); t3 = int(dht3.readTemperature()); t4 = int(dht4.readTemperature()); loopTime = currentTime; } // Serial.print("t="); // Serial.println(t); // Serial.print("autoTemp+delta="); // Serial.println(autoTemp+delta); if (unit1status==true){ if (t1 < autoTemp-delta){ digitalWrite(unit1, HIGH); us1=0;} else if (t1 > autoTemp+delta){ digitalWrite(unit1, LOW); us1=1;} } if (unit2status==true){ if (t2 < autoTemp-delta){ digitalWrite(unit2, HIGH); us2=0;} else if (t2 > autoTemp+delta){ digitalWrite(unit2, LOW); us2=1;} } if (unit3status==true){ if (t3 < autoTemp-delta){ digitalWrite(unit3, HIGH); us3=0;} else if (t3 > autoTemp+delta){ digitalWrite(unit3, LOW); us3=1;} } if (unit4status==true){ if (t4 < autoTemp-delta){ digitalWrite(unit4, HIGH); us4=0;} else if (t4 > autoTemp+delta){ digitalWrite(unit4, LOW); us4=1;} } } } void GetDatchik() { // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h1 = dht1.readHumidity(); float t1 = dht1.readTemperature(); float h2 = dht2.readHumidity(); float t2 = dht2.readTemperature(); float h3 = dht3.readHumidity(); float t3 = dht3.readTemperature(); float h4 = dht4.readHumidity(); float t4 = dht4.readTemperature(); float h5 = dht5.readHumidity(); float t5 = dht5.readTemperature(); float p1 = (bmp.readPressure()/133.3); u1st = unit1status - us1; u2st = unit2status - us2; u3st = unit3status - us3; u4st = unit4status - us4; Serial.print("Unit1status="); Serial.println(u1st); Serial.print("Unit2status="); Serial.println(u2st); Serial.print("Unit3status="); Serial.println(u3st); Serial.print("Unit4status="); Serial.println(u4st); Serial.print("Temperature street="); Serial.println(t5); Serial.print("Vlazhnost street="); Serial.println(h5); Serial.print("Pressure="); Serial.println(p1); // check if returns are valid, if they are NaN (not a number) then something went wrong! //if (isnan(t1) || isnan(h1)) { // Serial.println("Failed to read from DHT"); //} else { statusHome = String("Valdai")+String(";")+int(u1st)+String(";")+int(t1)+String(";")+int(h1)+String(";")+int(u2st)+String(";")+int(t2)+String(";")+int(h2)+String(";")+int(u3st)+String(";")+int(t3)+String(";")+int(h3)+String(";")+int(u4st)+String(";")+int(t4)+String(";")+int(h4)+String(";")+int(unit5status)+String(";")+int(isPerimetr)+String(";")+int(autoTemp)+String(";")+String(bal)+String(";")+int(t5)+String(";")+int(svetsost)+String(";")+int(p1)+String(";")+int(h5); sendTextMessage(statusHome); bal = ""; // Serial.flush(); Serial.print("Message send: "); // Serial.print("T-"); // Serial.print(t1); //Температура // Serial.print(";"); // Serial.print("H-"); // Serial.print(h1); //Влажность // Serial.println(";"); // Serial.print("Pressure:"); // Serial.print(p1); //атмосферное давление // Serial.print(" mm"); Serial.println(statusHome); // } } void ParseSMS(String currStr) { us1=0; us2=0; us3=0; us4=0; int firstSemicolon; //Распарсиваем SMS firstSemicolon = 1;//находим первую ; //Получаем значение Автоматического режима контроля температуры //Serial.println(currStr); firstSemicolon = currStr.indexOf(';'); //Получаем значение Автоматического уровня температуры autoTemp = stringToNumber(currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 ))); if (autoTemp > 0) { isAuto=1; } else { isAuto=0; } Serial.print("autoTemp="); Serial.println(autoTemp); Serial.print("isAuto="); Serial.println(isAuto); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Терассы if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){ unit1status=false; digitalWrite(unit1, LOW); Serial.println("Terassa OFF"); } else { unit1status=true; digitalWrite(unit1, HIGH); Serial.println("Terassa ON"); } Serial.print("Terassa="); Serial.println(unit1status); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Ванной if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){ unit2status=false; digitalWrite(unit2, LOW); Serial.println("Vanna OFF"); } else { unit2status=true; digitalWrite(unit2, HIGH); Serial.println("Vanna ON"); } Serial.print("Vanna="); Serial.println(unit2status); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Гостинная if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){ unit3status=false; digitalWrite(unit3, LOW); Serial.println("Gostin OFF"); } else { unit3status=true; digitalWrite(unit3, HIGH); Serial.println("Gostin ON"); } Serial.print("Gostin="); Serial.println(unit3status); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Комната if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){ unit4status=false; digitalWrite(unit4, LOW); Serial.println("Komnata OFF"); } else { unit4status=true; digitalWrite(unit4, HIGH); Serial.println("Komnata ON"); } Serial.print("Komnata="); Serial.println(unit4status); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Роутер if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0")){ unit5status=false; digitalWrite(unit5, LOW); Serial.println("Router OFF"); } else { unit5status=true; digitalWrite(unit5, HIGH); Serial.println("Router ON"); } Serial.print("Router="); Serial.println(unit5status); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение Периметр if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 ))) == "0"){ isPerimetr=0; Serial.println("Perim OFF"); } else { isPerimetr=1; Serial.println("Perim ON"); } Serial.print("Perim="); Serial.println(isPerimetr); firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 ); //Получаем значение включение света if ((currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 ))) == "0"){ svetsost=0; digitalWrite(svet, LOW); Serial.println("Svet OFF"); } else { svetsost=1; digitalWrite(svet, HIGH); Serial.println("Svet ON"); } Serial.print("Svet="); Serial.println(svetsost); } /* Функция отправки SMS-сообщения */ void sendTextMessage(String text) { // gprsSerial.println("AT+CMGF=1\r"); // delay(5000); // gprsSerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста // delay(5000); // Устанавливаем адресата: телефонный номер в международном формате gprsSerial.println("AT + CMGS = \"+79677364050\""); //Телефон нужно откорректировать delay(100); // Пишем текст сообщения gprsSerial.println(text); delay(100); // Отправляем Ctrl+Z, обозначая, что сообщение готово gprsSerial.println((char)26); delay(18000); Serial.print("sendTextMessage FINISH"); } void balance(){ // currStr = ""; // gprsSerial.println("AT+CMGF=1\r"); // delay(500); // gprsSerial.println("AT+CSCS=\"GSM\""); // delay(500); gprsSerial.println("ATD#102#\r"); while(gprsSerial.available()>0){ data = gprsSerial.read(); if(data == 'e'){ data = gprsSerial.read(); while(data != 'r'){ bal += data; data = gprsSerial.read(); } Serial.print(" BALANCE= "); Serial.println(bal); return; } } } int testGsmOn(){ //Функция опроса модема. Возвращает "0" если связь с модемом есть или "1" если нет. gprsSerial.println("AT"); delay(100); gprsSerial.println("AT"); delay(500); if(gprsSerial.available()>0){ return 0; } else { return 1; } } void gsmOn(){ //Функция включения модема. Serial.print(" TESTgsm= "); Serial.println(testGsmOn()); digitalWrite(powerGSM, HIGH); delay(800); digitalWrite(powerGSM, LOW); } //Функция преобразовангия 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; }там идет в мониторе такого формата
+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 еще где то на почте валяются, а в слепую трудновато...
вообщем сам добился ответа баланса по запросу.
if (gprsSerial.available())//если модуль что-то послал { char currSymb = gprsSerial.read(); Serial.print(currSymb); // return; // char currSymb = gprsSerial.read(); // Serial.println(gprsSerial.read()); if ('\r' == currSymb) { //если символ перевод каретки if (isStringMessage) { //если текущая строка - SMS-сообщение, //отреагируем на него соответствующим образом if (!currStr.compareTo("STATUS")) { //balance(); delay(1000); GetDatchik(); } else if (currStr.startsWith("Ardu")) { ParseSMS(currStr); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } if (!currStr.compareTo("BALANSE")) { balance(); } else if(currStr.startsWith("+CUSD: 0,")) { int zzz = currStr.indexOf('?.'); String bal=currStr.substring(10,zzz); //баланс на сим карте Serial.println(bal); sendTextMessage("BALANSE = "+bal+".rub"); //Возвращаем смс с балансом } currStr = ""; } else if ('\n' != currSymb) { //если символ НЕ новая строка currStr += String(currSymb); } }теперь другой вопрос: как прикрутить датчик движения в этот код?
#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(9600); delay(300); // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку 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 getBalanse() { mySerial.println("ATD*102#"); //запрос баланса delay(300); Serial.println("zapros balansa"); } 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; } } if (!currStr.compareTo("BALANSE")) { getBalanse(); } else if(currStr.startsWith("+CUSD: 0,")) { int zzz = currStr.indexOf('?.?'); String balance=currStr.substring(10,zzz); //баланс на сим карте Serial.print(balance); // Возвращаем смс с балансом // sendTextMessage(balance) } 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; }а вот собственно визульное отображение скетча