modifica timer

Progetti Arduino
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

modifica timer

Messaggio da RoccoCostruzioni »

salve a tutti, ho fatto un timer countdown e per regolare il tempo ho utilizzato un encoder solo che vorrei implementare una funzione che se ruoto l'encoder piano mi avanza di una unità e se ruoto veloce mi avanza per esempio di decine, non avendo trovato niente in rete chiedo a voi come fare.
grazie a chi mi aiuterà
estrapolo solo il listato del timer, sicuramente non compilerà perchè ci sono variabili inerenti il listato completo

Codice: Seleziona tutto

#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 4);
#define Pause 61 //PULSANTE PAUSA TIMER
#define Reset 56 //PULSANTE RESET FORZATO TIMER
#define Start 60 //PULSANTE START TIMER
#define led 58 //LED RELE TIMER
#define buzzer 59 //SEGNALATORE ACUSTICO TIMER
#define encoderPinA 2 //ENCODER TIMER CW 
#define encoderPinB 3 //ENCODER TIMER CCW
#define encoderButton 57 //PULSANTE ENCODER TIMER

byte pos, actPos;
int HMS = 0;
int hours = 0;
int minutes = 0;
int seconds = 0;
unsigned long time1 = 0; 
bool mask = 0, toggle = 0; 
int pause = 0;
int reset = 0;
int starting = 0;
int encoderPos = 0; 
unsigned int lastReportedPos = 1; 
static boolean rotating = false; 
boolean A_set = false;
boolean B_set = false;
int contatoreFineTempo;

void setup() {

    pinMode (Pause, INPUT_PULLUP);
    pinMode (Reset, INPUT_PULLUP);
    pinMode (Start, INPUT_PULLUP);
    pinMode (led, OUTPUT);
    pinMode (buzzer, OUTPUT);
    pinMode (encoderPinA, INPUT_PULLUP);
    pinMode (encoderPinB, INPUT_PULLUP);
    pinMode (encoderButton, INPUT_PULLUP);
    attachInterrupt (0, doEncoderA, CHANGE); 
    attachInterrupt (1, doEncoderB, CHANGE); 
    digitalWrite (led, LOW);
    digitalWrite (buzzer, LOW);
    lcd.init();
    lcd.backlight();
    lcd.clear();
    lcd.print("IdeltaN");
    lcd.setCursor(0, 1);
    lcd.print("deltaT");
    lcd.setCursor(15, 0);
    lcd.print("A");
    lcd.setCursor(15, 1);
    lcd.print("S");
    lcd.setCursor(9, 0);
    lcd.print("0,000");
    lcd.setCursor(10, 1);
    lcd.print("0,00");
    lcd.setCursor(-4,2);
    lcd.print("Timer Count Down");
    lcd.setCursor(0, 3);
    lcd.print("00:00:00");

    time1=millis();

}

