Почему мой Arduino перестает загружаться на сервер Thingspeak через несколько часов?

Я использую устройство Maduino Zero 4G SIM7600 для загрузки данных с 28 датчиков на IoT-сервер ThingSpeak. Он работает хорошо в течение нескольких часов, затем перестает загружать данные. Иногда оно начинается снова через разное время (час или два), иногда нет.

Я могу подтвердить, что происходят сбои только в функциях SIM7600 и/или Thingspeak, поскольку последовательный монитор показывает, что другие операции, связанные с I2C на плате Arduino, все еще работают нормально, даже если загрузка на сервер не удалась.

Вот соответствующая часть кода:

void setup(){
    SerialUSB.begin(115200);
    SerialUSB.println("Serial initialized");
    Serial1.begin(115200);
    Wire.begin();

    pinMode(LTE_PWRKEY_PIN, OUTPUT);
    digitalWrite(LTE_RESET_PIN, LOW);
    delay(100);
    digitalWrite(LTE_PWRKEY_PIN, HIGH);
    delay(2000);
    digitalWrite(LTE_PWRKEY_PIN, LOW);
    
    pinMode(LTE_FLIGHT_PIN, OUTPUT);
    digitalWrite(LTE_FLIGHT_PIN, LOW);//Нормальный режим
    
    delay(5000);
     
    sendData("AT+CCID", 3000, DEBUG);
    sendData("AT+CREG?", 3000, DEBUG);
    sendData("AT+CGATT=1", 1000, DEBUG);
    sendData("AT+CGACT=1,1", 1000, DEBUG);    
    sendData("AT+CGDCONT=1,\"IP\",\"sp.mb.com\"", 1000, DEBUG);

    delay(5000);
}

void loop(){
  getData();
  
  //Датчики 0-6
  http_str = "AT+HTTPPARA=\"URL\",\"https://api.thingspeak.com/update?api_key=" + Apikey1 + "&field1=" + (String)hallData[0] + "&field2=" + (String)hallData[1] + "&field3=" + (String)hallData[2] + "&field4=" + (String)hallData[3] + "&field5=" + (String)hallData[4] + "&field6=" + (String)hallData[5] + "&field7=" + (String)hallData[6] + "\"\r\n";
  SerialUSB.print("Sent to Channel 1: ");
  SerialUSB.println(http_str);
  sendData("AT+HTTPINIT\r\n", 2000, DEBUG);
  sendData(http_str, 2000, DEBUG);
  sendData("AT+HTTPACTION=1\r\n", 3000, DEBUG);
  sendData("AT+HTTPTERM\r\n", 3000, DEBUG);

  //Датчики 7-13
  http_str = "AT+HTTPPARA=\"URL\",\"https://api.thingspeak.com/update?api_key=" + Apikey2 + "&field1=" + (String)hallData[7] + "&field2=" + (String)hallData[8] + "&field3=" + (String)hallData[9] + "&field4=" + (String)hallData[10] + "&field5=" + (String)hallData[11] + "&field6=" + (String)hallData[12] + "&field7=" + (String)hallData[13] + "\"\r\n";
  SerialUSB.print("Sent to Channel 2: ");
  SerialUSB.println(http_str);
  sendData("AT+HTTPINIT\r\n", 2000, DEBUG);
  sendData(http_str, 2000, DEBUG);
  sendData("AT+HTTPACTION=1\r\n", 3000, DEBUG);
  sendData("AT+HTTPTERM\r\n", 3000, DEBUG);

  //Датчики 14-20
  http_str = "AT+HTTPPARA=\"URL\",\"https://api.thingspeak.com/update?api_key=" + Apikey3 + "&field1=" + (String)hallData[14] + "&field2=" + (String)hallData[15] + "&field3=" + (String)hallData[16] + "&field4=" + (String)hallData[17] + "&field5=" + (String)hallData[18] + "&field6=" + (String)hallData[19] + "&field7=" + (String)hallData[20] + "\"\r\n";
  SerialUSB.print("Sent to Channel 3: ");
  SerialUSB.println(http_str);
  sendData("AT+HTTPINIT\r\n", 2000, DEBUG);
  sendData(http_str, 2000, DEBUG);
  sendData("AT+HTTPACTION=1\r\n", 3000, DEBUG);
  sendData("AT+HTTPTERM\r\n", 3000, DEBUG);

  //Датчики 21-27
  http_str = "AT+HTTPPARA=\"URL\",\"https://api.thingspeak.com/update?api_key=" + Apikey4 + "&field1=" + (String)hallData[21] + "&field2=" + (String)hallData[22] + "&field3=" + (String)hallData[23] + "&field4=" + (String)hallData[24] + "&field5=" + (String)hallData[25] + "&field6=" + (String)hallData[26] + "&field7=" + (String)hallData[27] + "\"\r\n";
  SerialUSB.print("Sent to Channel 4: ");
  SerialUSB.println(http_str);
  sendData("AT+HTTPINIT\r\n", 2000, DEBUG);
  sendData(http_str, 2000, DEBUG);
  sendData("AT+HTTPACTION=1\r\n", 3000, DEBUG);
  sendData("AT+HTTPTERM\r\n", 3000, DEBUG);
}

String sendData(String command, const int timeout, boolean debug){
  String response = "";
  Serial1.println(command);
  
  long int time = millis();
  while ( (time + timeout) > millis()){
    while (Serial1.available()){
      char c = Serial1.read();
      response += c;
    }
  }
  if (debug){
    SerialUSB.print(response);
  }
  return response;
}

Все операции, связанные с SIM7600, взяты непосредственно из примеров Makerfabs, доступных по адресу эта страница. Следует отметить, что в своем примере они используют команду AT+HTTPACTION=0, которая, согласно эта страница означает ЧТЕНИЕ. Это работает, но иногда возвращает ERROR вместо OK. Я изменил его на AT+HTTPACTION=1, что означает POST, который, кажется, работает немного лучше - по крайней мере, нет сообщений об ошибках. Но та же проблема все еще сохраняется.

ОБНОВЛЕНИЕ №1: сообщения ОШИБКИ иногда возвращаются даже при настройке AT+HTTPACTION=1. Я заметил, что создание новых ключей API для каждой страницы Thingspeak (всего их 4, по 7 датчиков на странице) заставляет его работать какое-то время, чего раньше не было. Никаких объяснений, почему это так.

Будем признательны за любые советы.

Что касается аппаратного обеспечения, я питаю его от адаптера переменного тока через преобразователь постоянного тока 5 В. Я также использую батарею 3,7 для резервного питания.

, 👍2

Обсуждение

Если вы используете бесплатный вариант, разве у него нет дневного лимита сообщений? Может быть, вы попадаете в это, @KIIV

Хороший вопрос - я пользуюсь бесплатной версией, но с ежедневным ограничением сообщений не столкнулся. Похоже, что все рассчитывается ежегодно (они дают «дневной максимум», но, похоже, это просто рекомендация по оптимизации количества сообщений, которые вы можете отправлять в год)., @Zurn


1 ответ


0

Со страницы Параметры лицензии ThingSpeak:

ThingSpeak доступен как бесплатный сервис для небольших некоммерческих проектов (<3 миллиона сообщений в год или ~8200 сообщений в день).

Можете ли вы достичь этого предела?

,