modifica timer

Progetti Arduino
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: modifica timer

Messaggio da Guido »

Forse ho capito: AND nella condizione IF non da' come risultato VERO se gli operandi sono Veri, ma fa un confronto binario tra i singoli bit. Per fare un confronto come forse voleva lei (per es. se Condizione1 = vera e anche Condizione2 = true ) deve usare l'operatore && (doppia E commerciale).
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: modifica timer

Messaggio da RoccoCostruzioni »

no no ho provato con la "&&" ma è perfettamente uguale, a me basta che semplicemente la variabile prot rimanga a 1 e venga messa a 0 solo da questo:

Codice: Seleziona tutto

if (var == 1) {
      dt1 = millis() - t1;
      if (dt1 > 3000) {
        t1 = millis();
        prot = 0;
        var = 0;
      }
    }
ovviamente scarterei questa:

Codice: Seleziona tutto

if (var == 1) {
     prot == 1;
      dt1 = millis() - t1;
      if (dt1 > 3000) {
        t1 = millis();
        prot = 0;
        var = 0;
      }
    }
e scarterei anche che prot venga messa nuovamente ad 1 da buttonStatus3
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: modifica timer

Messaggio da Guido »

[RoccoCostruzioni post_id=17132 time=1612808400 user_id=9799]
no no ho provato con la "&&" ma è perfettamente uguale,
No. Il piu' delle volte AND presente nel codice precedentemente linkato (a proposito, ho provato a compilarlo ma ho visto che ci sono una miriade di variabili non dichiarate ed ho rinunciato) funziona regolarmente, ma cio' avviene solo quando si tratta di operandi non numerici, se ben ricordo.
In realta' l'operatore AND non si limita a controllare che entrambi gli operandi siano > 0, ma fa una operazione tra gli operandi stessi, e' quindi uno dei due operandi puo' essere modificato dal contenuto dell'altro operando. Cio' e' anche scritto nella guida online di Arduino alla voce AND oppure &.
Per i confronti presenti in quel codice ci vuole &&.
a me basta che semplicemente la variabile prot rimanga a 1 e venga messa a 0 solo da questo:
if (var == 1) {
dt1 = millis() - t1;
if (dt1 > 3000) {
t1 = millis();
prot = 0;
var = 0;
}
}
Questo non l'ho capito. Questo codice verra' effettuato una sola volta, perche' appena dt1 > 3000, var diventa 0 e quindi la condizione if (var == 1)
sara' valida solo una volta.
Ora ti devo lasciare perche' in questi giorni saro' oberato di cose, spero che qualcuno ti possa seguire.
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: modifica timer

Messaggio da RoccoCostruzioni »

Ok grazie comunque e spero che ci sia qualche anima pia che possa darmi una mano
Avatar utente
blue3121
Messaggi: 879
Iscritto il: dom 24 gen 2021, 7:22

Re: modifica timer

Messaggio da blue3121 »

RoccoCostruzioni ha scritto: lun 8 feb 2021, 16:27 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
Scusami, sarà per l'età... ma per me è ancora nebuloso...
Lasciando perdere le variabili del codice, puoi descrivere nel dettaglio cosa vuoi far fare ad Arduino ?
Hai tre led, tre pulsanti di cui uno a logica negativa, ecc... Come devono funzionare ? Qual'è lo scopo ?
“...dentro i confini del computer, sei tu il creatore. Controlli - almeno potenzialmente - tutto ciò che vi succede. Se sei abbastanza bravo, puoi essere un dio. Su piccola scala.”
L. Torvalds
_________________
Guido C.
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: modifica timer

Messaggio da RoccoCostruzioni »

