модем NEOWAY M590

Sasha80
Offline
Зарегистрирован: 18.01.2016

Здравствуйте уважаемые форумчане. Просьба помочь разобраться с данным модулем, который ну никак не конектится с сервером. Инициализацию и настройки проходит полностью. IP серый получает.

Но на запрос "AT+FTPLOGIN=ip,login,pass" (с этими данными легко конектюсь файлзилой с сервером)

выдает вот это:

OK

+FTPLOGIN:Error TimeOut

+FTPLOGIN:Error Connect Server Fail

Если пытаюсь законектится с народным мониторингом, для отправки DHT, то при рег. нового датчика пишет что данные этот датчик не слал (при вводе MAC этой симки).

NEOWAY M590 REVISION 01.30d

Подскажите пожалуйста в чем проблема?

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

1. возможно, из-за того, что порт забыл прописать.

2. Проверь баланс.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Не порт IP все как надо, баланс есть. Проблему победил отправкой данных на свой сервер по FTP. 

Появилась другая проблема. Скетч работает примерно 15 мин если отправлять данные каждую минуту и примерно два часа если отправлять данные с интервалом 10 мин. Потом молчек. Запускаю монитор порта и ардуинка или модем как бы просыпаются и дальше шлют данные ровно столько же, после чего опять молчек. Это вообще что? И как это решить.

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Есть у меня подозрение, что он перегревается. Я во время своих экспериментов тоже замечал, что после долгой работы ему "надо отдохнуть". Но по сути не знаю.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Sh0a1m0a0n1 пишет:

Есть у меня подозрение, что он перегревается.

Может радиатор на него с водянкой :)

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Sasha80 пишет:

Sh0a1m0a0n1 пишет:

Есть у меня подозрение, что он перегревается.

Может радиатор на него с водянкой :)

азотом!

Sasha80
Offline
Зарегистрирован: 18.01.2016

Может что с кодом не так?


#include <dht11.h>
#define DHT11PIN 11  // пин DHT11
#define gsm Serial

dht11 DHT11;

     // функция отправляет данные на фтп сервер
void gprssend(){  
     // считаем данные с градусника
    DHT11.read(DHT11PIN);  
     // собераем массив для отправки
      char val[8]; 
      snprintf(val, sizeof(val),",%d,%d;",DHT11.humidity,DHT11.temperature);
      //snprintf(val, sizeof(val), "#FFFFFFFFFFFF#ardESP\n#H1DHT11#%d\n#T1DHT11#%d\n##", DHT11.humidity, DHT11.temperature);

      // проверяем соединины ли с интернетом
    gsm.flush(); 
    gsm.println("at+xiic?");
    delay(100);  
    if (gsm.find("0.0.0.0")) gprsconnect(); // если нет, то подключаемся
     gsm.flush();       
     
 gsm.println("AT+FTPLOGOUT");                // на всякий случай разлогиниваемся
 delay(1000);
 gsm.flush(); 
 
      // соединяемся с FTP и отправляем массив в файл   
 gsm.println("AT+FTPLOGIN=*********************"); // соединяемся с FTP, УКАЗЫВАЕМ СВОЙ СЕРВЕР!
 
 while(!gsm.find("+FTPLOGIN"));              // в цикле ждем ответ
   delay(100);
   
   gsm.println("AT+FTPPUT=test.csv,1,2,8");  // открываем файл
   delay(1000); 
   gsm.println(val);                          // пишим в файл массив   
   delay(100);
   
    while(!gsm.find("+FTPPUT:")){              // ждем ответ
      Serial.print(".");
      delay(1000);    
   } 
  Serial.print("FTP send");                    // отписываемся что отправили
  delay(1000);
  gsm.println("AT+FTPLOGOUT");                 // разлогиниваемся
}

    // отправляем настройки GPRS и подключаемся. 
