• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino MEGA problem z DCF
#1
Dzień dobry Wszystkim

Na stare lata stwierdziłem, że nauczę się czegoś nowego i wziąłem się za arduino.
Po miganiu diodą, termometrach i sterowaniu lampką przyszła pora na poważniejszy (dla mnie) projekt czyli zegarek.
A że wala się u mnie trochę lamp to postawiłem od razu z grubej rury zrobić zegarek na lampach nixie z566.
Prototyp już mam, nawet działa ale nie wiem dlaczego działa i tu moja prośba o naprowadzenie dlaczego to działa tak a nie inaczej.

Płytka to arduino mega, bo nie ogarniam jeszcze rejestrów i steruję wszystkimi lampami poprzez 4 układy DM74141N.
Do tego moduł DCF 77 i zegar DS3231.

Zacząłem od testowania czy lampy działają i czy mogę nimi stertować. Działają, 1 sukces.
Potem przyszła pora na na DCF i synchronizację czasu z zapisanie go do DS3221.
Użyłem tego kodu znalezionego na forum:

Kod:
#include <Wire.h>

#define DEBUGMODE 0  // 1 or 0 to show or not show debug messages
#define DCFPIN 2    // data pin of DCF77 module
#define DCF_INPUTMODE INPUT_PULLUP  // INPUT or INPUT_PULLUP
#define INVERTEDSIGNAL true  // false= normal signal, true= inverted signal

#include "jursDCFtime.h"

void setup() {
  Serial.begin(9600);
  Serial.println(F("\nDCF77 and RTC test sketch by 'jurs'"));
  if (RTCinit()) Serial.println(F("RTC OK"));
  else Serial.println(F("RTC FAIL"));
  pinMode(DCFPIN, DCF_INPUTMODE);
}

unsigned long lastPrintTimeMillis;

void loop() {
  sTime time;
  if (dcfUpdate())
  {
    RTCwriteTime(lastValidDCFtime);
    Serial.println("DCF77 TIME TELEGRAM RECEIVED!");
   
  }
  if (millis()-lastPrintTimeMillis>=1000) // each second
  { // read time from RTC and print it to Serial
    lastPrintTimeMillis+=1000;
    char buf[21];
    RTCreadTime(time);
    snprintf(buf,sizeof(buf),"%02d.%02d.%04d  %02d:%02d:%02d", time.bDay, time.bMonth, time.iYear, time.bHour, time.bMinute, time.bSecond);
    Serial.println(buf); // print date and time
  }
}

Zegar się ślicznie zsynchronizował i zapisał czas do DS3221. 2 sukces.

No to dołączyłem powyższy kod do programu zegara i... nie działa.
Nie wiem dlaczego kod włożony do programu zegara nie chce synchronizować czasu.

Jak odpalę kod samej synchronizacji (ten powyżej) to pięknie działa i mam czas zapisany w DS3231.
Wgram po tym program zegara i pięknie godzinę pokazuje.
Resetuję RTC poprzez wyjęcie baterii i mogę czekać godzinę i zero synchronizacji.
Wgram kod samej synchronizacji i po 2 mim mam czas.

Wyjaśnijcie proszę staremu staremu człowiekowi dlaczego. Pewnie robię gdzieś błąd ale go nie widzę.
Poniżej kod zegara, którego używam.

Kod:
#include <Wire.h>

#define DEBUGMODE 0  // 1 or 0 to show or not show debug messages
#define DCFPIN 2    // data pin of DCF77 module
#define DCF_INPUTMODE INPUT_PULLUP  // INPUT or INPUT_PULLUP
#define INVERTEDSIGNAL true  // false= normal signal, true= inverted signal

#include "jursDCFtime.h"

#define A1 22
#define B1 24
#define C1 26
#define D1 28
#define A2 30
#define B2 32
#define C2 34
#define D2 36
#define A3 38
#define B3 40
#define C3 42
#define D3 44
#define A4 46
#define B4 48
#define C4 50
#define D4 52

char A[4] = {A4, A3, A2, A1};
char B[4] = {B4, B3, B2, B1};
char C[4] = {C4, C3, C2, C1};
char D[4] = {D4, D3, D2, D1};

int zero;
int one;
int two;
int three;
int hour;
int minute;

