Данные не отправляются в 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;
}
@Richi_carrillo, 👍-1
Обсуждение1 ответ
Наконец я разделил команды на две функции (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).
Есть идеи или предложения?
- Ардуино не может проснуться с помощью прерывания после отправки SMS
- Как увеличить частоту передачи данных модуля SIM900A GSM, подключенного к Arduino Uno?
- Использование millis() и micros() внутри процедуры прерывания
- Подсчет импульсов с прерыванием
- Проблема с получением SMS - GSM-модуль Arduino Uno и SIM900A
- SIM900 3G? Или SIM900A умеет подключаться к 3G?
- Мини-модем SIM900a, IMEI 0, помощь с контактами TX RX
- Как получить данные из базы данных моего сервера в переменную в моем Arduino?
так может ли это повлиять на отправку моих данных?
.... запустите тест, чтобы узнать наверняка, @jsotolaВы забыли включить библиотеку от Sparkfun?, @Jot
Я запускаю его и работает с прерыванием () и без него, но когда я добавляю больше переменных (4 или более), AT-CIPSEND не отправляет данные, @Richi_carrillo
Наконец, я разделил команды на две функции (comandosAT_1 и comandosAT_2) с разными переменными. Первый не работает, а второй работает нормально. Вот код, @Richi_carrillo