void gprsconnect(){

  gsm.println("AT+CGDCONT=1,\"IP\",\"internet.beeline.ru\"");   
  delay(100);
  gsm.println("AT+XGAUTH=1,1,\"beeline\",\"beeline\"");   
  delay(100);
  gsm.println("AT+CUSD=1,\"*99***1#\",15");  
  delay(100);
  gsm.println("AT+XISP=0");  // включаем РРР
  delay(100);
  //gsm.println("AT+CCLK="16/10/08,14:15:10+03""); устанавливаем время где по порядку идут «год/месяц/дата,час:минуты:секунды+часовой пояс» 
  //delay(100);
  gsm.println("at+xiic=1");   
  delay(100);
  do{             // ждем IP
    gsm.println("at+xiic?");         
    Serial.print(".");
    delay(300);  
  }while(gsm.find("0.0.0.0"));       
}

void setup() {
  Serial.begin(9600);
  gsm.begin(9600);  
    
      do{             // проверяем готовность модема
        gsm.println("AT+CPAS");         
        Serial.print(".");
        delay(100);  
      }while(!gsm.find("0"));
      
      do{              
        gsm.println("AT+CREG?");        
        Serial.print(":");
        delay(100);  
      }while(!gsm.find("+CREG: 0,1"));
 
 
  delay(100); 
  gsm.flush();
  
gprsconnect();     // соединяемся с инетом
gprssend();        // отправляем данные
}

void loop() {
  delay(600000);   // Данные шлются раз в 10 минут
  gprssend();
}





 

Sasha80
Offline
Зарегистрирован: 18.01.2016

Кстати когда саму ардуину перезагружаешь, данные снова шлются. Может в ней чего то переполняется. Незнаю может буфер какой.

 

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Ну, например, команда flush, по моему мнению, лишняя. А чтобы не переполнялся буфер, надо Serial всё время читать. Я где-то тут уже выкладывал код.

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Посмотрите: вот как-то так.

arduino.ru/forum/programmirovanie/kak-zashchitit-bufer-serial1-ot-perepolneniya

Sasha80
Offline
Зарегистрирован: 18.01.2016

Sh0a1m0a0n1 спасибо конечно, пересмотрел тему, и не только эту, тут решения не увидел (kak-zashchitit-bufer-serial1-ot-perepolneniya). Вы создавали еще похожую тему, тоже пролистал. Вы предлагади реализовать защиту от переполнения буфера вот таким образом:

 

void modemread(){
    while (gsm.available()>0)
{
  char c = gsm.read();
  Serial.write(c);
}
}

Не совсем понял как это работает, вы пишете "Пихнул её почти после каждого оператора, данные перестали теряться" - что значит " почти после каждого оператора"- операторов всего два setup() и loop().

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

если переодически подвисает модем М590, то надо установить керамический конденсатор 0.1 мкф между 14 выводом модема и землей

Sasha80
Offline
Зарегистрирован: 18.01.2016

Дык модем то не виснет, я так понимаю ардуина устает. Буфер переполняется сериал. Вот и бьемся тут, пока никак!

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

ну-ну, бейтесь :)

Sasha80
Offline
Зарегистрирован: 18.01.2016

Воткнуть то не проблема, но на чем основано ваше предположение? В схеме подключения нет такого конденсатора в этом месте.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

идут помехи по питанию симки и это тут уже обсуждалось

http://arduino.ru/forum/apparatnye-voprosy/ne-rabotaet-neoway-m590?page=5#comment-205653

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

После каждой команды, конечно, извините.

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

А работает проще простого. Читает содержимое буфера, а, значит, очищает его. Заодно заменяет Delay.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Sh0a1m0a0n1 не могли бы вы на примере моего кода это показать, как это будет выглядеть. Буду благодарен.

Ато я чет попробывал ее вставить после некоторых АТ команд, компелятор заругал.

Сделал вот так, правильно?:

#include <dht11.h>
#define DHT11PIN 11  // пин DHT11
#define gsm Serial

dht11 DHT11;

void modemread(){
    while (gsm.available()>0)
{
  char c = gsm.read();
  Serial.write(c);
}
}

     // функция отправляет данные на фтп сервер
