Данные не отправляются в Thingspeak с использованием SIM900 с прерыванием в коде

В настоящее время я работаю на метеостанции с онлайн-записью на Thingspeak. Когда я отправляю набор параметров (Т, Давление, Влажность, свет), у меня нет проблем с отправкой данных. Но когда я добавляю в код параметр дождя, код не отправляет данные. Параметр дождя рассчитывается на основе прерывания, может ли это повлиять на отправку данных? Это какой-нибудь трюк, который я могу использовать, чтобы решить эту проблему?

Код:

#include <Wire.h>
#include <SoftwareSerial.h>
#include <String.h>

SoftwareSerial Sim900Serial(9,11);//Конфигурация серийного ПО для сосен: RX, TX

Weather myHumidity;//Создаем экземпляр датчика влажности

const byte RAIN = 2;

volatile int pulse_counter_ISR;
float mm; 
volatile unsigned long raintime, rainlast, raininterval, rain;

float humidity = 0; // [%]

void setup() {
  Serial.begin(19200); 
  Sim900Serial.begin(19200);// Arduino подключается к SIM900 со скоростью 19200 бит/с
  Sim900Serial.println("AT+IPR=19200");    // Сообщаем SIM900, чтобы не выполнялась автопередача

  Wire.begin();  

  pinMode(RAIN, INPUT_PULLUP); // вход датчика дождя из ветромера
  digitalWrite(RAIN, HIGH);

  myHumidity.begin();


  // подключаем внешние прерывания к функциям IRQ
  attachInterrupt(0, interrupt_handler, FALLING);

  // включаем прерывания
  interrupts();

}

void loop() {
 calcWeather();
 comandosAT();
 delay(600000);
}

void calcWeather()
{
//Рассчитать влажность
humidity = myHumidity.getRH();

//Рассчитать количество осадков за последние 10 минут
mm = pulse_counter_ISR*0.2794;
pulse_counter_ISR = 0;

}

