Ciao a tutti!
Sto realizzando un prototipo in grado di fare diverse cose in relazione tra di loro e la cui principale funzione è un countdown impostato dall'utente. Premetto che non sono un esperto, non sono un informatico, ma sono estremamente curioso, sto quindi studiando anche ciò che mi serve per compilare gli sketch capendoli, ma le cose che ancora non so sono moltissime.
Come potete vedere dello sketch, il dispositivo è dotato uno schermo da 1,44" che mi mostra ciò che mi serve e che funge da interfaccia. Purtroppo non sono riuscito a farlo funzionare mentre si imposta il timer e quindi quella parte (nella sezione void setup()) è fatta per ora tramite seriale.
Il vero problema è questo: con questo sketch, quando imposto un countdown di 30sec. il tempo passa più lentamente. E' facile notarlo, perché nello schermo in basso c'è pure mostrato un orologio RTC. Nell'ultima prova che ho fatto il countdown è durato 8 secondi in più, il che, per la funzione per cui è progettato il dispositivo, è inaccettabile. Troppo di più.
Per ora il timer passa per la libreria "Countimer.h" e penso sia questo il problema, credo di basi sul processore e questo non è affidabile.
Dovrei provare a impostare il countdown attraverso il modulo DS3231 che è già collegato ad esso. Qualcuno ha un'idea su come farlo?
P.S.
Abbiate pietà se lo sketch è un po' confusionario, non sono un programmatore e ho studiato programmazione per conto mio...
#include <Keypad.h> //Libreria matrice 4x4. Tastierino numerico.
#include <OneWire.h> //Libreria sonde a un cavo
#include <DallasTemperature.h> //Libreria temperatura
#include <DS3231.h> //Libreria RealTimeClock
#include <Countimer.h> //Libreria Time per il timer
#include <Adafruit_GFX.h> // Core graphics library LCD
#include <Adafruit_ST7735.h> // Hardware-specific library LCD
#include <pitches.h> //Buzzer
/*Dichiarazioni per il RTC*/
DS3231 clock;
RTCDateTime dt;
/*Dichiarazioni per il tastierino numerico*/
char customKey;
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {22, 24, 26, 28}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {23, 25, 27, 29}; //connect to the column pinouts of the keypad
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
/*PIN SCHERMO*/
#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
/*Dichiarazione della varaibile tft assegnata a uno schermo Adafruit_ST735.
* Permette di usare i comandi in maniera semplice con prefisso tft. */
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
#define TFT_SCLK 52 // set these to be whatever pins you like!
#define TFT_MOSI 51 // set these to be whatever pins you like!
//Melodia per il buzzer
int melody[] = {
NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6};
int duration = 100; // 500 miliseconds
/*TEMPERATURA*/
// Data wire is plugged into port 14 on the Arduino
#define ONE_WIRE_BUS 14
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer;
/*Dichiarazioni variabili per il timer*/
Countimer timer;
long int setHrs = 0;
long int setSec = 0;
long int setMin = 0;
void setup() {
tft.initR(INITR_144GREENTAB); //Inizializzazione dello schermo
tft.fillScreen(ST7735_WHITE); //Settaggio dello sfondo
Serial.begin(9600);
sensors.setResolution(insideThermometer, 11);
/* Initialize DS3231 RealTimeClock */
Serial.println("Initialize DS3231: Real Time Clock");;
clock.begin();
// Set sketch compiling time
clock.setDateTime(__DATE__, __TIME__);
// Set from UNIX timestamp
// clock.setDateTime(1397408400);
// Manual (YYYY, MM, DD, HH, II, SS
// clock.setDateTime(2016, 12, 9, 11, 46, 00);
/*Settaggio timer
*Per cominciare assegnamo alle variabili dei valori interi.
*/
setHrs = random(0,0); //Valore random tra 0 e 1
setMin = random(0,3); //Valore Random tra 0 e 3
setSec = random(0,59); //Valore Random tra 60 e 65. Poich� non c'� nessuna correzione dei valori, partir� dal massimo, cio� 59"
//Scriviamo i valori nel seriale
Serial.print("Random Min.");
Serial.print(setMin);
Serial.print(" Random Sec.");
Serial.println(setSec);
//Scriviamo i valori nello schermo
tft.setCursor(3,11);
tft.print(setHrs);
tft.print(":");
tft.print(setMin);
tft.print(":");
tft.print(setSec);
// Settiamo il timer vero e priprio con i valori immessi all'inzio della sezione,
// richiamo la funzione della libreria timer.COUNT_DOWN e per finire la funzione onComplete() qui nello sketch.
timer.setCounter(setHrs, setMin, setSec, timer.COUNT_DOWN, onComplete);
// Faccio un refresh del timer ogni 1" e chiamo la funziona refreshClock().
timer.setInterval(refreshClock, 1000);
}
// Funzioni per il timer
void refreshClock() {
Serial.print("Current count time is: ");
Serial.println(timer.getCurrentTime());
}
void onComplete() {
Serial.println("Complete!!!");
for (int thisNote = 0; thisNote < 8; thisNote++) {
// pin8 output the voice, every scale is 0.5 sencond
tone(2, melody[thisNote], duration);
}
tft.setCursor(8,75);
tft.setTextSize(2);
tft.print("Completed");
}
void loop(){
/*TIMER*/
timer.run();
if(!timer.isCounterCompleted()) {
timer.start();
}
/*Sonda Temperatura*/
sensors.requestTemperatures();
/* Serial.print("Temperatura = ");
Serial.print(sensors.getTempCByIndex(0));
Serial.println(" gradi C");*/
/* Schermo LCD
* Iformazioni utili per la grafica:
* funzione tft.setCursor(x,y); => Una linea sono 7 pixel sull'asse y, per scrivere sotto a qualcosa aggiungerne 8 per avere una linea adiacente e 9 per staccare.
* colore e dimensione testo sono dichiarati all'inizio, ridichiararli solo se cambiano.
*/
tft.setTextColor(ST7735_BLACK, ST7735_WHITE);
tft.setTextSize(1);
//Title on screen
tft.setCursor(3,3);
tft.print("-Thermo Chronometer-");
tft.drawLine(0,11,128,11,ST7735_RED);
//Timer on the screen//
tft.setCursor(3,15);
tft.print("Random Timer");
tft.setCursor(3,23); //y=+8
tft.print(timer.getCurrentTime());
//Informazioni sulla Temperatura
tft.setCursor(3,32); //y=+9
tft.print("Temperature");
tft.setCursor(3,40); //y+8
tft.print(sensors.getTempCByIndex(0)-2.27); //tenere conto dell calibrazione!!!
tft.println(" C");
//Print Time on Bottom line//
dt = clock.getDateTime();
tft.setCursor(3,119);
tft.setTextSize(1);
tft.print(clock.dateFormat("d.m.Y H:i:s", dt));
}