Übertragung von Messwerten per GPRS an Thingspeak, Fehler beim BME280

Hallo,
ich lade hiermit Daten nach Thingspeak per GPRS Modul (SIM800L).

#include <SoftwareSerial.h>
#include "Adafruit_FONA.h"
#include "cactus_io_BME280_I2C.h"

BME280_I2C bme(0x76); // I2C using address 0x76


#define FONA_RX 2
#define FONA_TX 3
#define FONA_RST 4


#define PIN_TEST A0
#define REF_VOLTAGE    5.0
#define PIN_STEPS   1024.0

//SoftwareSerial mySerial(3, 2); 
SoftwareSerial SIM800ss = SoftwareSerial(FONA_TX, FONA_RX);
Adafruit_FONA SIM800 = Adafruit_FONA(FONA_RST);

char http_cmd[80];
char url_field1_string[] = "thingspeakURL";
char field1_string[20];
char url_field2_string[] = "thingspeakURL";
char field2_string[20];
char url_field3_string[] = "thingspeakURL";
char field3_string[20];
char url_field4_string[] = "thingspeakURL";
char field4_string[20];
char url_field5_string[] = "thingspeakURL";
char field5_string[20];
double field1;
double field2;
double field3;
double field4;
double field5;
double voltage;
double ampere = 2.25;

const float diodeVoltage = 0.538;  
const float R1 = 99400.0;          
const float R2 =  9990.0;          
float vout = 0.0, vin = 0.0;
int rawValue = 0;

int net_status;

uint16_t statuscode;
int16_t length;
String response = "";
char buffer[512];

int relais1 = 5;

boolean sim800_on = true;
boolean gprs_on = false; 
boolean tcp_on = false;


const unsigned long SECOND = 1000;
const unsigned long MINUTE = 60 * SECOND;


void setup()
{
  pinMode(relais1, OUTPUT);
  digitalWrite(relais1, LOW); 
  while (!Serial);

  Serial.begin(9600);

  SIM800ss.begin(4800); 

  Serial.println("Booting...");

  delay(2000);
  if (!bme.begin()) {
    Serial.println("kein BME280 Sensor");
    while (1);
  }
  bme.setTempCal(-1);


}


