Nie chcąc budować nowego wątku, podłączę się do dyskusji licząc na pomoc. ( to tak na poczatek).
Primo :
Witam wszystkich , jestem tu nowy.
A teraz do faktów.
Z Arduino bawię się od trzech tygodni i naskrobałem taki program.
Arduino Pro / Mini
5V, 16 MHZ , dwie matryce szregowo P10 ( DMD.h)
wyświetlanie czasu z GPS, lub po wyborze pilotem RC5 tryb stopera.
Code: Select all
#include <SPI.h>
#include <DMD.h>
#include <TimerOne.h>
#include <Time.h>
#include <TinyGPS++.h>
#include <IRremote.h>
//#include "SystemFont5x7.h"
#include "Arial_black_16.h"
//#include "Arial14.h"
#define Serial_GPS Serial
TinyGPSPlus gps;
static const uint32_t GPSBaud = 9600;
#define DISPLAYS_ACROSS 2// ile matryc szeregowo
#define DISPLAYS_DOWN 1// ile matryc w pionie
DMD dmd( DISPLAYS_ACROSS , DISPLAYS_DOWN );
int RECV_PIN = 12;// PIN odbiornika IR
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long aktczas = 0;
unsigned long zapczas = 0;
byte setki;
byte sminuty;
byte ssekundy;
byte klucz;
char mi[3];
char gg[3];
char ss[3];
char czas[11];
char sss[3];
char smi[3];
char sme[3];
char licz[9];
String strmi;
String strgg;
String strss;
String str11;
String sstrmi;
String sstrgg;
String sstrss;
String liczydlo;
const int buttonPin = 2;
int buttonState = 0;
boolean zegar;
boolean stoper;
// ***************************************************************
void setup(void)
{
irrecv.enableIRIn(); // Start odbiornika IR
Serial.begin(9600);
Serial_GPS.begin(GPSBaud);
Timer1.initialize( 2500 );// 2,5 ms odswiezanie matrycy
Timer1.attachInterrupt( ScanDMD );
dmd.selectFont(Arial_Black_16);
// dmd.selectFont(SystemFont5x7);
// dmd.selectFont(Arial14);
pinMode(buttonPin, INPUT);
dmd.clearScreen(true);
setki = 0;
}
void ScanDMD()
{
dmd.scanDisplayBySPI();
}
void loop()
{
if (irrecv.decode(&results)) {
klucz = (results.value);
switch (klucz) {
case 1://zegar
dmd.clearScreen(true);
stoper = false;
zegar = true;
break ;
case 3://stoper
dmd.clearScreen(true);
zegar = false;
stoper = false;
setki = 0;
ssekundy = 0;
sminuty = 0;
dmd.drawString( 7, 1, "00:00.0", 8, GRAPHICS_NORMAL );
break ;
case 4:// start stoper
dmd.clearScreen(true);
zegar = false;
stoper = true;
break ;
case 6://pauza
dmd.clearScreen(true);
stoper = false;
zegar = false;
dmd.drawString( 7, 1, licz, 9, GRAPHICS_NORMAL );
break ;
}
irrecv.resume();
}
if (stoper) {
stoper1();
}
if (zegar) {
zegar1();
}
}
// ************* Koniec obslugi IR ****************
// ******************* Zegar *********************
void zegar1()
{
buttonState = digitalRead(buttonPin);
while (Serial_GPS.available()) {
if (gps.encode(Serial_GPS.read())) {
byte Hour = gps.time.hour();
byte Minute = gps.time.minute();
byte Second = gps.time.second();
// Przeliczenie zeby czas wygladal " 7:09 " a nie " 7:9 "
// ******************** Sekundy **********************
strss = String(Second);
if (Second < 10) {
strss = "0" + strss;
}
strss.toCharArray(ss , 3);
//****************Minuty*******************************
strmi = String(Minute);
if (Minute < 10) {
strmi = "0" + strmi;
}
strmi.toCharArray(mi , 3);
//***************** Godziny ************************************
if (buttonState == HIGH) {
Hour = Hour + 2;
} else {
Hour = Hour + 1;
}
if (Hour > 23) {
Hour = 0;
}
strgg = String(Hour);
strgg.toCharArray(gg , 3);
//****************************************************************
String strgg = gg;
String strmi = mi;
String strss = ss;
str11 = strgg + ":" + strmi + ":" + strss + " ";
str11.toCharArray(czas, 10);
dmd.drawString( 1, 1, czas, 10, GRAPHICS_NORMAL );
while (zegar != true);
}
}
}
void stoper1()
{
// *************** STOPER ***************
aktczas = millis();
if (aktczas - zapczas >= 100UL) {
zapczas = aktczas;
setki++;
}
if (setki == 10) {
ssekundy++;
setki = 0;
}
if (ssekundy == 60) {
sminuty++;
ssekundy = 0;
}
if (sminuty == 100) {
sminuty = 0;
}
sstrmi = String(ssekundy);
if (ssekundy < 10) {
sstrmi = "0" + sstrmi;
}
sstrgg = String(sminuty);
if (sminuty < 10) {
sstrgg = "0" + sstrgg;
}
sstrss = String(setki);
sstrss.toCharArray(sss , 2);
String sstrss = sss;
sstrmi.toCharArray(smi , 3);
String sstrmi = smi;
sstrgg.toCharArray(sme , 3);
String sstrgg = sme;
liczydlo = sstrgg + ":" + sstrmi + "." + sstrss + " ";
liczydlo.toCharArray(licz, 9);
dmd.drawString( 7, 1, licz, 9, GRAPHICS_NORMAL );
while (stoper != true);
}
//************ Koniec stopera ************************
" Szkic używa 17656 bajtów (57%) pamięci programu. Maksimum to 30720 bajtów.
Zmienne globalne używają 1023 bajtów (49%) pamięci dynamicznej, pozostawiając
1025 bajtów dla zmiennych lokalnych. Maksimum to 2048 bajtów."
Tak mówi kompilator.
No i wszystko działa piękie, tylko ....
no właśnie, gdy stoper liczy
to z biegiem czasu rozjeżdża się .
Po 26 minutach jest opóźniony o około 37 sekund , a to jest dla mnie nie do przyjęcia.
Porównywałem z drugim zegarem na GPS-ie.
Gdzie mam błąd ?
Poza ogólnym bałaganem w kodzie.
Pozdrawiam serdecznie i dziękuję za konstruktywne odpowiedzi.