Problema datalogging

Ciao, mi accingo ad effettuare la mia prima richiesta di aiuto sperando sia anche l'ultima...

Seguendo il tutorial per postare i dati da sensori su Adafruit IO attraverso un modulo HUZZAH-ESP8266 ho modificato ed implementato il codice implementando senza problemi i sensori di temperatura e umidità e il sensore per gli UV (è analogico; potrei aver sbagliato la conversione il voltaggio letto e la restituzione dell'indice UV) e il tutto funziona a dovere (se poi il codice poteva essere scritto in modo più efficace o ridotto non lo so; ma fa il suo lavoro e a me basta per ora).

Ora ho acquistato un sensore per la luce, il TSL2591, che utilizzato in fase di prova, da solo, funziona a dovere mentre nel momento di aggiungerlo agli altri non riesco a farlo andare. Nello specifico non capisco, a differenza degli altri sensori, come far leggere il valore dei lux da postare poi nell'IO.

Vi allego il codice intanto

// Libraries
#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include "Adafruit_SHT31.h"
#include "Adafruit_TSL2591.h"
#include <Adafruit_Sensor.h>

// WiFi parameters
#define WLAN_SSID       "xxxx"
#define WLAN_PASS       "xxxx"

// Adafruit IO
#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    "xxxx"
#define AIO_KEY         "xxxx"

Adafruit_SHT31 sht;
Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591);

//Dichiaro il pin analogico
int analogPin = 12;
int val = 12;

void configureSensor (void) {
  tsl.setGain(TSL2591_GAIN_MED);
  tsl.setTiming(TSL2591_INTEGRATIONTIME_100MS);
}

// Functions
void connect();

// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;

// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
/****************************** Feeds ***************************************/

// Setup feeds for temperature & humidity
Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperatura");

Adafruit_MQTT_Publish humidity = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/umidità");

Adafruit_MQTT_Publish uvin = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/UVI");

Adafruit_MQTT_Publish lux = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/lux");

/*************************** Sketch Code ************************************/

void setup() {

  // Init sensor
  sht.begin();
  tsl.begin();

  configureSensor();

  Serial.begin(115200);
  Serial.println(F("Esempio di trasmissione verso Adafruit"));

  // Connect to WiFi access point.
  Serial.println(); Serial.println();
  delay(10);
  Serial.print(F("Connessione a "));
  Serial.println(WLAN_SSID);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(F("."));
  }
  Serial.println();

  Serial.println(F("WiFi connesso"));
  Serial.println(F("Indirizzo IP: "));
  Serial.println(WiFi.localIP());

  // connect to adafruit io
  connect();

}

void unifiedSensorAPIRead(void)
{
  /* Get a new sensor event */ 
  sensors_event_t event;
  tsl.getEvent(&event);
 
  if ((event.light == 0) |
      (event.light > 4294966000.0) | 
      (event.light <-4294966000.0))
  {
    /* If event.light = 0 lux the sensor is probably saturated */
    /* and no reliable data could be generated! */
    /* if event.light is +/- 4294967040 there was a float over/underflow */
    Serial.println(F("Invalid data (adjust gain or timing)"));
  }
  else
  {
    Serial.print(event.light); Serial.println(F(" lux"));
  }
}
void loop() {

  // ping adafruit io a few times to make sure we remain connected
  if (! mqtt.ping(3)) {
    // reconnect to adafruit io
    if (! mqtt.connected())
      connect();
  }

  // Grab the current state of the sensor
  float humidity_data = (float)sht.readHumidity();
  float temperature_data = (float)sht.readTemperature();
  float sensorValue = analogRead(analogPin);
  float sensorVoltage = sensorValue / 1024 * 3.3;
  float uvin_data = sensorVoltage / 0.1;
  float lux_data = unifiedSensorAPIRead();


  
  // Publish data
  if (! temperature.publish(temperature_data))
    Serial.println(F("Pubblicazione temperatura fallita"));
  else
    Serial.println(F("Temperatura pubblicata!"));

  if (! humidity.publish(humidity_data))
    Serial.println(F("Pubblicazione umidità fallita"));
  else
    Serial.println(F("Umidità pubblicata!"));

  if (! uvin.publish(uvin_data))
    Serial.println(F("Pubblicazione uv fallita"));
  else
    Serial.println(F("UV Pubblicati"));

  if(! lux.publish(lux_data))
    Serial.print(F("Pubblicazione Lux fallita"));
  else
    Serial.print(F("Lux pubblicati"));
   
  // 360e4 è la pausa da un'ora
  delay(360e4);
}

