SIM800L Промблема....

vitjay
Offline
Зарегистрирован: 26.04.2016

Добрый день.

Встал на три дня уже... В примере ниже все хорошо работает когда я отправляю СМС с текстом Т, но когда входящее сообщение Snd... Оно распознается через раз и отправляет обратно не все символы(зажовывает где то их)... Засада, в общем. Искал другие примеры получения СМС, может плохо искал, но не нашел...

 

#include <LiquidCrystal_I2C.h>

#include <SoftwareSerial.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>

SoftwareSerial gprsSerial(7, 6); // RX, TX
LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей

#define ONE_WIRE_BUS 9

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

int T1, T2, T3, curr_temp, set_temp, max_temp, min_temp, bal;
int R1 = 1;
int R2 = 0;
int W = 0;
int grad_temp = 1;
String dbm;
long previousMillis = 0;
long interval = 10000;
String num, err_num, bal_num, mess;

...

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    gettemp();
    if (isStringMessage == 1) {
      lcd.setCursor(0, 0);
      lcd.print("I");
      gprsSerial.println("AT+CSQ"); // Здесь спрашиваю уровень сигнала...

    }

  } else {
    if (gprsSerial.available() > 0) {
      char currSymb = gprsSerial.read();
      if ('\r' == currSymb) {
        lcd.setCursor(0, 0);
        lcd.print("R");

        if (isStringMessage == 2) {
          lcd.setCursor(0, 0);
          lcd.print("S");
          Serial.println("SMS GET");
          //если текущая строка - SMS-сообщение,
          //отреагируем на него соответствующим образом
          if (!currStr.compareTo("Dbm")) {
            Serial.println("SMS Dbm");
            sms(dbm, num);
          } else if (!currStr.compareTo("T")) {  // Эта часть работает идеально
            mess = "Sensor 1:";
            mess += String(T1);
            delay(300);
            mess += " C";
            mess += " \n";
            mess += "Sensor 2:";
            mess += String(T2);
            delay(300);
            mess += " C";
            mess += " \n";
            mess += "Sensor 3:";
            mess += String(T3);
            delay(300);
            mess += " C";
            mess += " \n";
            mess += "Control:";
            if (W == 1) mess += "On"; else mess += "Off";
            delay(300);
            mess += " \n";
            mess += "Contr temp:";
            mess += String(set_temp);
            delay(300);
            mess += " C";
            mess += " \n";
            delay(500);
            sms(mess, num);
            delay(500);
          } else if (currStr.startsWith("Snd")) { // А вот тут она не может мне вернуть строку типа Snd 10 11 111 11111 111 20 7912222222 0 1
            delay(500);
            mess = "A: " + currStr;
            delay(1000);
            sms(mess, num);
            delay(500);
          } else if (!currStr.compareTo("R1 1")) {
            Serial.println("SMS R1 1");
            R1 = 1;
            EEPROM.write(1, R1);
            sms("R1 = Sensor 1", num);
          } else if (!currStr.compareTo("Reset")) {
            void(* resetFunc) (void) = 0;
            resetFunc();
          } else if (!currStr.compareTo("R1 2")) {
            Serial.println("SMS R1 2");
            R1 = 2;
            EEPROM.write(1, R1);
            sms("R1 = Sensor 2", num);
          } else if (!currStr.compareTo("R1 3")) {
            Serial.println("SMS R1 3");
            R1 = 3;
            EEPROM.write(1, R1);
            sms("R1 = Sensor 3", num);
          } else if (!currStr.compareTo("R2 1")) {
            Serial.println("SMS R2 1");
            R2 = 1;
            EEPROM.write(2, R2);
            sms("R2 = Sensor 1", num);
          } else if (!currStr.compareTo("R2 2")) {
            Serial.println("SMS R2 2");
            R2 = 2;
            EEPROM.write(2, R2);
            sms("R2 = Sensor 2", num);
          } else if (!currStr.compareTo("R2 3")) {
            Serial.println("SMS R2 3");
            R2 = 3;
            EEPROM.write(2, R2);
            sms("R2 = Sensor 3", num);
          } else if (!currStr.compareTo("R2 0")) {
            Serial.println("SMS R2 0");
            R2 = 0;
            EEPROM.write(2, R2);
            sms("R2 = None", num);
          } else if (!currStr.compareTo("W on")) {
            Serial.println("W on");
            W = 1;

            sms("Control on", num);
          } else if (!currStr.compareTo("W off")) {
            Serial.println("W off");
            W = 0;

            sms("Control off", num);
          } else if (currStr.startsWith("Set")) {
            String cs;
            cs = currStr.substring(4, 6);
            set_temp = cs.toInt();
            EEPROM.write(3, set_temp);
            Serial.print("Set");
            Serial.println(set_temp);
            Serial.print("Num");
            Serial.println(num);
            sms("Control temp: " + String(set_temp), num);
          } else if (currStr.startsWith("Max")) {
            String cs;
            cs = currStr.substring(4, 6);
            max_temp = cs.toInt();
            EEPROM.write(4, max_temp);
            Serial.print("Max");
            Serial.println(max_temp);
            sms("Max temp: " + String(max_temp), num);
          } else if (currStr.startsWith("Min")) {
            String cs;
            cs = currStr.substring(4, 6);
            min_temp = cs.toInt();
            EEPROM.write(30, min_temp);
            Serial.print("Max");
            Serial.println(min_temp);
            sms("Min temp: " + String(min_temp), num);
          } else if (currStr.startsWith("Num")) {
            String cs;
            cs = currStr.substring(4, 15);
            err_num = cs;
            Serial.println("writing eeprom tel num:");
            for (int i = 5; i < 25; i++)
            {
              EEPROM.write(i, err_num[i - 5]);
              Serial.print("Wrote: ");
              Serial.println(err_num[i - 5]);
            }

            Serial.print("err_num");
            Serial.println(err_num);
            sms("Alarm number: " + String(err_num), num);
          }
          isStringMessage = 1;
        } else {
          lcd.setCursor(0, 1);
          lcd.print(currStr);
          if (currStr.startsWith("+CMT")) {
            //Serial.println(currStr);
            //если текущая строка начинается с "+CMT",
            //то следующая строка является сообщением
            isStringMessage = 2;
            num =  currStr.substring(7, 19);
            num.trim();
            lcd.setCursor(0, 1);
            lcd.print("Get:" + num);
            delay(3000);

          } else if (currStr.startsWith("+CSQ")) {
            dbm = currStr.substring(5, 10);
            getdbm();
            lcd.setCursor(15, 1);
            lcd.print("D");


          }
        }
        currStr = "";
      } else if ('\n' != currSymb) {
        currStr += String(currSymb);
      }
    }

  }


}

 

