Attivazione timer a passaggio di stato da high a low

Buonasera a tutti, mi trovo ad un punto morto...

Avrei la necessità di attivare un timer solo quando l’input passa da high a low e non viceversa, al momento sono riuscito a far partire il timer alla variazione di stato (quindi oltre da high a low anche da low ad high).
Non riesco a trovare un’istruzione che mi gestisca solo il passaggio di stato richiesto.
Non chiedo come fare ma se si può fare (se non si può fare accantono il progetto)

Grazie

Ciao Miglio,

che input?...posta il codice che ci diamo un occhio.

Variabile che ricordi lo stato precesente.
Se lo stato che leggo é basso e la memoria é alta allora parte timer.
A fine loop la memoria diventa uguale alla lettura

Ciao Orso2001, al momento ho provato questo codice .. solo che cambia stato ad ogni pressione mentre a me servirebbe che il led si acceda solo quando premo il pulsante, inoltre il led dovrebbe accendersi per 2 secondi e poi spegnersi fino alla pressione successiva....

int pinLed = 8;
int buttonPin = 10;

void setup() {
  pinMode(pinLed, OUTPUT);
  pinMode(buttonPin, INPUT);
}
void loop() {
  if(digitalRead(buttonPin)==LOW) {
     digitalWrite(pinLed, !digitalRead(pinLed));
          while(digitalRead(buttonPin)==LOW){
        }
       }
  }

Cominciamo con una domanda: cosa intendincon 'timer"? Io pensavo ti riferissi ad un timer millis() allo scadere del quale fai qualcosa, ma così non sembra.
Inoltere il programma sembra fare quello che dici, ovvero fare qualcosa ao passaggio da HIGH a LOW. Ma temo che serva un anti rimvalzo hardware o software per il pulsante (se di un pulsante si tratta). Quanto a come farlo guarda rra i post di Guglielmo, ce ne sonobun numero imprecisato relativi a questi argomenti

in pratica dovrei costruire un dispositivo che quando il termostatato spegne la caldaia pellet questa non si riaccende più per un certo tempo dato da un timer anche se il termostato va UP (in modo che termini di bruciare il pellet ancora presente nel bracere)
Il buttonPin è gestito dal contatto NC (o NA) di un relè messo in parallelo al termostato, quando il termostato stacca il relè si diseccita e mi fa cambiare lo stato del buttonPin ... a quel punto viene rilevato il cambio stato e si attiva il pinLed (che non sarà un led ma sarà un modulo relè) che mi interrompe il contatto della caldaia.
Il timer può essere esterno ma in questo caso il pinLed mi deve dare solo in impulso per far partire il timer o utilizzando delay in modo che il relè rimanga eccitato per il tempo impostato. non vorrei usare millis ... preferisco che arduino rimanga in pausa per il tempo impostato.
a tempo scaduto il tutto si resetta e se il termostato è OFF ardino non fa niente se il termostato è ON arduino non fa niente in pratica il tutto deve partire solo quando il buttonPin passa da HIGH a LOW.

spero che quello scritto sia chiaro :slight_smile:

Ora ho visto un altra cosa: il programma, per come sembra andare, inverte lo stato del 'led' ad ogni discesa dell'input. Prova a sostituire la !digitalRead... con un HIGH, e as aggiungere una digitalWrite (led, LOW) fuori dalla if

Concordo che sembra un problema di rimbalzi. Se non ci sono vincoli stringenti di tempo il modo più semplice è prendere per buone due letture che a distanza di 40ms risultano uguali.

byte lettura() {
    static byte lett = digitalRead(buttonPin);
    byte in1 = digitalRead(buttonPin);
    delay(40);
    if(digitalRead(buttonPin) == in1) lett = in1;
    return lett;
}
void loop() {
    if(lettura() == LOW) {
        .......
        while(lettura() == LOW); // attende ritorno a HIGH
    }
}

Grazie per i consigli, oggi cerco di capire il primo codice che mi ha suggerito Claudio_FF e inserire le modifiche indicate da Silente

Penso di aver risolto :smiley: :smiley: con i led funzion

