Keine Sensordaten auf OpenSenseMap zu sehen

Sehr geehrte Damen und Herren,
am 25.3.24 habe ich schon den support kontaktiert, aber bisher noch keine Antwort erhalten. Deshalb versuche ich es über das Forum.
Eigentlich hatte ich gedacht, daß ich es hinbekommen werde, die Daten vom UV/Lichtsensor auf der Opensensemap darzustellen.
Das Einrichten der SenseBox auf der Opensensemap war kinderleicht (vielleicht habe ich hier einen Fehler gemacht?). Danke. ABER:
Nachdem ich geprüft habe, ob

  1. die neueste Firmware (19.6.1) installiert ist und
  2. die SSL-Zertifikate zu dem Board hochgeladen habe,
  3. meine Sensebox über einen WiFi-Hotspot (Smartphone) verbunden habe,
  4. den Code in Blockly geschrieben habe und in der Arduino IDE 1.8.7 auf das Board geladen habe,
  5. zeigt mir nur der serielle Monitor die Daten der beiden Sensoren an.

Die Datenübertragung zur SenseMap habe ich nun in unterschiedlichster Art und Weise (tutorials, Blog, Forum) mehrere Tage über Stunden (das sollte Minuten dauern, so wie mit dem WIO-Terminal und Ubidots!) hintereinander ausprobiert, aber es sind keine Daten verfügbar. Das ist echt frustrierend…

https://opensensemap.org/explore/65fae033ad2eb20007fdafe8

Da ich nun einfach nicht weiß, woran es liegt, würde ich Sie bitten, mich zu unterstützen. Dazu der Code. Mit freundlichen Grüßen, Matthias Birkicht


#include <senseBoxIO.h>
#include <WiFi101.h>
#include <VEML6070.h>
#include <LTR329.h>
#include <Wire.h>

char ssid[] = "wiotest";
char pass[] = "test1234";
int status = WL_IDLE_STATUS;

  const long intervalInterval = 1000;
  long time_startInterval = 0;
  long time_actualInterval = 0;

VEML6070 veml;

bool lightsensortype = 0; //0 for tsl - 1 for ltr
//settings for LTR sensor
LTR329 LTR;
unsigned char gain = 1;
unsigned char integrationTime = 0;
unsigned char measurementRate = 3;

const char SENSOR_IDFEA[] PROGMEM = "65fae033ad2eb20007fdafea";
const char SENSOR_IDFE9[] PROGMEM = "65fae033ad2eb20007fdafe9";
static const uint8_t NUM_SENSORS = 2;
const char SENSEBOX_ID [] PROGMEM = "65fae033ad2eb20007fdafe8";
const char server [] PROGMEM ="ingress.opensensemap.org";
WiFiClient client;
typedef struct measurement {
      const char *sensorId;
      float value;
    } measurement;
char buffer[750];
measurement measurements[NUM_SENSORS];
    uint8_t num_measurements = 0;
const int lengthMultiplikator = 35;


int read_reg(byte address, uint8_t reg)
  {
    int i = 0;
    Wire.beginTransmission(address);
    Wire.write(reg);
    Wire.endTransmission();
    Wire.requestFrom((uint8_t)address, (uint8_t)1);
    delay(1);
    if(Wire.available())
      i = Wire.read();
    return i;
  }


void write_reg(byte address, uint8_t reg, uint8_t val)
  {
    Wire.beginTransmission(address);
    Wire.write(reg);
    Wire.write(val);
    Wire.endTransmission();
  }