void loop() {
  
  if ((unsigned long) millis() - time1 > 1000 and mask == 1) {   
  lcd.setCursor(0, 3);
  lcd.print(hours);
  lcd.setCursor(2, 3);
  lcd.print(':');
  lcd.setCursor(3, 3);
  lcd.print(minutes);
  lcd.setCursor(5, 3);
  lcd.print(':');
  lcd.setCursor(6, 3);
  lcd.print(seconds);
    if(minutes == 0 and hours == 0 and seconds == 0) {  //When Timer Finish
      digitalWrite(led, LOW);
      myDigitalWrite(ledPinOFF, HIGH);
      myDigitalWrite(ledPinON, LOW);
      while(mask = 1) {
      contatoreFineTempo++;
      Serial.print("contatore");
      Serial.println(contatoreFineTempo);
      lcd.setCursor(0, 3);
      lcd.print("Finished");
      digitalWrite (buzzer, HIGH);
      delay(250);
      lcd.setCursor(0, 3);
      lcd.print("            ");
      digitalWrite (buzzer, LOW);
      delay(250);
          if (contatoreFineTempo >= 5) {
          contatoreFineTempo = 0;
          if (contatoreFineTempo == 0) {
          mask = 0;
          break;
          }
        }
      }
      lcd.setCursor(0, 3);
      lcd.print("00:00:00");
      if (ledState16 == HIGH) {
      hours = EEPROM.read(1);
      minutes = EEPROM.read(2);
      seconds = EEPROM.read(3);
}
    } else   
      seconds --;
    if (seconds < 0) {
      seconds = 59;
      minutes --;
    }
    if (minutes < 0) {
      minutes = 59;
      hours --;
    }
    time1 = millis();
  }

  if (digitalRead(encoderButton) == LOW and mask == 0) {
    while (digitalRead(encoderButton) == LOW);
    HMS = HMS + 1;
    if (HMS == 4)
    /* 
    if (HMS == 5)
    */
    {
      HMS = 1;
    }
    delay(100);
    if (HMS == 1) {
      lcd.setCursor(-4, 2);
      lcd.print("                ");
      lcd.setCursor(-1, 2);
      lcd.print("Set hours");
      }
      else if (HMS == 2) {
      lcd.setCursor(-4, 2);
      lcd.print("                ");
      lcd.setCursor(-1, 2);
      lcd.print("Set minutes");
      }
      else if (HMS == 3) {
      lcd.setCursor(-4, 2);
      lcd.print("                ");
      lcd.setCursor(-1, 2);
      lcd.print("Set seconds");
      }
      /*
      else if (HMS == 4) {
      lcd.setCursor(-4, 2);
      lcd.print("                ");
      lcd.setCursor(-4, 2);
      lcd.print("Timer Count Down");
      }
      */
  } 

  rotating = true; // reset the debouncer
  encoderPos = constrain(encoderPos, -1, 1);
  if (lastReportedPos != encoderPos) {
      
      if (HMS == 1) {
      if (encoderPos == 1)
      hours++;
      if (encoderPos == -1)
      hours--;
      if (hours > 59) hours = 0;
      if (hours < 0) hours = 59;
      lcd.setCursor(0, 3);
      lcd.print(hours);
      Serial.print ("hours");
      Serial.println (hours);
    } else if (HMS == 2) {
      if (encoderPos == 1)
      minutes++;
      if (encoderPos == -1)
      minutes--;
      if (minutes > 59) minutes = 0;
      if (minutes < 0) minutes = 59;
      lcd.setCursor(3, 3);
      lcd.print(minutes);
      Serial.print ("minutes");
      Serial.println (minutes);
    } else if (HMS == 3) {
      if (encoderPos == 1)
      seconds++;
      if (encoderPos == -1)
      seconds--;
      if (seconds > 59) seconds = 0;
      if (seconds < 0) seconds = 59;
      lcd.setCursor(6, 3);
      lcd.print(seconds);
      Serial.print ("seconds");
      Serial.println (seconds);
    }
      lcd.setCursor(0, 3);
      if (hours <= 9)
      {
        lcd.print("0");
      }
      lcd.print(hours);
      lcd.print(":");
      if (minutes <= 9)
      {;
        lcd.print("0");
      }
      lcd.print(minutes);
      lcd.print(":");
      if (seconds <= 9)
      {
        lcd.print("0");
      }
      lcd.print(seconds);
      
    if (ledState16 == HIGH) {
    EEPROM.update(1, hours);
    EEPROM.update(2, minutes);
    EEPROM.update(3, seconds);
    }
    encoderPos = 0;
    lastReportedPos = encoderPos;
}     

if(digitalRead(Start) == LOW) {
    while (digitalRead(Start) == LOW);
    if (minutes > 0 or hours > 0 or seconds > 0) {
      lcd.setCursor(-4, 2);
      lcd.print("                ");
      lcd.setCursor(-4, 2);
      lcd.print("Timer Count Down");
      lcd.setCursor(0, 3);
      lcd.print("              ");
      delay(500);
      lcd.setCursor(2, 3);
      lcd.print("Start");
      delay(1000);
    HMS = 0;  
    starting = 1;
    mask = 1;
    Serial.print("start");
    Serial.println(Start);
    Serial.print("mask");
    Serial.println(mask);
    digitalWrite(led,HIGH);
    if (starting == 1 and mask == 1) {
    myDigitalWrite (ledPinON, HIGH);
    myDigitalWrite (ledPinOFF, LOW);
    eravamoAccesi = HIGH;
    toggle = 0;
    pos = 0;
    }
    if (starting == 0) {
    myDigitalWrite (ledPinOFF, HIGH);
    myDigitalWrite (ledPinON, LOW);
    eravamoAccesi = LOW;
    } 
  }
}
  lcd.setCursor(0, 3);
  if (hours <= 9)
      {
        lcd.print("0");
      }
      lcd.print(hours);
      lcd.print(":");
      if (minutes <= 9)
      {
        lcd.print("0");
      }
      lcd.print(minutes);
      lcd.print(":");
      if (seconds <= 9)
      {
        lcd.print("0");
      }
      lcd.print(seconds);

  if (buttonStatus1 == HIGH or buttonStatus2 == HIGH) {
    mask = 0;
    } 
    if (buttonStatus3 == HIGH) {
      if (minutes > 0 or hours > 0 or seconds > 0) {
    mask = 1;
      }
    } 
    
    if (digitalRead(Pause) == LOW) { 
   delay(100);
      if (minutes > 0 or hours > 0 or seconds > 0) {
        if (digitalRead(ledPinON) == HIGH) {
      pause = 1;
      mask = 0;
    if (mask == 0) {
    myDigitalWrite (ledPinOFF, HIGH);
    myDigitalWrite (ledPinON, LOW);
    eravamoAccesi = LOW;
    } 
      if (pause == 1) {
      lcd.setCursor(0, 3);
      lcd.print("              ");
      delay(10);
      lcd.setCursor(2, 3);
      lcd.print("Pause");
      delay(1000);
  lcd.setCursor(0, 3);
  lcd.print(hours);
  lcd.setCursor(2, 3);
  lcd.print(':');
  lcd.setCursor(3, 3);
  lcd.print(minutes);
  lcd.setCursor(5, 3);
  lcd.print(':');
  lcd.setCursor(6, 3);
  lcd.print(seconds);
      pause = 0;
      }
    }
  }
}  
    
    if (digitalRead(Reset) == LOW) {
      delay(100);
      reset = 1;
      mask = 0;
      digitalWrite(led, LOW);
      if (reset == 1) {
      myDigitalWrite (ledPinOFF, HIGH);
      myDigitalWrite (ledPinON, LOW);
      eravamoAccesi = LOW;
      if (minutes > 0 or hours > 0 or seconds > 0) {
      minutes = 0; 
      hours = 0;
      seconds = 0;
      lcd.setCursor(0, 3);
      lcd.print("              ");
      delay(10);
      lcd.setCursor(2, 3);
      lcd.print("Reset");
      delay(1000);
  lcd.setCursor(0, 3);
  lcd.print("00:00:00");
      reset = 0;
      if (ledState16 == HIGH) {
      hours = EEPROM.read(1);
      minutes = EEPROM.read(2);
      seconds = EEPROM.read(3);
        }
      }
    }
  }
}

}