void loop()
{


  rawValue = analogRead(PIN_TEST);
  vout = (rawValue * REF_VOLTAGE) / PIN_STEPS;
  vin = vout / (R2 / (R1 + R2));

  if (vin < 0.09) {
    vin = 0.0; // suppress noise
  } else {
    voltage = vin + diodeVoltage;
  }
  voltage = vin + diodeVoltage;
  Serial.print("U = ");
  Serial.print(voltage);
  Serial.println(" V");


  bme.readSensor();
  Serial.println("Luftdruck\tLuftfeuchtigkeit\t\tTemperatur(Celsius)\t\tTemperatur(Fahrenheit)");
  Serial.print(bme.getPressure_MB()); Serial.print("\t\t"); // Pressure in millibars
  Serial.print(bme.getHumidity()); Serial.print("%\t\t\t\t");
  Serial.print(bme.getTemperature_C()); Serial.print(" °C\t\t\t");
  Serial.print(bme.getTemperature_F()); Serial.println(" °F");
  

  if (sim800_on == true) {

    Serial.println("SIM800__on");

    digitalWrite(relais1, LOW);       

    tcp_on = false; 
    gprs_on = false;



    if (! SIM800.begin(SIM800ss)) {
      Serial.println("Couldn't find SIM800L");
      while (1);
    }
    Serial.println("SIM800L is OK");



    SIM800.setGPRSNetworkSettings(F("internet.eplus.de"), F("blau"), F("blau"));  delay(1000);

    Serial.println("Waiting to be registered to network...");
    net_status = SIM800.getNetworkStatus();
    while (net_status != 1) {
      net_status = SIM800.getNetworkStatus();
      delay(2000);
    }
    Serial.println("Registered to home network!");
    Serial.print("Turning on GPRS... ");
    delay(2000);
    while (!gprs_on) {
      if (!SIM800.enableGPRS(true)) {
        Serial.println("Failed to turn on GPRS");
        Serial.println("Trying again...");
        delay(2000);
        gprs_on = false;
      } else {
        Serial.println("GPRS now turned on");
        delay(2000);
        gprs_on = true;
      }
    }






    Serial.println("\tSend TCP/Temperatur...");
    bme.readSensor();
    field1 = bme.getTemperature_C();
    dtostrf(field1, 5, 2, field1_string);
    sprintf(http_cmd, "%s=%s", url_field1_string, field1_string);
    delay(2000);
    while (!tcp_on) {
      if (!SIM800.HTTP_GET_start(http_cmd, &statuscode, (uint16_t *)&length)) {
        Serial.println("Failed!");
        Serial.println("Trying again...");
        tcp_on = false;
      } else {
        tcp_on = true;
       
        while (length > 0) {
          while (SIM800.available()) {
            char c = SIM800.read();
            response += c;
            length--;
          }
        }
        Serial.println(response);
        if (statuscode == 200) {
          Serial.println("Success, Temperatur gesendet!");
          statuscode = 0;
        }
       
      }
      delay(2000);
    }
    delay(15000);


    tcp_on = false;
    Serial.println("\tSend TCP/Luftfeuchtigkeit...");
    bme.readSensor();
    field2 = bme.getHumidity();
    dtostrf(field2, 5, 2, field2_string);
    sprintf(http_cmd, "%s=%s", url_field2_string, field2_string);
    delay(2000);
    while (!tcp_on) {
      if (!SIM800.HTTP_GET_start(http_cmd, &statuscode, (uint16_t *)&length)) {
        Serial.println("Failed!");
        Serial.println("Trying again...");
        tcp_on = false;
      } else {
        tcp_on = true;
     
        while (length > 0) {
          while (SIM800.available()) {
            char c = SIM800.read();
            response += c;
            length--;
          }
        }
        Serial.println(response);
        if (statuscode == 200) {
          Serial.println("Success, Luftfeuchtigkeit gesendet!");
          statuscode = 0;
        }
       
      }
      delay(2000);
    }
    delay(15000);


    /*
      tcp_on = false;
      Serial.println("\tSend TCP/Luftdruck...");
      bme.readSensor();
      field3 = bme.getPressure_MB();
      dtostrf(field3, 7, 2, field3_string);
      sprintf(http_cmd,"%s=%s",url_field3_string,field3_string);
      delay(2000);

      while(!tcp_on){
      if (!SIM800.HTTP_GET_start(http_cmd, &statuscode, (uint16_t *)&length)) {
           Serial.println("Failed!");
           Serial.println("Trying again...");
           tcp_on = false;
      }else{
        tcp_on = true;
     
        while (length > 0) {
           while (SIM800.available()) {
             char c = SIM800.read();
             response += c;
             length--;
           }
        }
        Serial.println(response);

        if(statuscode == 200){
          Serial.println("Success, Luftdruck gesendet!");
          statuscode = 0;
        }

      
      }
      delay(2000);
      }
      delay(15000);
    */


    tcp_on = false;
    Serial.println("\tSend TCP/Spannung...");
    field4 = voltage;
    dtostrf(field4, 5, 2, field4_string);
    sprintf(http_cmd, "%s=%s", url_field4_string, field4_string);
    delay(2000);
    while (!tcp_on) {
      if (!SIM800.HTTP_GET_start(http_cmd, &statuscode, (uint16_t *)&length)) {
        Serial.println("Failed!");
        Serial.println("Trying again...");
        tcp_on = false;
      } else {
        tcp_on = true;
       
        while (length > 0) {
          while (SIM800.available()) {
            char c = SIM800.read();
            response += c;
            length--;
          }
        }
        Serial.println(response);
        if (statuscode == 200) {
          Serial.println("Success, Spannung gesendet!");
          statuscode = 0;
        }
       
      }
      delay(1000);
    }
    delay(15000);


/*
    tcp_on = false;
    Serial.println("\tSend TCP/Strom...");
    field5 = ampere;
    dtostrf(field5, 5, 2, field5_string);
    sprintf(http_cmd, "%s=%s", url_field5_string, field5_string);
    delay(2000);
    while (!tcp_on) {
      if (!SIM800.HTTP_GET_start(http_cmd, &statuscode, (uint16_t *)&length)) {
        Serial.println("Failed!");
        Serial.println("Trying again...");
        tcp_on = false;
      } else {
        tcp_on = true;
        
        while (length > 0) {
          while (SIM800.available()) {
            char c = SIM800.read();
            response += c;
            length--;
          }
        }
        Serial.println(response);
        if (statuscode == 200) {
          Serial.println("Success, Strom gesendet!");
          statuscode = 0;
        }
      
      }
      delay(1000);
    }
    delay(15000);
*/



  } else {
    Serial.println("SIM800__off");
    digitalWrite(relais1, HIGH);  
  }

  digitalWrite(relais1, HIGH);            
  Serial.println("30 Minuten delay...");

  delay(30 * MINUTE);


}

Mein Problem ist, dass Daten in diesem Zustand des Codes einwandfrei übertragen werden.

Nehme ich die Kom. heraus, gibt es das Probl., dass Werte des BME280 der serielle Ausgabe fasch sind. Luftdruck irgendwas über 1500 und Temperatur und Luftfeuchtigkeit mit 0.

Schuld sind die auskommentierten Blöcken. Der “Strom” überträgt nur einen Wert. Da ist kein Sensor dran.

Codeursprung:

Vielen Dank!

Hallo
mein Notepad zählt 23! delay() Funktionen, mit Zeiten zwischen 2 Sekunden, 15 Sekunden und 30 Minuten!
Mein Notepad zählt 20 while-Anweisungen. Sind die so im Sketch als Kontrollfluß-Steuerung beabsichtigt?

Hallo paulpaulon,

der ursprüngliche Code arbeitet nur mit einem http Aufruf. Ich habe daraus mehrere machen wollen...
Die while-Schleifen habe ich übernommen, teilweise kommt das delay auch daher.

Die 15 Sekunden sind dafür, da nur alle 15 Sek. an Thingspeak gesendet werden kann. Ich hatte angenommen, dass an dieser Stelle "nichts" gemacht wird...

Habe jetzt testweise einen Arduino Mega 2560 genommen - da läuft alles.
Hatte vorher die Warnung beim Nano bzgl. des knappen RAMs.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.