Ciao sto provando a fare un novo codice ma quando cerco di scrivere sullo schermo ssd1306 con la libreria u8glib i valori del DHT22 ma al posto di uscire il valore c'è il ? . Ho controllato e non è un problema che non funziona ma che qualcosa va storto il DHT22 è totalmente funzionante.
#include <Adafruit_Sensor.h>
#include "U8glib.h"
#include "RTClib.h"
#include <Wire.h>
#include <DHT.h>
#include <DHT_U.h>
#include <avr/sleep.h>
U8GLIB_SSD1306_128X64 u8g(10, 9, 12, 11, 13);
RTC_DS3231 rtc;
#define DHTPIN 2
#define DHTTYPE DHT22
DHT_Unified dht(DHTPIN, DHTTYPE);
const unsigned char LOGO [] PROGMEM = {
// qua ce il LOGO
};
void drawlogo() {
u8g.firstPage();
do {
u8g.drawBitmapP(0, 0, 128/8, 64, LOGO);
} while( u8g.nextPage() );
}
void clearScreen() {
u8g.firstPage();
do {
} while( u8g.nextPage() );
}
void setup() {
Serial.begin(9600);
u8g.begin();
rtc.begin();
dht.begin();
delay(10);
drawlogo();
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
while (1) delay(10);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
delay(2000);
clearScreen();
}
void loop() {
DisplayInfo();
}
void DisplayInfo(){
DateTime now = rtc.now();
sensors_event_t event;
dht.temperature().getEvent(&event);
dht.humidity().getEvent(&event);
delay(1000);
dht.temperature().getEvent(&event);
if (isnan(event.temperature)) {
Serial.println(F("Error reading temperature!"));
}
else {
Serial.print(F("Temperature: "));
Serial.print(event.temperature);
Serial.println(F("°C"));
}
// Get humidity event and print its value.
dht.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
Serial.println(F("Error reading humidity!"));
}
else {
Serial.print(F("Humidity: "));
Serial.print(event.relative_humidity);
Serial.println(F("%"));
}
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[20];
snprintf(dhtBuffer, sizeof(dhtBuffer), "%05.2fC° %05.2f%%", event.temperature, event.relative_humidity);
int dhtX = (128 - u8g.getStrWidth(dhtBuffer)) / 4;
int dhtY = 60; // L'altezza della stringa
u8g.drawStr(dhtX, dhtY, dhtBuffer);
} while ( u8g.nextPage() );
}
Sono un ragazzo con competenze di base e medie non troppo avanzate e sto cercando di imparare a controllare un nuovo schermo che ho comprato da poco ma che sto riscontrando un problema che non trovo la soluzione
Buongiorno e benvenuto nella sezione Italiana del forum,
cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.
Grazie,
Guglielmo
P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto.
... non mi sembra ... come ti ho già scritto devi fare la tua presentazione NELL'APPOSITA DISCUSSIONE (spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati) e NON qui in questo thread dove poi nessuno è più in grado di ritrovarla.
Grazie,
Guglielmo
P.S.: Ciò che ti appare in blu è un link su cui devi fare click per raggiungere la discussione appropriata.
Ok.
Quindi ora spiegaci meglio, quale Arduino stai usando? Visto che dici di non essere pratico, quel codice lo hai preso da qualche parte? Se si, il codice originale qual era (o almeno quali parti hai modificato tu)? Ad esempio manca il "LOGO"...
E quando dici che il valore lo vedi come "?", esattamente cosa intendi? Cosa vedi sul display? Potresti fare una foto (più nitida e leggibile possibile) e postarla qui?
Tu leggi temperatura ed umidità, sono entrambi un "?" o solo una delle due?
Sto usando un arduino uno, non sono pratico al 100% dato che avevo smesso per motivo che i materiali non arrivavano.
Allora questo codice lo ho fatto io per imparare a usare lo schermo ssd1306 (imparando attraverso video ecc...) Del LOGO non ci dobbiamo preoccupare dato che funziona tutto è solo quando entra nel DisplayInfo che sarebbe la schermata dove c'è l'orario, la data e sotto i valori del dht22 che non appaiono adesso mando unimmagine.
sto usando un ds3231 e voglio sistemare anche l'orario dato che non so perche non lo prende in automatico come il ds1307, forse è problema della batteria?
Ok, capito, ma dato che i valori li mandi anche su seriale, lì cosa si legge? Puoi postare anche l'output seriale?
PS: Comunque il carattere "°" non credo che tu possa mandarlo così perché nel display vedo che compare un codice UNICODE (quella "A"), penso che dovresti usare un codice specifico per quel display.
EDIT: penso che per questo carattere sia sufficiente usare il codice 223 (ma dipende dalla versione del chip del tuo display), ad esempio dato che 223=0xDF nella stringa fdi formato netterai il carattere '\xDF' ossia:
si ho tolto adesso "°" era lui che faceva comparire la "A" allora per l'output seriale sì ci sono i valori scritti avevo lasciato quella parte di codice solo per vedere se li legge:
'''
Temperature: 27.10°C
Humidity: 50.40%
'''
EDIT: allora no non funziona il \xDF mi comprare un carattere come la B ma in corsivo
Devi verificare con la tabella dei caratteri dell'essatto chip grafico che hai. Prova a cercare nel datasheet.
Comunque per i valori ho capito. E' colpa del snprintf() che non gestisce i float! Devi prima convertirli in stringa con la dtostrf() e poi stampare la stringa.
Prova così (a parte il "\xDF" che devi verificare) e secondo me vedrai che funziona:
Visto che \xDF ti dà una "B" (in realtà un "beta"), hai il chip con HD44780A02 European standard, vedi la tabella a pagina 18 di QUESTO documento.
Devi allora usare '\xB0':
si dopo che mi hai dato il docie xB0 compare il simbolo ma scompra dopo la humidity e resta comunque al posto dei gradi c'è la humidity
EDIT: magari provo a dividere la stringa "snprintf(dhtBuffer, sizeof(dhtBuffer), "%sC\xB0 %s%%", sTemp, sHum);" per sistemare l'errore che non mi compaiono entrambi