// Note: only write to the display when the readout needs to be updated.
// Speaking I2C on every loop iteration jams the WWVB receiver.
void loop() {
- int signal;
- static int total_samples = 0;
- static int high_samples = 0;
-
- if (total_samples >= 1000) {
- if (high_samples > 500) {
- signal = HIGH;
- }
- else {
- signal = LOW;
- }
- total_samples = 0;
- high_samples = 0;
- }
- else {
- total_samples += 1;
- if (digitalRead(wwvb) == HIGH) {
- ++high_samples;
- }
- }
+ // Reading it three times and taking the average gives us some hysteresis
+ int signal = (digitalRead(wwvb) + digitalRead(wwvb) + digitalRead(wwvb)) / 3;
+
+ // has the timer ticked?
unsigned long m = millis();
if (m != previous_millis) {
millisecond += (m - previous_millis);
previous_millis = m;
int pulse_length;
- //int signal = digitalRead(wwvb); // is the input high or low right now?
if (signal) {
- analogWrite(timecodeled, 10); // it's too bright on my board so we dim it; change to digitalWrite() if not needed
+ analogWrite(timecodeled, 5); // it's too bright on my board so we dim it; change to digitalWrite() if not needed
}
else {
digitalWrite(timecodeled, LOW);
else if ((!signal) && (previous_signal)) { // trailing edge of pulse detected
pulse_length = millis() - start_of_pulse;
- if (pulse_length > 175 && pulse_length < 225) { // "0" bit ~= 200 ms (represented as "0")
+ if (pulse_length > 150 && pulse_length < 250) { // "0" bit ~= 200 ms (represented as "0")
this_pulse = 0;
}
- else if (pulse_length > 475 && pulse_length < 525) { // "1" bit ~= 500 ms (represented as "1")
+ else if (pulse_length > 450 && pulse_length < 550) { // "1" bit ~= 500 ms (represented as "1")
this_pulse = 1;
}
- else if (pulse_length > 775 && pulse_length < 825) { // marker bit ~= 800 ms (represented as "2")
+ else if (pulse_length > 750 && pulse_length < 850) { // marker bit ~= 800 ms (represented as "2")
this_pulse = 2;
}
else {