// GESTIONE STUFA PELLET
// 1) portando un  positivo (+5Volt) sul PIN 10 -->  il PIN 11 va ALTO
// 2) quando al PIN 10 togliamo tensione --> inizia il ritardo (si accende il led 12 x il tempo impostato)
// 3) se il led 12 e' acceso il comando sul PIN 10 viene ignorato
// 4) se il led 12 e' spento torna al punto 1

/*-------------------  VARIABILI ------------------------*/
const int Pin = 10;                               // pin di input a cui è collegato al termostato
const int USCITA_COMANDO_CALDAIA_11 = 11;         // Relè collegato al pin digitale 11 - contatto NA collegato alla caldaia 
const int LED12 = 12;                             // LED collegato al pin digitale 12 - resta acceso per il TEMPO_ATTESA 
const long TEMPO_ATTESA = 10000;                   // RITARDO IMPOSTATO in ms 


  // Avvio dell'applicazione

void setup()
{
  /*------------------ SETTA I PIN ---------------------*/
  pinMode(USCITA_COMANDO_CALDAIA_11, OUTPUT);     // imposta il pin digitale come output
  pinMode(LED12, OUTPUT);                         // imposta il pin digitale come output
  pinMode(Pin, INPUT);                            // imposta il pin digitale come input

    /*------------------  INIZIALIZZA PORTA SERIALE ---------------------*/
  Serial.begin(9600);                             // apre la porta seriale
}

  // Avvio del loop
void loop()
{
  verifica (); 
}
void verifica () 
{
  // Verifico se arriva segnale sul PIN 10

  if (digitalRead(Pin))
  {
    digitalWrite(USCITA_COMANDO_CALDAIA_11, HIGH);  
    digitalWrite(LED12, LOW);
    Serial.println ("--> void ritardo()");
    ritardo();
   }
  else 
  {
    Serial.println ("CMD_LOW"); 
    digitalWrite(USCITA_COMANDO_CALDAIA_11, LOW);  
    delay (5000);                                //verifica ogni 5 secondi stato PIN 10
  }
  
}

void ritardo ()
  // Verifico se cambia stato segnale sul PIN 10
{
    CHANGE_PIN_SIGNAL:
   if   (digitalRead(Pin)== LOW)
    { digitalWrite(USCITA_COMANDO_CALDAIA_11, LOW); 
    digitalWrite(LED12, HIGH); 
    delay (TEMPO_ATTESA);
    digitalWrite(USCITA_COMANDO_CALDAIA_11, HIGH); 
    Serial.println ("<-- loop");
    digitalWrite(LED12, LOW);
    delay (100);
    verifica ();}
   else goto CHANGE_PIN_SIGNAL; 
    
 }

adesso devo comprare la scheda relè e provare il tutto ...

Scusami, per un’applicazione con tempi così alti non ti converrebbe utilizzare un rtc? Così blocchi il sistema per tutto il tempo di attesa. Tanto per quello che costano.

ciao Lollo82, grazie per il consiglio ma visto che sono alle prime armi il blocco del sistema è voluto .. infatti avevo già scritto che preferivo usare il deley.... alla fine il tutto sta facendo quello che voglio ;D.
Se nel tempo troverò difetti cercherò altre soluzioni
Al momento è già tanto quello che sono riuscito a fare :grin:

Miglio:
ciao Lollo82, grazie per il consiglio ma visto che sono alle prime armi il blocco del sistema è voluto .. infatti avevo già scritto che preferivo usare il deley.... alla fine il tutto sta facendo quello che voglio ;D.
Se nel tempo troverò difetti cercherò altre soluzioni
Al momento è già tanto quello che sono riuscito a fare :grin:

Ok scusami. Son contento che sei riuscito ad ottenere ciò che volevi. :slight_smile:

Lollo82:
Ok scusami. Son contento che sei riuscito ad ottenere ciò che volevi. :slight_smile:

Non devi scusarti .... il fatto è che non so cosa sia un rtc :slight_smile:

però so cercando di capire cosè

potrebbe anche bastare l'uso della pulseIn() nella quale puoi indicare HIGH o LOW

anche se è nata per contare quanto è lungo l'impulso....

Oppure un interrupt in falling

Per iscrizione