Ciao @Datman , e ciao a tutti coloro che hanno dato un contributo a questo argomento!
Intanto rispondo alla tua domanda. Per layout delle 2 pagine intendo le parti fisse.
Nella prima pagina c'è una piccola bitmap, 2 linee(orizzontale e verticale) e 2 scritte fisse
Le scritte variabili sono l'umidità rilevata, la soglia impostata e lo stato della ventola(ON,OFF,MAN)
Nella seconda pagina ho una scritta fissa(temperatura) ed una linea fissa orizzontale e poi la temperatura costantemente aggiornata.
Ho provato ad applicare tutti i vostri consigli ma...il risultato è peggiorato di tanto.
Il codice, molto semplice funziona così:
in prima pagina attraverso due bottoni posso aumentare o diminuire la soglia
In seconda visualizzo la temperatura
Passo dalla prima allla seconda attraverso un terzo pulsante(SET)
Se premo a lungo SET invece la ventola si accende fissa, se ripremo a lungo si spegne.
Il tutto è composto da 1 Nano, DHT11,Mod relay 2 posizioni, Schermo SSD1306, 3 bottoni.
Posto di seguito i 2 listati(prima delle modifiche e dopo) ma il problema è legato a 2 motivi secondo me:
inserisce delle spurie in basso a destra perchè ,forse, ha troppo da gestire. Infatti se nel codice faccio stampare solo la scritta "Temperatura" il problema sparisce. Se modifico in "Temperatura attuale" o comunque aumento i caratteri inizia il problema.
Così come se allungo ancora di più i contenuti(tipo scrivo temperatura attuale registrata o comunque allungo qualsiasi altra scritta o ne aggiungo) le spurie aumentano.
Inoltre le spurie "sfarfallano" per via del costante aggiornamento dello schermo(nel primo codice)
Per rendere meglio l'l'idea gho caricato su youtube il video dei 2 risultati
CODICE VECCHIO
CODICE NUOVO
Da notare che nel secondo listato ho spostato quante più scritte possibili nella flash, senza avere miglioramenti.
Ecco i Listati, vi prego di essere pacati con le critiche...sono alle prime armi con arduino 
Però consigli, commenti o altro possa essere costruttivo sono per me una manna!
LISTATO VECCHIO
//Gestione dipendenze-------------------------------------------------
#include <Wire.h>
#include <DHT.h>
#include <OneButton.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Dichiarazione dei PIN-----------------------------------------------
#define downBtnPin 2
#define upBtnPin 3
#define setBtnPin 4
#define DHTPin 5
#define relayPin 6
//Settaggi schermo OLED SSM1306----------------------------------------
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
//SDA su A4
//SCL su A5
//Icona ventola
const unsigned char fanBmp[] PROGMEM = {
0x00, 0x0f, 0xc0, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00,
0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0x00,
0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xf8, 0x00,
0x00, 0x7f, 0xf0, 0x00, 0x00, 0x3f, 0xc3, 0xc0, 0x1f, 0x0f, 0xcf, 0xf0, 0x3f, 0xc5, 0xbf, 0xfc,
0x7f, 0xf3, 0xbf, 0xfe, 0xff, 0xfb, 0xbf, 0xfe, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x7f, 0xff, 0x3f, 0xfe,
0x7f, 0xfe, 0x3f, 0xfe, 0x7f, 0xfe, 0x3f, 0xfc, 0x3f, 0xfc, 0x3f, 0xf8, 0x1f, 0xfc, 0x3f, 0xf0,
0x0f, 0xf0, 0x1f, 0xe0, 0x07, 0xe0, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
//Settaggi sensore DHT11
#define DHTTYPE DHT11
DHT dht(DHTPin,DHTTYPE);
//Variabili di stato e conservazione valori
int setVal =60;//valore di base per l'umidità in partenza
int varVal = 5;//sottratto al valore settato è il valore di spegnimento della ventola
int h;//Umidità
int t;//Temperatura
bool relayState=1;//Memorizza lo stato del Relè. A 1 la ventola è spenta
//Variabili per la gestione delle schermate
int schermata=0;//Provo a gestire diverse schermate...
int maxSchermata =1;//Numero massimo schermate, se è 1 ho la 0 e la 1, ecc
//Gestione manuale, quando è attiva la ventola sta sempre accesa
bool manuale =0;
//Creazione dei bottoni per la gestione con ONE BUTTON
OneButton btnUp;
OneButton btnDown;
OneButton btnSet;
void setup() {
Serial.begin(9600);
dht.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
//Inizializzazione dei bottoni---------------------------------------------------
btnUp.setup(upBtnPin,INPUT_PULLUP,true);
btnDown.setup(downBtnPin,INPUT_PULLUP,true);
btnSet.setup(setBtnPin,INPUT_PULLUP,true);
btnUp.attachClick(btnUpClick);
btnDown.attachClick(btnDownClick);
btnSet.attachClick(btnSetClick);
btnSet.attachLongPressStart(btnSetLongClick);
//SPLASH SCREEN
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(30, 20);
display.println("Umidostato");
display.setCursor(45, 40);
display.println("V 1.1");
display.display();
pinMode(relayPin,OUTPUT);
digitalWrite(relayPin,relayState);
delay(3000);
}
void loop() {
btnUp.tick();
btnDown.tick();
btnSet.tick();
h = int(dht.readHumidity());
t=int(dht.readTemperature());
//Gestione automatica
if(manuale==0){
if (h>setVal){relayState=0;}//accendo
if (h<=setVal-varVal){relayState=1;}//spengo
digitalWrite(relayPin,relayState);
}
if(manuale==1){digitalWrite(relayPin,LOW);}
Serial.print(manuale);
stampaSchermo();
}
void btnUpClick()
{
//l'implementazione è solo nella prima schermata
if (schermata !=0){return;}
setVal++;
if (setVal>99){setVal=1;}
}
void btnDownClick()
{
//l'implementazione è solo nella prima schermata
if (schermata !=0){return;}
setVal--;
if (setVal<1){setVal=99;}
}
void btnSetClick()
{
schermata++;
if (schermata>maxSchermata){schermata=0;}
Serial.println(schermata);
}
void btnSetLongClick()
{
manuale=!manuale;
}
void stampaSchermo()
{
display.clearDisplay();
if (schermata==0) {
display.drawBitmap(92, 5, fanBmp, 32, 32, WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("Ambiente"));
display.setCursor(0, 40);
display.println(F("SET"));
display.drawFastHLine(0, 32, 87, WHITE);
display.drawFastVLine(87, 0, 64, WHITE);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(25, 15);
display.print(h);
display.println("%");
display.setCursor(25, 48);
display.print(setVal);
display.println("%");
display.setCursor(92, 48);
if(manuale==0){
display.println((relayState ? "OFF" : "ON")); }
else{display.println("MAN");}
}
if (schermata==1){
display.setTextSize(1);
display.setCursor(30, 15);
display.println("Temperatura Attuale registrata");
display.drawFastHLine(0, 32, 128, WHITE);
display.setTextSize(2);
display.setCursor(35, 40);
display.print(t);
display.print((char)247); display.print("C");
}
display.display();
}
LISTATO NUOVO
//Gestione dipendenze-------------------------------------------------
#include <Wire.h>
#include <DHT.h>
#include <OneButton.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Dichiarazione dei PIN-----------------------------------------------
#define downBtnPin 2
#define upBtnPin 3
#define setBtnPin 4
#define DHTPin 5
#define relayPin 6
//Settaggi schermo OLED SSM1306----------------------------------------
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
//Per Arduino Nano
//SDA su A4
//SCL su A5
//Icona ventola
const unsigned char fanBmp[] PROGMEM = {
0x00, 0x0f, 0xc0, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00,
0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0x00,
0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xf8, 0x00,
0x00, 0x7f, 0xf0, 0x00, 0x00, 0x3f, 0xc3, 0xc0, 0x1f, 0x0f, 0xcf, 0xf0, 0x3f, 0xc5, 0xbf, 0xfc,
0x7f, 0xf3, 0xbf, 0xfe, 0xff, 0xfb, 0xbf, 0xfe, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x7f, 0xff, 0x3f, 0xfe,
0x7f, 0xfe, 0x3f, 0xfe, 0x7f, 0xfe, 0x3f, 0xfc, 0x3f, 0xfc, 0x3f, 0xf8, 0x1f, 0xfc, 0x3f, 0xf0,
0x0f, 0xf0, 0x1f, 0xe0, 0x07, 0xe0, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
//Settaggi sensore DHT11
#define DHTTYPE DHT11
DHT dht(DHTPin,DHTTYPE);
//Variabili di stato e conservazione valori
int setVal =60;//valore di base per l'umidità in partenza
int varVal = 5;//sottratto al valore settato è il valore di spegnimento della ventola
int h;//Umidità
int t;//Temperatura
bool relayState=1;//Memorizza lo stato del Relè. A 1 la ventola è spenta
//Variabili per la gestione delle schermate
int schermata=0;//Provo a gestire diverse schermate...
int maxSchermata =1;//Numero massimo schermate, se è 1 ho la 0 e la 1, ecc
//Gestione manuale, quando è attiva la ventola sta sempre accesa
bool manuale =0;
//Creazione dei bottoni per la gestione con ONE BUTTON
OneButton btnUp;
OneButton btnDown;
OneButton btnSet;
void setup() {
dht.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
//Inizializzazione dei bottoni---------------------------------------------------
btnUp.setup(upBtnPin,INPUT_PULLUP,true);
btnDown.setup(downBtnPin,INPUT_PULLUP,true);
btnSet.setup(setBtnPin,INPUT_PULLUP,true);
btnUp.attachClick(btnUpClick);
btnDown.attachClick(btnDownClick);
btnSet.attachClick(btnSetClick);
btnSet.attachLongPressStart(btnSetLongClick);
//SPLASH SCREEN
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(30, 20);
display.println("Umidostato");
display.setCursor(45, 40);
display.println("V 1.1");
display.display();
pinMode(relayPin,OUTPUT);
digitalWrite(relayPin,relayState);
delay(3000);
stampaLayout();
stampaValori();
}
void loop() {
btnUp.tick();
btnDown.tick();
btnSet.tick();
h = int(dht.readHumidity());
t=int(dht.readTemperature());
//Gestione automatica
if(manuale==0){
if (h>setVal){relayState=0;}//accendo
if (h<=setVal-varVal){relayState=1;}//spengo
digitalWrite(relayPin,relayState);
}
//Gestione Manuale
if(manuale==1){digitalWrite(relayPin,LOW);}
stampaValori();
}
void btnUpClick()
{
//l'implementazione è solo nella prima schermata
if (schermata !=0){return;}
setVal++;
if (setVal>99){setVal=1;}
}
void btnDownClick()
{
//l'implementazione è solo nella prima schermata
if (schermata !=0){return;}
setVal--;
if (setVal<1){setVal=99;}
}
void btnSetClick()
{
schermata++;
if (schermata>maxSchermata){schermata=0;}
stampaLayout();
}
void btnSetLongClick()
{
manuale=!manuale;
}
void stampaLayout()
{
display.clearDisplay();
if (schermata==0) {
display.drawBitmap(92, 5, fanBmp, 32, 32, WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("Ambiente"));
display.setCursor(0, 40);
display.println(F("SET"));
display.drawFastHLine(0, 32, 87, WHITE);
display.drawFastVLine(87, 0, 64, WHITE);
}
if (schermata==1){
display.setTextSize(1);
display.setCursor(30, 15);
display.println(F("Temperatura"));
display.drawFastHLine(0, 32, 128, WHITE);
}
display.display();
}
void stampaValori()
{
if(schermata==0){
//Ripulisco lo spazio delle variabili
display.fillRect(25,48,35,15,BLACK);
display.fillRect(25,15,35,15,BLACK);
display.fillRect(92,48,35,20,BLACK);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(25, 15);
display.print(h);
display.println("%");
display.setCursor(25, 48);
display.print(setVal);
display.println(F("%"));
display.setCursor(92, 48);
if(manuale==0){
display.println((relayState ? "OFF" : "ON")); }
else{
display.println("MAN");}
}
if (schermata==1){
//Ripulisco lo spazio delle variabili
display.fillRect(35,40,47,15,BLACK);
display.setTextSize(2);
display.setCursor(35, 40);
display.print(t);
display.print((char)247); display.print("C");
}
display.display();
}