void Lightsensor_begin()
  {
    Wire.begin();
    unsigned int u = 0;
    u = read_reg(0x29, 0x80 | 0x0A); //id register
    if ((u & 0xF0) == 0xA0)            // TSL45315
      {
        write_reg(0x29, 0x80 | 0x00, 0x03); //control: power on
        write_reg(0x29, 0x80 | 0x01, 0x02); //config: M=4 T=100ms
        delay(120);
        lightsensortype = 0; //TSL45315
      }
    else
      {
        LTR.begin();
        LTR.setControl(gain, false, false);
        LTR.setMeasurementRate(integrationTime, measurementRate);
        LTR.setPowerUp(); //power on with default settings
        delay(10); //Wait 10 ms (max) - wakeup time from standby
        lightsensortype = 1;                     //
      }
  }


  uint32_t Lightsensor_getIlluminance()
  {
    unsigned int lux = 0;
    if (lightsensortype == 0) // TSL45315
    {
      unsigned int u = (read_reg(0x29, 0x80 | 0x04) << 0);  //data low
      u |= (read_reg(0x29, 0x80 | 0x05) << 8); //data high
      lux = u * 4; // calc lux with M=4 and T=100ms
    }
    else if (lightsensortype == 1) //LTR-329ALS-01
    {
      delay(100);
      unsigned int data0, data1;
      for (int i = 0; i < 5; i++) {
        if (LTR.getData(data0, data1)) {
          if(LTR.getLugain, integrationTime, data0, data1, lux));
          if(lux > 0) break;
          else delay(10);
        }
        else {
        byte error = LTR.getError();
      }
    }
  }
  return lux;
  }




    void addMeasurement(const char *sensorId, float value) {
    measurements[num_measurements].sensorId = sensorId;
    measurements[num_measurements].value = value;
    num_measurements++;
    }

    void writeMeasurementsToClient() {
    // iterate throug the measurements array
    for (uint8_t i = 0; i < num_measurements; i++) {
      sprintf_P(buffer, PSTR("%s,%9.2f\n"), measurements[i].sensorId,
                measurements[i].value);
      // transmit buffer to client
      client.print(buffer);
    }
    // reset num_measurements
    num_measurements = 0;
  }

  void submitValues() {
if (WiFi.status() != WL_CONNECTED) {
WiFi.disconnect();
delay(1000); // wait 1s
WiFi.begin(ssid, pass);
delay(5000); // wait 5s
}
  if (client.connected()) {
      client.stop();
      delay(1000);
    }
  bool connected = false;
  char _server[strlen_P(server)];
  strcpy_P(_server, server);
  for (uint8_t timeout = 2; timeout != 0; timeout--) {
    Serial.println(F("connecting..."));
    connected = client.connect(_server, 80);
    if (connected == true) {
      // construct the HTTP POST request:
      sprintf_P(buffer,
                PSTR("POST /boxes/%s/data HTTP/1.1\nAuthorization: adc1c0da8f3af2a2c5c87840e19921cc6c3796bcbdeba71d4c92f015ffb18dbc\nHost: %s\nContent-Type: "
                     "text/csv\nConnection: close\nContent-Length: %i\n\n"),
                SENSEBOX_ID, server, num_measurements * lengthMultiplikator);
      // send the HTTP POST request:
      client.print(buffer);
      // send measurements
      writeMeasurementsToClient();
      // send empty line to end the request
      client.println();
      uint16_t timeout = 0;
      // allow the response to be computed
      while (timeout <= 5000) {
        delay(10);
        timeout = timeout + 10;
        if (client.available()) {
          break;
        }
      }

      while (client.available()) {
        char c = client.read();
        // if the server's disconnected, stop the client:
        if (!client.connected()) {
          client.stop();
          break;
        }
      }

      num_measurements = 0;
      break;
    }
    delay(1000);
  }

  if (connected == false) {
  delay(5000);
  noInterrupts();
 NVIC_SystemReset();
 while (1)
 ;
 }
  }


void setup() {

if (WiFi.status() == WL_NO_SHIELD) {
    while (true);
}
while (status != WL_CONNECTED) {
    status = WiFi.begin(ssid, pass);
    delay(5000);
}

SerialUSB.begin(9600);
veml.begin();
Lightsensor_begin();



}


void loop() {
time_startInterval = millis();


  if (time_startInterval > time_actualInterval + intervalInterval) {
  time_actualInterval = millis();
  SerialUSB.println(veml.getUV());
  SerialUSB.println(Lightsensor_getIlluminance());
}

  if (time_startInterval > time_actualInterval + intervalInterval) {
  time_actualInterval = millis();
    addMeasurement(SENSOR_IDFEA,veml.getUV());
    addMeasurement(SENSOR_IDFE9,Lightsensor_getIlluminance());
  submitValues();
}

}

Hallo @matthiasbirkich,

im Helpdesk sehe ich, dass wir dir eigentlich am 27.03.24 auf deine Supportanfrage geantwortet hatten.

Das Problem im Code liegt daran, dass zwei Intervalle mit dem gleichen Namen definiert worden sind. Dadurch wird nur das erste Intervall (indem die Messwerte auf dem Seriellen Monitor ausgegeben werden) ausgeführt.

Du kannst entweder das zweite Intervall anders benennen oder die Blöcke zum senden der Messwerte auch in das erste Intervall ziehen.

Viele Grüße,
Mario

Lieber Mario,
herzlichen Dank für die superschnelle Antwort und die Fehlerkorrektur!
Das probiere ich sofort aus. Die Antwort vom 27.4.24 ist wohl bei mir verschütt gegangen. Entschuldigung.
mFG, Matthias