vitjay
Offline
Зарегистрирован: 26.04.2016

Добавлю что на входящее Т - оно просто отвечает
На вохдящее Snd 10 11 22 11 7912222222 и т.д. скетч начинает жевать символы. Попарсить в порт не смогу. Скетч на плате, плата не ардуина) Вывод только USBAsp...

Но уже думаю что пора на UNe собрать чтоб в порт смотреть что приходит...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vitjay пишет:

Но уже думаю что пора на UNe собрать чтоб в порт смотреть что приходит...

С этого надо начинать. На уне или ещё на чём, но чтобы видеть процесс. Вслепую никто не отлаживается (кроме новичков, которые считают, что у них все с первого запуска заработет).

vitjay
Offline
Зарегистрирован: 26.04.2016

Ой ой ой... Я тоже так писать могу не вникая в код.. Можно же и на LCD выводить - это раз а второе там в основе цикл. 

    if (gprsSerial.available() > 0) {
      char currSymb = gprsSerial.read();
      if ('\r' == currSymb) {
     
        if (isStringMessage == 2) {
          // если пришло подтверждение что сообщение - работаем со строкой
          isStringMessage = 1;
        } else {
          if (currStr.startsWith("+CMT")) { // Получили сообщение
            isStringMessage = 2; // Триггер двинули
            num =  currStr.substring(7, 19); // Вырезали телефонный номер из сообщения
            num.trim(); 
            delay(3000); // Это, тут как вариант было... не стер

          } else if (currStr.startsWith("+CSQ")) { // Ну тут уровень сигнала если пришел - вырезаем
            dbm = currStr.substring(5, 10);
            getdbm();
            lcd.setCursor(15, 1);
            lcd.print("D");


          }
        }
        currStr = "";
      } else if ('\n' != currSymb) {
        currStr += String(currSymb); / пока нет символа переноса - собираем строку
      }
    }


  И все... Что вам конкретно распарсить? Я все что угодно на LCD вывести могу, зачем мне ком?
vitjay
Offline
Зарегистрирован: 26.04.2016

11 символов только нормально передает... То есть если я отправляю Snd12345678 Нормально приходит. Больше уже глючит. Может длинной переменной ограничено какой то? 

Или буфером SoftwareSerial?

vitjay
Offline
Зарегистрирован: 26.04.2016

Дело было не в бобине... А вот тут: 

if (currStr.startsWith("+CMT")) {
            //Serial.println(currStr);
            //если текущая строка начинается с "+CMT",
            //то следующая строка является сообщением
            isStringMessage = 2;
            num =  currStr.substring(7, 18); // Было 7,19 вырезался лишний символ и дальше в цикле вносил неоднородность...
            num.trim();
            lcd.setCursor(0, 1);
            lcd.print("Get:" + num);
            delay(3000);

          } else if (currStr.startsWith("+CSQ")) {
            dbm = currStr.substring(5, 10);
            getdbm();
            lcd.setCursor(15, 1);
            lcd.print("D");

 

vitjay
Offline
Зарегистрирован: 26.04.2016

Дело было не в бобине... А вот тут: 

if (currStr.startsWith("+CMT")) {
            isStringMessage = 2;
            num =  currStr.substring(7, 18); // Было 7,19 вырезался лишний символ и дальше в цикле вносил неоднородность...
            num.trim();
            lcd.setCursor(0, 1);
            lcd.print("Get:" + num);
            delay(3000);

          } else if (currStr.startsWith("+CSQ")) {
            dbm = currStr.substring(5, 10);
            getdbm();
            lcd.setCursor(15, 1);
            lcd.print("D");

 

vitjay
Offline
Зарегистрирован: 26.04.2016

Нет, где то не тут... 

Проблема в том, что после функции:   num =  currStr.substring(7, 19) переменная currStr в следующем цикле возвращает только 13 символов...

Jatixo
Offline
Зарегистрирован: 13.01.2016

Скорость то какая по softwareserial?

vitjay
Offline
Зарегистрирован: 26.04.2016
Serial.begin(19200);  
  Serial.println("Goodnight moon!");
  delay(15000);
  gprsSerial.begin(19200); 
  delay(500);
  gprsSerial.println("AT+IPR=19200");
  delay(300);
  gprsSerial.println("AT");
   delay(500);
  gprsSerial.print("AT+CMGF=1\r");
  delay(500);
  gprsSerial.print("AT+IFC=1, 1\r");
  delay(500);
  gprsSerial.print("AT+CPBS=\"SM\"\r");
  delay(500);
  gprsSerial.print("AT+GSMBUSY=1, 1\r");
  delay(500);
  gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
  delay(500);
  gprsSerial.print("AT+CMGDA=\"DEL ALL\"\r");
  delay(1000);

Где то он в цикле жует длинное сообщение. При том, что короткое входящее - как часы работает. При чем отрезает ровно на 14 символов. Первый раз послыаю Snd 12345678910111213141516 пролетает нормально все сообщение.

Второй раз не распознает начало. То есть не определяет: if (currStr.startsWith("Snd"))

Третий раз если скинуть запрос, Т например - возвращает оба, но первое обрезанное Snd 1234567891 

 

vitjay
Offline
Зарегистрирован: 26.04.2016

То есть где то ограничение по длине получается. А где и за счет чего... Хз...

vitjay
Offline
Зарегистрирован: 26.04.2016

Есть вообще где то в природе скрипт(пример, работающий) под SIM800L где получают сообщение и отправляют его на номер с которого получили? Только целиком и большое? Я не гордый, переделаю по новой...

vitjay
Offline
Зарегистрирован: 26.04.2016

Вот на что на просторах наткнулся:

https://github.com/cristiansteib/Sim800l

Ну-ка заюзаем, посмотрим...

Jatixo
Offline
Зарегистрирован: 13.01.2016

Вам бы сначала протестировать все без скетча, то есть открыть в ардуино стандартный пример SoftwareSerial, поменять пины на свои, залить, и через монитор порта послать AT допустим, придет OK (обязательно надо любую команду отправить после включения, иначе модуль так сказать сам первый не начнет, даже если на него звонить и т.п.), потом можно смску послать на модуль, посмотреть что появится, а то может и не отображается вся строка вовсе...

vitjay
Offline
Зарегистрирован: 26.04.2016

Jatixo пишет:

Вам бы сначала протестировать все без скетча, то есть открыть в ардуино стандартный пример SoftwareSerial, поменять пины на свои, залить, и через монитор порта послать AT допустим, придет OK (обязательно надо любую команду отправить после включения, иначе модуль так сказать сам первый не начнет, даже если на него звонить и т.п.), потом можно смску послать на модуль, посмотреть что появится, а то может и не отображается вся строка вовсе...

Да попробую вечерком... 

vitjay
Offline
Зарегистрирован: 26.04.2016
Посмотрел... Вся приходит... Как часы работает все...
 
AT+CSQ
+CSQ: 13,0
 
OK
 
+CMT: "+79122603064","","16/04/27,00:05:15+20"
Snd 1234567891011121314151617
 
+CMT: "+79122603064","","16/04/27,00:06:22+20"
Snd 1234567891011121314151617
 
+CMT: "+79122603064","","16/04/27,00:06:55+20"
Snd 1234567891011121314151617

 

vitjay
Offline
Зарегистрирован: 26.04.2016

С симовлами так это выглядит... Догадался как к плате(не ардуино, уже  готовая плата) припарить UART... Буду завтра под микроскопом смотреть...

Но что то я не вижу где косяк... Пока что с ходу... Говорят в свежих IDE неоднородности наблюдаются, не знаю правда или...

Jatixo
Offline
Зарегистрирован: 13.01.2016

Вряд ли IDE, и ОСТОРОЖНЕЕ с uart, так как модуль работает с 2.8В по TX, RX, спасибо и от ардуины не сгорел без преобразования уровней (хотя бы на резисторах)... Так что лучше подключать и от ардуино, и от uart нормально, а не 5В, где ждут 2,8В макс.

В общем, Вы пробуете отправить три смс, первая нормально, от второй ничего не происходит, а при третей приходит часть второй и третья нормально?

А как Вы проверяете, что у Вас приходит? Через ответную смс (а то может это уже отправка смс косячит)? Или все-таки добавили в код вывод в сериал?

vitjay
Offline
Зарегистрирован: 26.04.2016

Jatixo пишет:

В общем, Вы пробуете отправить три смс, первая нормально, от второй ничего не происходит, а при третей приходит часть второй и третья нормально?

А как Вы проверяете, что у Вас приходит? Через ответную смс (а то может это уже отправка смс косячит)? Или все-таки добавили в код вывод в сериал?

Да именно так...

То есть IsStringMessage Видимо остается 2 или CurrStr не очищается.

Потом приходит третья и все это добавляется и происходит отправка... Хотя странная версия. Сейчас буду парсить и смотреть что на каком этапе происходит... 

ЕвгенийП, конечно прав, но не таким же императорским тоном про это говорить(добрее надо быть). XD

vitjay
Offline
Зарегистрирован: 26.04.2016

Кажется дело было не в бобине... Разобрался блин. Дело в том, что в цикле стоит чтение строки, путем отлавливания /r и игнорирования /n потому что они вместе идут... А вот про то, что раз в 10 секунд запускается цикл запроса темпераутры и портит всю картину - я забыл... То есть надо сделать проверку на окончание чтения...

vitjay
Offline
Зарегистрирован: 26.04.2016

Этот косяк конечно присутствовал, но дело не в нем. 

Получает СМС:

+CMT: "+79122603064","","16/04/27,11:41:01+20"
 
Понимает что это СМС, ставит флаг isStringMessage = 2;, проваливается в цикл... читает и недочитывает:
 
Snd 123456789 - тут встает... 
 
Соответственно символ переноса каретки тоже не записывается и ничего дальше не падает... Странно что строчками выше где стоит 
 isStringMessage = 2;
06             num =  currStr.substring(7, 19); 
07             num.trim();
08             lcd.setCursor(0, 1);
09             lcd.print("Get:" + num);
10             delay(3000);

currStr как раз такую длину и вырезает из сообщения... 

vitjay
Offline
Зарегистрирован: 26.04.2016

else if ('\n' != currSymb) {   - пробовал просто else... та же фигня... 

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

вечером скину свои наработки по сим 800L посмотрите может что подчерпнете оттуда

vitjay
Offline
Зарегистрирован: 26.04.2016

Baks пишет:

вечером скину свои наработки по сим 800L посмотрите может что подчерпнете оттуда

Вот спасибо!:)

vitjay
Offline
Зарегистрирован: 26.04.2016

Вот без этого как часы работает:

if(GprsSerial.avaliable()) {

// Тут как раз цикл чтения

} else if (isStringMessage == 1) {
      unsigned long currentMillis = millis();
      if (currentMillis - previousMillis > interval) {
        previousMillis = currentMillis;
        gettemp();
        //gprsSerial.println("AT+CSQ");
      }

    }

 

vitjay
Offline
Зарегистрирован: 26.04.2016

В смысле если убрать 

 

else if (isStringMessage == 1) {
06       unsigned long currentMillis = millis();
07       if (currentMillis - previousMillis > interval) {
08         previousMillis = currentMillis;
09         gettemp();
10         //gprsSerial.println("AT+CSQ");
11       }
12  
13     }

 

vitjay
Offline
Зарегистрирован: 26.04.2016

Да, определенно... Косяк в millis();

блин... Причем неважно закрыта она или нет if ами...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vitjay пишет:

Да, определенно... Косяк в millis();

Это сильно! Продолжайте исследования и сообщите нам в чём именно этот косяк состоит.

vitjay
Offline
Зарегистрирован: 26.04.2016

ЕвгенийП пишет:

vitjay пишет:

Да, определенно... Косяк в millis();

Это сильно! Продолжайте исследования и сообщите нам в чём именно этот косяк состоит.

Подсказали бы лучше, куда копать...

vitjay
Offline
Зарегистрирован: 26.04.2016
else if (isStringMessage == 1) {
06       unsigned long currentMillis = millis();
07       if (currentMillis - previousMillis > interval) {
08         previousMillis = currentMillis;
09         gettemp();
10         //gprsSerial.println("AT+CSQ");
11       }
12  
13

    }

Не в milis(); если закоментировать gettemp(); - все работает. В этой функции три далласа опрашивается, но она закрыта If ом до тех пор, пока не получится/отправится СМС... А если ее под коментарий - стабильно работает...

vitjay
Offline
Зарегистрирован: 26.04.2016

ЕвгенийП пишет:

vitjay пишет:

Да, определенно... Косяк в millis();

Это сильно! Продолжайте исследования и сообщите нам в чём именно этот косяк состоит.

Я лучше промолчу))))))