void comandosAT(){
Sim900Serial.println("AT+CIPSTATUS");//Консультант по фактическому состоянию связи
delay(2000);
Sim900Serial.println("AT+CIPMUX=0");//команда настроить устройство для одного или нескольких IP-подключений 0=одиночное
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CSTT=\"internet.simple\"");
delay(1000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIICR");//УСТАНОВИТЬ БЕСПРОВОДНОЕ СОЕДИНЕНИЕ ПО GPRS ИЛИ CSD
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIFSR");// Получаем наш локальный IP
delay(2000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSPRT=0");//Установить флаг '>' при отправке данных
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",\"80\"");//Указываем тип подключения, url или IP адрес и порт, на который мы установить связь
delay(6000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSEND");//ОТПРАВКА ДАННЫХ ПО СОЕДИНЕНИЮ TCP ИЛИ UDP
delay(4000);
mostrarDatosSeriales();
String datos="GET https://api.thingspeak.com/update?api_key=MYAPIKEY&field1=0" + String(влажность) + "&field2=0" + String(mm);
Sim900Serial.println(datos);//Отправить данные на удаленный сервер
delay(4000);
mostrarDatosSeriales();
Sim900Serial.println((char)26);
delay(5000);//Теперь мы будем ждать ответа, но это будет зависеть от условий сети, и это значение, возможно, придется изменить в зависимости от условий сети
Sim900Serial.println();
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSHUT");//Закрываем соединение(Деактивирует контекст GPRS PDP)
delay(5000);
mostrarDatosSeriales();
} 

void mostrarDatosSeriales()//Показывает данные, которые доставляет sim900
{
while(Sim900Serial.available()!=0)
Serial.write(Sim900Serial.read());
}

void interrupt_handler()
{
  pulse_counter_ISR = pulse_counter_ISR + 1;
}

, 👍-1

Обсуждение

так может ли это повлиять на отправку моих данных? .... запустите тест, чтобы узнать наверняка, @jsotola

Вы забыли включить библиотеку от Sparkfun?, @Jot

Я запускаю его и работает с прерыванием () и без него, но когда я добавляю больше переменных (4 или более), AT-CIPSEND не отправляет данные, @Richi_carrillo

Наконец, я разделил команды на две функции (comandosAT_1 и comandosAT_2) с разными переменными. Первый не работает, а второй работает нормально. Вот код, @Richi_carrillo


1 ответ


0

Наконец я разделил команды на две функции (comandosAT_1 и comandosAT_2) с разными переменными. Первый не работает, а второй работает нормально. Вот код

void comandosAT_1(){
Sim900Serial.println("AT+CIPSTATUS");//Проверяем текущий статус соединения
delay(2000);
Sim900Serial.println("AT+CIPMUX=0");//команда настроить устройство для одного или нескольких IP-подключений 0=одиночное
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CSTT=\"internet.simple\"");//команда настраивает APN, имя пользователя и пароль."gprs.movistar.com.ar","wap","wap"- > Movistar Арг.
delay(1000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIICR");//УСТАНОВИТЬ БЕСПРОВОДНОЕ СОЕДИНЕНИЕ С GPRS ИЛИ CSD
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIFSR");// Получаем наш локальный IP
delay(2000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSPRT=0");//Установить флаг '>' при отправке данных
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",\"80\"");//Указываем тип подключения, url или IP адрес и порт, на который мы установить связь
delay(6000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSEND");//ОТПРАВКА ДАННЫХ ПО СОЕДИНЕНИЮ TCP ИЛИ UDP
delay(4000);
mostrarDatosSeriales();
String datos="GET https://api.thingspeak.com/update?api_key=XXXXXXXXXXXXXX&field1=0" + String(tempC) + "&field2=0" + String(влажность) + "&field3=0 " + Строка(давление);
Sim900Serial.println(datos);//Отправить данные на удаленный сервер
delay(4000);
mostrarDatosSeriales();
Sim900Serial.println((char)26);
delay(5000);//Теперь мы будем ждать ответа, но это будет зависеть от условий сети, и это значение, возможно, придется изменить в зависимости от условий сети
Sim900Serial.println();
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSHUT");//Закрываем соединение(Деактивирует контекст GPRS PDP)
delay(5000);
mostrarDatosSeriales();
} 

void comandosAT_2(){
Sim900Serial.println("AT+CIPSTATUS");//Проверяем текущий статус соединения
delay(2000);
Sim900Serial.println("AT+CIPMUX=0");//команда настроить устройство для одного или нескольких IP-подключений 0=одиночное
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CSTT=\"internet.simple\"");//команда настраивает APN, имя пользователя и пароль."gprs.movistar.com.ar","wap","wap"- > Movistar Арг.
delay(1000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIICR");//УСТАНОВИТЬ БЕСПРОВОДНОЕ СОЕДИНЕНИЕ ПО GPRS ИЛИ CSD
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIFSR");// Получаем наш локальный IP
delay(2000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSPRT=0");//Установить флаг '>' при отправке данных
delay(3000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",\"80\"");//Указываем тип подключения, url или IP адрес и порт, на который мы установить связь
delay(6000);
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSEND");//ОТПРАВКА ДАННЫХ ПО СОЕДИНЕНИЮ TCP ИЛИ UDP
delay(4000);
mostrarDatosSeriales();
String datos="GET https://api.thingspeak.com/update?api_key=XXXXXXXXXXXXXX&field4=0" + String(light_lvl) + "&field5=0" + String(mm) + "&field6=0" " + Строка(скорость ветра_км/ч);
Sim900Serial.println(datos);//Отправить данные на удаленный сервер
delay(4000);
mostrarDatosSeriales();
Sim900Serial.println((char)26);
delay(5000);//Теперь мы будем ждать ответа, но это будет зависеть от условий сети, и это значение, возможно, придется изменить в зависимости от условий сети
Sim900Serial.println();
mostrarDatosSeriales();
Sim900Serial.println("AT+CIPSHUT");//Закрываем соединение(Деактивирует контекст GPRS PDP)
delay(5000);
mostrarDatosSeriales();
} 

И первый ответ серийного монитора следующий:

ОК АТ+ЦИПСТАТУС

ОК

СОСТОЯНИЕ: IP НАЧАЛЬНЫЙ AT+AT+CSTT="internet.simple"

ОК AT+CIICR

ОК AT+CIFSR

10.254.14.23 AT+CIPSPRT=0

ОК AT+CIPSTART="TCP","api.thingspeak.com","80"

ОК

ПОДКЛЮЧИТЬ OKAT+CIPSEND

ОТПРАВИТЬ ОК

AT+CIPSHUT

ВЫКЛЮЧИТЬ ОК

И второй вариант (работает)

AT+ЦИПСТАТУС

ОК

СОСТОЯНИЕ: IP НАЧАЛЬНЫЙ AT+CIPMUX=0

ОК AT+CSTT="internet.simple"

ОК AT+CIICR

ОК AT+CIFSR

10.110.2.23 AT+CIPSPRT=0

ОК AT+CIPSTART="TCP","api.thingspeak.com","80"

ОК

ПОДКЛЮЧИТЬ OKAT+CIPSEND ПОЛУЧИТЬ https://api.thingspeak.com/update?api_key=XXXXXXXXXXXXXXXXXXX&

ОТПРАВИТЬ ОК 381 AT+CIPSHUT

ВЫКЛЮЧИТЬ ОК

Вы можете видеть, что после команды AT+CIPSEND SIM-карта отвечает "GET https://api.thingspeak. com/update?api_key=XXXXXXXXXXXXXXXXXXX&" , затем "ОТПРАВИТЬ ОК" и, наконец, номер записи (381).

Есть идеи или предложения?

,