Go Down

Topic: Bitte um Hilfe für Änderung Code 12h AM/PM zu 24h-Ausgabe (Read 220 times) previous topic - next topic

Ulo

Guten Tag zusammen,

ich bin der Stan.


Auf folgendem Youtube-Video

https://www.youtube.com/watch?v=1mbPR0R01uE&t=308s

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:



Code: [Select]





#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:

Code: [Select]

  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

noiasca

was vermutest du, dass dieser Abschnitt mit deinen Stunden macht?

Code: [Select]

  if (hours > 12)
    hours -= 12;
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Moko

Ich würde versuche mal diese Zeilen:

Code: [Select]

  if (hours > 12)
    hours -= 12;
  if (hours == 0)
    hours = 12;


und
Code: [Select]

    if (i == 0 && nixTenHours <= 0) //skip if it's 0
      goto skip;

auszukommentieren.


edit: zu langsam :(

Ulo

Hallo,

Danke für die schnellen Antworten.

@Noiasca: Ja, ich bin auch davon ausgegangen, daß man hier etwas ändern kann, aber das Ergebnis war nicht wie erhofft...

@Moko: ... ich habe die beiden Abschnitte auskommentiert...


Ergebnis ist jetzt:

Zeit in RTC  07:17  Ausgabe 7:17
                13:47              1:47
                23:16              1:16

bedeutet, die führende 0 fehlt, dafür wird bei 23:00 Uhr die scheinbar eine Stelle der 11 verschluckt.

Sorry, wenn ich etwas blöde frage, aber mit Software hab ichs nicht so. In SMD-Löten und Hardware bin ich deutlich besser drauf.

Geht das eigentlich nicht, daß die Stunden und Minuten nur "durchgereicht" werden?

noiasca

Ja, ich bin auch davon ausgegangen, daß man hier etwas ändern kann, aber das Ergebnis war nicht wie erhofft...
WAS hast du geändert und WIE war das Ergebnis.

Bedenke, wir haben nicht deine Hardware!

Irgendwie alles verkorkst.

Nur geraten:

Code: [Select]

  //if (hours > 12)
  //  hours -= 12;     // das willst nicht

  //if (hours == 0)
  //   hours = 12;   // das macht bei 24:01 auch wenig sinn

  if (hours >= 10) {
    //nixTenHours = 1;  // das ist natürlich nix für 24h
nixTenHours = hours / 10;
    nixHours = hours % 10;
  } else
  {                   //neue Klammer auf
    nixTenHours = 0;
    nixHours = hours; // das glaube ich nicht dass das hier ohne Klammer hingehört, beide zeilen gehören in geschweiften klammern nach dem else
  }                   // neue Klammer zu


tausche das mal aus, schau ob es kompiliert, drücke mal STRG-T, lade es hoch.
Beschreibe was der Code nun macht.

Poste dann den neuen sauberen gesamten Code.

Video habe ich mir angesehen. Wo ist der Link auf den originalen Code - oder ist das alles von dir?
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Ulo

Hallo Noiasca,

bisherige Änderungen:

Codezeilen entfernt, wie von Moko vorgeschlagen, darauf folgende Ausgabe der Uhrzeit wie in Post #3 beschrieben.

Deine Änderungen werde ich morgen im Lauf des Tages vornehmen, muss/darf jetzt dann zur Arbeit...


Der Code ist von

https://reibot.org/,

Abschnitt 16.Jan.2017 "Clock 1".

von dort gibts einen Link zu Dropbox. Datei nixie_clock2_rtc.ino.

Hier ist auch handschriftlich der Schaltungsaufbau beschrieben.


Bis hierher schon mal vielen Dank für die Unterstützung!




Ulo


Hallo zusammen,

ich habe die Änderungen von Noiasca soweit vorgenommen, die Ausgabe in 24 h funktioniert :D

Aber:

von 00:00 bis 09:00 Uhr fehlt noch die führende 0.

Ich habe testweise mal den einen, dann den anderen, dann alles vom folgenden Abschnitt auskommentiert, keine Änderung:

Code: [Select]


  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;



Ulo


noiasca

wenn du obige Zeilen ausdokumentierst erwarte ich, dass die 10er Stelle immer fehlt. es gibt ja dann keine Ausgabe für die nixTenHours. Korrekt?

daher eher so

Code: [Select]

/*
 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 == 0)
    nixieOutPut(nixTenHours, 1,0); // IMMER ausgeben

   if(i == 1)
     nixieOutPut(nixHours, 1,0);



drück mal STRG-T in deiner IDE, entferne die unnützen Leerzeilen.
Poste den neuen Code und beschreibe GENAU was der Code macht oder nicht macht.
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Ulo

Hallo Noiasca,

habe die Änderungen gemacht, läuft alles perfekt.

An dieser Stelle nochmal herzlichen Dank für die Hilfe!  :)

Im Anhang, falls sich jemand selber dran versuchen möchte, der geänderte Code.

Schöne Grüße
Stan

Go Up