INPUT DIGITALE: Esempio Ricevitore 4 canali
Per costruire il seguente circuito occorre avere un ricevitore a 4 canali e il corrispondente telecomando.
Codice Sorgente A
Obiettivo progetto: Mostrare sul Serial Monitor di un circuito ricevitore a 4 canali, connesso ad Arduino, il pulsante schiacciato sul telecomando.
soluzione: Costruiamo il seguente circuito:
Chiaramente prima della stesura del codice è necessario effettuare delle prove per stabilire la relazione tra i pin D0 ... D3 e i pulsanti del telecomando (nel nostro caso D0 => B ; D1 => D ; D2 => A ; D3 => C ;):
/* Programma che visualizza sul Serial Monitor il bottone premuto sul telecomando */ // Imposto la connessione tra i Pin VT, D0...D3 < // sul ricevitore wireless e i pin di ARDUINO #define Pin_D0 6 #define Pin_D1 5 #define Pin_D2 4 #define Pin_D3 3 #define Pin_VT 2 // Variabili globali int out[4]={0}, prec_out[4]={0}; int PB=0; void setup() { Serial.begin(9600); pinMode(Pin_D0, INPUT); // Imposto i pin del ricevitore come INPUT pinMode(Pin_D1, INPUT); pinMode(Pin_D2, INPUT); pinMode(Pin_D3, INPUT); pinMode(Pin_VT, INPUT); StampaStato(); // Stampo stato iniziale } void StampaStato() { boolean AlmenoUno; // Mostro sul Serial Monitor lo stato dei pin D0 ... D3 e PB // PB è high quando viene inviato un segnale corretto // ovvero se uno dei pulsanti A, B, C e D è premuto Serial.print("PB="+String(PB)+" || "); for (int i=0 ; i<4 ; i++) Serial.print("D"+String(i)+"="+(out[i]==0 ? "_" : String(out[i]) )+" "); // Determina il pulsante premuto Serial.print(" || Pulsanti premuti: "); AlmenoUno=false; if (out[2]==1) { Serial.print("A "); AlmenoUno=true; } // D2 è HIGH quando premo A if (out[0]==1) { Serial.print("B "); AlmenoUno=true; } // D0 è HIGH quando premo B if (out[3]==1) { Serial.print("C "); AlmenoUno=true; } // D3 è HIGH quando premo C if (out[1]==1) { Serial.print("D "); AlmenoUno=true; } // D1 è HIGH quando premo D if (!AlmenoUno) Serial.print("Nessuno"); Serial.print("\n"); } // Leggo i pin di Arduino per capire se è stato premuto qualche pulsante void LeggiPINReceiver() { PB = digitalRead(Pin_VT); out[0] = digitalRead(Pin_D0); out[1] = digitalRead(Pin_D1); out[2] = digitalRead(Pin_D2); out[3] = digitalRead(Pin_D3); } boolean ECambiataLaPressioneSuQualchePulsante() { for ( int i=0 ; i<4 ; i++ ) if (out[i]!=prec_out[i]) return true; return false; } void loop() { int i; LeggiPINReceiver(); if ( ECambiataLaPressioneSuQualchePulsante() ) StampaStato(); for (i=0 ; i<4 ; i++) prec_out[i]=out[i]; }
Il codice proposto produce sul Serial Monitor il seguente output.
Si
noti che è possibile premere in contemporanea più bottoni ma una volta premuti non è
possibile aggiungerne altri con un'ulteriore pressione.