Ciao a tutti,
scrivo perché non riesco a risolvere un problema di lettura tasti, utilizzando come IOexpander il PCF8574AP, la configurazione piedini che uso è
scusate ma non ho capito come si inserisce un'immagine :~
Il problema che ho consiste nel fatto che per un certo numero di pressioni dei tasti fatte sia a casaccio che non, leggo i tasti, poi si blocca tutto e devo resettare…
La tastiera, così come l’ho prevista andrà integrata con un lcd 20x4 già pilotato con un altro ic identico e senza nessun problema riscontrato e con un rtc ds1307, anche questo fino ad ora senza nessun problema.
Ho fatto le prove sia collegando tutto insieme sia con la tastiera separata, ed ho testato resistenze di pullup sul bus i2c da 2,2k da 4,7k e da 10k
Ed il risultato non cambia mai…
Ho provato ad usare la libreria IOexp, qui di seguito il codice:
/*
Configurazione piedini PCF 8574AP
piedino 1 = A0 = +5v
piedino 2 = A1 = GND
piedino 3 = A2 = GND
piedino 4 = P0 = tasto destra
piedino 5 = P1 = tasto sinistra
piedino 6 = P2 = tasto decremento
piedino 7 = P3 = tasto incremento
piedino 8 = Vss = GND
piedino 9 = P4 = tasto OK
piedino 14 = SCL = A5 su Arduino
piedino 15 = SDA = A4 su Arduino
piedino 16 = Vdd = +5v
*/
#include <Wire.h>
#include <IOexp.h>
IOexp tastiera(0x39);
boolean inc, dec, dx, sx, ok;
boolean incremento = false;
boolean tastopremuto = false;
int tempo;
#define bip 200 // Tono acustico per pulsante ok
#define bop 220 // Tono acustico per pulsanti inc e dec
#define bep 240 // Tono acustico per pulsanti dx e sx
#define buzzer 14
void Cicalino (int tono)
{
for (int i = 0; i < 90; i++)
{
digitalWrite(buzzer,HIGH);
delayMicroseconds(tono);
digitalWrite(buzzer,LOW);
delayMicroseconds(tono);
}
}
void setup()
{
Wire.begin();
pinMode(buzzer, OUTPUT);
//Serial.begin(9600);
}
void loop()
{
//tastiera.fullwrite(0x0);
inc = tastiera.read(P3);
dec = tastiera.read(P2);
sx = tastiera.read(P1);
dx = tastiera.read(P0);
ok = tastiera.read(P4);
if (inc == true && tastopremuto == false)
{
//Serial.println("Prova tasti: Incremento");
Cicalino(bop);
tastopremuto = true;
tempo = millis();
}
if (dec == true && tastopremuto == false)
{
//Serial.println("Prova tasti: Incremento");
Cicalino(bop);
tastopremuto = true;
tempo = millis();
}
if (dx == true && tastopremuto == false)
{
//Serial.println("Prova tasti: Incremento");
Cicalino(bep);
tastopremuto = true;
tempo = millis();
}
if (sx == true && tastopremuto == false)
{
//Serial.println("Prova tasti: Incremento");
Cicalino(bep);
tastopremuto = true;
tempo = millis();
}
if (ok == true && tastopremuto == false)
{
//Serial.println("Prova tasti: Incremento");
Cicalino(bip);
tastopremuto = true;
tempo = millis();
}
if (millis() >= (tempo + 300))
{
tastopremuto = false;
}
/* Serial.print("Prova tasti: ");
//if (incremento == true) { Serial.println(" Incremento"); }
if (dec == true) { Serial.println(" Decremento"); }
if (dx == true) { Serial.println(" Destra"); }
if (sx == true) { Serial.println(" Sinistra"); }
if (ok == true) { Serial.println(" OK!"); }
Serial.print(" \n ");*/
}
ed ho provato anche con wire direttamente:
/*
Configurazione piedini PCF 8574AP
piedino 1 = A0 = +5v
piedino 2 = A1 = GND
piedino 3 = A2 = GND
piedino 4 = P0 = tasto destra
piedino 5 = P1 = tasto sinistra
piedino 6 = P2 = tasto decremento
piedino 7 = P3 = tasto incremento
piedino 8 = Vss = GND
piedino 9 = P4 = tasto OK
piedino 14 = SCL = A5 su Arduino
piedino 15 = SDA = A4 su Arduino
piedino 16 = Vdd = +5v
*/
#include <Wire.h>
#define buzzer 14
boolean tastopremuto = false;
int tasto;
int tempo;
#define bip 200 // Tono acustico per pulsante ok
#define bop 220 // Tono acustico per pulsanti inc e dec
#define bep 240 // Tono acustico per pulsanti dx e sx
void Cicalino (int tono)
{
for (int i = 0; i < 90; i++)
{
digitalWrite(buzzer,HIGH);
delayMicroseconds(tono);
digitalWrite(buzzer,LOW);
delayMicroseconds(tono);
}
}
void setup()
{
Wire.begin();
pinMode(buzzer, OUTPUT);
//Serial.begin(9600);
}
void loop()
{
Wire.beginTransmission(0x39);
Wire.send(0);
Wire.endTransmission();
Wire.requestFrom(0x39, 1);
tasto = Wire.receive();
//Serial.print("Tasto premuto: ");
if ((tasto == 8) && (tastopremuto == false))
{
Cicalino(bop);
tastopremuto = true;
tempo = millis();
//Serial.print("Incremento");
}
if ((tasto == 4) && (tastopremuto == false))
{
Cicalino(bop);
tastopremuto = true;
tempo = millis();
//Serial.print("Decremento");
}
if ((tasto == 2) && (tastopremuto == false))
{
Cicalino(bip);
tastopremuto = true;
tempo = millis();
//Serial.print("Sinistra");
}
if ((tasto == 1) && (tastopremuto == false))
{
Cicalino(bip);
tastopremuto = true;
tempo = millis();
//Serial.print("Destra");
}
if ((tasto == 16) && (tastopremuto == false))
{
Cicalino(bep);
tastopremuto = true;
tempo = millis();
//Serial.print("OK!!!");
}
if (millis() >= (tempo + 300))
{
tastopremuto = false;
}
//Serial.println(" ");
}
ma sono sempre al punto di prima, dopo un po’ non leggo più i tasti, qualcuno riesce a capire dove sbaglio?????
inizialmente, ho creduto anche che ci fosse qualche conflitto con il serial monitor, tanto che ho scritto una funzioncina per il buzzer in modo da avere un feedbak sonoro, ma niente da fare…
E’ una settimana che faccio tentativi senza nessun successo…
Grazie in anticipo a chiunque voglia aiutarmi…