vitjay
Offline
Зарегистрирован: 26.04.2016

Еще раз:
 

void loop() {

  csq = 0; // флаг

  while (gprsSerial.available() > 0) {

    currSymb = gprsSerial.read(); // символ прочли

    csq = 1; // подняли

    if (currSymb == '\r') {
      Serial.println("Hopaaa");
      Serial.println(currStr);

      if (isStringMessage == 2) {

        Serial.println("SMS GET");

        //если текущая строка - SMS-сообщение,
        //отреагируем на него соответствующим образом

        if (!currStr.compareTo("Dbm")) {
          Serial.println("SMS Dbm");
          sms(dbm, num);
        } else if (!currStr.compareTo("T")) {
          mess = "Sensor 1:";
          mess += String(T1);
          delay(300);
          mess += " C";
          mess += " \n";
          mess += "Sensor 2:";
          mess += String(T2);
          delay(300);
          mess += " C";
          mess += " \n";
          mess += "Sensor 3:";
          mess += String(T3);
          delay(300);
          mess += " C";
          mess += " \n";
          mess += "Control:";
          if (W == 1) mess += "On"; else mess += "Off";
          delay(300);
          mess += " \n";
          mess += "Contr temp:";
          mess += String(set_temp);
          delay(300);
          mess += " C";
          mess += " \n";
          delay(500);
          sms(mess, num);
          delay(500);
        } else if (currStr.startsWith("Snd")) {
          delay(500);
          String cs;
          cs = currStr;
          delay(1000);
          sms(cs, num);
          delay(500);
        } 

        isStringMessage = 1;
        csq = 0; // Когда прочли месседж - опустили
      } else {

        if (currStr.startsWith("+CMT")) { // СМС детектед
          Serial.println("Is SMS");
          //если текущая строка начинается с "+CMT",
          //то следующая строка является сообщением
          isStringMessage = 2;
          num =  currStr;
          num = num.substring(7, 19);
          Serial.println("Get:" + num);
          currStr = "";

        } else if (currStr.startsWith("+CSQ")) { // Запрос уровня сигнала детектед
          dbm = currStr.substring(5, 10);
          getdbm();

        }
      }
      currStr = ""; //Стерли за ненадобностью
    } else if (currSymb != '\n') {
      currStr += currSymb; //читаем символы
      Serial.println(currStr);
      Serial.println(isStringMessage);
    }
  }

  
  if (csq == 0 && isStringMessage == 1) {
    previous++;
    if (previous > inter) {
      previous = 0;
      gettemp(); //а тут косяк когда ставлю коммент работает прога смс получаются целиком а когда раскоментирую - режет СМС
      //gprsSerial.println("AT+CSQ");
    }

  }

}

 

vitjay
Offline
Зарегистрирован: 26.04.2016

Теперь функция Get temp там все просто... Когда ставишь под коментарий sensors.requestTemperatures(); все работает стабильно..

Но почему? Тут то она под If ом....

 if (csq == 0 && isStringMessage == 1) {
092     previous++;
093     if (previous > inter) {
094       previous = 0;
095       gettemp(); //а тут косяк когда ставлю коммент работает прога смс получаются целиком а когда раскоментирую - режет СМС
096       //gprsSerial.println("AT+CSQ");
097     }
098  
099   }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vitjay пишет:

Но суть не в этом, суть в том, что я бы хотел получить практический совет, типа... Что попарсить, что дописать. 

Зачем Вам советы, если Вы их не слушаете? Я Вам дал совет в посте №3. Очень, между прочим дельный совет. Но Вы его либо не поняли, либо проигнорировали.

После того поста, я ожидал, что Вы вставите по ходу программы кучу Serial.println(), которые печатают значения переменных. посмотрите на эти значения и либо разберётесь сами, либо выложите сюда скетч со вставленной отладочной печатью и копи-пасту того, что печатает, чтобы можно было посмотреть и разобраться. Вы же этого делать не захотели а продолжаете отлаживаться вслепую, гадая на кофейной гуще. Ну, удачи, ничем не могу помочь. Кстати, может Вы это и сделали, я не знаю, но от нас Вы держите в секретеи обновлённый скетч и протокол отладочной печати.

Хотите реальной помощи, слушайте и делайте, что Вам говорят. В частности, ставьте отладочную печать и покажите скетч и то, что он печатает. Возможно, Вас попросят вставить дополнительные печати - именно так и отлаживаются программы, а вовсе не гаданием "чтобы там могло быть?" и уж тем более, не заявлениями. что "миллис не работает".  

vitjay
Offline
Зарегистрирован: 26.04.2016

Дак я поставил... Выложил вроде... 15, 16 пост. Еще раз пост 31 написал чтоб понятно было что и как...

vitjay
Offline
Зарегистрирован: 26.04.2016

Вот так с закоментированным sensors.requestTemperatures();

Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Hopaaa
AT+CPBS="S
+
1
+C
1
+CM
1
+CMT
1
+CMT:
1
+CMT:
1
+CMT: "
1
+CMT: "+
1
+CMT: "+7
1
+CMT: "+79
1
+CMT: "+791
1
+CMT: "+7912
1
+CMT: "+79122
1
+CMT: "+791226
1
+CMT: "+7912260
1
+CMT: "+79122603
1
+CMT: "+791226030
1
+CMT: "+7912260306
1
+CMT: "+79122603064
1
+CMT: "+79122603064"
1
+CMT: "+79122603064",
1
+CMT: "+79122603064","
1
+CMT: "+79122603064",""
1
+CMT: "+79122603064","",
1
+CMT: "+79122603064","","
1
+CMT: "+79122603064","","1
1
+CMT: "+79122603064","","16
1
+CMT: "+79122603064","","16/
1
+CMT: "+79122603064","","16/0
1
+CMT: "+79122603064","","16/04
1
+CMT: "+79122603064","","16/04/
1
+CMT: "+79122603064","","16/04/2
1
+CMT: "+79122603064","","16/04/27
1
+CMT: "+79122603064","","16/04/27,
1
+CMT: "+79122603064","","16/04/27,1
1
+CMT: "+79122603064","","16/04/27,16
1
+CMT: "+79122603064","","16/04/27,16:
1
+CMT: "+79122603064","","16/04/27,16:4
1
+CMT: "+79122603064","","16/04/27,16:41
1
+CMT: "+79122603064","","16/04/27,16:41:
1
+CMT: "+79122603064","","16/04/27,16:41:1
1
+CMT: "+79122603064","","16/04/27,16:41:15
1
+CMT: "+79122603064","","16/04/27,16:41:15+
1
+CMT: "+79122603064","","16/04/27,16:41:15+2
1
+CMT: "+79122603064","","16/04/27,16:41:15+20
1
+CMT: "+79122603064","","16/04/27,16:41:15+20"
1
Hopaaa
+CMT: "+79122603064","","16/04/27,16:41:15+20"
Is SMS
Get:+79122603064
S
2
Sn
2
Snd
2
Snd
2
Snd 1
2
Snd 12
2
Snd 123
2
Snd 1234
2
Snd 12345
2
Snd 123456
2
Snd 1234567
2
Snd 12345678
2
Snd 123456789
2
Snd 1234567891
2
Snd 12345678910
2
Snd 123456789101
2
Snd 1234567891011
2
Snd 12345678910111
2
Snd 123456789101115
2
Hopaaa
Snd 123456789101115
SMS GET
Send+79122603064
 
vitjay
Offline
Зарегистрирован: 26.04.2016
Вот так с ней...
A
1
AT
1
AT+
1
AT+I
1
AT+IP
1
AT+IPR
1
AT+IPR=
1
AT+IPR=1
1
AT+IPR=19
1
AT+IPR=192
1
AT+IPR=1920
1
AT+IPR=19200
1
Hopaaa
AT+IPR=19200
Hopaaa
 
O
1
OK
1
Hopaaa
OK
A
1
AT
1
AT+
1
AT+C
1
AT+CM
1
AT+CMG
1
AT+CMGF
1
AT+CMGF=
1
AT+CMGF=1
1
Hopaaa
AT+CMGF=1
Hopaaa
 
O
1
OK
1
Hopaaa
OK
A
1
AT
1
AT+
1
AT+I
1
AT+IF
1
AT+IFC
1
AT+IFC=
1
AT+IFC=1
1
AT+IFC=1,
1
AT+IFC=1,
1
AT+IFC=1, 1
1
Hopaaa
AT+IFC=1, 1
Hopaaa
 
