Quattro bottoni letti da ingresso analogico con Debouce:
Su amazon vendono lcd shield con 4 bottoni in ingresso analogico.
Così ho costruito uno sketch per quel modulo.
Collegamenti:
Da vedere sulla shield comprata, comunque per lo sketch che ho scritto:
Lcd da collegare ai pin 2, 3, 4, 5, 11, 12.
I 4 bottoni al pin A0.
Sull'Arduino Basic Control c'è lo schema per il collegamento dei bottoni per ingresso analogico.
Codice Arduino: Version 1.0 (stabile e testata)
#include <LiquidCrystal.h>
int debounce = 200; //Tempo di rimbalzo
int readingOk;
int readingEsc;
int readingUp;
int readingDown;//Lettura corrente del pin INPUT PULSANTE
int previousOk = LOW; //Lettura precedente del pin INPUT PULSANTE
int previousEsc = LOW;
int previousUp = LOW;
int previousDown = LOW;
long timeOk = 0; //Ultimo tempo in cui il pin di OUTPUT è stato attivato
long timeEsc = 0;
long timeUp = 0;
long timeDown = 0;
int bottonepremuto = 0;
int LetturaValoreBottone = 0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
}
void loop()
{
leggiBottoniAnalog();
if (bottonepremuto > 0)
{
Serial.println(bottonepremuto);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(bottonepremuto);
}
}
void leggiBottoniAnalog(){
bottonepremuto = 0; //azzero bottone premuto se no continua ad essere così anche finito di premere il tasto
LetturaValoreBottone = analogRead(A0);
if (LetturaValoreBottone > 50 && LetturaValoreBottone < 150)
{
readingOk = LOW;
readingEsc = HIGH;
readingUp = LOW;
readingDown = LOW;
}
else if (LetturaValoreBottone > 150 && LetturaValoreBottone < 250)
{
readingOk = LOW;
readingEsc = LOW;
readingUp = LOW;
readingDown = HIGH;
}
else if (LetturaValoreBottone > 250 && LetturaValoreBottone < 350)
{
readingOk = LOW;
readingEsc = LOW;
readingUp = HIGH;
readingDown = LOW;
}
else if (LetturaValoreBottone > 350)
{
readingOk = HIGH;
readingEsc = LOW;
readingUp = LOW;
readingDown = LOW;
}
else
{
readingOk = LOW;
readingEsc = LOW;
readingUp = LOW;
readingDown = LOW;
}
//Se abbiamo premuto in pulsante (HIGH) e la volta prima il suo stato
//era LOW ed è trascorso il tempo necessario, allora...
if (readingOk == HIGH && previousOk == LOW && millis() - timeOk > debounce) {
//Ricorda quando l'ultima volta è stato premuto il pulsante
timeOk = millis();
bottonepremuto=1;
}
if (readingEsc == HIGH && previousEsc == LOW && millis() - timeEsc > debounce) {
//Ricorda quando l'ultima volta è stato premuto il pulsante
timeEsc = millis();
bottonepremuto=4;
}
if (readingUp == HIGH && previousUp == LOW && millis() - timeUp > debounce) {
//Ricorda quando l'ultima volta è stato premuto il pulsante
timeUp = millis();
bottonepremuto=2;
}
if (readingDown == HIGH && previousDown == LOW && millis() - timeDown > debounce) {
//Ricorda quando l'ultima volta è stato premuto il pulsante
timeDown = millis();
bottonepremuto=3;
}
previousOk = readingOk;
previousEsc = readingEsc;
previousUp = readingUp;
previousDown = readingDown;
}
int debounce = 200; //Tempo di rimbalzo
int readingOk;
int readingEsc;
int readingUp;
int readingDown;//Lettura corrente del pin INPUT PULSANTE
int previousOk = LOW; //Lettura precedente del pin INPUT PULSANTE
int previousEsc = LOW;
int previousUp = LOW;
int previousDown = LOW;
long timeOk = 0; //Ultimo tempo in cui il pin di OUTPUT è stato attivato
long timeEsc = 0;
long timeUp = 0;
long timeDown = 0;
int bottonepremuto = 0;
int LetturaValoreBottone = 0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
}
void loop()
{
leggiBottoniAnalog();
if (bottonepremuto > 0)
{
Serial.println(bottonepremuto);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(bottonepremuto);
}
}
void leggiBottoniAnalog(){
bottonepremuto = 0; //azzero bottone premuto se no continua ad essere così anche finito di premere il tasto
LetturaValoreBottone = analogRead(A0);
if (LetturaValoreBottone > 50 && LetturaValoreBottone < 150)
{
readingOk = LOW;
readingEsc = HIGH;
readingUp = LOW;
readingDown = LOW;
}
else if (LetturaValoreBottone > 150 && LetturaValoreBottone < 250)
{
readingOk = LOW;
readingEsc = LOW;
readingUp = LOW;
readingDown = HIGH;
}
else if (LetturaValoreBottone > 250 && LetturaValoreBottone < 350)
{
readingOk = LOW;
readingEsc = LOW;
readingUp = HIGH;
readingDown = LOW;
}
else if (LetturaValoreBottone > 350)
{
readingOk = HIGH;
readingEsc = LOW;
readingUp = LOW;
readingDown = LOW;
}
else
{
readingOk = LOW;
readingEsc = LOW;
readingUp = LOW;
readingDown = LOW;
}
//Se abbiamo premuto in pulsante (HIGH) e la volta prima il suo stato
//era LOW ed è trascorso il tempo necessario, allora...
if (readingOk == HIGH && previousOk == LOW && millis() - timeOk > debounce) {
//Ricorda quando l'ultima volta è stato premuto il pulsante
timeOk = millis();
bottonepremuto=1;
}
if (readingEsc == HIGH && previousEsc == LOW && millis() - timeEsc > debounce) {
//Ricorda quando l'ultima volta è stato premuto il pulsante
timeEsc = millis();
bottonepremuto=4;
}
if (readingUp == HIGH && previousUp == LOW && millis() - timeUp > debounce) {
//Ricorda quando l'ultima volta è stato premuto il pulsante
timeUp = millis();
bottonepremuto=2;
}
if (readingDown == HIGH && previousDown == LOW && millis() - timeDown > debounce) {
//Ricorda quando l'ultima volta è stato premuto il pulsante
timeDown = millis();
bottonepremuto=3;
}
previousOk = readingOk;
previousEsc = readingEsc;
previousUp = readingUp;
previousDown = readingDown;
}