void setup() {
  {Serial.begin(9600);
  Serial.println(F("\nDCF77 and RTC test sketch by 'jurs'"));
  if (RTCinit()) Serial.println(F("RTC OK"));
  else Serial.println(F("RTC FAIL"));
  pinMode(DCFPIN, DCF_INPUTMODE);

  }
 
  unsigned long lastPrintTimeMillis;
 
  pinMode(A1, OUTPUT);
  pinMode(B1, OUTPUT);
  pinMode(C1, OUTPUT);
  pinMode(D1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(B2, OUTPUT);
  pinMode(C2, OUTPUT);
  pinMode(D2, OUTPUT);
  pinMode(A3, OUTPUT);
  pinMode(B3, OUTPUT);
  pinMode(C3, OUTPUT);
  pinMode(D3, OUTPUT);
  pinMode(A4, OUTPUT);
  pinMode(B4, OUTPUT);
  pinMode(C4, OUTPUT);
  pinMode(D4, OUTPUT);

  for (char i = 0; i < 4; i++) {
    digitalWrite(A[i], HIGH);
    digitalWrite(B[i], HIGH);
    digitalWrite(C[i], HIGH);
    digitalWrite(D[i], HIGH);
  }

}

unsigned long lastPrintTimeMillis;

void loop() {
  sTime time;
  if (dcfUpdate())
  {
    RTCwriteTime(lastValidDCFtime);
    Serial.println("DCF77 TIME TELEGRAM RECEIVED!");
   
  }
  if (millis()-lastPrintTimeMillis>=1000) // each second
  { // read time from RTC and print it to Serial
    lastPrintTimeMillis+=1000;
    char buf[21];
    RTCreadTime(time);
    snprintf(buf,sizeof(buf),"%02d.%02d.%04d  %02d:%02d:%02d", time.bDay, time.bMonth, time.iYear, time.bHour, time.bMinute, time.bSecond);
    Serial.println(buf); // print date and time
   
  }
  {
  hour = time.bHour;
  minute = time.bMinute;
  zero = (hour / 10);
  one = hour % 10;
  two =  (minute / 10);
  three = minute % 10;
//Serial.println(zero);
// Serial.println(one);
// Serial.println(two);
// Serial.println(three);
  writenumber(0, zero);
  writenumber(1, one);
  writenumber(2, two);
  writenumber(3, three);
  delay(1000);
  }

}

void writenumber(int a, int b) {
  switch (b) {
    case 0:
      digitalWrite(A[a], LOW);
      digitalWrite(B[a], LOW);
      digitalWrite(C[a], LOW);
      digitalWrite(D[a], LOW);
      break;
    case 1:
      digitalWrite(A[a], HIGH);
      digitalWrite(B[a], LOW);
      digitalWrite(C[a], LOW);
      digitalWrite(D[a], LOW);
      break;
    case 2:
      digitalWrite(A[a], LOW);
      digitalWrite(B[a], HIGH);
      digitalWrite(C[a], LOW);
      digitalWrite(D[a], LOW);
      break;
    case 3:
      digitalWrite(A[a], HIGH);
      digitalWrite(B[a], HIGH);
      digitalWrite(C[a], LOW);
      digitalWrite(D[a], LOW);
      break;
    case 4:
      digitalWrite(A[a], LOW);
      digitalWrite(B[a], LOW);
      digitalWrite(C[a], HIGH);
      digitalWrite(D[a], LOW);
      break;
    case 5:
      digitalWrite(A[a], HIGH);
      digitalWrite(B[a], LOW);
      digitalWrite(C[a], HIGH);
      digitalWrite(D[a], LOW);
      break;
    case 6:
      digitalWrite(A[a], LOW);
      digitalWrite(B[a], HIGH);
      digitalWrite(C[a], HIGH);
      digitalWrite(D[a], LOW);
      break;
    case 7:
      digitalWrite(A[a], HIGH);
      digitalWrite(B[a], HIGH);
      digitalWrite(C[a], HIGH);
      digitalWrite(D[a], LOW);
      break;
    case 8:
      digitalWrite(A[a], LOW);
      digitalWrite(B[a], LOW);
      digitalWrite(C[a], LOW);
      digitalWrite(D[a], HIGH);
      break;
    case 9:
      digitalWrite(A[a], HIGH);
      digitalWrite(B[a], LOW);
      digitalWrite(C[a], LOW);
      digitalWrite(D[a], HIGH);
      break;
  }
}

void off(int a) {
  digitalWrite(A[a], HIGH);
  digitalWrite(B[a], HIGH);
  digitalWrite(C[a], HIGH);
  digitalWrite(D[a], HIGH);
}
 
Odpowiedź
  


Wiadomości w tym wątku
Arduino MEGA problem z DCF - przez yodi_yodi - 30-10-2023, 13:03
RE: Arduino MEGA problem z DCF - przez Irvin - 30-10-2023, 13:35
RE: Arduino MEGA problem z DCF - przez yodi_yodi - 30-10-2023, 13:56

Skocz do:


Przeglądający: 1 gości