O
1
OK
1
Hopaaa
OK
A
1
AT
1
AT+
1
AT+C
1
AT+CP
1
AT+CPB
1
AT+CPBS
1
AT+CPBS=
1
AT+CPBS="
1
AT+CPBS="S
1
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Cur_temp:0
Cur_temp1:26
Cur_temp2:-127
Cur_temp3:-127
Control OFF
Hopaaa
AT+CPBS="S
+
1
+C
1
+CM
1
+CMT
1
+CMT:
1
+CMT:
1
+CMT: "
1
+CMT: "+
1
+CMT: "+7
1
+CMT: "+79
1
+CMT: "+791
1
+CMT: "+7912
1
+CMT: "+79122
1
+CMT: "+791226
1
+CMT: "+7912260
1
+CMT: "+79122603
1
+CMT: "+791226030
1
+CMT: "+7912260306
1
+CMT: "+79122603064
1
+CMT: "+79122603064"
1
+CMT: "+79122603064",
1
+CMT: "+79122603064","
1
+CMT: "+79122603064",""
1
+CMT: "+79122603064","",
1
+CMT: "+79122603064","","
1
+CMT: "+79122603064","","1
1
+CMT: "+79122603064","","16
1
+CMT: "+79122603064","","16/
1
+CMT: "+79122603064","","16/0
1
+CMT: "+79122603064","","16/04
1
+CMT: "+79122603064","","16/04/
1
+CMT: "+79122603064","","16/04/2
1
+CMT: "+79122603064","","16/04/27
1
+CMT: "+79122603064","","16/04/27,
1
+CMT: "+79122603064","","16/04/27,1
1
+CMT: "+79122603064","","16/04/27,16
1
+CMT: "+79122603064","","16/04/27,16:
1
+CMT: "+79122603064","","16/04/27,16:4
1
+CMT: "+79122603064","","16/04/27,16:43
1
+CMT: "+79122603064","","16/04/27,16:43:
1
+CMT: "+79122603064","","16/04/27,16:43:2
1
+CMT: "+79122603064","","16/04/27,16:43:27
1
+CMT: "+79122603064","","16/04/27,16:43:27+
1
+CMT: "+79122603064","","16/04/27,16:43:27+2
1
+CMT: "+79122603064","","16/04/27,16:43:27+20
1
+CMT: "+79122603064","","16/04/27,16:43:27+20"
1
Hopaaa
+CMT: "+79122603064","","16/04/27,16:43:27+20"
Is SMS
Get:+79122603064
S
2
Sn
2
Snd
2
Snd
2
Snd 1
2
Snd 12
2
Snd 123
2
Snd 1234
2
Snd 12345
2
Snd 123456
2
Snd 1234567
2
Snd 12345678
2
Snd 123456789
2
 
vitjay
Offline
Зарегистрирован: 26.04.2016

Хотя странно что без sensors.requestTemperatures(); все работает...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, нет, ну так не ставят.

Печати нужно гораздо больше.

Вот смотрите Ваш пост №31, где Вы жалуетесь на кусок 91-97. Если у Вас сомнения в этом куске, то Вы должны превратить его в нчето вроде

Serial << "csq=" << csq << "; isStringMessage=" << isStringMessage << '\n';   
 if (csq == 0 && isStringMessage == 1) {
    Serial << "INSIDE IF1 previous=" << previous << "; inter=" << inter<< '\n';   
     previous++;
    if (previous > inter) {
      Serial << "INSIDE IF2 \n";   
      previous = 0;
      gettemp(); //а тут косяк когда ставлю коммент работает прога смс получаются целиком а когда раскоментирую - режет СМС
      //gprsSerial.println("AT+CSQ");
    } else {
       Serial << "IF2  MIMO\n";   
   }

  } else {
   Serial << "IF1 - MIMO\n";   
 }

И точно также надо разукрасить функцию gettemp - чтобы Вы 1) видели каждую переменную и 2) точно видели в какую ветку IF' а попадаете.

Тогда, глядя на всю эту информацию, Вам будет легче разобраться. А то, что Вы вставили сейчас особой информации не даёт - так "для галочки".

Кстати. чтобы работал потоковый вывод в Serial (и можно было в одной строке писать кучу всего, как я делаю в примере), поставьте первой строкой скетча вот такую

template <typename T> inline Print & operator << (Print &s, T n) { s.print(n); return s; }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

О, пока я писал, Вижу, что Вы уже что-то вставили - гораздо ближе к делу.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Только Вы опят варитесь в своём соку, скрывая от нас детали. Вот смотрите, Вы пишете. что это напечатано пи закомментированном requestTemperatures. Отлично, только в скетче в посте №31 (это ведь последний?) нет ни этих печатей, ни requestTemperatures. Ну, нет этого там. ЧТо прикажете мне делать?

Вы если публикуете, то публикуйте актуальный скетч и то, что именно он печатает. Только так Вам кто-то сможет помочь. Без этого Вы только мозги людям пудрите. Вот пояите, я сижу в тысяче вёрст от Вас и читаю, что у Вас всё работает с закомментированной строкой, которую я вовсе не вижу. И что мне делать?

 

vitjay
Offline
Зарегистрирован: 26.04.2016

окей)

#include <LiquidCrystal_I2C.h>

#include <SoftwareSerial.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>

SoftwareSerial gprsSerial(7, 6); // RX, TX
LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей

#define ONE_WIRE_BUS 9

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

int T1, T2, T3, curr_temp, set_temp, max_temp, min_temp, bal, csq;
int R1 = 1;
int R2 = 0;
int W = 0;
int grad_temp = 1;
String dbm;
long previous = 0;
long inter = 20000;
String num, err_num, bal_num, mess;

void setup() {

  sensors.begin();
  lcd.begin();
  // Print a message to the LCD.
  lcd.backlight();
  lcd.createChar(1, sig);
  lcd.createChar(2, sig1);
  lcd.createChar(3, sig2);
  lcd.createChar(4, sig3);
  lcd.createChar(5, sig4);
  lcd.createChar(6, temp_cel);


  lcd.setCursor(0, 0);
  lcd.print("Start...");

  Serial.begin(19200);  //Скорость порта для связи Arduino с компьютером
  Serial.println("Goodnight moon!");
  delay(15000);
  gprsSerial.begin(19200);  //Скорость порта для связи Arduino с GSM модулем
  delay(500);
  gprsSerial.println("AT+IPR=19200");
  delay(500);
  gprsSerial.begin(19200);  //Скорость порта для связи Arduino с GSM модулем

  // Настраиваем приём сообщений с других устройств
  // Между командами даём время на их обработку
  delay(500);
  gprsSerial.print("AT+CMGF=1\r");
  delay(500);
  gprsSerial.print("AT+IFC=1, 1\r");
  delay(500);
  gprsSerial.print("AT+CPBS=\"SM\"\r");
  delay(500);
  gprsSerial.print("AT+GSMBUSY=1, 1\r");
  delay(500);
  gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
  delay(500);
  gprsSerial.print("AT+CMGDA=\"DEL ALL\"\r");
  delay(1000);
  pinMode(5, OUTPUT);
  digitalWrite(5, LOW);

  lcd.clear();
}
char currSymb;
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
int isStringMessage = 1;

void loop() {

  csq = 0;

  while (gprsSerial.available() > 0) {
    currSymb = gprsSerial.read();
    csq = 1;
    if (currSymb == '\r') {
      Serial.println("Hopaaa");
      Serial.println(currStr);

      if (isStringMessage == 2) {

        Serial.println("SMS GET");
        //если текущая строка - SMS-сообщение,
        //отреагируем на него соответствующим образом
        if (!currStr.compareTo("Dbm")) {
          Serial.println("SMS Dbm");
          sms(dbm, num);
        } else if (!currStr.compareTo("T")) {
          mess = "Sensor 1:";
          mess += String(T1);
          delay(300);
          mess += " C";
          mess += " \n";
          mess += "Sensor 2:";
          mess += String(T2);
          delay(300);
          mess += " C";
          mess += " \n";
          mess += "Sensor 3:";
          mess += String(T3);
          delay(300);
          mess += " C";
          mess += " \n";
          mess += "Control:";
          if (W == 1) mess += "On"; else mess += "Off";
          delay(300);
          mess += " \n";
          mess += "Contr temp:";
          mess += String(set_temp);
          delay(300);
          mess += " C";
          mess += " \n";
          delay(500);
          sms(mess, num);
          delay(500);
        } else if (currStr.startsWith("Snd")) {
          delay(500);
          String cs;
          cs = currStr;
          delay(1000);
          sms(cs, num);
          delay(500);
        } else if (!currStr.compareTo("R1 1")) {
          Serial.println("SMS R1 1");
          R1 = 1;
          EEPROM.write(1, R1);
          sms("R1 = Sensor 1", num);
        } else if (!currStr.compareTo("Reset")) {
          void(* resetFunc) (void) = 0;
          resetFunc();
        } else if (!currStr.compareTo("R1 2")) {
          Serial.println("SMS R1 2");
          R1 = 2;
          EEPROM.write(1, R1);
          sms("R1 = Sensor 2", num);
        } 
        isStringMessage = 1;
        csq = 0;
      } else {

        if (currStr.startsWith("+CMT")) {
          Serial.println("Is SMS");
          //если текущая строка начинается с "+CMT",
          //то следующая строка является сообщением
          isStringMessage = 2;
          num =  currStr;
          num = num.substring(7, 19);
          Serial.println("Get:" + num);
          currStr = "";

        } else if (currStr.startsWith("+CSQ")) {
          dbm = currStr.substring(5, 10);
          getdbm();

        }
      }
      currStr = "";
    } else if (currSymb != '\n') {
      currStr += currSymb;
      Serial.println(currStr);
      Serial.println(isStringMessage);
    }
  }

  
  if (csq == 0 && isStringMessage == 1) {
    previous++;
    if (previous > inter) {
      previous = 0;
      
      gettemp();
      //gprsSerial.println("AT+CSQ");
    }

  }

}


void sms(String text, String phone) {


  Serial.println("Send" + phone);
  delay(500);
  gprsSerial.println("AT+CMGS=\"" + phone + "\" ");
  delay(500);
  gprsSerial.print(text);
  delay(3000);
  gprsSerial.print((char)26);
  delay(3000);

}

void gettemp()
{
  int te1, te2;
  
  sensors.requestTemperatures();
  T1 = sensors.getTempCByIndex(0);
  
  T2 = sensors.getTempCByIndex(1);
  
  T3 = sensors.getTempCByIndex(2);
  

}

void getdbm()
{
 

}

 

vitjay
Offline
Зарегистрирован: 26.04.2016

SetResolution(9) сделал, вроде заробило...

vitjay
Offline
Зарегистрирован: 26.04.2016

SetResolution(9), не помогло... Блин... Как же температуру по другому спросить и где косяк?) Если он Ifом закрывается - почему все равно влияет гад...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы когда-нибудь сделаете то, что я просил? Та печать, что Вы привели не соответсвует тексту программы (наверное что-то поменялось по-мелочи).

Сделайте программу и ЕЁ печать. Вместе. В одном посте

А в другом посте сделайте работающую программу (с чем-то там закомментированным) и ЕЁ печать.

Если сделаете, то я постараюсь вечером посмотреть что у Вас там.

vitjay
Offline
Зарегистрирован: 26.04.2016

Ты сообщения то вообще читаешь(с пропусканием через мозг)? Написано уже где проблема. Из кода все понятно как работает и где БАГ, что нужно то еще??? Ничего ключвеого я не удалил...

Я сомневаюсь получить разумный(работающий) ответ при таких вопросах...

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vitjay пишет:

Написано уже где проблема.

