VISUALIZZAZIONE CARATTERI CON KEYPAD 3x4 E WEMOS D1 R1

Buonasera a tutti,
è da diverso tempo che provo a visualizzare dei caratteri inseriti con il keypad sul monitor seriale con la scheda wemos d1 r1, ma niente da fare non vedo nessun carattere.Il compilatore non mi da nessun errore e non compaiono neanche caratteri strani… di seguito potete trovare il codice che ho utilizzato.
Grazie a tutti

#define D0 3
#define D1 1
#define D2 16
#define D3 5
#define D4 4
#define D5 0
#define D6 2
#define D7 14
#define D8 12
#define D9 13
#define D10 15

#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
 {'1','2','3'},
 {'4','5','6'},
 {'7','8','9'},
 {'*','0','#'}
};


byte rowPins[ROWS] = {D7, D6, D5, D4}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {D3, D2, D1}; //connect to the column pinouts of the keypad


Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
 Serial.begin(9600);
}

void loop(){
 char key = keypad.getKey();
 
 if (key){
   Serial.println(key);
 }
}

Buongiorno,
prima di tutto ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese … quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post …

… poi, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione il su citato REGOLAMENTO

… infine in conformità al suddetto regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Il tuo post è già stato spostato nell’opportuna sezione del forum "Italiano”dove puoi proseguire la discussione.
P.P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. :wink:

Ok scusate... mi sono presentato e ho messo a posto il codice

marco2120:

define D0 3

define D1 1

define D2 16

define D3 5

define D4 4

...

Scusa, ma che è sta roba? Guarda che nei WeMos (ESP) i simboli D0, D1 eccetera sono predefiniti nel suo core, non puoi mica cambiarli!

Ad esempio, D4 serve per identificare il pin digitale 4 "Arduino", che negli ESP corrisponde al GPIO2 quindi D4 normalmente vale 2, ma se tu qui lo cambi in 4 stai di fatto usando il pin GPIO4 che è in realtà il D2, insomma un casino ;) Cambia questi nomi, cancella i simboli che non usi (da D8 a D10), per cui una cosa del genere (ovviamente adatta gli indirizzi Dx per i pin che realmente usi):

#define D0 3
#define PAD1 D1
#define PAD2 D2
#define PAD3 D3
#define PAD4 D4
#define PAD5 D5
#define PAD6 D6
#define PAD7 D7
...
byte rowPins[ROWS] = {PAD7, PAD6, PAD5, PAD4}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {PAD3, PAD2, PAD1}; //connect to the column pinouts of the keypad
...
byte rowPins[ROWS] = {D7, D6, D5, D4}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {D3,D2, D1}; //connect to the column pinouts of the keypad

Inizialmente io avevo dichiarato cosi i pin delle righe e colonne ma non vìfunzionava e cosi ho provato a cambiare con il codice nel codice che mi hai corretto, ma a quanto pare ho fatto solo una cavolata…
comunque continua ancora a non funzionare e i pin cono collegati in modo corretto, ho provato a cambiare anche i cavetti e a cambiare keypad ma niente, non riesco proprio a capire…

marco2120:
comunque continua ancora a non funzionare e i pin cono collegati in modo corretto

Mah, ma sei sicuro che le connessioni siano corrette? Hai altre cose collegate alla WeMos? Hai anche periferiche con interfacce I2C e SPI? Puoi allegare una foto della WeMos e relativi collegamenti, e magari farci anche uno schemino di tutto (va bene pure un disegnino su carta che poi fotografi e metti qui come allegato).

Per dire, vedo che tu usi D1 ma quello è riservato alla seriale, e questo lo eviterei (quantomeno per poter fare debug col monitor seriale), sposta tutto da D2 in poi.

Io ho ho ancora una WeMos D1 R1, ma non ho un keypad per provare, ma in ogni caso intanto al tuo posto farei uno sketch di prova solo per questo aspetto (come dico sempre, “isolare i problemi uno alla volta”). Poi userei simboli per identificare facilmente righe e colonne, quindi R1, R2, C1, C2, eccetera, rimappandole sui pin Dx corrispondenti (e non è detto che la colonna 1 sia sul pin D1 ad esempio…).
e per MIA convenzione, metto “P_” come prefisso per evidenziare tutti i simboli che rappresentano i pin.
Quindi un piccolo sketch di prova sarebbe questo (devi adattare i pin che usi realmente, oppure connetti il keypad come indicato qui, ma NON collegare nient’altro):

#define P_C1 D2
#define P_C2 D3
#define P_C3 D4
#define P_R1 D5
#define P_R2 D6
#define P_R3 D7
#define P_R4 D8

byte rowPins[ROWS] = {P_R1, P_R2, P_R3, P_R4}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {P_C1, P_C2, P_C3}; //connect to the column pinouts of the keypad

void setup() {
  Serial.begin(9600);
  
  pinMode(P_C1, OUTPUT);
  digitalWrite(P_C1, HIGH);
  pinMode(P_C2, OUTPUT);
  digitalWrite(P_C2, HIGH);
  pinMode(P_C3, OUTPUT);
  digitalWrite(P_C3, HIGH);
  pinMode(P_R1, INPUT_PULLUP);
  pinMode(P_R2, INPUT_PULLUP);
  pinMode(P_R3, INPUT_PULLUP);
  pinMode(P_R4, INPUT_PULLUP);
}

