Go Down

Topic: Comandare uscite con un Keypad (Read 4283 times) previous topic - next topic

fratt

se gli stati sono sempre 2 sono sufficienti 2 coppie di variabili (statoRele + previusMillis).
aggiungi altre coppie (tipo statoRele3 e previusMillis3) solo se aggiungi un terzo stato.

per adesso, per variare solo il tempo di accensione, è sufficiente che modifichi il "2000" nell'if (2000 corrisponde a 2 secondi).

nid69ita

Adesso vorrei chiederti un'altra cosa: se volessi attivare statoRèle con due pulsanti, cioè magari premendo 1 si attiva il relè per 2 secondi, e magari premendo il tasto 2 si attiva sempre lo stesso relè per 4 secondi... Dovrei usare un altro previousMillis2, però non riesco a far in modo che si attivi il relè...
In questo caso la strada più semplice è avere una variabile che indica QUANTO tempo deve passare, invece di mettere fisso 2000,   a seconda del tasto premuto, imponi il tempo 2000 o 4000 ad una variabile che userai come "intervallo" necessario.
my name is IGOR, not AIGOR

marcosilve95

Ecco il codice completo :
Code: [Select]
#include <Keypad.h>

const byte ROWS = 4; // quattro righe
const byte COLS = 4; // quattro colonne
// Definizione del Keymap
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'#','0','*','D'}
};
// Connessione Keypad ROW0, ROW1, ROW2 e ROW3 ai pin Arduino
byte rowPins[ROWS] = { 2,3,4,5};
// Connessione Kaypad COL0, COL1 e COL2 ai pin Arduino
byte colPins[COLS] = { 6,7,8,9 };

// Creazione del Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

#define LEDPIN1 13 
#define LEDPIN2 12
byte statoRele0,statoRele1,statoRele2,statoRele3,statoRele4,statoRele5,statoRele6,statoRele7,statoRele8,statoRele9;
unsigned long prevMillis0,prevMillis1,prevMillis2,prevMillis3,prevMillis4,prevMillis5,prevMillis6,prevMillis7,prevMillis8,prevMillis9;

void setup()
{ pinMode(LEDPIN1,OUTPUT);
  pinMode(LEDPIN2,OUTPUT);
  statoRele0=1;       
  statoRele1=1;
  statoRele2=1;
  statoRele3=1;
  statoRele4=1;
  statoRele5=1;
  statoRele6=1;
  statoRele7=1;
  statoRele8=1;
  statoRele9=1;
  digitalWrite(LEDPIN2, statoRele0);
  digitalWrite(LEDPIN1, statoRele1);
  digitalWrite(LEDPIN1, statoRele3);
  digitalWrite(LEDPIN1, statoRele4);
  digitalWrite(LEDPIN1, statoRele5);
  digitalWrite(LEDPIN1, statoRele6);
  digitalWrite(LEDPIN1, statoRele7);
  digitalWrite(LEDPIN1, statoRele8);
  digitalWrite(LEDPIN1, statoRele9);
  Serial.begin(9600);
  delay(1000);
}

void loop()
{ char key = kpd.getKey();
  if(key) Serial.println(key);
  switch (key)
  { case '1':
        statoRele1=0;         // attivare relè ALZATA e conteggio   
        prevMillis1 = millis();     // istante in cui ha premuto
        break;

    case '2':
        statoRele2=0;         // attivare relè ALZATA e conteggio   
        prevMillis2= millis();     // istante in cui ha premuto
        break;

    case '3':
        statoRele3=0;         // attivare relè ALZATA e conteggio   
        prevMillis3= millis();     // istante in cui ha premuto
        break;

    case '4':
        statoRele4=0;         // attivare relè ALZATA e conteggio   
        prevMillis4= millis();     // istante in cui ha premuto
        break;

    case '5':
        statoRele5=0;         // attivare relè ALZATA e conteggio   
        prevMillis5= millis();     // istante in cui ha premuto
        break;

    case '6':
        statoRele6=0;         // attivare relè ALZATA e conteggio   
        prevMillis6= millis();     // istante in cui ha premuto
        break;

    case '7':
        statoRele7=0;         // attivare relè ALZATA e conteggio   
        prevMillis7= millis();     // istante in cui ha premuto
        break;

    case '8':
        statoRele8=0;         // attivare relè ALZATA e conteggio   
        prevMillis8= millis();     // istante in cui ha premuto
        break;

    case '9':
        statoRele9=0;         // attivare relè ALZATA e conteggio   
        prevMillis9= millis();     // istante in cui ha premuto
        break;

    case '0':
        statoRele0=0;         // attivare relè DISCESA e conteggio   
        prevMillis0= millis();     // istante in cui ha premuto
        break;
  }

 
  if(statoRele1==0)
  { if( millis()- prevMillis1 > 1000 )    // passati 1 secondO da quando si preme
    { statoRele1=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele1);
  }

    if(statoRele2==0)
  { if( millis()- prevMillis2 > 2000 )    // passati 2 secondi da quando si preme
    { statoRele2=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele2);
  }

    if(statoRele3==0)
  { if( millis()- prevMillis3 > 3000 )    // passati 3 secondi da quando si preme
    { statoRele3=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele3);
  }

    if(statoRele4==0)
  { if( millis()- prevMillis4 > 4000 )    // passati 4 secondi da quando si preme
    { statoRele4=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele4);
  }

  if(statoRele5==0)
  { if( millis()- prevMillis5 > 5000 )    // passati 5 secondi da quando si preme
    { statoRele5=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele5);
  }

  if(statoRele6==0)
  { if( millis()- prevMillis6 > 6000 )    // passati 6 secondi da quando si preme
    { statoRele6=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele6);
  }

  if(statoRele7==0)
  { if( millis()- prevMillis7 > 7000 )    // passati 7 secondi da quando si preme
    { statoRele7=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele7);
  }

  if(statoRele8==0)
  { if( millis()- prevMillis8 > 8000 )    // passati 8 secondi da quando si preme
    { statoRele8=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele8);
  }

  if(statoRele9==0)
  { if( millis()- prevMillis9 > 9000 )    // passati 9 secondi da quando si preme
    { statoRele9=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele9);
  }
 
  if(statoRele0==0)
  { if( millis()- prevMillis0 > 10000 )    // passati 10 secondi da quando si preme
    { statoRele0=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN2,statoRele0);
  }

}


Adesso vorrei chiedervi un'altra cosa: con un relè praticamente alzo ad un determinato livello (impostato dal tempo), con l'altro (statoRele0) abbasso. Si riuscirebbe a fare in modo che il sistema si ricordi a quanto è stato alzato (in secondi) e poi quando si attivi la discesa sappia automaticamente di scendere lo stesso tempo che è salito?

SukkoPera

Ovviamente. millis() è una funzione che funziona similmente ad un orologio e ti aiuta a tracciare lo scorrere del tempo, vedi nella mia firma per maggiori dettagli.

Basta salvare il valore di millis() quando inizi ad alzare, e poi quando finisci di alzare fai la differenza col valore attuale di millis(): otterrai la durata dell'"alzata" in millisecondi. A quel punto ti basta abbassare per la stessa durata.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

marcosilve95

#34
Apr 06, 2016, 10:54 am Last Edit: Apr 06, 2016, 11:00 am by marcosilve95
Il problema è che io ho 9 prevMillis, come dovrei fare io esattamente?

SukkoPera

"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

fratt

non ho ben capito cosa vuoi fare, ma nel tuo codice c'è qualcosa di strano...

hai 2 led e 9 stati... sicuro che servano?

Code: [Select]

  digitalWrite(LEDPIN2, statoRele0);
  digitalWrite(LEDPIN1, statoRele1);
  digitalWrite(LEDPIN1, statoRele3);
  digitalWrite(LEDPIN1, statoRele4);
  digitalWrite(LEDPIN1, statoRele5);
  digitalWrite(LEDPIN1, statoRele6);
  digitalWrite(LEDPIN1, statoRele7);
  digitalWrite(LEDPIN1, statoRele8);
  digitalWrite(LEDPIN1, statoRele9);


a cosa dovrebbero servire i digitalWrite da 1 a 9 sempre sullo stesso pin?

marcosilve95

Mi servono perché ad ogni pressione di un tasto del keypad devo avere un determinato tempo.... Io devo,  quando premo il tasto 0 della discesa ,  il relè deve restare acceso lo stesso tempo di uno dei 9 tasti premuti prima per l'altra

brunello22

Quote
Mi servono perché ad ogni pressione di un tasto del keypad devo avere un determinato tempo
Capisco il tuo ragionamento, però che senso ha mettere 9 volte in HIGH lo stesso piedino, basta una volta

marcosilve95

Capisco il tuo ragionamento, però che senso ha mettere 9 volte in HIGH lo stesso piedino, basta una volta

se leggi le risposte precedenti c'è scritto tutto il procedimento che mi hanno consigliato di fare

brunello22

io lo modificherei un po'

Code: [Select]

#include <Keypad.h>

const byte ROWS = 4; // quattro righe
const byte COLS = 4; // quattro colonne
// Definizione del Keymap
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'#', '0', '*', 'D'}
};
// Connessione Keypad ROW0, ROW1, ROW2 e ROW3 ai pin Arduino
byte rowPins[ROWS] = { 2, 3, 4, 5};
// Connessione Kaypad COL0, COL1 e COL2 ai pin Arduino
byte colPins[COLS] = { 6, 7, 8, 9 };

// Creazione del Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

#define pin_rele_su 13
#define pin_rele_giu 12
byte statoRele_su = 1 ;
byte statoRele_giu = 1 ;
unsigned long prevMillis ;
int int_key ;
int old_key ;

void setup() {
  delay(1000);
  pinMode(pin_rele_su, OUTPUT);
  pinMode(pin_rele_giu, OUTPUT);
  digitalWrite(pin_rele_su, statoRele_su );
  digitalWrite(pin_rele_giu, statoRele_giu );
  Serial.begin(9600);
}

void loop() {
  char key = kpd.getKey();
  if (key) {
    Serial.println(key);
    int_key = key - '0'; // converte in intero e lo usa come moltiplicatore
    if ( int_key  >= 0 && int_key <= 9 ) { // controlla se è un numero
      prevMillis = millis();
      if ( int_key == 0 ) {
        statoRele_giu = 0 ;
      }
      else {
        statoRele_su = 0 ;
        old_key = int_key ; // memorizza il tasto premuto
      }
    }
  }

  if (statoRele_su == 0)  {
    // c'è da disabilitare prima rele_giu altrimenti "litigano"
    digitalWrite(pin_rele_giu, HIGH ); // disabilita rele discesa
    if ( millis() - prevMillis > ( int_key * 1000 ) ) {
      statoRele_su = 1;  // disattivare relè e conteggio
    }
    digitalWrite(pin_rele_su, statoRele_su);
  }
  if (statoRele_giu == 0)  {
    // c'è da disabilitare prima rele_su altrimenti "litigano"
    digitalWrite(pin_rele_su, HIGH ); // disabilita rele salita
    if ( millis() - prevMillis > (old_key * 1000 ) ) {
      statoRele_giu = 1;  // disattivare relè e conteggio
    }
    digitalWrite(pin_rele_giu, statoRele_giu);
  }
}

marcosilve95

Grazie, quindi io dovrei aggiungere questo sotto al mio codice, ovviamente modificando il nome delle variabili?

marcosilve95

Ecco adesso ho inserito il tutto nel codice
Code: [Select]
#include <Keypad.h>

const byte ROWS = 4; // quattro righe
const byte COLS = 4; // quattro colonne
// Definizione del Keymap
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'#','0','*','D'}
};
// Connessione Keypad ROW0, ROW1, ROW2 e ROW3 ai pin Arduino
byte rowPins[ROWS] = { 2,3,4,5};
// Connessione Kaypad COL0, COL1 e COL2 ai pin Arduino
byte colPins[COLS] = { 6,7,8,9 };

// Creazione del Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

