Pluviometro su ESP32

Il tuo WiFi non ha la possibilità di assegnare IP determinati in base al MAC address?

Ciao @zoomx e grazie per la risposta,
chiaro.... ovviamente si può, ma come detto questo ovvia al problema e non lo risolve!
Voglio capire perché succede e poi ovviamente risolvere il problema anche perché nel mio caso è possibile ovviarlo, nel caso in cui non sia io il proprietario delle infrastrutture di rete no, quindi devo risolvere il problema cosi!

Alan

Hai ragione!
Ho visto dove si inchioda ed è strano, si tratta di codice che ho riusato anche io, poi qui c'è un ESP32 che ha 2 core. Li usi entrambi?
Per caso arriva a stampare "Reconnecting..." prima di inchiodarsi?
Vedo poi che usi la classe String non è che è questa la causa dei problemi, anche se su ESP32 mi sembra strano.

Si, uno gestisce il loop e l'altro controlla lo stato del WiFi ed anche la pressione e tutti gli eventi che si generano sul GPIO0 (BOOT BUTTON) per attivare il pairing via WPS.

No, anzi... arriva si e no al initNTP() perché non stampa nemmeno l'ora e la data!

Alan

Nel senso che hai una funzione che fa partire un task che chiama una funzione che a sua volta chiama una funzione.
Quello che fai in connectionLoop() io lo avrei messo tutto all'interno di connectionLoopTask()

Immagino che tu abbia adottato questo approccio perché in connectionLoop() usi delle variabili globali?
In questo caso, potevi passare al task il puntatore ad una struct dove "impacchetti" tutte le variabili condivise con il task in oggetto.

// Definizione di un tipo dati "custom"
typedef struct {
  int var1;
  bool var2;
  long var3;
} TaskParams;

// Istanza del tipo dati TaskParams 
TaskParams params;
.....
params.var1 = 123;
params.var2 = true;
params.var3 = 164596494949;
......

// Se la funzione connectionLoopTaskCreate() dove l'unica cosa che fai è avviare
// il task la chiami una volta sola in setup(),  a che serve? Crea il task direttamene e basta...
xTaskCreate(
    connectionLoopTask,           /* Task function. */
    "CONNECTION_LOOP_T",          /* name of task. */
    10000,                        /* Stack size of task */
    (void*)&params,               /* parameter of the task */
    1,                      /* priority of the task */
    &connectionLoop_t,      /* Task handle to keep track of created task */
    );

/* pin task to core 0 */ 
// Lo "user code" è preferibile farlo girare nel core 1
// Sul core 0 infatti c'è tutto lo stack WiFi ed altre funzionalità di base dell'esp.

void connectionLoopTask(void *vParameters) {
  TaskParams *param = (TaskParams *) vParameters;
  while (1) {
    ..... bla bla bla
    param->var1;
    param->var2;
    param->var3;
    ..... bla bla bla
    yield();
  }
  vTaskDelete(NULL);
}

non proprio; il ConnectionMenager.h lo avevo fatto per racchiudere le funzioni WiFi in un unico file e averle già pronte... quella del task è una delle successive modifiche fatte....

Quindi, riassumendo, se modifico come dici dovrei riuscire a eliminare l'errore del TWDT o è solo una miglioria assestante dal problema che comunque ho?

edit: cosa sta a significare l'operatore -> lo vedo di continuo ma non so che faccia, spiegazione veloce?

Alan

Non credo, io mi riferivo solo al fatto che è tutto un po' "contorto".

Comunque io non vedo tutta questa necessità di un task distinto se devo essere sincero.
Secondo me funziona senza problemi anche mettendo tutto nel loop e risolvi il problema del task watch dog che abbaia :laughing:

Riguardo l'operatore -> si usa quando vuoi accedere a proprietà di oggetti che sono stati referenziati come puntatori.
Nello specifico l'oggetto param all'interno della funzione del task è un puntatore al tipo dati TaskParams quindi devo usare il ->

Ma l'oggetto passato al task come parametro è definito globalmente come TaskParams params; quindi non come un puntatore.
Infatti le istruzioni per assegnare il valore contengono il .
params.var1 = 123;

La funzione del task, come vedi, accetta come parametro solo un generico puntatore a void * vParameters perché in questo puoi fare il casting al puntatore del tipo che ti pare, e quindi gli puoi passare qualsiasi tipo di dati: int, float, bool, array, struct, classi, funzioni etc etc

Ciao @cotestatnt ,
ora sono passato alla xTaskCreate e funziona decisamente meglio!

Alan

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