// connect to adafruit io via MQTT
void connect() {

  Serial.print(F("Connessione ad Adafruit IO... "));

  int8_t ret;

  while ((ret = mqtt.connect()) != 0) {

    switch (ret) {
      case 1: Serial.println(F("Wrong protocol")); break;
      case 2: Serial.println(F("ID rejected")); break;
      case 3: Serial.println(F("Server unavail")); break;
      case 4: Serial.println(F("Bad user/pass")); break;
      case 5: Serial.println(F("Not authed")); break;
      case 6: Serial.println(F("Failed to subscribe")); break;
      default: Serial.println(F("Connection failed")); break;
    }

    if (ret >= 0)
      mqtt.disconnect();

    Serial.println(F("Riprovando a connettersi..."));
    delay(10000);

  }

  Serial.println(F("Adafruit IO Connessa!"));

}

Come vedete non c'è molto di mio all'interno, ho aggiunto il deepSleep e non avendo acnora un RTC (già ordinato) l'ho dovuto un attimo tarare rispetto all'ora di sonno che dovrebbe rispettare (adesso resta in deep per un'ora e un secondo circa e mi va bene ancora) ma appena avrò il RTC utilizzerò quello sicuramente.
Con questo codice, andando a verificarlo ho questo errore

exit status 1
void value not ignored as it ought to be

capisco, o almeno credo, che il problema sia nel codice per la lettura dei lux, ma le mie scarse conoscenze non mi permettono di risolvere la questione. Dovrei creare una variabile nella quale inserire la lettura dei lux e poi mandarla verso la pubblicazione? La dovrei indicare prima del setup o dentro? il fatto che utilizzo il unifiedSensorAPIRead() mi permette di inserirlo in un'altra variabile? non è già una variabile di suo?

Insomma come si capisce dalle ultime domande non so come uscire da questo blocco e credo che già essere indirizzato verso una soluzione potrebbe aiutarmi.

Grazie a chi vorrà aiutarmi

Non so nulla della lib che stai usando ma a naso direi che unifiedSensorAPIRead() è una void e tu stai cercando di assegnare il risultato (che non c'è) di una void ad una variabile.

Guardati qualche esempio in GitHub - adafruit/Adafruit_TSL2591_Library: This is an Arduino library for the TSL2591 digital luminosity (light) sensors. e sicuramente troverai qualcosa.

silvioz:
Non so nulla della lib che stai usando ma a naso direi che unifiedSensorAPIRead() è una void e tu stai cercando di assegnare il risultato (che non c'è) di una void ad una variabile.

Guardati qualche esempio in GitHub - adafruit/Adafruit_TSL2591_Library: This is an Arduino library for the TSL2591 digital luminosity (light) sensors. e sicuramente troverai qualcosa.

È proprio l'esempio incluso con quella libreria che ho testato il sensore.
Con unifiedSensorAPIRead() il sensore restituisce a monitor seriale il valore dei lux, quindi pensavo che come fatto con le letture dagli altri sensori mi bastasse utilizzare quella funzione per ottenere il valore dei lux ed inviarlo al server IO e invece no...

scusate se non ho specificato prima di aver utilizzato le due librerie indicate nel tuo link

Scorri quasi in fondo e guardati void unifiedSensorAPIRead(void). Questa è solo una 'utility' che scrive su serial monitor. Quello che a te interessa è:

/* Get a new sensor event */ 
  sensors_event_t event;
  tsl.getEvent(&event);

....
....

Serial.print(event.light);

quindi tu puoi estrarre quanto sopra dalla funzione unifiedSensorAPIRead (includi anche il controllo if che è nella funzione per evitare valori non congrui) e metterlo in listato (e a questo punto : float lux_data = tsl.getEvent(&Event) event.light, oppure fai una copia di unifiedSensorAPIRead() e lo depuri di quello che non ti interessa (tutte le Serial.println), gli cambi nome e gli fai restituire un float e quindi avrai

float dammiLaLuce()
{
....
....
....
return event.light;

}



....
....
float lux_data = dammiLaLuce();

Grazie silvioz; dopo un po' di sbattimenti sono riuscito ad ottenere il risultato voluto e tutto funziona. Alla fine ho dichiarato la float luce() mettendoci dentro la lettura e l'ho richiamata poi come lux_data =
luce()

Tutto funziona correttamente. Grazie ancora