Ssd1306 spi + dht22

Boh, dalla foto non mi sembra risolto, pare che stampi comunque lo stesso valore (48.1)...
Stampa su seriale quello che ottieni e vediamo:

...
    char tempBuffer[10];
    char sTemp[8];
    dtostrf(event.temperature, 5, 2, sTemp);
    snprintf(tempBuffer, sizeof(tempBuffer), "%sC\xB0%", sTemp);
    Serial.print("tempBuffer=\"");Serial.print(tempBuffer);Serial.println("\"");    
    int tempX = (128 - u8g.getStrWidth(tempBuffer)) / 4;
    u8g.drawStr(20, 60, tempBuffer);

    u8g.setFont(u8g_font_profont12);
    char humBuffer[10];
    char sHum[8];
    dtostrf(event.relative_humidity, 5, 1, sHum);
    snprintf(humBuffer, sizeof(humBuffer), "%s%%", sHum);
    Serial.print("humBuffer=\"");Serial.print(bumBuffer);Serial.println("\"");
    int humX = (128 - u8g.getStrWidth(humBuffer)) / 4;
    u8g.drawStr(60, 60, humBuffer);  
...

sisi rimane lo stesso problema ma almeno ho sistemato quello che uno dei due non compariva

EDIT: uscita dal monitor seriale:
tempBuffer=" 46.5C�"
humBuffer=" 46.5%"

Quindi si, mostrano lo stesso valore! Ma secondo te 46.5 è l'umidità o la temperatura?

Giusto per conferma, puoi far girare questa versione e riportare l'output con copia/incolla?

    char tempBuffer[10];
    char sTemp[8];
    Serial.print("event.temperature=");Serial.println(event.temperature);
    dtostrf(event.temperature, 5, 2, sTemp);
    snprintf(tempBuffer, sizeof(tempBuffer), "%sC\xB0%", sTemp);
    Serial.print("tempBuffer=\"");Serial.print(tempBuffer);Serial.println("\"");    
    int tempX = (128 - u8g.getStrWidth(tempBuffer)) / 4;
    u8g.drawStr(20, 60, tempBuffer);

    u8g.setFont(u8g_font_profont12);
    char humBuffer[10];
    char sHum[8];
    Serial.print("event.relative_humidity=");Serial.println(event.relative_humidity);
    dtostrf(event.relative_humidity, 5, 1, sHum);
    snprintf(humBuffer, sizeof(humBuffer), "%s%%", sHum);
    Serial.print("humBuffer=\"");Serial.print(bumBuffer);Serial.println("\"");
    int humX = (128 - u8g.getStrWidth(humBuffer)) / 4;
    u8g.drawStr(60, 60, humBuffer);  

46.5 è l'umidità

EDIT: ce un problema di spazio non so come ottimizzarlo

event.temperature=44.70

tempBuffer="44.70C�"

event.relative_humidity=44.70

humBuffer=" 44.7%"

E' definito qui:

 dtostrf(event.relative_humidity, 5, 1, sHum);

Sono 5 caratteri totali, di cui 1 decimale (ed il punto decimale). Se sei sicuro di non avere mai il 100% di umidità puoi cambiare il 5 in 4:

 dtostrf(event.relative_humidity, 4, 1, sHum);

Ma quindi è proprio la struttura "event" che contiene due volte lo stesso valore! Devi capire perché ma rigarda l'interfaccia.

forse ho capito ma non so come risolvere

sensors_event_t event;
  dht.humidity().getEvent(&event);
  dht.temperature().getEvent(&event);

se metto queste tre righe in questo modo mi legge solo la temp se invece faccio:

sensors_event_t event;
  dht.temperature().getEvent(&event);
  dht.humidity().getEvent(&event);

adesso non mi legge la temp ma solo l'umidità non so come sistemare.

EDIT: risolto ho capito mando quello che ho cambiato:

