Guten Tag zusammen,
ich bin der Stan.
Auf folgendem Youtube-Video
habe ich eine 1-Digit-Nixie-Uhr entdeckt und nachgebaut.
Es handelt sich bei der Hardware um einen Arduino nano, DS3231 RTC und eine Handvoll Kleinkram. Arduino IDE 1.6.10.
Die Uhr läuft soweit.
Ich habe nur das Problem, daß die Zeitausgabe im amerikanischen 12h- Format erfolgt, das möchte ich auf Europa-24h mit führender 0 ändern. Z.B also 6:37 nach 06:37 und 3:56 nach 15:56.
Der Autor ist nicht mehr erreichbar. Nach vielen erfolgosen Änderungsversuchen bitte ich um Hilfe.
Anbei der Code:
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;
int pwmPin = 3; // small neon tube pwm
int interruptCount = 0; //for boost interrupt freqwuency decrease
void setup() {
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();
interruptSetup();
pwmSetup();
//Serial.begin(57600);
//time setting button
pinMode(8, INPUT);
//rtc.adjust(DateTime(2014, 4, 24, 22, 59, 30));
}
void setClock() {
byte timeArray[] = {0, 0, 0, 0}; //newNixTenHours,newNixHours,newNixTenMinutes,newNixMinutes
//int newNixTenHours = 0;
byte newHours = 0;
// int newNixTenMinutes = 0;
byte newMinutes = 0;
unsigned long timePressed = 0;
int numPresses = 0;
unsigned long previousUpTime = 0;
//ten hours
digitalWrite(13, LOW);
delay(1000);
for (byte i = 0; i <= 3; i++) {
blinkBulbs(i + 1, 100, 400); //num blinks , on time , off time
nixieOutPut(timeArray[i], 1, 100);
while (timePressed < 2000) {
previousUpTime = millis();
if (digitalRead(0) == HIGH) {
delay(100);
digitalWrite(13, HIGH);
while (digitalRead(0) == HIGH)
timePressed = millis() - previousUpTime;
if (timePressed < 2000)
timeArray[i]++;
//numPresses++;
if (timeArray[i] > 9) timeArray[i] = 0;
nixieOutPut(timeArray[i], 1, 100);
//if(timePressed < 1000)
delay(200);//button debounce time
}
//Serial.print("timePressed ");
//Serial.println(timePressed);
digitalWrite(13, LOW);
}
nixieOutPut(timeArray[i], 0, 0);
timePressed = 0;
delay(1000);
}
for (byte i = 0; i <= 3; i++) {
blinkBulbs(i + 1, 100, 300); //num blinks , on time , off time
nixieOutPut(timeArray[i], 1, 100);
delay(500);
nixieOutPut(timeArray[i], 0, 100);
delay(100);
}
newHours = 10 * timeArray[0] + timeArray[1];
newMinutes = 10 * timeArray[2] + timeArray[3];
if (newHours > 24)
newHours = 12;
if (newMinutes > 60)
newMinutes = 00;
//tm.Hour = newHours;
//tm.Minute = newMinutes;
DateTime now = rtc.now();
//byte hours = now.hour();
//byte minutes = now.minute();
rtc.adjust(DateTime(2014, 4, 24, newHours, newMinutes, 00));
blinkBulbs(10, 50, 50);
}
void loop() {
//test nixie
/* while(1){
for(int ii = 0; ii <= 9
; ii++){
nixieOutPut(ii, 1,250);
delay(500);
nixieOutPut(ii, 0,200);
delay(500);
}
}
*/
//set clock
if (digitalRead(0) == HIGH) {
blinkBulbs(3, 50, 50);//num blinks , on time , off time
delay(1000);
if (digitalRead(0) == HIGH) { //make sure button wasn't pressed accidently
while (digitalRead(0) == HIGH)
digitalWrite(13, HIGH);
blinkBulbs(10, 50, 50);//num blinks , on time , off time
digitalWrite(13, LOW);
delay(500);
setClock();
}
}
DateTime now = rtc.now();
byte hours = now.hour();
byte minutes = now.minute();
byte nixTenHours = 0;
byte nixHours = 0;
byte nixTenMinutes = 0;
byte nixMinutes = 0;
if (nixHours < 10){
nixTenHours = 0;
nixHours = hours;
}
else
if ( hours >= 10){
nixTenHours = 1;
nixHours = hours%10;
}
else
if(hours >= 20){
nixTenHours = 2;
nixHours = hours%10;
}
if (hours > 12)
hours -= 12;
if (hours == 0)
hours = 12;
if (hours >= 10) {
nixTenHours = 1;
nixHours = hours % 10;
} else
nixTenHours = 0;
nixHours = hours;
if (minutes >= 10) {
nixTenMinutes = minutes / 10.;
}
if (minutes >= 10) {
nixMinutes = minutes % 10;
}
if (minutes < 10) {
nixTenMinutes = 0;
nixMinutes = minutes;
}
delay(100);
for (int i = 0; i <= 3; i++) {
//Serial.print("for");
// Serial.print(i);
//Serial.println(" ");
// blinkBulbs(i, 5);
delay(300);
if (i == 0 && nixTenHours > 0)
nixieOutPut(nixTenHours, 1, 0); //display it if it's not 0
if (i == 0 && nixTenHours <= 0) //skip if it's 0
goto skip;
if (i == 1)
nixieOutPut(nixHours, 1, 0);
if (i == 2)
nixieOutPut(nixTenMinutes, 1, 0);
if (i == 3)
nixieOutPut(nixMinutes, 1, 0);
//OCR2B = 250;//pin3
if (now.hour() >= 23 || now.hour() <= 6) {
// fade in from min to max in increments of 5 points:
for (int fadeValue = 0 ; fadeValue <= 30; fadeValue += 1) {
// sets the value (range from 0 to 255):
// OCR2B = fadeValue;
analogWrite(9, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(15);
}
// fade out from max to min in increments of 5 points:
for (int fadeValue = 30 ; fadeValue >= 0; fadeValue -= 1) {
// sets the value (range from 0 to 255):
analogWrite(9, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(15);
}
} else {
// fade in from min to max in increments of 5 points:
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
// sets the value (range from 0 to 255):
// OCR2B = fadeValue;
analogWrite(9, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(4);
}
// fade out from max to min in increments of 5 points:
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
// sets the value (range from 0 to 255):
analogWrite(9, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(4);
}
}
skip:
nixieOutPut(i, 0, 0);
}
delay(2500);
}
void nixieOutPut(byte number, boolean power, byte pwmValue) {
pinMode(2, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(10, OUTPUT);
pinMode(1, OUTPUT);
pinMode(12, OUTPUT);
digitalWrite(2, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
OCR2B = 0; //digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(1, LOW);
digitalWrite(12, LOW);
switch (number) {
case 0:
digitalWrite(2, power);
break;
case 1:
digitalWrite(4, power);
break;
case 2:
digitalWrite(5, power);
break;
case 3:
digitalWrite(6, power);
break;
case 4:
digitalWrite(7, power);
break;
case 5:
digitalWrite(8, power);
break;
case 6:
if (power == 1)
OCR2B = 255;
if (power == 0)
OCR2B = 0;
break;
case 7:
digitalWrite(10, power);
break;
case 8:
digitalWrite(1, power);
break;
case 9:
digitalWrite(12, power);
break;
}
analogWrite(9, pwmValue);
}
.
.
.
.
Wegen der Begrenzung auf 9000 Zeichen fehlt der Rest des Codes, der komplette ist aber im Anhang.
In diesem Bereich habe ich einiges probiert, geändert, auskommentiert. Geholfen hats nichts, eher verschlechtert:
if (nixHours < 10){
nixTenHours = 0;
nixHours = hours;
}
else
if ( hours >= 10){
nixTenHours = 1;
nixHours = hours%10;
}
else
if(hours >= 20){
nixTenHours = 2;
nixHours = hours%10;
}
if (hours > 12)
hours -= 12;
if (hours == 0)
hours = 12;
if (hours >= 10) {
nixTenHours = 1;
nixHours = hours % 10;
} else
nixTenHours = 0;
nixHours = hours;
if (minutes >= 10) {
nixTenMinutes = minutes / 10.;
}
if (minutes >= 10) {
nixMinutes = minutes % 10;
}
if (minutes < 10) {
nixTenMinutes = 0;
nixMinutes = minutes;
}
Bin für jede Hilfestellung dankbar.
Gruß
Stan
nixie_clock2_rtc.ino (9.42 KB)