void loop()
{
  // Test primo pulsante della prima colonna
  digitalWrite(P_C1, LOW);
  if ( digitalRead(P_R1) == LOW )
   Serial.println("PREMUTO!");
  digitalWrite(P_C1, HIGH);
  delay(200);
}

Se premi il primo tasto della prima colonna (dovrebbe essere l’“1”) leggi sulla seriale “1”? Se si, il collegamento di riga 1 e colonna 1 è ok, e se vuoi puoi passare ad esempio alla seconda colonna.
Se non vedi “PREMUTO!” allora hai una mappatura diversa (prova tutti i pulsanti, uno per volta e vedi per quale leggi “PREMUTO!”) o hai fatto male qualche collegamento, o il keypad (hai un link?) non funziona bene.

Se quindi funziona, prova questo sketch (sempre adattando le costanti con i pin che hai collegato) e fammi sapere se va:

#define P_C1 D2
#define P_C2 D3
#define P_C3 D4
#define P_R1 D5
#define P_R2 D6
#define P_R3 D7
#define P_R4 D8

#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 3;
byte rowPins[ROWS] = {P_R1, P_R2, P_R3, P_R4};
byte colPins[COLS] = {P_C1, P_C2, P_C3};
char keys[ROWS][COLS] = {
 {'1','2','3'},
 {'4','5','6'},
 {'7','8','9'},
 {'*','0','#'}
};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup() {
  Serial.begin(115200);
}

void loop()
{
 char key = keypad.getKey();
 if (key)
   Serial.println(key);
}

si ho collegato un display I2C 16x2 che funziona correttamente.In tanto provo a fare le modifiche che mi hai detto isolando il problema e cambiando i pin, se ancora non funziona ti allego codice e foto/ disegno del circuito per vedere cosa ancora si può fare. Grazie mille

Beh allora intanto conferma a quali pin hai collegato il display, perché se vedi bene, nelle WeMos D1 R1 i pin SDA-SCL dell’I2C sono proprio i pin D3 e D4 che quindi NON dovresti usare per il tastierino…

Niente, ancora non riesco a risolvere...

https://drive.google.com/file/d/1j49iDfZMveOG_hk6Rexgitpe5O2Co6VS/view?usp=sharing

questa è l'immagine dello schema

Quella della foto è una D1 R2, tu hai detto di avere una D1 R1 che hanno pinout differenti. Quale versione esattamente hai quindi?

allora ho la d1 r2 scusate..... non me ne intendo molto di schede wemos. Comunque ho quella dell'immagine

Aaah, ok, ora mi spiego alcune cose... Allora vediamo.

Ti riporto qui sotto una immagine di una D1 R2 perché la tua era piccola e sgranata (ti consiglio di usare il sito imgbb.com sul quale puoi anche fare "incolla" di una immagine che hai in locale o che catturi con Windows 10 con i tasti Win+Shift+S):

Dal tuo schema hai collegato il keypad ai pin in blu (righe) e verde (colonne). Ma come anche la serigrafia mostra, il pin D2 che ti ho segnato in rosso, è anche il pin SDA dell'interfaccia I2C, e replicato in fondo (ed anche qui è chiaramente riportato "SDA/D2"!!). Quindi visto che usi la I2C quel pin non puoi usarlo.

Insomma, come avrai forse ora capito, nella WeMos i pin non sono come su arduino! Ad esempio se ci fai caso il pin MOSI, che come posizione su Arduino sarebbe il pin 11, è marcato "MOSI/D7" ossia quel pin è collegato anche al D7! Vedi questo schema, ti ho indicato in rosso le corrispondenze (ma con un semplice tester puoi verificare da te quali siano collegati tra loro):

Inoltre il pin D4 (in viola) se guardi dietro alla board c'è scritto "TX1" ossia è il pin TX della seconda seriale (una "mezza seriale", ha solo TX). Considera poi anche che D3 e D4 (in viola) hanno delle loro pull-up interne da 10k, mentre D8 ha una pull-down, e D4 corrisponde anche al LED interno (LED_BUILTIN) con funzionamento inverso (il LED è acceso con LOW).

Però una buona notizia: dato che non hai interfacce SPI puoi usare tutti quelli con la scritta MISO/MOSI/SCK. ;)

Ma in fin dei conti, dato che di fatto hai a disposizione solo 9 pin (da D0 a D8) di cui però 2 sono per la I2C, te ne restano esattamente 7 per cui se non hai bisogno del led builtin, prova ad impostare queste connessioni:

per le colonne D0, D3, D4 per le righe D5, D6, D7, D8

E vedi se funziona.

PS Ricorda che D3 e D4 ed hanno pullup e la D8 pulldown, quindi se la libreria usa D3 e D4 come input dovrebbe andare, mentre la pulldown della D8 non ci interessa perché sarà OUTPUT. Ma se la libreria dovesse funzionare al contrario, dovrai usare D3 e D4 tra le righe non le colonne...

Se proprio non dovessi venirne a capo, la cosa più semplice e pulita è quella di usare una delle soluzioni alternative tipo QUESTA o QUESTA o QUESTA per usare sempre I2C e quindi non stare a "litigare" con nessun pin della WeMos (che rimarrebbero liberi per altre cose).

Ti ringrazio molto... ora provo e ti faccio sapere!