void gprssend(){  
     
    DHT11.read(DHT11PIN);  // считаем данные с градусника  
     
      char val[8];         // собераем массив для отправки
      snprintf(val, sizeof(val),",%d,%d;",DHT11.humidity,DHT11.temperature);

      // проверяем соединины ли с интернетом
    gsm.flush(); 
    gsm.println("at+xiic?");
    delay(100);  
    if (gsm.find("0.0.0.0")) gprsconnect(); // если нет, то подключаемся
     gsm.flush();       
     gprssend(); 
     
 gsm.println("AT+FTPLOGOUT");                // на всякий случай разлогиниваемся
 delay(1000);
 gsm.flush();
 gprssend(); 
 
      // соединяемся с FTP и отправляем массив в файл   
 gsm.println("AT+FTPLOGIN=5.101.152.43,21,rfb79270_test,A*D7]66*"); // соединяемся с FTP, УКАЗЫВАЕМ СВОЙ СЕРВЕР!
 
 while(!gsm.find("+FTPLOGIN"));              // в цикле ждем ответ
   delay(100);
   
   gsm.println("AT+FTPPUT=test.csv,1,2,8");  // открываем файл
   delay(1000); 
   gsm.println(val);                          // пишим в файл массив   
   delay(100);
   
    while(!gsm.find("+FTPPUT:")){              // ждем ответ
      Serial.print(".");
      delay(1000);    
   } 
  Serial.print("FTP send");                    // отписываемся что отправили
  delay(1000);
  gsm.println("AT+FTPLOGOUT");                 // разлогиниваемся
}

    // отправляем настройки GPRS и подключаемся. 
void gprsconnect(){

  gsm.println("AT+CGDCONT=1,\"IP\",\"internet.beeline.ru\"");   
  //delay(100);
  modemread();
  gsm.println("AT+XGAUTH=1,1,\"beeline\",\"beeline\"");   
  //delay(100);
  modemread();
  gsm.println("AT+CUSD=1,\"*99***1#\",15");  
  //delay(100);
  modemread();
  gsm.println("AT+XISP=0");  // включаем РРР
  //delay(100);
  modemread();
  gsm.println("at+xiic=1");   
  //delay(100);
  modemread();
  
  do{             // ждем IP
    gsm.println("at+xiic?");         
    Serial.print(".");
    delay(300);  
  }while(gsm.find("0.0.0.0"));       
}

void setup() {
  Serial.begin(19200);
  gsm.begin(19200);  
    
      do{             // проверяем готовность модема
        gsm.println("AT+CPAS");         
        Serial.print(".");
        delay(100);  
      }while(!gsm.find("0"));
      
      do{              
        gsm.println("AT+CREG?");        
        Serial.print(":");
        delay(100);  
      }while(!gsm.find("+CREG: 0,1"));
 
  delay(100); 
  gsm.flush();
  
gprsconnect();     // соединяемся с инетом
gprssend();        // отправляем данные
}

void loop() {
  delay(600000);   // Данные шлются раз в 10 минут
  gprssend();
  gsm.flush();

}

 

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

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

По краней мере, это компилируется.

#define gsm Serial1
#include <DmxSimple.h>
int channel;
int value;
String atcusd = "at+cusd=1,\"*99#\",15";

void modemread() {
for (int i=0; i <= 5000; i++)
  {
    if (gsm.find("OK") == true);
    {
      goto label1;
    }
    Serial.println(gsm.readString());//Надо оставить либо эту строчку, либо следующую Serial.println. Пока не проверял. Должна выводить в Serial сведения об ошибке.
    delay(50);
  }
  Serial.println(gsm.readString());
  setup(); 
  label1:
  delay(1);
}
void gprsconnect() {

  gsm.println("ATE0");
  modemread();
  gsm.println("AT&D2");
  modemread();
  gsm.println("AT+CGDCONT=1,\"IP\",\"internet.tele2.ru\"");
  modemread();
  gsm.println("AT+CLIP=1");
  modemread();
  gsm.println(atcusd);
  modemread();
  gsm.println("at+xisp=0");
  modemread();
  gsm.println("at+xiic=1");
  modemread();
  for (int i=0; i <= 5000; i++)
  {
    gsm.println("at+xiic?");
    if (gsm.find("0.0.0.0") == false);
    {
      goto label2;
    }
    delay(100);
  }
  label2:
  gsm.println("at+xiic?");
  delay(100);
  Serial.println(gsm.readString());
}
void gprsget() {

  gsm.println("at+xiic?");
  delay(100);
  while (gsm.find("0.0.0.0")) {
    gprsconnect();
  }
  gsm.println("AT+FTPLOGOUT");
  modemread();
  gsm.println("AT+FTPLOGIN=Сервер, порт, логин. пароль");
  for (int i=0; i <= 100; i++){
    delay(100);
    Serial.println(gsm.readString());
      if (gsm.find("+FTPLOGIN: User logged in."==true))
      {
        goto label;
      }
      }
      setup();
   
label:
  Serial.println(gsm.readString());
  gsm.println("AT+FTPGET=test.txt,1,1");
  delay(100);
  do {
    delay(10);
  } while (gsm.find("+FTPGET:7,"));
    while (gsm.available() > 0);
  {
    channel = gsm.parseInt();
    value = gsm.parseInt();
    DmxSimple.write(channel, value);
    Serial.write('\n\n');
    Serial.println("DMX:" + String(channel) + "," + String(value));
  }
}
void setup() {
  
  Serial.begin(9600);
  gsm.begin(9600);
  do {            // проверяем готовность модема
    gsm.println("AT+CPAS");
    Serial.print(".");
    delay(100);
  } while (!gsm.find("0"));

  do {
    gsm.println("AT+CREG?");
    Serial.print(":");
    delay(100);
  } while (!gsm.find("+CREG: 0,1"));
  gprsconnect();
  //gprsget();
}


