Pages: [1]   Go Down
Author Topic: [Risolto] Combinazione Pulsanti  (Read 979 times)
0 Members and 1 Guest are viewing this topic.
Italy
Offline Offline
Full Member
***
Karma: 0
Posts: 186
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vorrei realizzare un piccolo circuito che, immettendo una sequenza tramite 4 pulsanti, la confronti con una caricata al interno dello sketch e se le due corrispondono si dovrebbe accendere un led.
Il problema sta nella realizzazione dello sketch poiché la parte circuitale non è un problema.
Ho già scritto uno uno sketch che pero non funziona:
Code:
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int  button1 = 10;
const int  button2 = 9;
const int  button3 = 8;
const int  button4 = 7;





int val1= 0;
int val2= 0;
int val3= 0;
int val4= 0;

int i = 0;

int codice[4] = {val1, val2, val3, val4};  
int sequenza[4] = {button3, button1, button4, button2};

void setup() {
  lcd.begin(16, 2);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(button4, INPUT);
  }

void loop() {
    val1 = digitalRead(button1);
    val2 = digitalRead(button2);
    val3 = digitalRead(button3);
    val4 = digitalRead(button4);
   for(i=0; i<4; i++) {
    if (codice[i] == sequenza[i]) {
     lcd.clear();
     lcd.setCursor(2,0);
     lcd.print("System Armed");
    
     }
     }
     }
    
    
Potreste indicarmi dove sbaglio?
La scheda Arduino che utilizzo è - Arduino UNO Rev.3- (Atmega328)
Grazie in anticipo per le risposte.
« Last Edit: January 27, 2013, 11:32:44 am by Hertz » Logged

Capo d'Orlando
Offline Offline
God Member
*****
Karma: 2
Posts: 723
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

io farei semplicemente

cicla fino a che i=4
     se è premuto un pulsante
        vet(i)=pulsante
        i++

