Causa più probabile
Stai incontrando un problema insidioso che anche i programmatori C ++ esperti spesso perdono: l'ordine di inizializzazione delle variabili globali. Nel tuo caso, Display lcd
viene inizializzato ( cioè viene chiamato il suo costruttore) prima di main ()
e successivamente setup ()
vengono eseguiti. Tuttavia, quasi certamente stai #include
in qualsiasi libreria dichiari la classe LiquidCrystal_I2C
, probabilmente Wire.h
e così via. In molte di queste classi, viene definita anche una variabile globale di quel tipo per rendere più facile l'accesso alle cose. Ad esempio, Serial
(come in Serial.println ("foo")
) è in realtà una variabile globale del tipo appropriato di qualsiasi implementazione seriale utilizzata dal tuo core.
Il problema che stai riscontrando è che lo standard C ++ non garantisce l'ordine di esecuzione dei costruttori di variabili globali. L'ordine è un artefatto del compilatore, l'ordine in cui i file oggetto sono stati collegati e probabilmente la fase della luna :)
Quello che sta accadendo (quasi certamente) è che il costruttore del tuo viene chiamata la classe Display
, che inizializza l'LCD e il bus i2c, quindi qualcos'altro chiama il costruttore LCD o il costruttore i2c e confonde le cose.
OK, "come posso risolvere questo problema?" Ti sento chiedere. Semplice: rendi la variabile lcd globale un puntatore e alloca l'istanza in begin ()
, in questo modo:
#include "Visualizza .h "Visualizza * lcd; void setup () {Serial.begin (9600); lcd = nuovo display (); // roba} void loop () {// altro materiale lcd->some_method (some_argument); // ancora più cose}
Ora hai la certezza che il tuo codice sarà l'ultimo a toccare qualsiasi codice di inizializzazione che potrebbe influenzare il display o il bus. Continua ad accedere ai metodi class Display
tramite il puntatore.
Una causa meno probabile
È ancora possibile che i tuoi costruttori vengano eseguiti nell'ordine giusto, ma al tuo hardware non piace essere inizializzato due volte (ma provalo comunque!), quindi potresti dover capire come resettare l'hardware in modo da poterlo fare inizializzalo di nuovo. Se comprendo correttamente il tuo messaggio, il ciclo non viene mai eseguito, il che significa che una seconda inizializzazione probabilmente causa un'eccezione (che non vedresti a meno che tu non abbia una sorta di canale di debug aggiuntivo; nel caso dell'ESP8266, ad esempio, quello sarebbe la porta Serial1
di solo output, e anche in questo caso, dovresti attivare esplicitamente il debug. Ogni core ha le sue cose di debug, dimentico cosa fa il vero Arduino.)
Spero che questo aiuti.
/ ji