void loop() {
  gprsget();
 //if (gsm.available())
   // Serial.write(gsm.read());
   // if (Serial.available())
   // gsm.write(Serial.read());
}

 

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

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

Sasha80
Offline
Зарегистрирован: 18.01.2016

Это версия с вычитыванием буфера из сериал?

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Да. А на что конкретно у Вас ругался компилятор?

Sasha80
Offline
Зарегистрирован: 18.01.2016

Уж точно и не вспомню. Уже переделал. Использовал ваш цикл, спасибо. 

void modemread(){
    while (gsm.available()>0)
{
  char c = gsm.read();
  Serial.write(c);
}
}

Тестирую. Вроде работает. Другая проблема вылезла. Заменил датчик на  DHT22 изменил немного скетч, а он мне в сериал какую то фигню шлет. Штатным скетчем проверял, датчик рабочий. Гдето в коде ошибка.

#include "DHT.h"
#define DHTPIN 7
#define DHTTYPE DHT22
//#include <dht11.h>
//#define DHT11PIN 11  // пин DHT11
#define gsm Serial

//dht11 DHT11;
DHT dht(DHTPIN, DHTTYPE);

void modemread(){
    while (gsm.available()>0)
{
  char c = gsm.read();
  Serial.write(c);
}
}

     // функция отправляет данные на фтп сервер
void gprssend(){  
     
    //DHT11.read(DHT11PIN);  // считаем данные с градусника  
     
      char val[8];         // собераем массив для отправки
      //snprintf(val, sizeof(val),",%d,%d;",DHT11.humidity,DHT11.temperature);
        snprintf(val, sizeof(val),",%d,%d;",dht.readHumidity(),dht.readTemperature());
        
      // проверяем соединины ли с интернетом
    gsm.flush(); 
    gsm.println("at+xiic?");
    delay(100);  
    if (gsm.find("0.0.0.0")) gprsconnect(); // если нет, то подключаемся
    gsm.flush();       
          
 gsm.println("AT+FTPLOGOUT");                // на всякий случай разлогиниваемся
 delay(1000);
 gsm.flush(); 
 
      // соединяемся с FTP и отправляем массив в файл   
 gsm.println("AT+FTPLOGIN=5.101.152.43,21,rfb79270_chart,P!0A?8*7"); // соединяемся с FTP, УКАЗЫВАЕМ СВОЙ СЕРВЕР!
 
 while(!gsm.find("+FTPLOGIN"));              // в цикле ждем ответ
   delay(100);
   
   gsm.println("AT+FTPPUT=test.csv,1,2,8");  // открываем файл
   delay(1000); 
   gsm.println(val);                          // пишим в файл массив   
   delay(100);
   
    while(!gsm.find("+FTPPUT:")){              // ждем ответ
      Serial.print(".");
      delay(1000);    
   } 
  Serial.print("FTP send");                    // отписываемся что отправили
  delay(1000);
  gsm.println("AT+FTPLOGOUT");                 // разлогиниваемся
}

 

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Не вижу, где вы используете мой цикл.

К сожалению, не разбирался  с датчиком ещё. Вот придёт мой датчик, буду у Вас учиться)

Ещё раз переписал код. Вставил Ваш код теперь)

#define gsm Serial1
#include <dht11.h>
#define DHT11PIN 11  // пин DHT11


dht11 DHT11;
int channel;
int value;
String atcusd = "at+cusd=1,\"*99#\",15";

void modemread() {
for (int i=0; i <= 5000; i++)
  {
    if (gsm.find("OK") == true);
    {
      goto label1;
    }
    Serial.println(gsm.readString());//Надо оставить либо эту строчку, либо следующую Serial.println. Пока не проверял. Должна выводить в Serial сведения об ошибке.
    delay(50);
  }
  Serial.println(gsm.readString());
  setup(); 
  label1:
  delay(1);
}
void gprsconnect() {

  gsm.println("ATE0");
  modemread();
  gsm.println("AT&D2");
  modemread();
  gsm.println("AT+CGDCONT=1,\"IP\",\"internet.tele2.ru\"");
  modemread();
  gsm.println("AT+CLIP=1");
  modemread();
  gsm.println(atcusd);
  modemread();
  gsm.println("at+xisp=0");
  modemread();
  gsm.println("at+xiic=1");
  modemread();
  for (int i=0; i <= 5000; i++)
  {
    gsm.println("at+xiic?");
    if (gsm.find("0.0.0.0") == false);
    {
      goto label2;
    }
    delay(100);
  }
  label2:
  gsm.println("at+xiic?");
  delay(100);
  Serial.println(gsm.readString());
}
void gprssend(){  
     
    DHT11.read(DHT11PIN);  // считаем данные с градусника  
     
      char val[8];         // собераем массив для отправки
      snprintf(val, sizeof(val),",%d,%d;",DHT11.humidity,DHT11.temperature);

      // проверяем соединины ли с интернетом
     
   gsm.println("at+xiic?");
  delay(100);
  while (gsm.find("0.0.0.0")) {
    gprsconnect();
  }
  gsm.println("AT+FTPLOGOUT");
  modemread();                // на всякий случай разлогиниваемся

 
      // соединяемся с FTP и отправляем массив в файл   
 gsm.println("AT+FTPLOGIN=5.101.152.43,21,rfb79270_test,A*D7]66*"); // соединяемся с FTP, УКАЗЫВАЕМ СВОЙ СЕРВЕР!
 
 for (int i=0; i <= 100; i++){
    delay(100);
    Serial.println(gsm.readString());
      if (gsm.find("+FTPLOGIN: User logged in."==true))
      {
        goto label;
      }
      }
      setup();
   
label:
   
   gsm.println("AT+FTPPUT=test.csv,1,2,8");  // открываем файл
   delay(1000); 
   gsm.println(val);                          // пишим в файл массив   
   delay(100);
   
    while(!gsm.find("+FTPPUT:")){              // ждем ответ
      Serial.print(".");
      delay(1000);    
   } 
  Serial.print("FTP send");                    // отписываемся что отправили
  delay(1000);
  gsm.println("AT+FTPLOGOUT");                 // разлогиниваемся
}

void gprsget() {

  gsm.println("at+xiic?");
  delay(100);
  while (gsm.find("0.0.0.0")) {
    gprsconnect();
  }
  gsm.println("AT+FTPLOGOUT");
  modemread();
  gsm.println("AT+FTPLOGIN=5.101.152.43,21,rfb79270_test,A*D7]66*");
  for (int i=0; i <= 100; i++){
    delay(100);
    Serial.println(gsm.readString());
      if (gsm.find("+FTPLOGIN: User logged in."==true))
      {
        goto label;
      }
      }
      setup();
   
label:
  Serial.println(gsm.readString());
  gsm.println("AT+FTPGET=test.txt,1,1");
  delay(100);
  do {
    delay(10);
  } while (gsm.find("+FTPGET:7,"));
    while (gsm.available() > 0);
  {
    channel = gsm.parseInt();
    value = gsm.parseInt();
    DmxSimple.write(channel, value);
    Serial.write('\n\n');
    Serial.println("DMX:" + String(channel) + "," + String(value));
  }
}
void setup() {
  
  Serial.begin(9600);
  gsm.begin(9600);
  do {            // проверяем готовность модема
    gsm.println("AT+CPAS");
    Serial.print(".");
    delay(100);
  } while (!gsm.find("0"));

  do {
    gsm.println("AT+CREG?");
    Serial.print(":");
    delay(100);
  } while (!gsm.find("+CREG: 0,1"));
  gprsconnect();
  //gprsget();
}