poi con un ciclo confronti i due vettori..

Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20166
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
int sequenza[4] = {button3, button1, button4, button2};
non Ti fa un array con i contenuti delle variabili button1 fino button4.
Perché non leggi i stati dei pulsanti direttamente nel array?
Code:
sequenza[0]= digitalRead(button1);
o meglio leggi lo stato del pulsante durante il controllo mettendo i Pin dei 4 pulsanti in un altro array:
Code:
if (codice[ i ] == digitalRead(button[ i ])) {
Ciao Uwe

« Last Edit: January 25, 2013, 04:20:02 pm by uwefed » Logged

Italy
Offline Offline
Full Member
***
Karma: 0
Posts: 186
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho provato con questo codice dove metto i Pin dei pulsanti in un array, ne creo un altro con la combinazione e un altro vuoto dove memorizzare gli input; ma lo stesso non funziona!
Code:
int led = 9;
int pinPulsanti[] = {13,12,11,10};
int sequenza[] = {13,12,11,10};
int codice[5];


void setup() {
  for(int indice = 0; indice < 4; indice++)  {
  pinMode(pinPulsanti[indice], INPUT);
  pinMode(led, OUTPUT);
  }
 }

void loop() {
    for(int indice = 0; indice < 4; indice++)  {
    codice[5] = digitalRead(pinPulsanti[indice]);
    if (codice[indice] == sequenza[indice]) {
     digitalWrite(led, HIGH);
     }
     }
     }
     
Dove sbaglio?
Logged

Marche
Offline Offline
Edison Member
*
Karma: 32
Posts: 2261
azioni semplici per risultati complessi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
int led = 9;
int pinPulsanti[] = {13,12,11,10};
int sequenza[] = {13,12,11,10};
int codice[5];


void setup() {
  for(int indice = 0; indice < 4; indice++)  {
  pinMode(pinPulsanti[indice], INPUT);
  pinMode(led, OUTPUT);// pignoleria: va messo fuori dal ciclo for perchè così lo inizializzi 4 volte di fila
  }
 }

void loop() {
    for(int indice = 0; indice < 4; indice++)  {
    codice[5] = digitalRead(pinPulsanti[indice]); // aggiorni sempre lo stesso elemento dell'array
    if (codice[indice] == sequenza[indice]) { // sequenza[indice] può valere 13,12,11 oppure 10, come fa corrispondere allo stato del pulsante?
     digitalWrite(led, HIGH);
     }
     }
     }

Leggi i commenti che ho messo e ritenta smiley-wink
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 312
Posts: 21604
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

L'errore è qui:
Code:
int pinPulsanti[] = {13,12,11,10};
int sequenza[] = {13,12,11,10};
Crei un vettore che contiene i numeri 13, 12, 11 e 10. Non lo stato dei pulsanti D13, D12, D11 e D10.
Te lo aveva già suggerito Uwe
Logged


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20166
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
for(int indice = 0; indice < 4; indice++)  {
    codice[5] = digitalRead(pinPulsanti[indice]);
    if (codice[indice] == sequenza[indice]) { del pulsante?
     digitalWrite(led, HIGH);
}}

scrivi il valore letto fuori dal Array ( l' array di 5 elementi ha gli elementi da 0 a 4) e percui sovvrascrivi la variabile che é memorizzata nella Ram dopo l# array (non so dirti quale é)
Il secondo errore é che scrivi il pulsante in un elemento fisso che alla fine non viene confrontato col array di riferimento.

Altro consiglio metti una funzione a temp ( per esempio 5 secondi entro il quale il codice deve essere inserito senó si svuota il array di ricezione (codice)). In questo modo quando hai sbagliato a inserire il codice riparte dopo 5 secondi da zero.

Questa logica di leggere i pin non funziona come vorresti. Devi immettere il codice in qualche microsecondo perché la lettura dei pulsanti avviene con questa velocitá.
La lettura deve avvenire con una logica diversa.

Devi leggere tutti 4 pulsanti.
Controlli se non sono premuti 2 pulsanti in contemporanea. se sí la lettura viene scartata
Se un pulsante é premuto scrivi il relativo numero nel array pulsanti premuti
Incrementi l' indice dell array pulsanti premuti
Aspetti che il pulsante sia stato rilasciato
Se l'array pulsanti premuti é pieno ( premuti il numero di pulsanti correspondenti alla lunghezza del  codice segreto) fai il controllo dell'array pulsanti premuti.  Accendi il led e svuoti l' array pulsanti premuti premuta e azzeri l'indice dell'array pulsanti premuti.
Se é passato il tempo utile per immettere la sequenza svuoti l' array pulsanti premuti premuta e azzeri l'indice dell'array pulsanti premuti.
Riparti con questo ciclo.

Ciao Uwe
Logged

Italy
Offline Offline
Full Member
***
Karma: 0
Posts: 186
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho provato con quest' altro codice ma mi da errore nella compilazione
Code:
int led = 12;
int sequenza[] = {10,9,8,7};
int pulsantiPremuti[4];

int button1 = 10;
int button2 = 9;
int button3 = 8;
int button4 = 7;

int i = 0;

void setup() {
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(button4, INPUT);
  pinMode(led, OUTPUT);
 
void loop()  {
  digitalRead(button1);
  digitalRead(button2);
  digitalRead(button3);
  digitalRead(button4);
 
  if (button1 == HIGH) {
    codice[1] = 10;
    i++;
  if (button2 == HIGH) {
    codice[2] = 9;
    i++;
  if (button3 == HIGH) {
    codice[3] = 8;
    i++;
  if (button4 == HIGH) {
    codice[4] = 7;
    i++;
   
 if (i == 4) {
   if (pulsantipremuti[] == sequenza[]) {
     digitalWrite(led, HIGH);
     }
     }
     }
     }
     }
     }
     }
     }
Uwe ha detto che il codice deve essere inserito in qualche microsecondo, ma come non so come fare.
Scusate ma sono alle prime armi con Arduino.
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20166
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Uwe ha detto che il codice deve essere inserito in qualche microsecondo, ma come non so come fare.
Intendevo dire che il Sketch era scritto in moco che Tu dovevi inserire da tastiera il codice in velocitá supersonica.

Ti da problemi in compilazione perché
if (pulsantipremuti[] == sequenza[]) {
mancano gli indici.

Il Sketch fa illuminare il LED se schiacci tutti i 4 pulsanti in contemporanea.
Ciao Uwe
Logged

Italy
Offline Offline
Full Member
***
Karma: 0
Posts: 186
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie a tutti per le risposte.
Alla fine ci sono riuscito! Ora per migliorare il progetto avevo pensato di immettere la sequenza con un telecomando a infrarossi con il ricevitore
IRM-3638.
Cosa ne pensate?
Logged

ivrea (to)
Online Online
Faraday Member
**
Karma: 57
Posts: 3480
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi permetto di dirti che come scrivi il codice (indentazione e parentisi graffe) non permette una facile lettura del codice:

Code:
void loop() 
{ digitalRead(button1);
  digitalRead(button2);
  digitalRead(button3);
  digitalRead(button4);
  if (button1 == HIGH)
  { codice[1] = 10;
    i++;
    if (button2 == HIGH)
    { codice[2] = 9;
      i++;
      if (button3 == HIGH)
      { codice[3] = 8;
        i++;
        if (button4 == HIGH)
       { codice[4] = 7;
         i++;
         if (i == 4)
         {  if (pulsantipremuti[] == sequenza[]) // test errato
            { digitalWrite(led, HIGH);
            }
         }
       }
     }
  }

Come l'ho scritto io è evidente che gli if sono uno DENTRO all'altro, nel tuo codice sembrava quasi fosse un select (if multiplo)
Come le ho scritte io, le graffe chiuse devono essere sulla stessa colonna delle corrispondente graffa aperta. Molto più semplice non perdersi con le chiusure di graffa. Di solito mi sposto di 2 spazi alla volta.
Infatti tu di graffe ne chiudi a bizzeffe e a caso. Una di quelle graffe poi è da mettere moolto prima. La setup() deve avere la sua chiusa graffa PRIMA della loop

void setup()
{
}

void loop()
{
}


Logged

my name is IGOR, not AIGOR

Pages: [1]   Go Up
Jump to: