tempo tra un high e il successivo

ciao a utti sono nuovo nel forum , ma e' tanto che vi leggo
scrivo il mio primo post per una cosa molto banale
ho un oggetto che in base al lampeggio di un led devo fare delle azioni .

io ho un led che lampeggia , ed quindi ho un pin input di arduino che va HIGH.
ora io devo i considerare il tempo tra un lampeggio ed un altro .
se tra un lampeggio ed un altro vi e' un tempo inferiore a 1 secondi mi restituisce un pin che va alto per 2 secondi e poi va LOW .
se invece tra un HIGH ed il successivo , vi e' un tempo di 3 secondi non fa nulla

unsigned long tempo=0;

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

void loop() {
  if (digitalRead(8)==HIGH) {
   Serial.println("led ");
   tempo= millis();
  }

ho scritto due righe proprio di base ma non so andare avanti
vi dico grazie ancora prima delle vostre notizie ,
buona serata sperando di non chiedervi troppo

Beh...

Così riconosci il led acceso
Adesso devi riconoscere il led spento
È simile

Ma il circuito?
Perché se sbagli qualche collegamento tra circuiti con differenti alimentatori ti friggi arduino prima di dire 'ops'

E se colleghi un led dritto su un ingresso, anche con i gnd in comune, non sperare che arduino lo senta

C'era qui uno, un anno e passa fa, che affermava cose strane sui led, ma alla fine non andava mica...

Ti serve una variabile stato che assume due valori.
Il problema è il pin diventa HIGH e acquisisco il tempo, il pin diventa LOW e calcolo il tempo trascorso, ma questo non sempre allo stato LOW, ma solo se in precedenza era HIGH.

da qui una macchina a stati finiti

Se pin == HIGH
stato=1
tempo=millis()

ELSE IF stato==1 e pin== LOW (il pin è allo stato LOW ma prima era HIGH)
stato=0 (lo predispongo per il prossimo ciclo)
tempo=millis()-tempo
se tempo<1000
faccio qualcosa
else se tempo>=3000
faccio qualcosa
ELSE non è maggiore di 3000 e non è minore di 1000

C'era qui uno, un anno e passa fa, che affermava cose strane sui led, ma alla fine non andava mica...

Puoi mettere un link per favore?

Marco

Preferirei di no

Mi sono scornato con quella persona
E adesso la tempesta è passata, quindi non riaprirsi vecchie ferite

Preferirei di no ...

Beh ... non farne una questione personale ... e' solo che mi incurioriscono "le cose strane"...
Comunque vedi tu, se preferisci di no, non c'e' problema. ::slight_smile:

Marco

Solo un rapido sunto tecnico:
Un gruppo di led mi sembra fossero 13
Con un selettore sul 5 volt
Quindi selettore su 13 resistenze che vanno a 13 led

C'era uno che stava tentando di leggere lo stato dei led collegando i 13 piedini di ingresso tra resistenza e led
E un altro che gli parlava del rischio di false letture, di leggere 'alto' anche a led spento....

ciao e grazie a tutti delle dritte.
si le gnd sono collegate assieme, altrimenti non va.
ho iniziato a buttar giu questo secondo i vostri consigli, devo ancora associare il pin, ma che ne dite?

unsigned long tempo = 0;
boolean stato = 1;
boolean pinState;
boolean pin;
void setup() {
  pinMode(13, OUTPUT);
  pinMode(8, INPUT);        // imposta come input il pin 7
  Serial.begin(9600);        // imposta la comunicazione seriale
  digitalWrite(13, LOW);
  Serial.println ("inizio ");

}

void loop() {
  // put your main code here, to run repeatedly:
  if (pinState ==  HIGH) {
    stato = 1;
    tempo = millis();
  }

  else if (stato == 1 && pin == LOW) { //(il pin è allo stato LOW ma prima era HIGH)
    stato = 0 ; //(lo predispongo per il prossimo ciclo)
    tempo = millis() - tempo;
  }
  if ( tempo < 1000) {

  }

  if  (tempo > 3000) {
    //faccio qualcosa
  }
}

Compila?

per compilare compila ma non funziona

unsigned long tempo = 0;
unsigned long tempoON = 0;
boolean stato = 1;
boolean pinState;
boolean pin;

void setup() {
  pinMode(13, OUTPUT);
  pinMode(10, INPUT_PULLUP);        // imposta come input il pin 7
  Serial.begin(9600);        // imposta la comunicazione seriale
  digitalWrite(13, LOW);
  Serial.println ("inizio ");

}

void loop() {
  // put your main code here, to run repeatedly:
 pinState = digitalRead(10);  
 
  if (pinState ==  LOW) {
    Serial.println ("premo");
    stato = 1;
    tempo = millis();
  }

  else if (stato == 1 && pinState == HIGH) { //(il pin è allo stato LOW ma prima era HIGH)
    stato = 0 ; //(lo predispongo per il prossimo ciclo)
    
    tempo = millis() - tempo;
  }
 
  
  if ( tempo < 1000) {
 
 Serial.println ("reset up");
 tempoON=millis();
digitalWrite(13, HIGH);
  }
if (millis() - tempoON > 1000) {
  tempoON=0;
digitalWrite(13, LOW);
Serial.println ("reset dm");
}
  
  if  (tempo > 3000) {
    //faccio qualcosa
  }
}

Per come la vedo io: a te interessa solo se l'impulso è inferiore ad 1 secondo dato che oltre 1 secondo non deve fare nulla. Devi usare solo i primi 2 if che adesso stai utilizzando al contrario. Devi leggere prima l'ingresso alto e caricarti il valore di millis() e poi l'ingresso basso per calcolati la durata. In più come scritto adesso se tempo < 1000 avrai sempre un LED acceso.

Veramente ha detto che vuole misurare il tempo tra due lampeggi, non la durata di un lampeggio...
Se non abbiamo neppure chiarezza su questo meglio prima chiarirlo...

ciao, io devo calcolare il tempo che passa tra un lampeggio ed un altro, che sarebbe tra un livello alto e il successivo.
ho corretto secondo quanto ho capito dal suggerimento che mi hai dato, credo che sia cosi

unsigned long tempo = 0;
unsigned long tempoON = 0;
boolean stato = 1;
boolean pinState;


void setup() {
  pinMode(13, OUTPUT);
  pinMode(10, INPUT_PULLUP);        // imposta come input il pin 7
  Serial.begin(9600);        // imposta la comunicazione seriale
  digitalWrite(13, LOW);
  Serial.println ("inizio ");

}

void loop() {
  // put your main code here, to run repeatedly:
 pinState = digitalRead(10);  
 
  if (pinState ==  LOW) {
    Serial.println ("premo");
    stato = 1;
    tempo = millis();
  }

  else if (stato == 1 && pinState == HIGH) { //(il pin è allo stato LOW ma prima era HIGH)
    stato = 0 ; //(lo predispongo per il prossimo ciclo)
    
    tempo = millis() - tempo;
  }
 
  
  if ( tempo > 1000) {
 
 Serial.println ("reset up");
 tempoON=millis();
digitalWrite(13, HIGH);
  }
if (millis() - tempoON > 1000) {
  tempoON=0;
digitalWrite(13, LOW);
Serial.println ("reset dw");
}
  
 
}

in poche parole se tra un lampeggio ed un altro in un tempo inferiore ad 1 secondo deve mettermi il pin 13 alto per 1 secondo e poi andare il low.
se tra un lampeggio ed un altro c e' piu di 3 secondi non fa niente

Ti rendi conto vero che così se il lampeggio è veloce l'uscita non s spegnerà mai?

Se il periodo è minore di 1 secondo, vuoi un impulso in uscita;
se è maggiore di 3 secondi, non deve fare nulla.
Se è fra 1 e 3 secondi?...

Il LED lampeggia costantemente o emette solo coppie di lampi? Se il LED lampeggia costantemente con periodo minore di 1 secondo e vuoi in uscita impulsi di 1 secondo, come dice Standardoil l'uscita starà sempre alta!
Che cosa vuoi fare?...

il led ha solo questi 2 tipi di lampeggio ,ed lo ripete all infinito, in base allo stato che deve indicare.
ravvicinato che indica errore , ed lungo tutto ok.
si corretto e' se e' inferiore ad un secondo mi da un impulso , che sarebbe il reset.
l uso che devo fare e' cosi :
l arrocchio se va in pappa mi fa lampeggiare il led a circa 1 secondo tra un high e l atro, un questa condizione lo devo resettare.
quando funziona bene mi lampeggia ogni 3 secondi , e il tempo tra un high e il successivo passano 3 secondi

novello90:
il led ha solo questi 2 tipi di lampeggio ,ed lo ripete all infinito .......

Quindi le premesse sono leggermente errate ... in ogni caso, se 1 secondo e' errore e 3 secondi e' ok, e non ci sono altri tempi intrermedi, a te basta sapere se, ad esempio, fra due lampeggi passano piu o meno di 2 secondi ... e dato che il lampeggio piu veloce e' quello che ti serve, te ne bastano 2 consecutivi con un tempo inferiore ai 2 secondi fra loro ... :wink:

Problema x-y

quindi devo memorizzare anche il millis() del secondo lampeggio??