void loop() {
  gprsget();
 //if (gsm.available())
   // Serial.write(gsm.read());
   // if (Serial.available())
   // gsm.write(Serial.read());
}

 

Sasha80
Offline
Зарегистрирован: 18.01.2016

Только логин и пароль по фтп поменять не забудьте :)

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Nfr jyb nen Dfib)

Sasha80
Offline
Зарегистрирован: 18.01.2016

Ругается на 80 строку 

ISO C++ forbids comparison between pointer and integer [-fpermissive]

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Это где такое? Не нашёл ничего подобного  80-й строке. Сейчас то уже не ругается?

Sasha80
Offline
Зарегистрирован: 18.01.2016

 if (gsm.find("+FTPLOGIN: User logged in."==true)) 

вот она, говорит что:

exit status 1
ISO C++ forbids comparison between pointer and integer [-fpermissive]
 
В первой строке    #define gsm Serial1 изменил на #define gsm Serial
Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Уберите == true. Где-то нормально компилирует, где-то нет. Понял свою ошибку. Не там поставил. Надо вынести за одни скобки.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Убрал в двух местах, спотыкнулся тут:  DmxSimple.write(channel, value);  ошибка 'DmxSimple' was not declared in this scope

134 строка

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

А, это лишнее. Это Вам нафиг не сдалось, просто не убрал из своего кода. Вам же не нужна функция gprsget, так снесите её полностью! Извиняюсь, что не отшлифовал всё, крепко занят другим проектом.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Чувствую немного остальсь! Скетчь компелируется, но работает пока не совсем как надо. Попробую описать то что шлется в сериал:

регистрация в сети проходит IP получаем  +XIIC:    1, 10.226.55.78 

на сервер проходим +FTPLOGIN:User logged in

Вот после начинаются чудеса! В сериал идут пустые строки, минуты две, затем приходит вот это:
 
AT+CPAS
.AT+CREG?
:ATE0
AT&D2
AT+CGDCONT=1,"IP","internet.beeline.ru"
AT+CLIP=1
at+cusd=1,"*99***1#",15
at+xisp=0
at+xiic=1
at+xiic?
at+xiic?
 
+XIIC:    1, 10.226.55.78
 
OK
 
at+xiic?
AT+FTPLOGOUT
AT+FTPLOGIN=5.101.152.43,21,*************
 
 
OK
 
Затем опять пустые строки, опять минуты две и так по кругу. Файл на FTP не меняет.
 
Понимаю вашу занятьсть но может добьем его!

 

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Извиняюсь, опять моя дурацкая ошибка. После "User Logged in" надо убрать точку.

 

UPD: Только что-то долго идут пустые строки. В коде установлен "таймер" на 10 секунд.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Как убрать эти пустые строки совсем?

Или может я чего в коде науберал?

#define gsm Serial
#include <dht11.h>
#define DHT11PIN 11  // пин DHT11

dht11 DHT11;
int channel;
int value;
String atcusd = ("at+cusd=1,\"*99***1#\",15");  