ok spiego meglio:
buttonPinPROTa è un ingresso a logica positiva usato per acquisire quando la protezione 1 è scattata
buttonPinPROTb è un ingresso a logica positiva usato per acquisire quando la protezione 2 è scattata
buttonPinRESET è un ingresso a logica negativa usato per effettuare il reset
ledPinPROTa è un led che mi segnala quando la protezione 1 è intervenuta
ledPinPROTb è un led che mi segnala quando la protezione 2 è intervenuta
ledPinON è un led azionato da un'altro pulsante (non presente nel listato che ho postato) che si occupa di abilitare l'uscita del mio alimentatore
ledPinOFF è un led azionato da un'altro pulsante (non presente nel listato che ho postato) che si occupa di disabilitare l'uscita del mio alimentatore
ho creato le tre variabili per non ripetere i digitalRead ecc in ogni costrutto:
buttonStatus1 = digitalRead (buttonPinPROTa);
buttonStatus2 = digitalRead (buttonPinPROTb);
buttonStatus3 = digitalRead (buttonPinRESET);
la logica che ho creato funziona così:
se buttonStatus1 è alto (quindi è scattata la protezione 1) ma anche buttonStatus3 è alto (quindi non è stato schiacciato il pulsante di reset) allora metti a 1 la variabile prot, fammi accendere il led corrispondente per segnalare l'avvenuto intervento della protezione 1, mandami alto l'uscita ledPinOFF così mi disabiliti l'uscita dell'alimentatore e per precauzione mandami basso l'uscita ledPinON.
se buttonStatus2 è alto (quindi è scattata la protezione 2) ma anche buttonStatus3 è alto (quindi non è stato schiacciato il pulsante di reset) allora metti a 1 la variabile prot, fammi accendere il led corrispondente per segnalare l'avvenuto intervento della protezione 2, mandami alto l'uscita ledPinOFF così mi disabiliti l'uscita dell'alimentatore e per precauzione mandami basso l'uscita ledPinON.
una volta scattate le protezioni ora devo resettarle, sempre che non siano ancora scattate, quindi verifico che buttonStatus1 ma anche buttonStatus2 sono bassi, allora schiacco buttonStatus3 che risulta anche lui basso quindi metti a 1 la variabile var, spegni ledPinPROTa e ledPinPROTb.
quest'altra funzione:

Codice: Seleziona tutto

if (ledState13 == HIGH) {
       if (eravamoAccesi == HIGH) {
        myDigitalWrite (ledPinOFF, LOW);
        myDigitalWrite (ledPinON, HIGH);
        }
      }
mi serve per abilitare o disabilitare una memoria dove posso decidere se, una volta resettato, attacare il carico al mio alimentatore oppure farlo manualmente
poi ho messo un temporizzatore:

Codice: Seleziona tutto

if (var == 1) {
      dt1 = millis() - t1;
      if (dt1 > 3000) {
        t1 = millis();
        prot = 0;
        var = 0;
      }
    }
che una volta fatto il reset mi manda a zero le variabili prot e var dopo 3 secondi perchè queste mi servono per fare altro.
ora qual'è il malfunzionamento che ho riscontrato?
prot viene messa a 1 o da buttonStatus1 o da buttonStatus2 e fin qui tutto ok,
var viene messa a 1 da buttonStatus3 e fin qui tutto ok,
var va a zero dopo tre secondi e fin qui tutto ok,
ma prot viene messa a zero subito dopo aver schiacciato buttonStatus3,
la cosa che non capisco è perchè prot non va a zero dopo tre secondi!!!!
ecco questa è la mia problematica!!!
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: modifica timer

Messaggio da Guido »

Ho provato a rileggere il tutto ma ci sono alcune cose non chiare:
"ma prot viene messa a zero subito dopo aver schiacciato buttonStatus3,
la cosa che non capisco è perchè prot non va a zero dopo tre secondi!!!!"
Scusa, ma se e' gia' andato a zero !?

myDigitalWrite che cosa e' ?

ledState13 e eravamoAccesi non sono determinate.

