Buongiorno a tutti, in questo periodo di forzata inattività ho fatto, .. e rifatto, … e rifatto per la terza volta un orologio digitale che funziona (fatto salvo due pulsanti che riesco a far funzionare solo definendoli OUTPUT e non come INPUT) …. per un paio d'ore, poi i numeri che compaiono sui display a 7 segmenti impazziscono.
In un primo tempo pensavo si trattasse di un problema di programma per cui avevo chiesto indicazioni nella sezione soft, ma ora ritengo sia dovuto alla scarsità (di energia???) dell'arduino utilizzato (un Pro mini AT mega 328 a 5V e 16 mHz) anche in quanto scollegando i display a video compaiono i dati corretti.
Qualcuno può darmi indicazioni? allego programma e schema del circuito.
#include <stdio.h>
#include <DS1302.h>
int orario;
int data;
// Pin RTC
const int kCePin = 2; // Chip Enable
const int kIoPin = 3; // Input/Output
const int kSclkPin = 4; // Serial Clock
#define led1 8
// Pin integrati
#define DATA_PIN 7
#define LATCH_PIN 5
#define CLOCK_PIN 6
// Pin pulsanti visualizzazione/set
#define PulsDisplay 9
#define PulsSet 8
int StatoDisplay = 0; // visualizza ora o data
int StatoSet = 0;
// Variabili scelta correzioni
int Set_Ore;
int Set_Min;
int Set_Gg;
int Set_Mesi;
// Variabili corrette
int corOre = 0;
int corMinuti = 0;
int corData = 0;
int corMese = 0;
// Variabili correzioni
int modOre = 0;
int modMinuti = 0;
int modData = 0;
int modMese = 0;
long t_debounce = 0;
long debounce_delay = 500;
// Variabili display
unsigned long a;
unsigned long b;
unsigned long c;
unsigned long d;
// Variabili comandi display
unsigned long e;
unsigned long f;
unsigned long g;
unsigned long h;
unsigned long values[] = {
//gfedcba
0x7E, // 0
0xC, // 1
0xB6, // 2
0x9F, // 3
0xCD, // 4
0xDA, // 5
0xFA, // 6
0xE, // 7
0xFE, // 8
0xDE, // 9
0x0, // tutto spento
};
DS1302 rtc(kCePin, kIoPin, kSclkPin);
void printTime() {
Time t = rtc.time();
// Array temporaneo inserimento valori data/ora
char buf[50];
Set_Ore = t.hr;
Set_Min = t.min;
Set_Gg = t.date;
Set_Mesi = t.mon;
corOre = t.hr + modOre;
corMinuti = t.min + modMinuti ;
corData = t.date + modData;
corMese = t.mon + modMese;
snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d",
t.yr, corMese, corData,
corOre, corMinuti, t.sec);
// Controllo a video
Serial.println(buf);
orario = (corOre * 100) + corMinuti;
data = (corData * 100) + corMese;
}
void setup() {
Serial.begin(9600);
Serial.println("Versione caricata 13");
pinMode(DATA_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(PulsDisplay, OUTPUT);
pinMode(PulsSet, OUTPUT);
// Initializzazione data/ora
//rtc.writeProtect(false);
//rtc.halt(false);
// Sunday, April 26, 2020 at 15:19:00.
//Time t(2020, 04, 26, 15, 19, 00, Time::kSunday);
// Memorizzazione valori inseriti
//rtc.time(t);
}
void loop() {
// Lampeggio Led
if (digitalRead(led1) == HIGH) {
digitalWrite(led1, LOW);
} else {
digitalWrite(led1, HIGH);
}
//Visualizzazione ora/data
if ((digitalRead(PulsDisplay)) && (StatoSet == 0)) {
if ( (millis() - t_debounce) > debounce_delay) {
StatoDisplay = !StatoDisplay;
t_debounce = millis();
}
}
printTime();
nuovoSet();
modValori();
vis_dati();
delay(1000);
}
void writeRegister(unsigned long value) {
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value >> 24);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value >> 16);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value >> 8);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value);
digitalWrite(LATCH_PIN, HIGH);
}
void vis_dati() {
a = values[h];
b = values[g];
d = values[f];
c = values[e];
unsigned long dati = d;
dati = (dati << 8) | c;
dati = (dati << 8) | b;
dati = (dati << 8) | a;
writeRegister(dati << 0);
}
void ora() {
e = (orario / 1000);
f = (orario - (e * 1000)) / 100;
g = (orario - (e * 1000) - (f * 100)) / 10;
h = (orario - (e * 1000) - (f * 100) - (g * 10));
}
void DispData() {
e = (data / 1000);
f = (data - (e * 1000)) / 100;
g = (data - (e * 1000) - (f * 100)) / 10;
h = (data - (e * 1000) - (f * 100) - (g * 10));
}
void ModificaOra() {
g = ((corOre ) / 10);
h = ((corOre ) - (g * 10));
e = 10;
f = 10;
}
void ModificaMin() {
g = ((corMinuti ) / 10);
h = ((corMinuti ) - (g * 10));
e = 10;
f = 10;
}
void ModificaData() {
g = ((corData ) / 10);
h = ((corData ) - (g * 10));
e = 10;
f = 10;
}
void ModificaMese() {
g = (corMese / 10);
h = corMese - (g * 10);
e = 10;
f = 10;
}
void modValori() {
switch (StatoSet) {
case (0): // fine delle modifiche
if (StatoDisplay == 1) {
DispData();
} else {
ora();
}
break;
case (1): // incrementa il valore delle ore
while (StatoSet == 1) {
nuovoSet();
ModificaOra(); // visualizzo su disply le ore
vis_dati();
//incremento le ore premendo PulsDisplay
if (digitalRead(PulsDisplay)) {
if ( (millis() - t_debounce) > debounce_delay) {
if (corOre == 23) {
modOre = 24 - (Set_Ore + 24);
} else {
modOre = modOre + 1;
}
corOre = Set_Ore + modOre;
}
t_debounce = millis();
}
}
break;
case (2): // incrementa il valore dei minuti
while (StatoSet == 2) {
nuovoSet();
ModificaMin(); // visualizzo su disply i minuti
vis_dati();
//incremento i minuti premendo PulsDisplay
if (digitalRead(PulsDisplay)) {
if ( (millis() - t_debounce) > debounce_delay) {
if (corMinuti == 59) {
modMinuti = 60 - (Set_Min + 60);
} else {
modMinuti = modMinuti + 1;
}
corMinuti = Set_Min + modMinuti;
}
t_debounce = millis();
}
}
break;
case (3): // incrementa il valore della data
while (StatoSet == 3) {
nuovoSet();
ModificaData(); // visualizzo su disply la data
vis_dati();
//incremento la data premendo PulsDisplay
if (digitalRead(PulsDisplay)) {
if ( (millis() - t_debounce) > debounce_delay) {
if (corData == 31) {
modData = 31 - (Set_Gg + 30);
} else {
modData = modData + 1;
}
corData = Set_Gg + modData;
}
t_debounce = millis();
}
}
break;
case (4): // incrementa il valore dei mesi
while (StatoSet == 4) {
nuovoSet();
ModificaMese();// visualizzo su disply il mese
vis_dati();
//incremento i mesi premendo PulsDisplay
if (digitalRead(PulsDisplay)) {
if ( (millis() - t_debounce) > debounce_delay) {
if (corMese == 12) {
modMese = 12 - (Set_Mesi + 11);
} else {
modMese = modMese + 1;
}
corMese = Set_Mesi + modMese;
}
t_debounce = millis();
}
}
break;
}
}
void nuovoSet()
{
if (digitalRead(PulsSet)) {
if ( (millis() - t_debounce) > debounce_delay) {
StatoSet = StatoSet + 1;
if (StatoSet > 4) {
StatoSet = 0;
}
t_debounce = millis();
}
}
}
//******************************FINE*****************************************
Enrico
Orologio_schem.pdf (1.91 MB)