#define LEDPIN1 13 
#define LEDPIN2 12
byte statoRele0,statoRele1,statoRele2,statoRele3,statoRele4,statoRele5,statoRele6,statoRele7,statoRele8,statoRele9;
unsigned long prevMillis0,prevMillis1,prevMillis2,prevMillis3,prevMillis4,prevMillis5,prevMillis6,prevMillis7,prevMillis8,prevMillis9,prevMillis;
int int_key;
int old_key;

void setup()
{ pinMode(LEDPIN1,OUTPUT);
  pinMode(LEDPIN2,OUTPUT);
  statoRele0=1;       
  statoRele1=1;
  statoRele2=1;
  statoRele3=1;
  statoRele4=1;
  statoRele5=1;
  statoRele6=1;
  statoRele7=1;
  statoRele8=1;
  statoRele9=1;
  digitalWrite(LEDPIN2, statoRele0);
  digitalWrite(LEDPIN1, statoRele1);
  digitalWrite(LEDPIN1, statoRele3);
  digitalWrite(LEDPIN1, statoRele4);
  digitalWrite(LEDPIN1, statoRele5);
  digitalWrite(LEDPIN1, statoRele6);
  digitalWrite(LEDPIN1, statoRele7);
  digitalWrite(LEDPIN1, statoRele8);
  digitalWrite(LEDPIN1, statoRele9);
  Serial.begin(9600);
  delay(1000);
}

