prime armi , rfid, 4 pulsanti e 4 relè

Buonasera, premetto che sono alle prime armi di un autodidatta

Stò cercando di fare un sistema che abilitato da un tag rfid permetta di attivare tramite 4 pulsanti di scelta uno dei 4 relè, l’idea poi, è quella di implementarci anche un blocco per cui il tag appena usato puo essere usato una seconda volta e poi annullato per tot tempo, ma questo proprio x adesso non ne ho la più pallida idea di come si possa fare.

ovviamente lo sketch è un mio frullato di copia e incolla trovate e modificate su internet di cui ringrazio gli autori anche se non ricordo più dove li ho presi, insomma riconosce la chiave e funziona con il primo pulsante, il secondo non me lo vede neppure, non ho aggiunto gli altri x che è lo stesso, non capisco perchè non esegue quel else if se non viene premuto il pulsante 1.

Grazie mille in anticipo…

prova_mic_3.ino (6.2 KB)

Cioè, spiegami, metti HIGH tutte le uscite e anche tutti gli ingressi ????

ciao, si perchè se ho letto bene cprreggimi se sbaglio, sugli ingressi dei pulsanti così facendo non servono resistenze, e le uscite perchè ho la schedina con 4 relè se li tengo low sono sempre eccitati lavora al contrario.

Da una certa versione IDE (non ricordo quale) in poi puoi usare
pinMode( pinX, INPUT_PULLUP);
invece di pinMode(pinX,INPUT) e poi metterlo a HIGH. Più semplice da leggere

ok l’ho provato si funziona anche con pullup, ma per quanto riguarda le lettura del secondo pulsante non avete idee?

Dalla tua descrizione del problema non è che ho capito molto, quindi leggendo il codice vado ad intuito, leggi la chiave e ti parte il relé del pulsante 1 e al pulsante due non ci arriva mai.
Considera che tu l'ingresso lo metti in HIGH nel setup (resistenza di pullup interna) quindi quando arrivi alla riga

digitalRead(puls1) == HIGH

La condizione è soddisfatta ed entra nell'if, poi sta qui

while (digitalRead(puls1) == HIGH){
        //mentre il pulsante rimane premuto non eseguire nulla
      }

finchè non premi il pulsante che hai collegato a GND (vero???) e ti porta il pin a LOW.
Devi invertire la logica ovvero controllare se il pulsante è LOW e stare li finché resta LOW, quando lo rilasci torna a HIGH
Oltre a questo dopo

digitalWrite(ledGreen, HIGH);

devi mettere un while che ti faccia restare in attesa finché non hai attivato alemeno un uscita altrimenti non ti funzionerà mai poiché verifichi il primo, il secondo, ecc. pulsante nessuno è premuto e vai avanti senza aver fatt nulla.
Come fare? Con una variabile semaforo Es.

bool bAttesa = true;
while(bAttesa)
{
  if (digitalRead(puls1) == LOW){
    ...
    bAttesa = false;
  }
  else if (digitalRead(puls2) == LOW){
   ...
   bAttesa = false;
  }...
}

due cose

  1. devi chiudere
  if (rfid.isCard()) {

prima del controllo dei pulsanti

  1. visto che i pulsanti lavorano con una PullUp, non credi di doverli controllare al rovescio ?
if (digitalRead(puls1) == LOW) {
    while (digitalRead(puls1) == LOW) {

brunello22:
due cose

  1. devi chiudere
  if (rfid.isCard()) {

prima del controllo dei pulsanti

direi di no, altrimenti controlla i pulsanti che sarebbero attivi anche senza passare il tag e la gente fa la doccia gratis

direi di no, altrimenti controlla i pulsanti che sarebbero attivi anche senza passare il tag e la gente fa la doccia gratis

verissimo

Pero', cosi com'è, se uno non preme il pulsante mentre passa la carta..... niente doccia

brunello22:
Pero', cosi com'è, se uno non preme il pulsante mentre passa la carta..... niente doccia

Hai visto il mio post #5?

Solo dopo che stavo scrivendo

@fabpolli grazie, stasera appena ho tempo provo, si cmq. è come dici tu in teoria vorrei "leggo la chiave e si abilitano i 4 pulsanti che a loro volta abilitano un unica uscita rele, e poi si riparte da rfid,.

un altro aiutino?? e volendo disabilitare quella chiave dopo 3 volte di utilizzo per tot tempo? che non ne ho proprio idea.?

cmq no passata la card rimane in attesa del pulsante

ilfusiere:
un altro aiutino?? e volendo disabilitare quella chiave dopo 3 volte di utilizzo per tot tempo? che non ne ho proprio idea.?
.................

La cosa non è di per se complicata ma richia di incasinarti il codice innutilmente a questo punto del progetto, visto che, per tua stessa ammissione, non è farina del tuo sacco ma opera di copia incolla selvaggio :slight_smile: e che da quel che mi pare di capire non sei esperto in programmazione, procedi per gradi, fai funzionare il tutto e poi aggiungi altri controlli/condizioni. Quando i tutt'e quattro i pulsanti funzioneranno a dovere ovvero:

  1. Resto in attesa finché non leggo la chiave valida, se non passo la chiave i pulsanti non fanno nulla
  2. Se la chiave è valida resto in attesa che un pulsante venga premuto
  3. Torno al punto 1
    Quando tutto è ok allora affronteremo l'altro problema, ti anticipo che:
  4. Dovrai imparare come si usa una struttura (struct in c) e gli array
  5. Dovrai imparare ad usare millis() per determinare il trascorrere del tempo (se questo è poco, se parliamo di ore/giorni allora la cosa si comlica ti servità un Real Time Clock detto anche RTC)
  6. In ottemperanza alle regole del forum non puoi aspettarti (o almeno non aspettartelo da me) che qualcuno ti scriva il codice, studia quello che ho messo nei punti 1 e 2 butta giù il codice e se non funziona allora chiedi

In linea di massima il ragionamento che dovrai seguire è:

  1. Aspetto una chiave
  2. Ho letto la chiave, controllo l'ultima volta che è stata usata
  3. verifico che sia passato il tempo prefissato
  4. Se non è passato non controllo i pulsanti e torno al punto 1, altrimenti memorizzo l'istante dell'ultimo uso della chiave e aspetto che un pulsante venga premuto
  5. torno al punto 1

ilfusiere:
cmq no passata la card rimane in attesa del pulsante

Fidati ti resta in attesa per colpa del while dentro l'if se fai i controlli come si deve e come ti abbiamo suggerito vedrai che letta la chiave esce subito in attesa dell'altra card, a meno di non mettere il while come ti ho suggerito alcuni post fa...

ok mi piacciono le sfide io contro il codice....ci proverò stasera o domani al massimo metto le modifiche ciao. e grazie dell'aiuto

modifica riuscita, mi sa a fortuna perchè mi è venuta troppo facile, ora da prova fatta aspetta una pressione di uno o l’altro pulsante poi torna in all’inizio,

prova_mic_3_1.ino (6.31 KB)

Ok, così a vederlo sembra possa funzionare correttamente, adesso ti basta provare a fare il resto :slight_smile:
Per capire le basi con cui si usa millis() consiglio prima la lettura di QUESTO post esplicativo, dopo di che lo studio di come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... alla fine il tutto dovrebbe essere più chiaro :slight_smile: