Lettura digitale con conteggio tempo

Buonasera a tutti,

vi sottopongo questa mia necessità, vorrei risolverla con Arduino Uno in mio possesso.
Ho realizzato un circuito alimentato con i 5V di Arduino che mi realizza in uscita un onda quadra; in pratica mi mantiene a +5V l'uscita per 0.5 secondi e la mantiene bassa per ulteriori 0.5 secondi, così ciclicamente. Ecco questi 0.5 secondi sono stati calcolati con alcune semplici formule.

Il mio intento ora è quello di verificare con Arduino che questi 0.5 secondi siano reali. Vorrei che, attraverso scrittura seriale Arduino mi dica il tempo in cui il segnale in lettura digitale risulta HIGH e quanto tempo LOW-

Sapete darmi qualche indicazione? Se è possibile..

Grazie mille

puoi prendere nota dell'istante in cui passi a HIGH e poi dell'istante in cui torni a LOW usando millis().
per differenza vedi quanto tempo è passato.

curiosità: ma la verifica la fai con lo stesso arduino con cui generi l'onda quadra? o con un arduino diverso?

Si, vorrei usare l'unico arduino in mio possesso sia per generare i 5V che per usarlo allo scopo de mio post..

Puoi darmi una mano alla stesura del codice?

altra curiosità... come generi l'onda quadra?
con digitalWrite(HIGH); delay(500); digitalWrite(LOW);?

Nono.. per generare l'onda quadra uso un piccolo circuito realizzato su breadboard con l'utilizzo dell'integrato NE555. Se avessi usato Arduino per generare l'onda quadra avrei conosciuto con esattezza i tempi stessi dell'onda..

infatti, mi pareva strano...

comunque, per misurare l'intervallo tra HIGH e LOW devi controllare il pin che ti interessa e segnarti in una variabile il valore di millis(). poi verifichi quando torna LOW e per differenza calcoli il tempo.

butta giù qualche riga di codice e vediamo cosa ne esce.

Va bene. Ci provo nei prossimi giorni.. a breve allora su questo canale. Grazie mille per il momento

Ecco quello che sono riuscito a partorire nel mio piccolo, con questo codice riesco effettivamente a "vedere" attraverso stampa seriale i tempi della fase High e Low. Avete consigli per leggere direttamente la durata degli eventi high e low senza fare la differenza dei millisecondi? o altri consigli?

Allego codice e stampa seriale..

int Tempo=0;
int Lettura=0;

void setup() {
  
Serial.begin (9600);
pinMode (8, INPUT);

}

void loop() {
  
Lettura = digitalRead(8);
Tempo = millis();

if (Lettura == HIGH) {
Serial.print ("T_On=");
Serial.println (Tempo);
}


if (Lettura == LOW){
Serial.print ("T_Off=");
Serial.println (Tempo);

}
}

Stampa seriale:
T_On=4429
T_On=4441
T_On=4452
T_On=4464
T_On=4475

(interrotta)

T_Off=5104
T_Off=5116
T_Off=5130
T_Off=5142
T_Off=5154

(interrotta).

Grazie mille. Appena ho un attimo di tempo lo provo.. A presto

Ciao, caricato il programma su arduino e collegato il mio circuitino, funziona tutto alla grande.
Questo è il risultato che ottengo dalla lettura seriale:

T_Off= 534
T_On= 537
T_On= 314
T_Off= 534
T_On= 537
T_Off= 533
T_On= 537
T_Off= 535
T_On= 536
...

Esattamente quello che desideravo. Grazie mille

Dite che è possibile farmi dire da Arduino, trascorsi 60 secondi, quanti T On e quanti T Off ha conteggiato?

Grazie mille

direi di sì, devi solo cambiare un po' la struttura del programma...
prevedi un contatore per Ton e uno per Toff che vai ad incrementare ogni volta che cambia lo stato.
ovviamente adesso usi il millis() per misurare i 60 secondi invece di misurare il cambio di stato.