void modemread() {
for (int i=0; i <= 5000; i++)
  {
    if (gsm.find("OK") == true);
    {
      goto label1;
    }
    //Serial.println(gsm.readString()); //Надо оставить либо эту строчку, либо следующую Serial.println. Пока не проверял. Должна выводить в Serial сведения об ошибке.
    delay(50);
  }
  Serial.println(gsm.readString());
  setup(); 
  label1:
  delay(1);
}
void gprsconnect() {

  gsm.println("ATE0");
  modemread();
  gsm.println("AT&D2");
  modemread();
  gsm.println("AT+CGDCONT=1,\"IP\",\"internet.beeline.ru\"");
  modemread();
  gsm.println("AT+CLIP=1");
  modemread();
  gsm.println(atcusd);
  modemread();
  gsm.println("at+xisp=0");
  modemread();
  gsm.println("at+xiic=1");
  modemread();
  for (int i=0; i <= 5000; i++)
  {
    gsm.println("at+xiic?");
    if (gsm.find("0.0.0.0") == false);
    {
      goto label2;
    }
    delay(100);
  }
  label2:
  gsm.println("at+xiic?");
  delay(100);
  Serial.println(gsm.readString());
}
void gprssend(){  
     
    DHT11.read(DHT11PIN);  // считаем данные с градусника  
     
      char val[8];         // собераем массив для отправки
      snprintf(val, sizeof(val),",%d,%d;",DHT11.humidity,DHT11.temperature);

      // проверяем соединины ли с интернетом
     
   gsm.println("at+xiic?");
  delay(100);
  while (gsm.find("0.0.0.0")) {
  gprsconnect();
  }
  gsm.println("AT+FTPLOGOUT");
  modemread();                // на всякий случай разлогиниваемся

 
      // соединяемся с FTP и отправляем массив в файл   
 gsm.println("AT+FTPLOGIN=5.101.152.43,21,*******************"); // соединяемся с FTP, УКАЗЫВАЕМ СВОЙ СЕРВЕР!
 
 for (int i=0; i <= 100; i++){
    delay(100);
    Serial.println(gsm.readString());
      if (gsm.find("+FTPLOGIN: User logged in"))
      {
        goto label;
      }
      }
      setup();
   
label: 
   gsm.println("AT+FTPPUT=test.csv,1,2,8");  // открываем файл
   delay(1000); 
   gsm.println(val);                          // пишим в файл массив   
   delay(100);
   
    while(!gsm.find("+FTPPUT:")){              // ждем ответ
      Serial.print(".");
      delay(1000);    
   } 
  Serial.print("FTP send");                    // отписываемся что отправили
  delay(1000);
  gsm.println("AT+FTPLOGOUT");                 // разлогиниваемся
}

void setup() {
  
  Serial.begin(19200);
  gsm.begin(19200);
  do {            // проверяем готовность модема
    gsm.println("AT+CPAS");
    Serial.print(".");
    delay(100);
  } while (!gsm.find("0"));

  do {
    gsm.println("AT+CREG?");
    Serial.print(":");
    delay(100);
  } while (!gsm.find("+CREG: 0,1"));

  gprsconnect();
  gprssend();
}


void loop() {
  //delay(6000);
  gprssend();
}

 

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

А они Вам мешают?

А всё остальное работает?

Попробуйте переделать с этого

for (int i=0; i <= 100; i++){
    delay(100);
    Serial.println(gsm.readString());
      if (gsm.find("+FTPLOGIN: User logged in"))
      {
        goto label;
      }
      }
      setup();

на это:

for (int i=0; i <= 100; i++){
    delay(100);
if (gsm.length()>2)
{
    Serial.println(gsm.readString());
}
      if (gsm.find("+FTPLOGIN: User logged in"))
      {
        goto label;
      }
      }
      setup();

 

Sasha80
Offline
Зарегистрирован: 18.01.2016

