Не вставляется баланс в смс от m590
- Войдите на сайт для отправки комментариев
Пт, 05/05/2017 - 08:21
Ребята, подскажите пожалуйста - gsm модуль m590, запрашиваю баланс, выделяю в сообщении цифры, перевожу из кода символов в сами символы - Serial.print выводит их в монитор нормально, а в ответном смс при вставке ничего нет. Что не так делаю, или преобразовать надо по другому как-то?
привожу только часть кода
if (Serial2.available()) {
char bl = ' ';
String valbl = "";
while (Serial2.available())
{
bl = Serial2.read();
//Serial.println(bl);
valbl += char(bl); //собираем принятые символы в строку
delay(5);
}
Serial.println(valbl);
if (valbl.indexOf("+CUSD") > -1) {
Serial.println("est otvet");
char result1 = valbl.charAt(37);
char result2 = valbl.charAt(38);
char result3 = valbl.charAt(39);
char result4 = valbl.charAt(40);
char result5 = valbl.charAt(41);
char result6 = valbl.charAt(42);
String ss1 = String(result1);
String ss2 = String(result2);
String ss3 = String(result3);
String ss4 = String(result4);
String ss5 = String(result5);
String ss6 = String(result6);
Serial.print(ss1);
Serial.print(ss2);
Serial.print(ss3);
Serial.print(ss4);
Serial.print(ss5);
Serial.println(ss6);
}
}
s1 = String(tu); // строковая переменная с уличной температурой
s2 = String(hu); // строковая переменная с уличной влажностью
s3 = String(p); // строковая переменная с давлением
s4 = String(td); // строковая переменная с температурой в доме
s5 = String(tg); // строковая переменная с температурой в гараже
s6 = String(tk); // строковая переменная с температурой в котельной
s7 = String(tkont); // строковая переменная с температурой контура
s8 = String(tb); // строковая переменная с температурой бойлера
s9 = String(ttp); // строковая переменная с температурой ТП
s10 = String(trad); // строковая переменная с температурой радиаторов
s11 = String (ss2); // строковая переменная с балансом
sms(String("Balans: " + ss2 + "rub." + '\n'
+ "Temp. ulica: " + s1 + '\n'
+ "Vlagn. ulica: " + s2 + '\n'
+ "Davlenie: " + s3 + '\n'
+ "Temp. dom: " + s4 + '\n'
+ "Temp. garag: " + s5 + '\n'
+ "Temp. kotelnay: " + s6 + '\n'
+ "Temp. kontur: " + s7 + '\n'
+ "Temp. boyler: " + s8 + '\n'
+ "Temp. tp: " + s9 + '\n'
+ "Temp. rad.: " + s10 + '\n'
), String("+79122234744")); // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
delay(500);
Что не так делаю
Много чего. Для начала, Вы не так вставляете код. Он у Вас без начала и без конца, поэтому что-то о нём говорить можно только потерев хрустальный шар.
Так вот шар мне подсказывает, что где-то Вы ше у Вас уже была описана переменная ss2. Затме Вы её описали в строке 21 - т.е. Вы завели новую переменную с тем же именем. После этого, Вы используете ss2 в строке 44, полагая, что в ней силит значение, полуенное в строке 21. Таки нет! ss2 в строке 21 и ss2 в строке 44 - это разные переменные, не имеющие друг к другу никакого отношения. См. концепцию экранирования переменных вот здесь.
Возможно, поможет, если Вы удалите слово String в строке 21.
Но, повторяю, всё это из шара, поскольку код у Вас секретный и Вы его показывать не хотите.
Спасибо большое, Евгений, ваша подсказка помогла. Прочитал ваш материал - тоже много чего уяснил для себя нового (не давно для себя открыл Ардуино и на С++ ранее никогда не приходилось писать). Полный код не стал помещать первый раз поскольку он не маленький, но сейчас выложу весь. Это рабочий код. Прошу не пинать за нерациональность. Железо - китайская Мега, TFT 3.2, GY-GPS6MU2(для синхронизации часов), BMP280, DS3231, DHT22, NEOWAY-m590 и DS18B20. Следующий шаг это прикрутить nrf24 для сбора данных с трёх других ардуин.
Спасибо!
#include <Time.h> #include <TimeLib.h> #include <DS1307RTC.h> #include <TinyGPS.h> #include <OneWire.h> #include <stDHT.h> #include <UTFT.h> #include <iarduino_Pressure_BMP.h> DHT sens(DHT22); iarduino_Pressure_BMP sensor; // активация датчика давления extern uint8_t BigFont[]; // шрифты extern uint8_t DGR24[]; extern uint8_t DGR56[]; OneWire sensDs1(11); // 18B20 подключен к выводу 11 OneWire sensDs2(12); // 12 OneWire sensDs3(13); // 13 byte bufData1[9]; // буфер данных 18B20 byte bufData2[9]; byte bufData3[9]; byte addr1[8]; // массив адреса 18B20 byte addr2[8]; byte addr3[8]; UTFT myGLCD(TFT32MEGA, 38, 39, 40, 41); // задаем тип дисплея TinyGPS gps; void getgps(TinyGPS &gps); bool newdata = false; int h, m, s; unsigned long sinhr; // переменная в мс задающ. период синхронизации unsigned long start; // переменная в мс задающ. цикл считывания данных gps int tpred; // предудщая температура для правильной индикации int tu; // температура на улице int hu; // влажность на улице int p; // давление int td; // температура в доме int tg; // температура в гараже int tk; // температура в котельной int tkont = 83; // температура контура int tb = 65; // температура в бойлере int ttp = 31; // температура входа ТП int trad = 56; // температура входа РАД int bal; // баланс int bal1; String(s1), (s2), (s3), (s4), (s5), (s6), (s7), (s8), (s9), (s10), (ss1), (ss2), (ss3), (ss4), (ss5), (ss6); // строковые переменные для sms void setup() { Serial1.begin(9600); Serial2.begin(9600); Serial.begin(9600); myGLCD.InitLCD(); // инициируем дисплей sensor.begin(); // инициируем BMP280 myGLCD.clrScr(); // очистка дисплея sensDs1.search(addr1); // поиск и запись адреса 1 датчика 18B20 sensDs2.search(addr2); // 2 датчика 18B20 sensDs3.search(addr3); // 3 датчика 18B20 setSyncProvider(RTC.get); // библиотечная команда извлечения данных из модуля часов sinhr = millis(); pinMode(3, INPUT); // пин для датчика света delay(200); Serial2.println("AT+CLIP=1"); // включить АОН delay(200); Serial2.println("AT+CMGF=1"); // текстовый формат SMS delay(200); Serial2.println("AT+CSCS=\"GSM\""); // кодировка текста - GSM delay(200); } void loop() { myGLCD.setColor(VGA_AQUA); // Рисование полосы на дисплее и надписей myGLCD.drawLine(300, 10, 300, 310); myGLCD.setColor(VGA_WHITE); myGLCD.setFont(BigFont); // BigFont myGLCD.print("Davlenie:", 325, 160); myGLCD.print("mm.r.st.", 340, 220); myGLCD.print("Vlagnosty:", 315, 255); myGLCD.print("Temperatura:", 50, 50); myGLCD.print("Teplonosit.", 45, 210); myGLCD.print("Bojler", 45, 235); myGLCD.print("Podaha TP", 45, 260); myGLCD.print("Podaha Rad.", 45, 285); myGLCD.printNumI(tkont, 235, 210); // темп. теплоноситель myGLCD.printNumI(tb, 235, 235); // температура бойлера myGLCD.printNumI(ttp, 235, 260); // температура ТП myGLCD.printNumI(trad, 235, 285); // температура Рад myGLCD.setFont(DGR24); // 24 шрифт myGLCD.print("Ulica", 330, 15); myGLCD.print("Dom", 10, 80); myGLCD.print("Garag", 10, 120); myGLCD.print("Koteljnay", 10, 160); // ---------------------------- чтение, формирование и печать давления ---------------------- sensor.read(1); p = sensor.pressure; if ((sensor.pressure - p) > 0.5) { p = p + 1; } myGLCD.printNumI(p, 360, 185); // печать давления // ----------------------- Темп. и влажность на улице ------------------- tu = sens.readTemperature(2); // температура улица hu = sens.readHumidity(2); // влажность улица delay(2000); myGLCD.setFont(DGR56); myGLCD.setColor(VGA_WHITE); // Очистка места при переходе с 3 на 2 знакоместа и с 2 на 1 if ((tpred == -1 && tu == 0) || (tpred == 10 && tu == 9) || (tpred == -10 && tu == -9)) { myGLCD.print("===", 305, 50); } tpred = tu; // запись температуры для сравнения в следующем цикле if (tu >= 0) { // положительная температура if (tu < 10) { myGLCD.printNumI(tu, 361, 50); } else { myGLCD.printNumI(tu, 333, 50); } } else { // отрицательная температура tu = abs(tu); // выделение модуля температуры if (tu < 10) { // отрицательная 1 знак myGLCD.printNumI(tu, 389, 50); // рисуем цифру myGLCD.print(":", 333, 50); // рисуем минус } else { // отрицательная 2 знака myGLCD.printNumI(tu, 361, 50); myGLCD.print(":", 305, 50); } } myGLCD.setFont(DGR24); myGLCD.printNumI(hu, 360, 280); // улица влажность myGLCD.print("%", 408, 280); //----------------------------- Работа с датчиками температуры ------------------- sensDs1.reset(); sensDs1.select(addr1); sensDs1.write(0x44, 0); // инициализация измерения с первого датчика sensDs2.reset(); sensDs2.select(addr2); sensDs2.write(0x44, 0); sensDs3.reset(); sensDs3.select(addr3); sensDs3.write(0x44, 0); delay(400); sensDs1.reset(); sensDs1.select(addr1); sensDs1.write(0xBE); // команда чтения памяти датчика sensDs1.read_bytes(bufData1, 9); // чтение памяти датчика, 9 байтов sensDs2.reset(); sensDs2.select(addr2); sensDs2.write(0xBE); sensDs2.read_bytes(bufData2, 9); sensDs3.reset(); sensDs3.select(addr3); sensDs3.write(0xBE); sensDs3.read_bytes(bufData3, 9); // ------------------------- Обработка данных датчиков ---------------------------- td = (float)((int)bufData1[0] | (((int)bufData1[1]) << 8)) * 0.0625; tg = (float)((int)bufData2[0] | (((int)bufData2[1]) << 8)) * 0.0625; tk = (float)((int)bufData3[0] | (((int)bufData3[1]) << 8)) * 0.0625; // ----------------- Вывод на печать трёх температур с датчиков -------------- myGLCD.printNumI(td, 235, 75); myGLCD.printNumI(tg, 235, 115); myGLCD.printNumI(tk, 235, 155); // ----------------------- Часы ------------------------------------------ if (millis() - sinhr < 40000) { // счетчик на 11 часов для синхронизации (40 млн.) goto P1; } newdata = false; start = millis(); while (millis() - start < 2000) { if (Serial1.available()) { char c = Serial1.read(); // чтение массива, переданного NEO-6M //Serial.print(c); // вывести на печать массив из NEO-6M if (gps.encode(c)) // проверка данных на правильность { newdata = true; break; // остановить цикл при нормальной декодировке } } } if (newdata) { getgps(gps); // при нормальной декодеровке уходим на выполнение getgps(TinyGPS &gps) } P1: // ================================ Вывод часов на дисплей ============================ myGLCD.setFont(DGR24); // задаём шрифт цифр myGLCD.setColor(VGA_LIME); if (hour() < 10) { // вывод часов myGLCD.printNumI(0, 170, 10); myGLCD.printNumI(hour(), 194, 10); } else { myGLCD.printNumI(hour(), 170, 10); } delay(5); if (minute() < 10) { // вывод минут myGLCD.printNumI(0, 242, 10); myGLCD.printNumI(minute(), 266, 10); } else { myGLCD.printNumI(minute(), 242, 10); } myGLCD.print(":", 218, 10); // ======================== Работа GSM =============================================== if (Serial2.available()) //если модуль что-то послал { delay(500); char ch = ' '; String val = ""; Serial.print(val); while (Serial2.available()) { ch = Serial2.read(); val += char(ch); //собираем принятые символы в строку } Serial.println(val); if (val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер { if (val.indexOf("791222ХХХХХ") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль { Serial2.println("ATH"); //разрываем связь delay(5000); Serial2.println("ATD*100#"); //запрос баланса delay(10000); if (Serial2.available()) { char bl = ' '; String valbl = ""; while (Serial2.available()) { bl = Serial2.read(); valbl += char(bl); //собираем принятые символы в строку } Serial.println(valbl); if (valbl.indexOf("+CUSD") > -1) { char result1 = valbl.charAt(38); char result2 = valbl.charAt(39); char result3 = valbl.charAt(40); char result4 = valbl.charAt(41); char result5 = valbl.charAt(42); char result6 = valbl.charAt(43); ss1 = String(result1); ss2 = String(result2); ss3 = String(result3); ss4 = String(result4); ss5 = String(result5); ss6 = String(result6); } } s1 = String(tu); // строковая переменная с уличной температурой s2 = String(hu); // строковая переменная с уличной влажностью s3 = String(p); // строковая переменная с давлением s4 = String(td); // строковая переменная с температурой в доме s5 = String(tg); // строковая переменная с температурой в гараже s6 = String(tk); // строковая переменная с температурой в котельной s7 = String(tkont); // строковая переменная с температурой контура s8 = String(tb); // строковая переменная с температурой бойлера s9 = String(ttp); // строковая переменная с температурой ТП s10 = String(trad); // строковая переменная с температурой радиаторов sms(String("Balans: " + ss1 + ss2 + ss3 + ss4 + ss5 + ss6 + "rub." + '\n' + "Davlenie: " + s3 + "mm" + '\n' + "Vlagn. ulica: " + s2 + "%" + '\n' + "Temperatura:" + '\n' + "ulica: " + s1 + '\n' + "dom: " + s4 + '\n' + "garag: " + s5 + '\n' + "kotelnay: " + s6 + '\n' + "kontur: " + s7 + '\n' + "boyler: " + s8 + '\n' + "tp: " + s9 + '\n' + "rad: " + s10 + '\n'), String("+791222ХХХХХ")); // номер на кот пойдет смс delay(500); } } } } //================= подпрограмма вывода данных из gps и синхронизации модуля часов (раз в 11 часов) ============= void getgps(TinyGPS &gps) { int year; byte month, day, hour, minute, second, hundredths; // вынимание данных из массива, полученного из модуля gps gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths); m = minute; h = hour + 3; // переделка час. пояса s = second; if (h > 23) // избежание 25, 26 часов на дисплее { h = h - 24; } // ------------------ непосредственно синхронизация ----------- setTime(h, m, s, 01, 4, 2016); // устанавливаем: часы, минуты, секунды (и день, месяц, год) RTC.set(now()); // применяем значение sinhr = millis(); } //===================== Подпрограмма посылки SMS ======================================================== void sms(String text, String phone) // отправка СМС { Serial.println("Start SMS send"); Serial2.println("AT + CMGS = \"" + phone + "\""); delay(500); Serial2.print(text); //Serial.print(text); delay(500); Serial2.print((char)26); delay(500); Serial2.print("AT+CMGD=1,4\r"); }