Ciao a tutti ragazzi,
sono un "newbie" alle prese con Arduino Uno e con il linguaggio C :~ . Vorrei sapere se, fatto un piccolo circuito dotato da 5 micropulsanti di questo tipo come raffigurato nell'immagine ( http://www.puglisi-elettronica.it/images/27.03105.jpg ) far riconoscere ad Arduino che il primo pulsante, una volta premuto, venga digitata la lettera "A", il secondo pulsante la lettera "B" sino ad arrivare all'ultimo con la lettera "E". Dovrei in pratica creare un piccolo programma che data, per esempio, la password "ABDEC" si accenda il led posto sul pin 13, invece, se per esempio, il codice immesso è "DCEAB" tale led si spenga. Ho visto che esiste anche la Keypad, ma sinceramente vorrei farne a meno, anche perchè creare un circuito disponendo i micropulsanti a proprio piacimento sulla millefori è anche comodo (a mio parere, ovviamente XD XD XD XD XD ). Con la speranza di essere stato quanto più chiaro possibile, vi ringrazio in anticipo ed attendo speranzoso vostre notizie.
Bhe certo che si può fare, non c'è cosa più semplice.
Ovviamente ci vuole del tempo e magari maggiori dettagli...
Ma volevi il progetto bello che pronto o volevi solo informazioni?
Questo a mio avviso è il modo più semplice ed efficace per di più ti porta via un solo pin come contro puoi usare un pulsante alla volta...
http://www.arduino.cc/playground/Code/AnalogButtons
ratto93:
... come contro puoi usare un pulsante alla volta...
Non sono d'accordo ...
Dimensionando opportunamente la sezione resistiva si arriva per logica deduzione anche alla pressione contemporanea di più pulsanti.
L'unica limitazione è la risoluzione del adc.
@niki77: beh, ovviamente un progetto bello e pronto sarebbe l'ideale per un "newbie" come me XD , scherzi a parte, certo, se si avesse un progetto che funga come un input iniziale sarebbe molto più che esaustivo
dipende come la si costruisce... per di più bisognerebbe usare resistenze di precisione
ed a quel punto conviene usare una vecchia tastiera PS2 o USB che sia...
matrice no?
ovvio con 5 pulsanti non vale la pena..
i pulsanti con resistenza potrebbero essere la soluzione migliore.
se poi ragioni dicendo resistenza 1 = (per assurdo) 1 ohm, resistenza 2 2 ohm, resistenza 3 4 ohm arrivi si a dedurre quali sono premuti contemporaneamente
il binario lo conoscete?
Ho trovato quest'immagine di come è collegato un pulsante su Arduino, certo, è un progetto diverso, ma, parlando sempre da "newbie", potrebbe essere una buona idea fare un collegamento simile all'immagine con i pulsanti che ho in dotazione? ( http://www.maffucci.it/wp-content/uploads/2010/11/arduino10.jpg ) - nel progetto usa una resistenza da 10 K Ohm come viene descritto qui ( Arduino – lezione 03: controlliamo un led con un pulsante | Michele Maffucci )
Bel tutorial,
Un bel led messo li a 'porcu' senza neanche uno straccio di resistenza !
Povero arduino.
Ragazzi, ho messo questo codice non sapendo bene nè di cosa parla nè di cosa abbia combinato caricandolo nel "povero" Arduino, ho collegato i pulsanti (ne ho messi 10 e non 5) sulla breadboard come in figura ( http://www.maffucci.it/wp-content/uploads/2010/11/arduino10.jpg ) ma succede che bypassa i pulsanti, non accende il led 13 e accende di continuo il led "TX" della scheda (penso sia il led della trasmissione, correggetemi se sbaglio) help me! :0 :0 :0
const int a2 = 2;
const int a3 = 3;
const int a4 = 4;
const int a5 = 5;
const int a6 = 6;
const int a7 = 7;
const int a8 = 8;
const int a9 = 9;
const int a10 = 10;
const int ledPin = 13;
int i, k, pwcount=0;
char password[] = "1234", entry[10];
void setup()
{
Serial.begin(115200);
for(i=13; i<=1; i++)
pinMode(i, INPUT);
for(i=2; i<=10; i++)
pinMode(i, OUTPUT);
}
void loop()
{
for(i=2; i<=11; i++){
reset();
digitalWrite(i, HIGH);
if(digitalRead(a2)==HIGH && i==2){
blinker();
entry[pwcount] = '1';
pwcount++;
delay(200);
Serial.print('1');
}
if(digitalRead(a3)==HIGH && i==3){
blinker();
entry[pwcount] = '2';
pwcount++;
delay(200);
Serial.print('2');
}
if(digitalRead(a3)==HIGH && i==4){
blinker();
entry[pwcount] = '3';
pwcount++;
delay(200);
Serial.print('3');
}
if(digitalRead(a4)==HIGH && i==5){
blinker();
entry[pwcount] = '4';
pwcount++;
delay(200);
Serial.print('4');
}
if(digitalRead(a5)==HIGH && i==6){
blinker();
entry[pwcount] = '5';
pwcount++;
delay(200);
Serial.print('5');
}
if(digitalRead(a6)==HIGH && i==7){
blinker();
entry[pwcount] = '6';
pwcount++;
delay(200);
Serial.print('6');
}
if(digitalRead(a7)==HIGH && i==8){
blinker();
entry[pwcount] = '7';
pwcount++;
delay(200);
Serial.print('7');
}
if(digitalRead(a8)==HIGH && i==9){
blinker();
entry[pwcount] = '8';
pwcount++;
delay(200);
Serial.print('8');
}
if(digitalRead(a9)==HIGH && i==10){
blinker();
entry[pwcount] = '9';
pwcount++;
delay(200);
Serial.print('9');
}
if(digitalRead(a10)==HIGH && i==11){
blinker();
entry[pwcount] = '0';
pwcount++;
delay(200);
Serial.print('0');
pwcount=0;
for(k=0; k<=4; k++){
if(k==4){
Serial.println("Access Granted");
digitalWrite(13, HIGH);
break;
}
if(password[k] != entry[k]){
Serial.println("Denied");
break;
}
}
for(k=0; k<10; k++)
entry[k]=0;
}
}}
void reset(){
int j;
for(j=3; j<=4; j++)
digitalWrite(j, LOW);
}
void blinker(){
digitalWrite(9, HIGH);
delay(20);
digitalWrite(9, LOW);
}
P.S.: avviato il monitor seriale, esce questa riga di continuo, come se fosse un "loop":
12356780 Denied
12356780 Denied
12356780 Denied
12356780 Denied
12356780 Denied
12356780 Denied
12356780 Denied
12356780 Denied
...
Che faccio? Non sto capendo niente, help me please (o, come diceva il vecchio e caro Johnny 5: "Necessito INPUT")
Cobra:
for(i=13; i<=1; i++)
pinMode(i, INPUT);.....
Ma l'hai scritto tu???
Se ci spieghi un attimo cosa vuoi fare una vista ce le diamo.
Ma così com'è non dovrebbe nemmeno uscire da setup!
Sicuro che hai caricato quello sulla scheda?
Scusami ma così non va bene.
Mi pare che tu non abbia molte basi di programmazione, non puoi pensare di scrivere un codice così di punto in bianco.
Prima comprati un libro sul C, imparati le basi, poi leggi la documentazione presente nel Reference del sito sui comandi e le funzioni specifiche di Arduino, poi inizia con le basi di elettronica, se ti mancano anche quelle (non lo so, non lo hai detto che grado di conoscenza hai).
Non prenderla male questa mia critica, voglio solo aiutarti a capire le cose ed a farti farei passi giusti
niki77:
Bel tutorial,Un bel led messo li a 'porcu' senza neanche uno straccio di resistenza !
Povero arduino.
Se vedi è infilato nel pin 13, e tutti pensano che lì la R ci sia già perché c'è un led integrato sul PCB
leo72:
Se vedi è infilato nel pin 13, e tutti pensano che lì la R ci sia già perché c'è un led integrato sul PCB
Bhe pensano male, già dalla luminosità che emana si vede che poccia un bel pò.
Allora ragazzi,
mi dovete innanzitutto scusare, ripeto che sono nuovo sia nell'ambiente arduino e sia nel linguaggio C (per me ancor più complesso dell'Arduino stesso).
Mi scuso soprattutto perchè me ne sono accorto che non sono stato affatto chiaro, aumentando ancor di più la confusione con quella "specie" di programma che ho postato :~ , frutto malsano dell'unione di un progetto per keypad + il progetto per accendere un led come era scritto in quel tutorial
. Vorrei in pratica collegare i micropulsanti alle uscite digitali di arduino e l'uscita digitale n.13 il led. Devo far riconoscere ad Arduino che, una volta schiacciato il pulsante posto, per esempio, sul pin digitale n.2, venga inviata la lettera "A" e via discorrendo per gli altri pulsanti, cioè il micropulsante posto sul pin digitale n.3, una volta schiacciato, faccia riconoscere ad Arduino che è stata schiacciata la lettera "B", il micropulsante posto sul pin digitale n.4 la "C" e via discorrendo sino al micropulsante posto sul pin 10 che rappresenterebbe la lettera "J". Poi, una volta fatto ciò, vorrei creare due password (una per esempio "ABC" e l'altra "DEF") così che, una volta schiacciati i pulsanti che rappresentano ciascuno le lettere "A"; "B" e "C", arduino riconosca la password ed accenda il led, se, invece, si schiacciassero i pulsanti che rappresentano ciascuno le lettere "D"; "E" e "F", arduino riconosca la nuova password immessa e spegne il led. Perdonatemi la confusione ma più chiaro di così non riesco ad essere, vi ringrazio per la pazienza dimostratami sino ad ora, ma ho scelto questo forum perchè so che qui c'è veramente il top della professionalità (e non lo dico tanto per dire ma perchè ci credo veramente
) e, soprattutto, gente veramente capace ad aiutare chi di programmazione e di elettronica ahimè è alle prime armi come il sottoscritto che ha tanta ma tantissima voglia di imparare attraverso esempi, illustrazioni che solo voi ragazzi potete dare. Grazie infinite.
Comunque, per farvi capire come sia nato quella specie di "mostro" che ho spacciato per codice, vi do i codici da cui, a mio modo, ho preso spunto:
- Arduino keypad:
int i, k, pwcount=0;
char password[] = "1342", entry[10];
void setup()
{
Serial.begin(9600);
for(i=2; i<=5; i++)
pinMode(i, INPUT);
for(i=6; i<=9; i++)
pinMode(i, OUTPUT);
}
void loop()
{
for(i=6; i<=8; i++){
reset();
digitalWrite(i, HIGH);
if(digitalRead(2)==HIGH && i==6){
blinker();
entry[pwcount] = '1';
pwcount++;
delay(200);
Serial.print('1');
}
if(digitalRead(3)==HIGH && i==6){
blinker();
entry[pwcount] = '4';
pwcount++;
delay(200);
Serial.print('4');
}
if(digitalRead(4)==HIGH && i==6){
blinker();
entry[pwcount] = '7';
pwcount++;
delay(200);
Serial.print('7');
}
if(digitalRead(5)==HIGH && i==6){
blinker();
entry[pwcount] = '';
pwcount++;
delay(200);
Serial.print('');
}
if(digitalRead(2)==HIGH && i==7){
blinker();
entry[pwcount] = '2';
pwcount++;
delay(200);
Serial.print('2');
}
if(digitalRead(3)==HIGH && i==7){
blinker();
entry[pwcount] = '5';
pwcount++;
delay(200);
Serial.print('5');
}
if(digitalRead(4)==HIGH && i==7){
blinker();
entry[pwcount] = '8';
pwcount++;
delay(200);
Serial.print('8');
}
if(digitalRead(5)==HIGH && i==7){
blinker();
entry[pwcount] = '0';
pwcount++;
delay(200);
Serial.print('0');
}
if(digitalRead(2)==HIGH && i==8){
blinker();
entry[pwcount] = '3';
pwcount++;
delay(200);
Serial.print('3');
}
if(digitalRead(3)==HIGH && i==8){
blinker();
entry[pwcount] = '6';
pwcount++;
delay(200);
Serial.print('6');
}
if(digitalRead(4)==HIGH && i==8){
blinker();
entry[pwcount] = '9';
pwcount++;
delay(200);
Serial.print('9');
}
if(digitalRead(5)==HIGH && i==8){
blinker();
delay(200);
Serial.println('#');
pwcount=0;
for(k=0; k<=4; k++){
if(k==4){
Serial.println("Access Granted");
digitalWrite(9, HIGH);
break;
}
if(password[k] != entry[k]){
Serial.println("Denied");
break;
}
}
for(k=0; k<10; k++)
entry[k]=0;
}
}}
void reset(){
int j;
for(j=6; j<=8; j++)
digitalWrite(j, LOW);
}
void blinker(){
digitalWrite(9, HIGH);
delay(20);
digitalWrite(9, LOW);
}
- Arduino Led:
const int buttonPin = 2;
const int buttonPin2 = 3;
const int ledPin = 13;
int buttonState = 0;
int buttonState2 = 0;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
pinMode(buttonPin2, INPUT);
}
void loop()
{
buttonState = digitalRead(buttonPin); /
buttonState2 = digitalRead(buttonPin2);
if (buttonState == HIGH){
digitalWrite(ledPin, HIGH);
}
if (buttonState2 == HIGH){
digitalWrite(ledPin, LOW);
}
}
Non ho letto il codice perché è illeggibile, postato così (metti sempre il codice tra gli appositi tag, che ottieni premendo sul pulsantino "#" in alto all'editor dove scrivi il tuo messaggio) né perché voglio capire e farti capire cosa dovrebbe fare secondo me.
Intanto ti dico subito che fare il polling (cioè leggere costantemente) 10 pulsanti senza usare un interrupt o cose del genere è molto dispendioso in termini di scrittura di codice perché crei un papiro abbastanza voluminoso. Ma tu sei alle prime armi per cui lascia perdere se il tuo codice sarà lungo quanto la costituzione.
Dunque, tu hai 10 pulsanti, che per praticità identifichi con le lettere A..J.
Premendo una sequenza vuoi accendere il led, premendone un'altra lo vuoi spengere.
Intanto identifica la lunghezza della password, ti servirà durante l'accettazione dei tasti.
Poi identifica uno stato iniziale: led acceso o spento (è una comune variabile, 0/1, false/true).
Poi metti in ascolto il codice facendo il polling sui 10 tasti per vedere se l'utente preme qualcosa.
Io userei una funzione che legge a cascata tutti e 10 i pulsantini e restituisce il primo che trova premuto. Userei una funzione perché la puoi usare anche in seguito.
Se il ciclo si accorge della pressione di un pulsante, lo memorizza come primo carattere inserito e poi legge i mancanti (qui ti torna utile la variabile definita all'inizio sulla lunghezza della password). Non uscire dalla lettura alla prima lettera sbagliata perché dai informazioni all'utente sulla sequenza. Tu invece devi leggere tutte le lettere (e qui vedi che ti torna comoda la funzione di polling) fino alla fine.
All'ultima controlli la password: se è a caso, esci e basta.
Se è quella di accensione, accendi il led, se è quella per spegnerlo, lo spengi. Prima di queste 2 ultime operazioni controlli lo stato del led in modo che se è già acceso non lo riaccendi, ovviamente, e così per spengerlo.
Ragazzi,
collegando i pulsanti sull'Arduino (ne ho messo solo 5 per prova rispettivamente dal pin digitale 2 al pin digitale 6; i primi 4 pulsanti vengono identificati come "A", "B", "C", "D" e l'ultimo come "Return") ed inserendo il codice che ho postato qui sotto, tutto funziona. Ora però vorrei sapere come si può mettere la password per spegnere il led e, soprattutto, se è possibile farne a meno del computer (ovvero, alimentare Arduino solo da una batteria da 9V e, con la password accendere ugualmente il led, senza dover usare il monitor seriale), eccovi il codice:
int i, k, pwcount=0;
char password[] = "ABCD", entry[10];
const int ledPin = 13;
void setup()
{
Serial.begin(9600);
for(i=2; i<=6; i++)
pinMode(i, INPUT);
for(i=6; i<=9; i++)
pinMode(i, OUTPUT);
}
void loop()
{
for(i=6; i<=9; i++){
reset();
digitalWrite(i, HIGH);
if(digitalRead(2)==HIGH && i==6){
blinker();
entry[pwcount] = 'A';
pwcount++;
delay(200);
Serial.print('A');
}
if(digitalRead(3)==HIGH && i==7){
blinker();
entry[pwcount] = 'B';
pwcount++;
delay(200);
Serial.print('B');
}
if(digitalRead(4)==HIGH && i==8){
blinker();
entry[pwcount] = 'C';
pwcount++;
delay(200);
Serial.print('C');
}
if(digitalRead(5)==HIGH && i==8){
blinker();
entry[pwcount] = 'D';
pwcount++;
delay(200);
Serial.print('D');
}
if(digitalRead(6)==HIGH && i==8){
blinker();
delay(200);
Serial.println('Return');
pwcount=0;
for(k=0; k<=4; k++){
if(k==4){
Serial.println("Access Granted");
digitalWrite(ledPin, HIGH);
digitalWrite(9, HIGH);
break;
}
if(password[k] != entry[k]){
Serial.println("Denied");
digitalWrite(ledPin, LOW);
break;
}
}
for(k=0; k<10; k++)
entry[k]=0;
}
}}
void reset(){
int j;
for(j=6; j<=8; j++)
digitalWrite(j, LOW);
}
void blinker(){
digitalWrite(9, HIGH);
delay(20);
digitalWrite(9, LOW);
}
Ti andrebbe bene se ci fosse un'ulteriore pulsante che premi una volta inserita la password per confermarla? Tutto sarebbe più semplice!
@stefano:
Il pulsante c'è, è il 5°. Lui lo usa appunto come invio
@cobra:
ti ho spiegato di già a livello di logica come fare, devi seguire quelle linee guida.
leo72:
@cobra:
ti ho spiegato di già a livello di logica come fare, devi seguire quelle linee guida.
Capito, solo che il problema è come dovrei trascrivere il codice, nel senso che, avendo pochissime basi di programmazione (e penso che ve ne siate accorti di quanta carenza abbia e quanta "gavetta" devo fare per ambientarmi, soprattutto nello studio e nell'interpretazione del linguaggio C), se non chiedo troppo, potreste farmi una piccola "bozza" di codice in modo tale che riesca a capire di più, per quanto riguarda la logica sono d'accordo con te e penso che abbia seguito quasi alla lettera il tuo consiglio e ti ringrazio infinitamente per l'aiuto dimostratomi, ma ora vorrei capire quel pezzo, sicuramente molto elementare per chi si sa destreggiare come voi nel campo della programmazione ma per me talmente importante per capire la seconda parte del funzionamento, ovvero impostazione della seconda password per la disattivazione del led e completa autonomia di Arduino senza l'uso del monitor seriale. Magari anche qualche link dove illustra tale metodo, l'importante è che, visto ed ottenuto il modo di ragionare attraverso le linee guida da te Leo72 postatomi in precedenza, ottenere il riscontro di tali linee sul codice, in modo tale che il mio metodo di apprendimento sia completo.