Arduino, esperimenti con RTC DS3231...

Jun 19, 2022 25 Replies

Ciao a tutti, mi sono messo a fare esperimenti con Arduino, RTC DS3231, display I2C



20x4 e tastiera a matrice 20 tasti. Raccattando informazioni a destra e a manca in rete sono riuscito a far vedere sul display sia l'orologio con la data sia i vari tasti premuti, ora vorrei provare a modificare data e ora tramite tastiera ma non ci sto capendo una mazza :-( Uso le librerie

#include

formatting link



#include

formatting link



#include

formatting link



ho cercato di capire i vari comandi leggendo il file info delle librerie ma anche li non capisco come usarli, comunque, quello che voglio



serial monitor posso mandare delle stringhe definite che cambiano i dati sul RTC ma non capisco come fare tramite tastiera.



Ringrazio i volenterosi che avranno la solita pazienza di aiutarmi :-)



Di seguito il codice:



#include #include #include



RTC_DS3231 rtc; LiquidCrystal_I2C lcd(0x27, 20, 4);



const byte ROWS = 5; //5 righe const byte COLS = 4; //4 colonne char keys[ROWS][COLS] = { {'A','B','#','*'}, {'1','2','3','U'}, {'4','5','6','D'}, {'7','8','9','E'}, {'','T'} }; byte rowPins[ROWS] = {10, 9, 8, 7, 6}; //connect to the row pinouts of the kpd byte colPins[COLS] = {2, 3, 4, 5}; //connect to the column pinouts of the kpd



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



unsigned long tempoRTC; // variabile per timer visualizzazione ora sul display



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



rtc.begin();



if (rtc.lostPower()) { rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); }



lcd.init(); lcd.setBacklight(0); lcd.clear();



tempoRTC = millis();



}


void loop() {



if ((millis()- tempoRTC) >= 1000) { DateTime now = rtc.now(); printDateTime(now); tempoRTC=millis(); }



char key = kpd.getKey(); char kstate = kpd.getState();



if (key != NO_KEY) { lcd.setCursor(0, 2); lcd.print(key); }



if (key) { switch (key) { case '0': // se si preme il tasto 0 scrive CIAO-0 lcd.setCursor(6, 3); lcd.print("CIAO-0"); break;



case '1': lcd.setCursor(6, 3); lcd.print("CIAO-1"); break;



case '2': lcd.setCursor(6, 3); lcd.print("CIAO-2"); break; } }



if (kstate) { switch (kstate) { case HOLD: lcd.setCursor(13, 3); // se si tiene premuto un tasto viene scritto HOLD lcd.print("HOLD"); break;



case RELEASED: lcd.setCursor(0, 3); // quando si rilascia il tasto si pulisce il display lcd.print(" "); lcd.setCursor(0, 2); lcd.print(" "); break; } }



}

void printDateTime(DateTime dt) //questo non ho capito bene come funziona { char dateBuffer[] = " DD/MM/YYYY "; char timeBuffer[] = " hh:mm:ss ";



lcd.setCursor(4, 0); lcd.print(dt.toString(dateBuffer)); lcd.setCursor(5, 1); lcd.print(dt.toString(timeBuffer));



}



Saluti da Drizzt, quello vero! www.agidone.altervista.org MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! http://www.tappezzeriagraziella.com/

Ciao

Non ho mai usato il DS3231, pur avendone uno da parte... Per impostare

tastierino usarei un encoder rotativo, incrementando o decrementando le cifre una per una (oppure minuti da 0 a 59 e ore da 0 a 23)...

Il 20/06/2022 11:34, LAB ha scritto:

Grazie per l'aiuto, il progetto finale sarebbe un timer programmabile settimanalmente ma essendo uno "zavagnino" (inesperto nel mio dialetto)

la tastiera che userei per il progettino finale ma evidentemente per me

scarso in programmazione di Arduino :-D

Saluti da Drizzt, quello vero! www.agidone.altervista.org MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! http://www.tappezzeriagraziella.com/

Il 19/06/2022 21:13, Drizzt do'Urden ha scritto:

azzz :)

Non l'ho mai programmato, lo farei strutturando il tutto a pagine (in

bene, la vedo dura.

cerca "rtc keypad arduino" magari troverai qualcosa di meglio.

Il 20/06/2022 12:22, Franco Af ha scritto:

la vedo dura pure io, per adesso vorrei solo capire come modificare data e ora, un passettino alla volta :-)

Ora vedo di capirci qualcosa, grazie :-)

Saluti da Drizzt, quello vero! www.agidone.altervista.org MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! http://www.tappezzeriagraziella.com/

Il 21/06/2022 08:17, El_Ciula ha scritto:

Infatti, vedo spesso tutorial fatti semplicemente col copia incolla senza nemmeno capire cosa si sta facendo, fanno tutto le librerie, io non capisco nemmeno quelle :-D :-D :-P

Comunque sono arenato su una stupidaggine, faccio qualche altro tentativo poi vengo a chiedere :-)

Saluti da Drizzt, quello vero! www.agidone.altervista.org MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! http://www.tappezzeriagraziella.com/

Il 21/06/2022 16:03, Drizzt do'Urden ha scritto:

Mi hai superato ormai...

Il 21/06/2022 17:26, El_Ciula ha scritto:

seeee, a capirci di meno :-D

a proposito, col generatore come va? Oppure aspetti di andare in pensione? :-P

Saluti da Drizzt, quello vero! www.agidone.altervista.org MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! http://www.tappezzeriagraziella.com/

Il 20/06/2022 12:22, Franco Af ha scritto:

asterisco viene premuto e mantenuto per un secondo, uso la libreria

RELEASE se rilasciato, PRESSED se premuto ecc ecc.

Non riesco a combinare il tasto col HOLD, o leggo uno o leggo l'altro, giusto per dire: key legge il tasto kstate vede lo stato queste due da sole funzionano se invece le metto assieme con l'AND non vanno, non riesco a capire se sia colpa del tipo di dato, infatti per indicare il tasto si mettono gli apici semplici mentre per indicare lo stato non si mette nulla.

char key = kpd.getKey(); char kstate = kpd.getState();

if ((key == '*') && (kstate == HOLD)) { lcd.setCursor(0, 3); lcd.print("HOLD-*"); }

Dove sbaglio, non ci capisco una mazza fra char int byte ecc ecc :-)

Saluti da Drizzt, quello vero! www.agidone.altervista.org MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! http://www.tappezzeriagraziella.com/

Il 22/06/2022 00:27, LAB ha scritto:

Scusa ma sono de coccio :-)

if (key == '*') { lcd.setCursor(0, 3); lcd.print("HOLD-*"); }

if (kstate == HOLD) { lcd.setCursor(0, 3); lcd.print("HOLD-*"); }

if ((key == '*') && (kstate == HOLD)) { lcd.setCursor(0, 3); lcd.print("HOLD-*"); }

ps: HOLD viene restituito dalla libreria Keypad.h se un tasto rimane premuto

con questo:

char kstate = kpd.getState();

si definisce che kstate deve restituire lo stato del pulsante:

HOLD se tenuto premuto RELEASED se rilasciato

Saluti da Drizzt, quello vero! www.agidone.altervista.org MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! http://www.tappezzeriagraziella.com/

Il 22/06/2022 13:02, LAB ha scritto:

Saluti da Drizzt, quello vero! www.agidone.altervista.org MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! http://www.tappezzeriagraziella.com/

Il 22/06/2022 14:16, Drizzt do'Urden ha scritto:

Rilevando le due condizioni e mandando le relative uscite a due canali

Comunque, usando la tastiera e la relativa libreria ti sei messo nei guai! Se proprio vuoi usare la tastiera piuttosto che un encoder, fai la scansione a mano: alimenti una riga e leggi le colonne, un millisecondo di pausa, alimenti la riga successiva e leggi le colonne... Che bisogno

un LCD, magari anche I2C, uso la libreria!

Il 22/06/2022 14:28, LAB ha scritto:

cosa servono?). Purtroppo ho la mente poco digitale :-D Ora riordino le idee e vediamo che salta fuori.

Saluti da Drizzt, quello vero! www.agidone.altervista.org MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! http://www.tappezzeriagraziella.com/

Il 22/06/2022 14:28, LAB ha scritto:

Allora, giusto per non lasciare nulla di intentato ho fatto alcune prove e sembra proprio che la differenza di parametri (char, int, long e chi

direte :-D

Ho fatto queste prove:

ho creato queste due variabili e le ho usate per convertire i due valori da confrontare:

byte kstate_1=LOW; byte key_1=LOW;

if (kstate == HOLD) kstate_1=HIGH; if (key == '*') key_1=HIGH;

poi ho eseguito il confronto normalmente:

if ((key_1 == HIGH) && (kstate_1 == HIGH))

{ lcd.setCursor(0, 3); lcd.print("CIAO-*-premuto"); }

Saluti da Drizzt, quello vero! www.agidone.altervista.org MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! http://www.tappezzeriagraziella.com/

Il 21/06/2022 23:11, Drizzt do'Urden ha scritto:

Giustamente come dice LAB, sono passati in momenti diversi...

Con la solita occhiata veloce, prova questo :

Come prima cosa ci vuole una variabile esterna per memorizzare il tasto

char keyM=0; // la dichiari fuori dal loop, in pratica una variabile globale

nel loop:

char key = kpd.getKey(); // questa variabile teniamola dello stesso tipo KeyState kstate = kpd.getState();

if (key != NO_KEY){ keym=key; }

if ((keyM == '*') && (kstate == HOLD)) { lcd.setCursor(0, 3); lcd.print("HOLD-*"); keym=0; }

Provalo :)

Ricordati di testare le variabili se arrivano come te le aspetti (tramite serial.print)

Il 22/06/2022 17:04, Drizzt do'Urden ha scritto:

Puoi fare una cosa del genere:

#define letA 10 #define letB 11 #define cancelletto 12 #define asterisco 13 #define letU 14 #define letD 15 #define letE 16 #define letT 17 #define maggiore 18 #define minore 19

----- setup() ----- //10 9 8 7 6 pinMode (2, INPUT_PULLUP); // A, 1, 4, 7, < pinMode (3, INPUT_PULLUP); // B, 2, 5, 8, 0 pinMode (4, INPUT_PULLUP); // #, 3, 6, 9, > pinMode (5, INPUT_PULLUP); // *, U, D, E, T

pinMode(10, OUTPUT); digitalWrite (10, HIGH); pinMode( 9, OUTPUT); digitalWrite ( 9, HIGH); pinMode( 8, OUTPUT); digitalWrite ( 8, HIGH); pinMode( 7, OUTPUT); digitalWrite ( 7, HIGH); pinMode( 6, OUTPUT); digitalWrite ( 6, HIGH);

----- loop() ----- digitalWrite (10, LOW); if (!digitalRead (2)) carattere = letA; else if (!digitalRead (3)) carattere = letB; else if (!digitalRead (4)) carattere = cancelletto; else if (!digitalRead (5)) carattere = asterisco; digitalWrite (10, HIGH); delay(1);

digitalWrite ( 9, LOW); if (!digitalRead (2)) carattere = 1; else if (!digitalRead (3)) carattere = 2; else if (!digitalRead (4)) carattere = 3; else if (!digitalRead (5)) carattere = letU;

... ... ...

"Drizzt do'Urden" ha scritto nel messaggio news:t8v17d$1o1s$ snipped-for-privacy@gioia.aioe.org...

strcmp non centra nulla, HOLD non e' una stringa ma un simbolo che ha valore numerico, quindi il tuo test con == e' giusto.

se guardi come e' scritta la libreria, le 2 condizioni in && non possono coesistere perche' nel codice di getKey c'e' questo: if (getKeys() && key[0].stateChanged && (key[0].kstate==PRESSED)) return key[0].kchar;

cioe' la getKey ritorna un valore solo nello stato PRESSED, cioe' a inizio pressione, lo stato HOLD arriva temporalmente dopo che lo tieni premuto X tempo.

Il 22/06/2022 17:39, Franco Af ha scritto:

forse ti riferisci ad alfio, non ho capito il codice della libreria che ha scritto ma ha spiegato bene come i due stati non sono contemporanei quindi assieme non si incontreranno mai per fare un confronto.

ehhh, certo che funziona e ora che mi avete spiegato l'inghippo ho capito il tuo codice :-)

ecco, pensavo che usando il display come monitor fosse la stessa cosa invece col monitor seriale si capisce meglio :-)

modifica premendo il tasto asterisco.

Siete dei geni della programmazione :-D

Saluti da Drizzt, quello vero! www.agidone.altervista.org MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! http://www.tappezzeriagraziella.com/

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required