void DisplayInfo(){
  DateTime now = rtc.now();

  sensors_event_t event;
  delay(1000);

  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_profont29);
    char timeBuffer[16];
    snprintf(timeBuffer, sizeof(timeBuffer), "%02d:%02d", now.hour(), now.minute());
    int timeX = (128 - u8g.getStrWidth(timeBuffer)) / 2;
    u8g.drawStr(timeX, 30, timeBuffer);

    u8g.setFont(u8g_font_profont15);
    snprintf(timeBuffer, sizeof(timeBuffer), "%02d-%02d-%04d", now.day(), now.month(), now.year());
    int timeBufferX = (128 - u8g.getStrWidth(timeBuffer)) / 2;
    u8g.drawStr(29, 46, timeBuffer);

    u8g.setFont(u8g_font_profont12);
    dht.temperature().getEvent(&event);
    char tempBuffer[10];
    char sTemp[8];
    dtostrf(event.temperature, 5, 1, sTemp);
    snprintf(tempBuffer, sizeof(tempBuffer), "%sC\xB0%", sTemp);
    int tempX = (128 - u8g.getStrWidth(tempBuffer)) / 4;
    u8g.drawStr(24, 60, tempBuffer);

    u8g.setFont(u8g_font_profont12);
    dht.humidity().getEvent(&event);
    char humBuffer[10];
    char sHum[8];
    dtostrf(event.relative_humidity, 5, 1, sHum);
    snprintf(humBuffer, sizeof(humBuffer), "%s%%", sHum);
    int humX = (128 - u8g.getStrWidth(humBuffer)) / 4;
    u8g.drawStr(62, 60, humBuffer);

  } while ( u8g.nextPage() );
}

Credo che quelle chiamate getEvent vadano a popolare la struttura che gli passi per riferimento per cui chiamando il metodo due volte vai a sovrascrivere il precedente. Quindi devi fare "dht.temperature().getEvent(&event);" ed usare la struttura "event" per leggere la temperatura, poi "dht.humidity().getEvent(&event);" ed usare "event" per l'umidità, per cui non serve neanche dividere le due snprintf.
Ad esempio una cosa molto più semplice della tua, del tipo:

  char sTemp[8], sHum[8];

  dht.temperature().getEvent(&event);
  dtostrf(event.temperature, 5, 2, sTemp);

  dht.humidity().getEvent(&event);
  dtostrf(event.relative_humidity, 5, 1, sHum);

  snprintf(dhtBuffer, sizeof(dhtBuffer), "%sC\xB0 %s%%", sTemp, sHum);

No ho appena provato e la umidità mi scompare dallo schermo.

EDIT: ma per unaltro dubbio su questo progetto posso chiederlo adesso qui?
cmq sarebbe sul modulo TDS un modulo per misurazione la qualità dell'acqua in pratica legge i dati ma non sono corretti e poi da quello che ho visto il risultato viene influito dalla corrente più moduli collegati ho è il valore è diverso.
quando lo immergno in acqua mi da un valore e quando lo tolgo lo pulisco mi da lo stesso lo provo nell'acqua sporca e rimane lo stesso.

Mi spiace, ma quello che dici non ha per me nessun senso, soprattutto perché non spieghi o descrivi nulla: "scompare dallo schermo" cosa significa? Che si vede per un attimo poi scompare? O che invece vale zero? E il simbolo "%" si vede? Cosa altro? Una immagine dello schermo, no eh? E le variabili sTemp e sHum quanto valgono, viste dalla seriale? Postare il tuo (ultimo) codice, quello che hai usato per fare questa prova ed affermare che "scompare" neanche? Magari insieme all'output del Serial Monitor?

Dato che continui a dare risposte parziali poco comprensibili quindi poco utili, mi spiace, se non dai queste risposte rinuncio a provare ad aiutarti ulteriormente.

Scusa se non mi sono spiegato bene allora il parte di codice che mi hai dato qualche minuto fa lo ho provato al posto del mio magari per risparmiare spazio dato che aveva detto che era più semplice:

void DisplayInfo(){
  DateTime now = rtc.now();

  sensors_event_t event;
  delay(1000);

  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_profont29);
    char timeBuffer[16];
    snprintf(timeBuffer, sizeof(timeBuffer), "%02d:%02d", now.hour(), now.minute());
    int timeX = (128 - u8g.getStrWidth(timeBuffer)) / 2;
    u8g.drawStr(timeX, 30, timeBuffer);

    u8g.setFont(u8g_font_profont15);
    snprintf(timeBuffer, sizeof(timeBuffer), "%02d-%02d-%04d", now.day(), now.month(), now.year());
    int timeBufferX = (128 - u8g.getStrWidth(timeBuffer)) / 2;
    u8g.drawStr(29, 46, timeBuffer);

    u8g.setFont(u8g_font_profont12);
    char dhtBuffer[10];
    char sTemp[8], sHum[8];

    dht.temperature().getEvent(&event);
    dtostrf(event.temperature, 5, 2, sTemp);

    dht.humidity().getEvent(&event);
    dtostrf(event.relative_humidity, 5, 1, sHum);

    snprintf(dhtBuffer, sizeof(dhtBuffer), "%sC\xB0 %s%%", sTemp, sHum);
    int humX = (128 - u8g.getStrWidth(dhtBuffer)) / 4;
    u8g.drawStr(20, 60, dhtBuffer);

  } while ( u8g.nextPage() );
}

questo è come apparirebbe con questo codice:

invece con quello che avevo fatto io:


void DisplayInfo(){
  DateTime now = rtc.now();

  sensors_event_t event;
  delay(1000);

  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_profont29);
    char timeBuffer[16];
    snprintf(timeBuffer, sizeof(timeBuffer), "%02d:%02d", now.hour(), now.minute());
    int timeX = (128 - u8g.getStrWidth(timeBuffer)) / 2;
    u8g.drawStr(timeX, 30, timeBuffer);

    u8g.setFont(u8g_font_profont15);
    snprintf(timeBuffer, sizeof(timeBuffer), "%02d-%02d-%04d", now.day(), now.month(), now.year());
    int timeBufferX = (128 - u8g.getStrWidth(timeBuffer)) / 2;
    u8g.drawStr(29, 46, timeBuffer);

    u8g.setFont(u8g_font_profont12);
    dht.temperature().getEvent(&event);
    char tempBuffer[10];
    char sTemp[8];
    dtostrf(event.temperature, 5, 1, sTemp);
    snprintf(tempBuffer, sizeof(tempBuffer), "%sC\xB0%", sTemp);
    int tempX = (128 - u8g.getStrWidth(tempBuffer)) / 4;
    u8g.drawStr(24, 60, tempBuffer);

    u8g.setFont(u8g_font_profont12);
    dht.humidity().getEvent(&event);
    char humBuffer[10];
    char sHum[8];
    dtostrf(event.relative_humidity, 5, 1, sHum);
    snprintf(humBuffer, sizeof(humBuffer), "%s%%", sHum);
    int humX = (128 - u8g.getStrWidth(humBuffer)) / 4;
    u8g.drawStr(20, 60, humBuffer);

  } while ( u8g.nextPage() );
}

appariva cosi:

quello che avevo detto nel messaggio prima era questo solo per confermare che il codice era finito e che funzionava scusi ancora per la incomprensione.

Ok, anche se non hai risposto alla domanda che riguarda la seriale (cosa vedi per quei valori?), provo quindi ad indovinare visto che non ho quel display sottomano...
Diciamo così: tu con quella dimensione di font, sai quanti caratteri puoi stampare su quella riga? E quanti ne stampi se provi a scrivere "28.60C° 80.4%" (nota anche che ci sono 2 spazi dopo "°")? Sarà per caso che l'umidità eccede la larghezza massima e quindi va "a capo", cosa che implica il fatto che non lo stampa? Magari non ti interessano i centesimi di grado e non avrai mai il 100% di umidità ad esempio?
E che quindi sia il caso di provare a ridurre lo spazio, cambiando sia i dtostrf() sia lo snprintf()?

...
    dht.temperature().getEvent(&event);
    dtostrf(event.temperature, 4, 1, sTemp); // 4 caratteri totali, 1 punto decimale, 1 decimale
    dht.humidity().getEvent(&event);
    dtostrf(event.relative_humidity, 4, 1, sHum); // 4 caratteri totali, 1 punto decimale, 1 decimale

    snprintf(dhtBuffer, sizeof(dhtBuffer), "%sC\xB0%s%%", sTemp, sHum);
...

Si ci avevo già pensato ma no non ha risolto poi non so

EDIT: mi scuso invece si che funziona il codice

...
    dht.temperature().getEvent(&event);
    dtostrf(event.temperature, 4, 1, sTemp); // 4 caratteri totali, 1 punto decimale, 1 decimale
    dht.humidity().getEvent(&event);
    dtostrf(event.relative_humidity, 4, 1, sHum); // 4 caratteri totali, 1 punto decimale, 1 decimale

    snprintf(dhtBuffer, sizeof(dhtBuffer), "%sC\xB0%s%%", sTemp, sHum);
...

Volevo chiedere se è possibile mettere il LOGO su una micro sd in modo che quando arduino si accende prende il LOGO e lo trasferisce sullo schermo in modo da risparmiare memoria per altro codice

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