modifica timer

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

Re: modifica timer

Messaggio da RoccoCostruzioni »

caricando il listato su arduino con buttonPinRESET in PULLUP funziona tutto, per quanto riguarda le and ho usato le doppie && commerciali.
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: modifica timer

Messaggio da Guido »

Da me funzionava anche senza la espressione PULLUP perche' in Tinkercad ho messo una resistenza esterna tra il pin ed il positivo ;) Non ho mai usato questa espressione.
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: modifica timer

Messaggio da RoccoCostruzioni »

questo è il listato originale con la modifica del signor Guido:

Codice: Seleziona tutto

#define ledPinON 17 //LED RELE OUT ON
#define ledPinOFF 19 //LED OUT OFF
#define pulsON 4 //PULSANTE OUT ON
#define pulsOFF 5 //PULSANTE OUT OFF
#define buttonPinPROTa 22 //INGRESSO PROTEZIONE LINEA A (OVP, UVP, OCP, UCP, OPP, UPP, OTIMER)
#define buttonPinPROTb 23 //INGRESSO PROTEZIONE LINEA B (PROTEZIONE DIFFERENZIALE)
#define ledPinPROTa 24 //LED RELE PROTEZIONE LINEA A
#define ledPinPROTb 25 //LED RELE PROTEZIONE LINEA B
#define buttonPinRESET 26 //PULSANTE RESET PROTEZIONI
#define pulsRipVout 46 //PULSANTE RIPRISTINO VOUT ON
#define RipMan 47 //LED RIPRISTINO VOUT ON MANUALE
#define RipAuto 48 //LED RIPRISTINO VOUT ON AUTOMATICO

int buttonPROTa = 0;
int buttonPROTb = 0;
int buttonReset = 0;
byte bytReset = 0;
byte bytProt = 0;
int intDt1 = 0;
unsigned long ulngT1  = 0;
uint8_t outputStatus[NUM_DIGITAL_PINS];
uint8_t eravamoAccesi;
int ledState12 = LOW;
int ledState13 = HIGH;
int buttonState9;
int lastButtonState9 = HIGH;
long lastDebounceTime9 = 0;
long debounceDelay9 = 50;

void myDigitalWrite(uint8_t pin, uint8_t val) {
  outputStatus[pin] = val;
  digitalWrite(pin, val);
}

void setup() {

    Serial.begin (9600);
    pinMode (ledPinON, OUTPUT);
    pinMode (ledPinOFF, OUTPUT);
    pinMode (pulsON, INPUT_PULLUP);
    pinMode (pulsOFF, INPUT_PULLUP);
    pinMode (buttonPinPROTa, INPUT);
    pinMode (buttonPinPROTb, INPUT);
    pinMode (ledPinPROTa, OUTPUT);
    pinMode (ledPinPROTb, OUTPUT);
    pinMode (buttonPinRESET, INPUT_PULLUP);
    pinMode (pulsRipVout, INPUT);
    pinMode (RipMan, OUTPUT);
    pinMode (RipAuto, OUTPUT);
    myDigitalWrite (ledPinON, LOW);
    myDigitalWrite (ledPinOFF, HIGH);
    myDigitalWrite (ledPinPROTa, LOW);
    myDigitalWrite (ledPinPROTb, LOW);
    ulngT1 = millis();
}