void doEncoderA() {
  if (rotating) delay(1); 
  if (digitalRead(encoderPinA) != A_set) { 
    A_set = !A_set;
    if (A_set and !B_set)
      encoderPos = -1;

    rotating = false; 
  }
}

void doEncoderB() {
  if (rotating) delay (1);
  if (digitalRead(encoderPinB) != B_set) {
    B_set = !B_set;
    if (B_set and !A_set)
      encoderPos = 1;

    rotating = false;
  }
}
TheOrdinarySuperhero
Messaggi: 1032
Iscritto il: mar 2 ott 2018, 15:16

Re: modifica timer

Messaggio da TheOrdinarySuperhero »

RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: modifica timer

Messaggio da RoccoCostruzioni »

grazie mille per il consiglio!!!! nel frattempo sapresti dirmi come fare per, dopo aver letto un pulsante, mettere a 0 una variabile dopo un tot di tempo magari regolabile?
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: modifica timer

Messaggio da Guido »

RoccoCostruzioni ha scritto: gio 4 feb 2021, 22:31 grazie mille per il consiglio!!!! nel frattempo sapresti dirmi come fare per, dopo aver letto un pulsante, mettere a 0 una variabile dopo un tot di tempo magari regolabile?
Semplice, non so se ho ben capito il quesito.
Nel thread "Lampeggio Led" c'e' una mia porzione di codice che riguarda il conteggio del tempo trascorso, in modo non bloccante.
Quindi imposti due variabili nel codice, pes esempio byte bytVar = 0 e #define TempoTrascorso 500 piu' le altre variabili mostrate in quel codice.
Quando raggiungi il tempo determinato cambi bytVar mettendolo = 1.
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: modifica timer

Messaggio da RoccoCostruzioni »

