Почему мой 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 для резервного питания.
@Zurn, 👍2
Обсуждение1 ответ
Со страницы Параметры лицензии ThingSpeak:
ThingSpeak доступен как бесплатный сервис для небольших некоммерческих проектов (<3 миллиона сообщений в год или ~8200 сообщений в день).
Можете ли вы достичь этого предела?
- Невозможно извлечь основные данные с помощью ThingspeakHTTP.
- Как увеличить частоту передачи данных модуля SIM900A GSM, подключенного к Arduino Uno?
- Как публиковать запросы HTTP POST на моем веб-сайте?
- Простой запрос GET с ESP8266HTTPClient
- Ethernet nodemcu
- Arduino zero Error: не удается найти устройство CMSIS-DAP
- Правильная схема карты Micro SD
- Почему я получаю "expected primary-expression before '.' token"?
Если вы используете бесплатный вариант, разве у него нет дневного лимита сообщений? Может быть, вы попадаете в это, @KIIV
Хороший вопрос - я пользуюсь бесплатной версией, но с ежедневным ограничением сообщений не столкнулся. Похоже, что все рассчитывается ежегодно (они дают «дневной максимум», но, похоже, это просто рекомендация по оптимизации количества сообщений, которые вы можете отправлять в год)., @Zurn