Если Вы знаете, где проблема - исправляйте, чего сюда-то пришли?

vitjay пишет:

Ничего ключвеого я не удалил...

Да меня не волнует ключевое оно или нет. Я всего лишь прошу показать мне программы и её печать. Уговариваю целый день, как будто бы это нужно мне.

vitjay пишет:

Я сомневаюсь получить разумный(работающий) ответ при таких вопросах...

А я не сомневаюсь. Если Вы знаете где проблема и ничего ключевого не удаляли, то вперёд и с песнями, но без меня. Я больше уговаривать Вас не намерен. не хотите - дело Ваше.

 

 

vitjay
Offline
Зарегистрирован: 26.04.2016

Ой всееее....))))

Вопрос не в том, где она. Вопрос в том, как её исправить. И вопрос вообще ключевой: почему ардуина смотрит в невыполняемый цикл if и почему ей мешает в этом цикле одна функция из библиотеки Dallas. Причём мешает она конкретной строке начинающейся с Snd. А кода я скинул достаточно чтоб повторить проблему. Она с таким кодом тоже повторяется.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понимаете, когда Вас просят дать текст программы, надо давать текст программы, а не "достаточно чтоб повторить проблему". Это нужно Вам, а не мне, а я Вас целый день уговаривал. Теперь пусть Вас поуговаривает кто-нибудь другой.

vitjay
Offline
Зарегистрирован: 26.04.2016

Нет бы честно сказать, что ответ неизвестен. Надоел уже этот детский сад, прекратите тут писать всякую херню! Либо по делу пишите, либо нахр-н даже не заглядывайте сюда, уважаемый. Сам наехал в начале зачем-то, а теперь как обиженная девочка себя ведет. Дам не дам но не вам... Я здесь хочу получить конструктивные подсказки а не ТЕОРИЮ и какие то сопли. 

Пожалуйста не пишите сюда если нет конкретного предложения.

vitjay
Offline
Зарегистрирован: 26.04.2016

И тут я плавно начал нащупывать источник беды))))

Смысл в том, что пока смс не приходит - идет запрос температуры у датчиков. И в момент когда прихоит смс она записывается в буфер SIM800L. А она в свою очередь отдает это ардуине по запросу If(gprsSerial.available()) и т.д. ...

Выводя значение этого gprsSerial.available() можно узнать сколько еще осталось непрочитанных байт. Ну и судя из логов непрочитанные байты заканчиваются...

  SMS GET

Send+79122603064
+
1
Port: 61
+C
1
Port: 60
+CM
1
Port: 59
+CMT
1
Port: 58
+CMT:
1
Port: 57
+CMT:
1
Port: 56
+CMT: "
1
Port: 55
+CMT: "+
1
Port: 54
+CMT: "+7
1
Port: 53
+CMT: "+79
1
Port: 52
+CMT: "+791
1
Port: 51
+CMT: "+7912
1
Port: 50
+CMT: "+79122
1
Port: 49
+CMT: "+791226
1
Port: 48
+CMT: "+7912260
1
Port: 47
+CMT: "+79122603
1
Port: 46
+CMT: "+791226030
1
Port: 45
+CMT: "+7912260306
1
Port: 44
+CMT: "+79122603064
1
Port: 43
+CMT: "+79122603064"
1
Port: 42
+CMT: "+79122603064",
1
Port: 41
+CMT: "+79122603064","
1
Port: 40
+CMT: "+79122603064",""
1
Port: 39
+CMT: "+79122603064","",
1
Port: 38
+CMT: "+79122603064","","
1
Port: 37
+CMT: "+79122603064","","1
1
Port: 36
+CMT: "+79122603064","","16
1
Port: 35
+CMT: "+79122603064","","16/
1
Port: 34
+CMT: "+79122603064","","16/0
1
Port: 33
+CMT: "+79122603064","","16/04
1
Port: 32
+CMT: "+79122603064","","16/04/
1
Port: 31
+CMT: "+79122603064","","16/04/2
1
Port: 30
+CMT: "+79122603064","","16/04/28
1
Port: 29
+CMT: "+79122603064","","16/04/28,
1
Port: 28
+CMT: "+79122603064","","16/04/28,1
1
Port: 27
+CMT: "+79122603064","","16/04/28,13
1
Port: 26
+CMT: "+79122603064","","16/04/28,13:
1
Port: 25
+CMT: "+79122603064","","16/04/28,13:1
1
Port: 24
+CMT: "+79122603064","","16/04/28,13:15
1
Port: 23
+CMT: "+79122603064","","16/04/28,13:15:
1
Port: 22
+CMT: "+79122603064","","16/04/28,13:15:2
1
Port: 21
+CMT: "+79122603064","","16/04/28,13:15:25
1
Port: 20
+CMT: "+79122603064","","16/04/28,13:15:25+
1
Port: 19
+CMT: "+79122603064","","16/04/28,13:15:25+2
1
Port: 18
+CMT: "+79122603064","","16/04/28,13:15:25+20
1
Port: 17
+CMT: "+79122603064","","16/04/28,13:15:25+20"
1
Port: 16
Hopaaa
+CMT: "+79122603064","","16/04/28,13:15:25+20"
Is SMS
Get:+79122603064
S
2
Port: 13
Sn
2
Port: 12
Snd
2
Port: 11
Snd
2
Port: 10
Snd 1
2
Port: 9
Snd 12
2
Port: 8
Snd 123
2
Port: 7
Snd 1234
2
Port: 6
Snd 12345
2
Port: 5
Snd 123456
2
Port: 4
Snd 1234567
2
Port: 3
Snd 12345678
2
Port: 2
Snd 123456789
2
Port: 1
Snd 1234567891
2
Port: 0