void loop() {

    if (digitalRead (pulsON) == LOW && digitalRead (pulsOFF) == HIGH && outputStatus[ledPinPROTa] == LOW && outputStatus[ledPinPROTb] == LOW) {
      delay (100);
      myDigitalWrite (ledPinON, HIGH);
      myDigitalWrite (ledPinOFF, LOW);
      eravamoAccesi = HIGH;
    }

    if (digitalRead (pulsOFF) == LOW && digitalRead (pulsON) == HIGH) {
      delay (100);
      myDigitalWrite (ledPinOFF, HIGH);
      myDigitalWrite (ledPinON, LOW);
      eravamoAccesi = LOW;
    }

  buttonPROTa = digitalRead (buttonPinPROTa);
  buttonPROTb = digitalRead (buttonPinPROTb);
  buttonReset = digitalRead (buttonPinRESET);

  if (buttonPROTa == HIGH && buttonReset == HIGH) {
    bytProt = 1;
      myDigitalWrite (ledPinPROTa, HIGH);
      myDigitalWrite (ledPinOFF, HIGH);
      myDigitalWrite (ledPinON, LOW);
  }

  if (buttonPROTb == HIGH && buttonReset == HIGH) {
    bytProt = 1;
      myDigitalWrite (ledPinPROTb, HIGH);
      myDigitalWrite (ledPinOFF, HIGH);
      myDigitalWrite (ledPinON, LOW);
  }
// ATTENZIONE:
// dalla simulazione su Tinkercad questa condizione IF non funziona
  if (buttonPROTa == LOW && buttonPROTb == LOW && buttonReset == LOW) {
    bytReset = 1;
    myDigitalWrite (ledPinPROTa, LOW);
      myDigitalWrite (ledPinPROTb, LOW);
      if (ledState13 == HIGH) {
       if (eravamoAccesi == HIGH) {
        myDigitalWrite (ledPinOFF, LOW);
        myDigitalWrite (ledPinON, HIGH);
      }
    }
  }
  

  if (bytReset == 1) {
    bytProt = 1;
    intDt1 = millis() - ulngT1;
    if (intDt1 > 3000) {
      ulngT1 = millis();
      bytProt = 0;
      bytReset = 0;
    }
  }
  Serial.print ("bytReset ");
  Serial.println (bytReset);
  Serial.print ("bytProt ");
  Serial.println (bytProt);

    int reading9 = digitalRead(pulsRipVout);
    if (reading9 != lastButtonState9) {
      lastDebounceTime9 = millis();
    }
    if ((millis() - lastDebounceTime9) > debounceDelay9) {
      if (reading9 != buttonState9) {
        buttonState9 = reading9;
        if (buttonState9 == HIGH) {
          ledState12 = !ledState12;
          ledState13 = !ledState13;
        }
      }
    }
    digitalWrite (RipMan, ledState12);
    digitalWrite (RipAuto, ledState13);
    lastButtonState9 = reading9;

}
se non capite qualcosa chiedete pure
ho fatto anche la simulazione con tinkercad se qualcuno vuole replicarla per capire il funzionamento della logica che ho utilizzato, purtroppo non mi fa caricare il file del progetto ma solo la foto, comunque se volete riprodurlo vi basta cambiare solo la parte iniziale, visto che tinkercad dispone solo di arduino uno, eccola:

Codice: Seleziona tutto

#define ledPinON 2 //LED RELE OUT ON
#define ledPinOFF 3 //LED OUT OFF
#define pulsON 4 //PULSANTE OUT ON
#define pulsOFF 5 //PULSANTE OUT OFF
#define buttonPinPROTa 6 //INGRESSO PROTEZIONE LINEA A (OVP, UVP, OCP, UCP, OPP, UPP, OTIMER)
#define buttonPinPROTb 7 //INGRESSO PROTEZIONE LINEA B (PROTEZIONE DIFFERENZIALE)
#define ledPinPROTa 8 //LED RELE PROTEZIONE LINEA A
#define ledPinPROTb 9 //LED RELE PROTEZIONE LINEA B
#define buttonPinRESET 10 //PULSANTE RESET PROTEZIONI
#define pulsRipVout 11 //PULSANTE RIPRISTINO VOUT ON
#define RipMan 12 //LED RIPRISTINO VOUT ON MANUALE
#define RipAuto 13 //LED RIPRISTINO VOUT ON AUTOMATICO
Allegati
Porzione Listato con TinkerCad.png
Porzione Listato con TinkerCad.png (99.37 KiB) Visto 3317 volte
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: modifica timer

Messaggio da Guido »

Bella realizzazione su Tinkercad: e' stata realizzato il circuito con immensa pazienza. Io ho problemi di estrema lentezza ed incertezza nei progetti che utilizzano Arduino, eppure ho una connessione ADSL di tutto rispetto. Forse dipende dal browser, forse dal SO dato che il PC che utilizzo per queste programmazioni hanno Windows7.
Vedo che sul codice hai utilizzato alcuni miei suggerimenti nella sintassi ed adesso diventa tutto piu' leggibile.
Ho cercato di implementare un azionamento ad interrupt per quanto riguarda il reset, perche' ho fatto il ragionamento che il reset deve agire quasiasi cosa stia facendo il processore, ma ho rinunciato : se non si utilizza spesso questo linguaggio ci si arruginisce, inoltre a me il C non piace a prescindere.