Per favore dacci un codice completamente funzionante, quindi con le variabili dichiarate etc e con le parti che non ti funzionano: dopodiche' io o qualcun altro lo modifichera' per farlo funzionare anche in queste parti che difettano. Altrimenti se lo riscrivo a modo mio ti troveresti un codice completamente diverso dal tuo (ho gia' iniziato, ma verrebbe cosa completamente diversa).
Poi per favore:
"buttonStatus1 = digitalRead (buttonPinPROTa);
buttonStatus2 = digitalRead (buttonPinPROTb);
buttonStatus3 = digitalRead (buttonPinRESET);"
riscrivilo in :
buttonPROTa = digitalRead (buttonPinPROTa);
buttonPROTb = digitalRead (buttonPinPROTb);
buttonReset = digitalRead (buttonPinRESET);
Poi :
non usare "var" o "prot" semplicemente, il codice diventa illeggibile:
(probabilmente hai specificato a mio parere:)
"byte prot = 0;
byte var = 0;
int dt1 = 0;
unsigned long t1 = 0 ;"

diventano:
byte bytProt = 0;
byte bytVar = 0;
int intDt1 = 0;
unsigned long ulngMillisT1 = 0 ;

altrimenti non ci si capisce nulla : dopo alcuni mesi anche tu faresti fatica a capire il tuo codice, ti converrebbe cominciare ad abituarti anche nei piccoli programmi.
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: modifica timer

Messaggio da Guido »

Ho fatto il lavoro io. Vedi se ti va bene. Mi sembra che non funzioni dove c'e' la sequenza di condizioni && sulla stessa riga. Devo approfondire.

Codice: Seleziona tutto

//
// c'e'  ledstate13 ed eravamoaccesi che non
// vengono impostate
//
// Attenzione: buttonPinRESET e' HIGHT quando e' disattivato

const byte buttonPinPROTa = 4;
const byte buttonPinPROTb = 2;
const byte buttonPinRESET = 3;
//
const byte ledPinPROTa = 13;
const byte ledPinPROTb = 12;
const byte ledPinOFF = 11;
const byte ledPinON = 10;

byte bytProt  = 0;
byte bytReset = 0;
int intDt1 = 0;
unsigned long ulngT1  = 0 ;
int buttonPROTa =  0 ;
int buttonPROTb =  0 ;
int buttonReset =  0 ;
int eravamoAccesi = 0 ;

void setup() {
Serial.begin(9600);
pinMode(buttonPinPROTa,INPUT);
pinMode(buttonPinPROTb,INPUT);
pinMode(buttonPinRESET,INPUT);
//
pinMode (ledPinPROTa,OUTPUT);
pinMode (ledPinPROTb,OUTPUT);  
pinMode (ledPinOFF,OUTPUT);  
pinMode (ledPinON,OUTPUT);  
  
}

void loop() {
  buttonPROTa = digitalRead (buttonPinPROTa);
  buttonPROTb = digitalRead (buttonPinPROTb);
  buttonReset = digitalRead (buttonPinRESET);

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

  if (buttonPROTb == HIGH && buttonReset == HIGH) {
    bytProt = 1;
    digitalWrite (ledPinPROTb, HIGH);
    digitalWrite (ledPinOFF, HIGH);
    digitalWrite (ledPinON, LOW);
  }
// ATTENZIONE:
// dalla simulazione su Tinkercad questa condizione IF non funziona
  if ((buttonPROTa == LOW && buttonPROTb == LOW) && buttonReset == LOW) {
    bytReset = 1;
    digitalWrite (ledPinPROTa, LOW);
    digitalWrite (ledPinPROTb, LOW);
    //if (ledState13 == HIGH) {
     // if (eravamoAccesi == HIGH) {
     //   digitalWrite (ledPinOFF, LOW);
     //   digitalWrite (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);
}
RoccoCostruzioni
Messaggi: 51
Iscritto il: mer 9 set 2020, 21:16

Re: modifica timer

Messaggio da RoccoCostruzioni »

allora grazie per aver fatto il lavoro ma posterò il listato originale così lo confrontiamo, la condizione if che non funziona si risolve semplicemente cambiando questa

Codice: Seleziona tutto

pinMode(buttonPinRESET,INPUT);
in questa

Codice: Seleziona tutto

pinMode(buttonPinRESET,INPUT_PULLUP);
il tutto funziona bene ma non può andare perchè in condizione di riposo, quindi quando buttonPROTa è basso, buttonPROTb è basso e buttonPinRESET è alto se schiaccio buttonPinRESET facendolo andare basso mi manda subito le due variabili bytProt e bytReset a 1 e questo non deve accadere, comunque domani posto tutto il codice compresi ledState13 e eravamoAccesi. buona notte e grazie di cuore per il fastidio che vi state prendendo.
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: modifica timer

Messaggio da Guido »

RoccoCostruzioni ha scritto: gio 11 feb 2021, 22:38 allora grazie per aver fatto il lavoro ma posterò il listato originale così lo confrontiamo, la condizione if che non funziona si risolve semplicemente cambiando questa

Codice: Seleziona tutto

pinMode(buttonPinRESET,INPUT);
in questa

Codice: Seleziona tutto

pinMode(buttonPinRESET,INPUT_PULLUP);

Dalla simulazione con Tinkercad invece buttonPinRESET viene correttamente letto nel mio codice
il tutto funziona bene ma non può andare perchè in condizione di riposo, quindi quando buttonPROTa è basso, buttonPROTb è basso e buttonPinRESET è alto se schiaccio buttonPinRESET facendolo andare basso mi manda subito le due variabili bytProt e bytReset a 1 e questo non deve accadere,
Questo non mi succede su Tinkercad, presumo perche' ho usato && invece che AND: con quest'ultima istruzione Tinkercad si rifiuta di funzionare segnalando errore. Hai usato AND per la simulazione su Arduino ?
Rispondi