Registrazione data ed orario accensione led tramite pagina web

Buonasera,

ho realizzato un piccolo progettino con Arduino, utilizzando un mkr 1010 come web server, accendo e spengo un led tramite pagina web. Adesso vorrei visualizzare sulla pagina web la data e l' orario di quando è stato acceso il led. Per la data e l' ora ho sfruttato la libreria RTCZero.h (quindi la data e l' orario li prendo da internet). Utilizzando un ciclo if vado a verificare se la condizione led acceso è vera, e di conseguenza scrivo il valori della data e dell' orario dentro a le rispettive varibili, queste varibili poi le visualizzo sulla pagina web. Fin qui tutto bene. Il problema è che il tutto funziona fin quando il led è acceso cioè è vera la condizione in cui è verificato l' if . Allora avevo pensato di scrivere una variabile mediante un puntatore e andare a richiamarla fuori dal ciclo if in modo che la variabile valesse anche fuori dal ciclo if. Ma la cosa non funziona( sono un pivello ). Qualcuno ha qualche idea di come potrei fare per risolvere la cosa ? Posto parte del codice in questione (per semplicità gli faccio visualizzare solo i minuti al momento)

    //stato led acceso spento 
            int statoled = digitalRead(2);
            
            client.print("<font size=+2>IL LED E'  ");
          
           int *minuti ;
            
            if (statoled==0){              
              
              client.print("SPENTO");              
            }
            if (statoled==1) {


             *minuti = rtc.getMinutes();               
                                        
                      
                 
             client.print("<font color=red> ACCESO");
             
            }
          
            client.print("<font color=red> 


E' stato acceso  -  " ); 
            
            client.print( *minuti );
  1. poco chiaro, ti riferisci alla variabile statoled ? Andarlo a capire dal programma non è semplice
    2.mi pare lei, quindi... molto semplicemente devi leggerti un manuale di C nella sezione scope o visibilità delle variabili.
    La variabile dichiarata li è locale.
    Devi dichiararla all'inizio del programma fuori da loop() e setup() così è globale.
    int statoled = digitalRead(2); in realtà sono ben 2 azioni.

int statoled; è la dichiarazione e poi fai una assegnazione leggendo il pin 2.

Perciò come variabile globale devi mettere int statoled; ad inizio programma
Poi al posto di quella riga che hai adesso metti solo statoled = digitalRead(2);
mi raccomando NON rimettere li la parola int davanti.

P.S. sarebbe meglio nel programma usare una costante iniziale per individuare il pin,
#define K_PINLED 2
e poi nel programma usi quel K_PINLED al posto del 2 statoled=digitalRead(K_PINLED);

P.S. assolutamente elimina questa cosa dei puntatori, non sai come usarli e il programma facilmente si schianta: il C non verifica se fai caxxate:
int *minuti ; NON va bene
perchè minuti non punta a NULLA (anzi ad un valore sconosciuto) quindi minuti punti in memoria a caso.
Quando fai questo:
*minuti = rtc.getMinutes();
è un vero disastro, scrivi il valore dei minuti in memoria puntato da minuti che punta... non si sa dove.

Questo è accettabile, ovvero minuti è un puntatore e punta alla variabile x
int x;
int *minuti=&x;
*minuti=10; // scrivo 10 dentro a x
x=10; // scrivo 10 dentro a x

Grazie tante per la pazienza e la spiegazione. Con i tuoi suggerimenti ho risolto così :

  1. ho messo a posto statoled come mi hai detto

  2. ho creato un variabile che ho chiamato minuti1 che legge i minuti quando lo statoled è acceso , li "congela "
    e tramite il puntatore li porta fuori dal ciclo if, poi sulla pagina web stampo il valore del puntatore *minuti

minuti1 e *minuti , come varibili globali (fuori dal setup e dal loop)

int minuti1 ; 


int *minuti =&minuti1 ;

poi la restante parte del codice in questione

            if (statoled==0){              
              
              client.print("SPENTO");              
            }
            if (statoled==1) {             


             minuti1 = rtc.getMinutes();           
                           
                       
                   
             client.print("<font color=red> ACCESO");          
                       
              
              
             
            }


           
            client.print("<font color=red> 


E' stato acceso  -  " ); 


            
           client.print( *minuti );

Quello che cercava di dirti nid è che in questo caso i puntatori sono inutili, più o meno come usare un bazooka per uccidere una mosca...
Basta che dichiari la tua variabile in testa al programma così è globale e la puoi usare dappertutto.
Tra l'altro, giusto per pignoleria, l'if non è un ciclo.

ok grazie, ho tolto i puntatori e funziona, quindi il valore alla variabile globale viene assegnato non appena la condizione dell' if è verificato e resta quello fin quando la condizione if non è di nuovo verificata e viene assegnato un nuovo valore. Scusatemi ma sto iniziando adesso .

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