Non ho capito le seguenti righe:

Codice: Seleziona tutto

uint8_t outputStatus[NUM_DIGITAL_PINS];
uint8_t eravamoAccesi;
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: modifica timer

Messaggio da RoccoCostruzioni »

sinceramente non li ho capiti al 100% mi sono stati dettati da PGV qui sul forum stesso ma funzionano alla grande, praticamente fanno da memoria, per esempio se il led A era acceso nel momento in cui schiaccio il reset me lo riaccendi, altrimenti non fai nulla.
comunque Guido se ti va prova a replicare il circuito su tinkecad e vedi il funzionamento è abbastanza accattivante come logica!!!! :D :D :D
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: modifica timer

Messaggio da Guido »

RoccoCostruzioni ha scritto: sab 13 feb 2021, 15:26 comunque Guido se ti va prova a replicare il circuito su tinkecad e vedi il funzionamento è abbastanza accattivante come logica!!!! :D :D :D
Grazie per l'info. Ma non credo che tentero' di replicare il circuito su tinkercad perche' come ho detto ultimamente questo simulatore e' diventato un tormento. Gia' la simulazione del codice che ho inviato, molto piu' semplice con solo tre interruttori + tre led e' stato molto difficile. Queste difficolta' non c'erano un anno fa, forse hanno cambiato la struttura del sito oppure e' aumentato molto il traffico al suo interno. Per capire se puo' essere cosa che dipenda dal mio PC ti chiederei se anche tu hai notato questo aspetto.
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: modifica timer

Messaggio da RoccoCostruzioni »

l'unica cosa che ho notato, effettivamente, è che si è rallentato, nel senso che se schiacci il pulsante in maniera veloce non funziona ma lo devi mantenere per commutare qualcosa o farlo funzionare, anche i led prima accendevano e si spegnevano, adesso fanno tipo effetto fade in e fade out, ma ti posso assicurare che non il nostro pc, anche perchè ho un mac recentissimo e fa lo stesso, sarà la loro piattaforma che è lenta
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: modifica timer

Messaggio da RoccoCostruzioni »

mi dispiace che non posso allegare il file di tinkercad così bastava che lo copiavi e avevi tutto gia fatto altrimenti mi mandi la mail e li te lo posso girare!!! anche perchè mi serve che quelle dannate variabili non vadano a 1 se schiaccio buttonReset
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: modifica timer

Messaggio da Guido »

RoccoCostruzioni ha scritto: dom 14 feb 2021, 23:11 l'unica cosa che ho notato, effettivamente, è che si è rallentato, nel senso che se schiacci il pulsante in maniera veloce non funziona ma lo devi mantenere per commutare qualcosa o farlo funzionare, anche i led prima accendevano e si spegnevano, adesso fanno tipo effetto fade in e fade out, ma ti posso assicurare che non il nostro pc, anche perchè ho un mac recentissimo e fa lo stesso, sarà la loro piattaforma che è lenta
Grazie per la testimonianza. Allora mi metto l'animo in pace. Vediamo se nei prossimi giorni io riesca a provare il tuo codice.
Ma intanto per quel malfunzionamento che hai detto prova a scrivere quel codice cosi':
invece di:
if (buttonPROTa == LOW && buttonPROTb == LOW && buttonReset == LOW) {
bytReset = 1;
etc
diventa:
if (buttonPROTa == LOW && buttonPROTb == LOW) {
if buttonReset == LOW {
bytReset = 1;
etc

mi sembra di ricordare qualcosa a proposito di quando gli operandi sono piu' di due
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: modifica timer

Messaggio da RoccoCostruzioni »

Codice: Seleziona tutto

  if (buttonPROTa == LOW && buttonPROTb == LOW) {
    if (buttonReset == LOW) {
    bytReset = 1;
    myDigitalWrite (ledPinPROTa, LOW);
      myDigitalWrite (ledPinPROTb, LOW);
      if (ledState13 == HIGH) {
       if (eravamoAccesi == HIGH) {
        myDigitalWrite (ledPinOFF, LOW);
        myDigitalWrite (ledPinON, HIGH);
        }
      }
    }
  }
niente da fare è uguale
Rispondi