Allora sono riuscito a far in modo che la variabile var una volta attivata da buttonStatus3 mi va a 0 dopo 3 secondi, fin qui tutto bene ma, come si vede dopo aver fatto la differenza insieme alla variabile var ho messo un'altra variabile chiamata prot che non segue var, cioè var mi va a zero dopo tre secondi ma prot mi va a zero subito dopo aver schiacciato buttonStatus3, anche prot deve andare a zero dopo tre secondi e sinceramente non capisco il motivo di questo mal funzionamento, dico io perchè?

Codice: Seleziona tutto

    buttonStatus1 = digitalRead (buttonPinPROTa);
    buttonStatus2 = digitalRead (buttonPinPROTb);
    buttonStatus3 = digitalRead (buttonPinRESET);

   if (buttonStatus1 == HIGH and buttonStatus3 == HIGH) {
      prot = 1;
      myDigitalWrite (ledPinPROTa, HIGH);
      myDigitalWrite (ledPinOFF, HIGH);
      myDigitalWrite (ledPinON, LOW);
    }

    if (buttonStatus2 == HIGH and buttonStatus3 == HIGH) {
      prot = 1;
      myDigitalWrite (ledPinPROTb, HIGH);
      myDigitalWrite (ledPinOFF, HIGH);
      myDigitalWrite (ledPinON, LOW);
    }
 
    if (buttonStatus1 == LOW and buttonStatus2 == LOW and buttonStatus3 == LOW) {
      var = 1;
      myDigitalWrite (ledPinPROTa, LOW);
      myDigitalWrite (ledPinPROTb, LOW);
      if (ledState13 == HIGH) {
       if (eravamoAccesi == HIGH) {
        myDigitalWrite (ledPinOFF, LOW);
        myDigitalWrite (ledPinON, HIGH);
        }
      }
    }

    if (var == 1) {
      dt1 = millis() - t1;
      if (dt1 > 3000) {
        t1 = millis();
        prot = 0;
        var = 0;
      }
    }
            Serial.print ("var ");
            Serial.println (var);
            Serial.print ("prot ");
            Serial.println (prot);
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: modifica timer

Messaggio da Guido »

Quando buttonStatus3 == HIGH il pulsante e' rilasciato o schiacciato ? Ci si risente domani sera.
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: modifica timer

Messaggio da RoccoCostruzioni »

allora spiego perchè buttonStatus3 è INPUT_PULLUP mentre buttonStatus1 e buttonStatus2 sono INPUT_PULLDOWN e sono tutti pulsanti, quindi quando buttonStatus3 == HIGH il pulsante è rilasciato mentre buttonStatus1 == LOW e buttonStatus2 == LOW i pulsanti sono rilasciati
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: modifica timer

Messaggio da RoccoCostruzioni »

ho fatto alcune modifiche è ho risolto la questione delle due variabili che devono andare a zero dopo 3 secondi ma non ho risolto la mia problematica perchè, le due variabili mi servono per fare un'altra funzione che deve funzionare solo se le due variabili sono a 1 e solo in questo caso mentre schiacciando solo buttonStatus3 le variabili vengono alzate ad 1 e questo non va bene cioè la variabile prot deve solo attivarsi con buttonStatus1 o buttonStatus2 e la variabile var deve attivarsi solo quando schiaccio buttonStatus3, non so se sono stato chiaro, altrimenti lo spiego diversamente, comunque metto lo spezzone di listato modificato con due varianti e la funzione che utilizza le due variabili per attivarne una terza.

prima variante:

Codice: Seleziona tutto

    buttonStatus1 = digitalRead (buttonPinPROTa);
    buttonStatus2 = digitalRead (buttonPinPROTb);
    buttonStatus3 = digitalRead (buttonPinRESET);

    if (buttonStatus1 == HIGH and buttonStatus3 == HIGH) {
      prot = 1;
      myDigitalWrite (ledPinPROTa, HIGH);
      myDigitalWrite (ledPinOFF, HIGH);
      myDigitalWrite (ledPinON, LOW);
    }

    if (buttonStatus2 == HIGH and buttonStatus3 == HIGH) {
      prot = 1;
      myDigitalWrite (ledPinPROTb, HIGH);
      myDigitalWrite (ledPinOFF, HIGH);
      myDigitalWrite (ledPinON, LOW);
    }
 
    if (buttonStatus1 == LOW and buttonStatus2 == LOW and buttonStatus3 == LOW) {
      var = 1;
      myDigitalWrite (ledPinPROTa, LOW);
      myDigitalWrite (ledPinPROTb, LOW);
      if (ledState13 == HIGH) {
       if (eravamoAccesi == HIGH) {
        myDigitalWrite (ledPinOFF, LOW);
        myDigitalWrite (ledPinON, HIGH);
        }
      }
    }

    if (var == 1) {
      prot = 1;
      dt1 = millis() - t1;
      if (dt1 > 3000) {
        t1 = millis();
        prot = 0;
        var = 0;
      }
    }
            Serial.print ("var ");
            Serial.println (var);
            Serial.print ("prot ");
            Serial.println (prot);
seconda variante:

Codice: Seleziona tutto

    buttonStatus1 = digitalRead (buttonPinPROTa);
    buttonStatus2 = digitalRead (buttonPinPROTb);
    buttonStatus3 = digitalRead (buttonPinRESET);

    if (buttonStatus1 == HIGH and buttonStatus3 == HIGH) {
      prot = 1;
      myDigitalWrite (ledPinPROTa, HIGH);
      myDigitalWrite (ledPinOFF, HIGH);
      myDigitalWrite (ledPinON, LOW);
    }

    if (buttonStatus2 == HIGH and buttonStatus3 == HIGH) {
      prot = 1;
      myDigitalWrite (ledPinPROTb, HIGH);
      myDigitalWrite (ledPinOFF, HIGH);
      myDigitalWrite (ledPinON, LOW);
    }
 
    if (buttonStatus1 == LOW and buttonStatus2 == LOW and buttonStatus3 == LOW) {
      var = 1;
      prot = 1;
      myDigitalWrite (ledPinPROTa, LOW);
      myDigitalWrite (ledPinPROTb, LOW);
      if (ledState13 == HIGH) {
       if (eravamoAccesi == HIGH) {
        myDigitalWrite (ledPinOFF, LOW);
        myDigitalWrite (ledPinON, HIGH);
        }
      }
    }

    if (var == 1) {
      dt1 = millis() - t1;
      if (dt1 > 3000) {
        t1 = millis();
        prot = 0;
        var = 0;
      }
    }
            Serial.print ("var ");
            Serial.println (var);
            Serial.print ("prot ");
            Serial.println (prot);
funzione che utilizza le due variabili per attivarne una terza

Codice: Seleziona tutto

if (prot == 1 and var == 1) {
      if (minutes > 0 or hours > 0 or seconds > 0) {
    mask = 1;
      }
    } 
con la prima e seconda variante il tutto funziona, le due variabili vanno a zero dopo tre secondi ma, se schiaccio buttonStatus3 rimetto a 1 le due variabili e quindi la funzione che utilizza la terza variabile risulta vera e quindi mi attiva mask = 1 ma non va bene, questo deve verificarsi solo dopo, come ho spiegato prima, la prot = 1 innescata solo da buttonStatus1 o da buttonStatus2 e var = 1 attivata solo da buttonStatus3
come faccio adesso?
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: modifica timer

Messaggio da Guido »

Guarda ho capito ben poco ;) Forse perche' ho la testa su altre cose. Se mi dici la tua situazione, cioe' a cosa servono pulsanti, led etc forse faccio prima a riscrivere il codice. Come il problema della macchina utensile a due pulsanti: a volte c'e' una soluzione molto piu' semplice.
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: modifica timer

Messaggio da RoccoCostruzioni »

allora buttonStatus1 e buttonStatus2 sono degli ingressi di protezioni esterne,
ledPinPROTa si attiva se è alto buttonStatus1 mandando alto ledPinOFF che è un led che segnala l'uscita in OFF e mandando basso ledPinON che è un led che segnala l'uscita in ON, ledPinPROTb si attiva se è alto buttonStatus2 mandando alto ledPinOFF che è un led che segnala l'uscita in OFF e mandando basso ledPinON che è un led che segnala l'uscita in ON, il buttonStatus3 serve per resettare con implementato una memoria per far si che se al momento dell'avvenuta intervento della protezione l'uscita era alta una volta resettato la ritrova alta e questo per quanto riguarda "eravamoAccesi" mentre "ledState13" l'ho messo per attivare o non attivare la funzione di memoria.
detto questo vorrei che la variabile mask che si trova in un timer venga messa a 1 solo se pigio buttonStatus3 ma se le due protezioni buttonStatus1 o buttonStatus2 sono scattate, quindi se schiaccio buttonStatus3 se le protezioni non sono scattate mask deve rimanere a 0. spero di essere stato più chiaro
Rispondi