void loop()
{ char key = kpd.getKey();
  if(key) Serial.println(key);
  switch (key)
  { case '1':
        statoRele1=0;         // attivare relè ALZATA e conteggio   
        prevMillis1 = millis();     // istante in cui ha premuto
        break;

    case '2':
        statoRele2=0;         // attivare relè ALZATA e conteggio   
        prevMillis2= millis();     // istante in cui ha premuto
        break;

    case '3':
        statoRele3=0;         // attivare relè ALZATA e conteggio   
        prevMillis3= millis();     // istante in cui ha premuto
        break;

    case '4':
        statoRele4=0;         // attivare relè ALZATA e conteggio   
        prevMillis4= millis();     // istante in cui ha premuto
        break;

    case '5':
        statoRele5=0;         // attivare relè ALZATA e conteggio   
        prevMillis5= millis();     // istante in cui ha premuto
        break;

    case '6':
        statoRele6=0;         // attivare relè ALZATA e conteggio   
        prevMillis6= millis();     // istante in cui ha premuto
        break;

    case '7':
        statoRele7=0;         // attivare relè ALZATA e conteggio   
        prevMillis7= millis();     // istante in cui ha premuto
        break;

    case '8':
        statoRele8=0;         // attivare relè ALZATA e conteggio   
        prevMillis8= millis();     // istante in cui ha premuto
        break;

    case '9':
        statoRele9=0;         // attivare relè ALZATA e conteggio   
        prevMillis9= millis();     // istante in cui ha premuto
        break;

    case '0':
        statoRele0=0;         // attivare relè DISCESA e conteggio   
        prevMillis0= millis();     // istante in cui ha premuto
        break;

    if (key) {
    Serial.println(key);
    int_key = key - '0'; // converte in intero e lo usa come moltiplicatore
    if ( int_key  >= 0 && int_key <= 9 ) { // controlla se è un numero
      prevMillis = millis();
      if ( int_key == 0 ) {
        statoRele0 = 0;
      }
      else {
        statoRele1 = 0;
        statoRele2 = 0;
        statoRele3 = 0;
        statoRele4 = 0;
        statoRele5 = 0;
        statoRele6 = 0;
        statoRele7 = 0;
        statoRele8 = 0;
        statoRele9 = 0;
        old_key = int_key ; // memorizza il tasto premuto
      }
    }
  }

 
  if(statoRele1==0)
  { if( millis()- prevMillis1 > 1000 )    // passati 1 secondO da quando si preme
    { statoRele1=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele1);
  }

    if(statoRele2==0)
  { if( millis()- prevMillis2 > 2000 )    // passati 2 secondi da quando si preme
    { statoRele2=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele2);
  }

    if(statoRele3==0)
  { if( millis()- prevMillis3 > 3000 )    // passati 3 secondi da quando si preme
    { statoRele3=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele3);
  }

    if(statoRele4==0)
  { if( millis()- prevMillis4 > 4000 )    // passati 4 secondi da quando si preme
    { statoRele4=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele4);
  }

  if(statoRele5==0)
  { if( millis()- prevMillis5 > 5000 )    // passati 5 secondi da quando si preme
    { statoRele5=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele5);
  }

  if(statoRele6==0)
  { if( millis()- prevMillis6 > 6000 )    // passati 6 secondi da quando si preme
    { statoRele6=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele6);
  }

  if(statoRele7==0)
  { if( millis()- prevMillis7 > 7000 )    // passati 7 secondi da quando si preme
    { statoRele7=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele7);
  }

  if(statoRele8==0)
  { if( millis()- prevMillis8 > 8000 )    // passati 8 secondi da quando si preme
    { statoRele8=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele8);
  }

  if(statoRele9==0)
  { if( millis()- prevMillis9 > 9000 )    // passati 9 secondi da quando si preme
    { statoRele9=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN1,statoRele9);
  }
 
  if(statoRele0==0)
  { if( millis()- prevMillis0 > 10000 )    // passati 10 secondi da quando si preme
    { statoRele0=1;    // disattivare relè e conteggio
    }
    digitalWrite(LEDPIN2,statoRele0);
  }


    if (statoRele1, statoRele2, statoRele3, statoRele4, statoRele5, statoRele6, statoRele7, statoRele8, statoRele9 == 0)  {
    // c'è da disabilitare prima rele_giu altrimenti "litigano"
    digitalWrite(statoRele0, HIGH ); // disabilita rele discesa
    if ( millis() - prevMillis > ( int_key * 1000 ) ) {
        statoRele1 = 1;
        statoRele2 = 1;
        statoRele3 = 1;
        statoRele4 = 1;
        statoRele5 = 1;
        statoRele6 = 1;
        statoRele7 = 1;
        statoRele8 = 1;
        statoRele9 = 1;  // disattivare relè e conteggio
    }
    digitalWrite(statoRele1);
    digitalWrite(statoRele2);
    digitalWrite(statoRele3);
    digitalWrite(statoRele4);
    digitalWrite(statoRele5);
    digitalWrite(statoRele6);
    digitalWrite(statoRele7);
    digitalWrite(statoRele8);
    digitalWrite(statoRele9);
  }
  if (statoRele0 == 0)  {
    // c'è da disabilitare prima rele_su altrimenti "litigano"
    digitalWrite(statoRele1, HIGH ); // disabilita rele salita
    digitalWrite(statoRele2, HIGH ); // disabilita rele salita
    digitalWrite(statoRele3, HIGH ); // disabilita rele salita
    digitalWrite(statoRele4, HIGH ); // disabilita rele salita
    digitalWrite(statoRele5, HIGH ); // disabilita rele salita
    digitalWrite(statoRele6, HIGH ); // disabilita rele salita
    digitalWrite(statoRele7, HIGH ); // disabilita rele salita
    digitalWrite(statoRele8, HIGH ); // disabilita rele salita
    digitalWrite(statoRele9, HIGH ); // disabilita rele salita
    if ( millis() - prevMillis > (old_key * 1000 ) ) {
      statoRele0 = 1;  // disattivare relè e conteggio
    }
    digitalWrite (statoRele0);
  }

 
 }
 }



Adesso mi da questo errore :
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:126:6: note: declared here

 void digitalWrite(uint8_t, uint8_t);

      ^

exit status 1
too few arguments to function 'void digitalWrite(uint8_t, uint8_t)'

Cosa può essere?

fratt

digitalWrite() vuole 2 argomenti: pin e stato.
alla fine del codice la chiami più volte con un solo argomento.

SukkoPera

Do anche a te un consiglio che ho già dato ieri: lascia un attimo da parte questa cosa e investi un po' di tempo a studiare il C. In questo modo riuscirai ad ottenere qualcosa in modo sicuramente più rapido che assemblando insieme a caso cose che capisci poco o niente, senza offesa.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

Go Up