Bello a dirsi, ma con la poca esperienza che ho, mi diventa difficile. Proverò a studiare un pò questo contatore.. chiederò consiglio poi sempre qui nel forum. Grazie a tutti per il momento..

per "contatore" intendo una variabile int che parte da 0 (zero) e che incrementi di volta in volta...

unsigned long inizio = 0;     // inizio conteggio tempo
int Lettura = 0;
int vecchia = 0;
int contaON = 0;              // contatore Ton
int contaOFF = 0;             // contatore Toff
int intervallo = 60 * 1000;   // intervallo 60 secondi (= 60000 millisecondi)

void setup() {
  Serial.begin (9600);
  pinMode (8, INPUT);

  inizio = millis();          // comincio il conteggio del tempo
}

void loop() {
  // controllo se è passato l'intervallo richiesto
  if ((millis() - inizio) >= intervallo) {
    // visualizzo i contatori
    Serial.print("T_On= ");
    Serial.println(contaON);
    Serial.print("T_Off= ");
    Serial.println(contaOFF);
    // resetto i contatori
    contaON = 0;
    contaOFF = 0;
    // resetto il conteggio del tempo
    inizio = millis();
  } else {
    // controllo se ON o OFF
    Lettura = digitalRead(8);
    if (vecchia != Lettura) {
      vecchia = Lettura;
  
      if (Lettura) {
        contaON++;
      } else {
        contaOFF++;
      }
    }
  }
}

non l'ho provato, ma la logica è quella...

Buonasera a tutti, oggi ho ricollegato Arduino per monitorare ancora i risultati e ho avuto una sorpresa..con il programma consigliatomi da @docsavage, se fino a ieri il programma mi restituiva esattamente i risultati con una formattazione del testo coerente, come da post precedente. Oggi mi fornisce una serie di numeri che non comprendo..:

T_On= 504
T_Off= 1
T_On= 0
T_Off= 0
T_On= 1
T_Off= 0
T_On= 0
T_Off= 1
T_On= 11
T_Off= 498
T_On= 503
T_Off= 0
T_On= 1
T_Off= 0
T_On= 0
T_Off= 0
T_On= 1
T_Off= 1
T_On= 11
T_Off= 499
T_On= 504
...

Qualcuno che sa darmi una spiegazione?

Grazie mille

@docsavage Ciao, no non è cambiato niente sul mio circuitino dalla prima volta, in cui il programma di arduino mi restituiva valori verosimili alla realtà. Sul mio circuitino ce' sempre stato un led che lampeggia. Lampeggio che è generato dal 555. Il lampeggio è sempre quello, ma arduino ieri nella breve pausa da un cambio di stato e l'altro, mi segnava nella stampa seriale T_Off=0 ; T_On=1 e al cambio di stato vero e propio tempi simili a quelli del "giorno prima".

Non ci può essere qualcosa che va in conflitto nel programma?

Grazie mille

@docsavage Grazie.. può bastare collegare all'uscita una resistenza di pull-down da 10KOhm?

@docsavage, Stasera provo ad aggiungere un delay di 10 millisecondi alla fine del programma. Con soluzione elettronica cosa intendi?

Qui però abbiamo delle commutazioni "elettroniche"... Se fosse disponibile un'oscilloscopio si potrebbe vedere cosa "butta fuori" veramente il ne555

Aggiornamento serale. Ho inserito una resistenza di pull down da 10KOhm, e il programma esegue esattamente le operazioni che mi aspettavo correttamente. Convinto di aver trovato la soluzione, ho provato a comunicazione seriale aperta, a rimuovere la resistenza. E non è cambiato nulla. Bah..

Mistero. Direi che per il momento è tutto. Ringrazio tutti gli intervenuti.. mi avete aperto importanti spunti che saranno degni di approfondimenti. Per il momento è tutto..

Grazie e a presto..