Дык если б в одних строках дело было..... Ведь к сожалению код не отрабатывает. Не обновляет фафл на сервере данными с датчика и все тут. :(    В последнем исправлении ругнулся на это  if (gsm.length()>2)

exit status 1
'class HardwareSerial' has no member named 'length'
Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

заменить length на available. Возможно, вместо 2 поставить 0.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Строки пустые пропали, это хороше, теперь бы его из замкнутого круга вытащить !

AT+CPAS
.AT+CREG?
:ATE0
AT&D2
AT+CGDCONT=1,"IP","internet.beeline.ru"
AT+CLIP=1
at+cusd=1,"*99***1#",15
at+xisp=0
at+xiic=1
at+xiic?
at+xiic?
 
+XIIC:    1, 10.215.28.40
 
OK
 
at+xiic?
AT+FTPLOGOUT
AT+FTPLOGIN=5.101.152.43,21,***********************
 
 
OK
 
Не может дальше продвинуться. На FTP данные не отправляет
 
Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Мдя. Тут надо один раз сесть и написать нормальный код.

Меняем тогда код обратно на 

gsm.println("AT+FTPLOGIN=5.101.152.43,21,rfb79270_chart,P!0A?8*7"); // соединяемся с FTP, УКАЗЫВАЕМ СВОЙ СЕРВЕР!
 
 while(!gsm.find("+FTPLOGIN"));              // в цикле ждем ответ
   delay(100);

и всё.

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

То чувство, когда сваял нечто, похожее на шедевр, а отладить некогда(((

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Valera19701 пишет:

если переодически подвисает модем М590, то надо установить керамический конденсатор 0.1 мкф между 14 выводом модема и землей

а насчёт модуля WiFi  ESP8266 ESP-01 не подскажете?

При включении выдаёт строки инициализации, а потом только иероглифы шлёт вместо эха, а команды не выполняет.

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

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

Sasha80
Offline
Зарегистрирован: 18.01.2016

Sh0a1m0a0n1 вы совершенно правы, лучше самому уметь. Опыта программирования как вы поняли нет. Разобраться надо бы конечно самому, но что то туговато у меня с этим модемом идет. Хотя для контроля и поддержания микроклимата, устройство сварганил. Вот теперь для него и хочу этот модем приспособить. Тут вся проблема то завертелась вокруг переполнения буфера на этом и сел...

Не понимаю наверное сути и тонкости работы в сети. В любом случае вам большое спасибо что уделили время.

По поводу последних исправлений, поменял цикл for на while(!gsm.find("+FTPLOGIN")); Заработало как прежде. Бодро шлет показания но примерно 30 раз. Затем стоп и как говориться - "в каждой строчки только точки" ................................

Я так понимаю проблема переполнения буфера.

 

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

С чего бы ему переполняться? Не думаю. Ищите в другом.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Как говорят автомеханика - "Главное выявить проблему, а починить нет проблем!"

По вашему мнению остановка выполнения программы из последнего исправленного скетча вот с этим куском:

// соединяемся с FTP и отправляем массив в файл   
 gsm.println("AT+FTPLOGIN=5.101.152.43,21,rfb79270_char,iGyNk*1v"); // соединяемся с FTP, УКАЗЫВАЕМ СВОЙ СЕРВЕР!
 while(!gsm.find("+FTPLOGIN"));  
 //for (int i=0; i <= 100; i++){
  delay(100);
 /*   
if (gsm.available()>0)
{
    Serial.println(gsm.readString());
}
      if (gsm.find("+FTPLOGIN: User logged in"))
      {
        goto label;
      }
      }
      setup();
 */  
//label: 
   gsm.println("AT+FTPPUT=test.csv,1,2,8");  // открываем файл
   delay(1000); 
   gsm.println(val);                          // пишим в файл массив   
   delay(100);
   
    while(!gsm.find("+FTPPUT:")){              // ждем ответ
      Serial.print(".");
      delay(1000);    
   } 
  Serial.print("FTP send");                    // отписываемся что отправили
  delay(1000);
  gsm.println("AT+FTPLOGOUT");                 // разлогиниваемся
}

не является следствием переполнения буфера хардового сериала?

Повторюсь, симтомы похожи на то что ардуина перестает слать данные, каждый раз после отправки примерно 33-х или 36-ти пакетов данных,  после чего в сериал выводятся постоянные точки. После закрытия и вновь открытия програмного монитора ардуина вновь исправно шлет 36 пакетов. 

Я изначально думал что вот такое закрытие програмного монитора чистит буфер сериала, поэтому скетч и отрабатывает вновь после перезапуска монитора. Разве не так?

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Ну не знаю. Вставьте в начало gprssend этот код:

Serial.print("В буфере:");
while(gsm.available()>0){              // ждем ответ
      Serial.print(gsm.String);
      delay(1000);  
 Serial.println(" ");
   } 

Перед каждым соединением он будет кидать в serial всё, что находится в буфере.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Нашел интересное решение данной проблемы. Сторожевой таймер!

 

Sh0a1m0a0n1
Offline
Зарегистрирован: 16.09.2016

Поясните, пожалуйста.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Сейчас сам с этим разбираюсь. Вот от куда информация. 

http://mypractic.ru/urok-16-povyshenie-nadezhnosti-programm-dlya-arduino-storozhevoj-tajmer.html

Каково ваше мнение? Думаю мне сгодится.

Так же на этом форуме человек проблему поднимал вот тут 

Программный Reset

http://arduino.ru/forum/programmirovanie/programmnyi-reset