-
+ Antworten
Ergebnis 1 bis 6 von 6

Thema: Uhrzeit auf LCD mit Arduino ausgeben (Eigene Zeichen)

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    14.04.2012
    Beiträge
    16

    Uhrzeit auf LCD mit Arduino ausgeben (Eigene Zeichen)

    Hallo @ All!
    Ich muss momentan mein P5 (Fünftes Prüfungselement) für's Abitur vorbereiten. Ich habe mir einen Arduino und ein LCD gekauft und habe alles angeschlossen und es funktioniert auch. Nun empfange ich die Zeit per Funk und kann sie auch ausgeben, nur leider sind mir die Zahlen zu klein. Deswegen habe ich mir selber Symbole erstellt und dann jeweils in einer Funktion (Eins (); , Zwei (); usw.) größere Zahlen daraus gemacht, welche über alle 4 Zeilen des LCD angezeigt werden. Nun habe ich natürlich ein Problem: Ich muss dem Arduino ja sagen, dass er für eine bestimmt Uhrzeit, z.B. 15:15:30 Uhr, meine Funktionen Eins(); | Fuenf (); | Doppeltpunkt (); | Eins(); | Fuenf (); | Doppeltpunkt (); | Drei (); | Null (); benutzen soll, damit auch die richtigen großen Zahlen angezeigt werden. Wenn ich das ganze mit switch & case realisiere benötige ich für die Stunden 24 case Blöcke sowie 60 für Minuten und Sekunden. Dadurch wird der Quelltext super unübersichtlich und man findet auch keine Fehler mehr. Hat Jemand eine Idee, wie man das ganze einfacher gestalten könnte? Vielleicht irgendwie den Funktionen einen Präfix geben, sodass auch diese einfach hochgezählt werden? Freue mich auf euere Antworten =) und vielen Dank im Voraus!

    LG

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von robo_tom_24
    Registriert seit
    04.02.2012
    Ort
    Burgenland, Österreich
    Beiträge
    485
    Hallo
    Bei manchen LCD's kann man zwischen einzeiligem und zweizeiligem Modus umschalten -> Datenblatt
    Oder aber du machst dir verschachtelte Funktionen bzw. eine Umwandlungsfunktion
    BSP:
    Code:
    void SmallToBig_time(int uhrzeit, char* string_mit_grossen_zeichen)
    {
           //uhrzeit kommt z.B. in array mit 3 Elemten -> 3 mal funktionsaufruf
           for(i=0;i<3;i++)
           {
                 SmallToBig_char(int uhrzeit[i], char* elemente_mit_grossen_zeichen)
                 {
                      //UMWANDELN
                  }
                  //Strings wieder zusammensetzen und ausgeben
                  strcat(string_mit_grossen_zeichen, elemente_mit_grossen_zeichen);
             }
    }
    So hätte ich das ca. aufgesetzt....

    mfg thomas

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    14.04.2012
    Beiträge
    16
    Hallo! Danke für die schnelle Antwort =). Nur weiß ich nicht genau wie ich mit deiner Funktion arbeiten soll. Meine Eigenen Zeichen sind wie folgt aufgebaut:
    Code:
    void Null (int x, int y)
    {
      int xPos = x;
      int yPos = y;
      lcd.setCursor(xPos, yPos);
      lcd.write(7);
      lcd.write(7);
      lcd.write(7);
      lcd.setCursor(xPos, yPos+1);
      lcd.write(7);
      lcd.setCursor(xPos+2, yPos+1);
      lcd.write(7);
      lcd.setCursor(xPos, yPos+2);
      lcd.write(7);
      lcd.setCursor(xPos+2, yPos+2);
      lcd.write(7);
      lcd.setCursor(xPos, yPos+3);
      lcd.write(7);
      lcd.write(7);
      lcd.write(7);
    }
    Das wäre jetzt z.B. meine Null. Ich übergebe die X- und Y-Positon auf dem LCD als Paramter und die Zahlen werden angezeigt. Vielleicht gibt es noch eine bessere Möglichkeit =)?

    LG

  4. #4
    Erfahrener Benutzer Roboter-Spezialist Avatar von robo_tom_24
    Registriert seit
    04.02.2012
    Ort
    Burgenland, Österreich
    Beiträge
    485
    Schau, du zerlegst sozusagen deine Uhrezeit in die einzelnen Zeichen, wandelst diese in große um und setzt sie wieder als String zusammen

    Vielleicht verstehst du es so: (ich gehe jetzt davon aus, das deine Uhrzeit in als Zahl in Sekunden seit 1.1.1970 (?) daherkommt)
    time ist deine "ganze" Zeit in sekunden
    das array int small_time deine Uhrzeit in kleinen Buchstaben

    Du machst dir eine Funktion, bzw benutzt eine Fertige die die Sekunden in die aktuelle Uhrzeit umwandelt:
    Code:
    void time_to_number(long time, int* small_time)
    {
    //UMWANDELN
    }
    Dann sieht dein array z.B so aus (13:05:27):
    Code:
    small_time: 
    [0]: 1
    [1]: 3
    [2]: 0
    [3]: 5
    [4]: 2
    [5]: 7
    Nun kommt wieder eine Funktion die dir das Ganze in deinen Text umwandelt
    Code:
    #define x_pos(x) (x)*120         //X Position für jedes Zeichen ermitteln - ich gehe von 120x200 Pixel pro Zeichen aus
    #define y_pos     20                //Randabstand von oben
    
    void number_to_text (const int* small time)
    {
    
    int i; for(i=0;i<=5;i++) {
    switch(i) {
    case 0: Null(x_pos(i),y_pos); break; case 1: Eins(x_pos(i),y_pos); break; //Und so weiter....
    }
    }
    }
    Din deinem Hauptprogramm würde dann nur das stehen:
    Code:
    void main()
    {
    
    int small_time[6]; //Andere Dinge.... while(1) {
    time_to_number(funktion_die_zeit_liefert, small_time); number_to_text(small_time);
    }
    }
    Ich hoffe es hilft dir weiter

    Mir kommt gerade.... du könntest aber auch eine große 7 Segmentanzeige verwenden

    mfg thomas
    Geändert von robo_tom_24 (15.04.2012 um 13:23 Uhr) Grund: Hauptprogramm vergessen

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    14.04.2012
    Beiträge
    16
    Hallo! Danke nochmal für die Antwort! Habe mir jetzt selber etwas ausgedacht, werde deine Möglichkeit aber auch noch mal überdenken:
    Code:
    void Zeige_Uhrzeit ()
    {
      int StundeBit = hour()%10;
      int MinuteBit = minute()%10;
       
      lcd.clear();
      if(hour() < 10)
      {
        Null (1, 0);
      }
      else if ((hour()>10) && (hour()<20))
      {
        Eins (1, 0);
      }
      else if ((hour()>=20) && (hour()<=24))
      {
        Zwei(1, 0);
      }
      
      switch (StundeBit)
      {
        case (0):
        {
          Null (5, 0);
        } break;
         case (1):
        {
          Eins (5, 0);
        } break;
         case (2):
        {
          
         Zwei (5, 0);
        } break;
         case (3):
        {
          Drei (5, 0);
        } break;
         case (4):
        {
          Vier (5, 0);
        } break;
         case (5):
        {
          Fuenf (5, 0);
        } break;
         case (6):
        {
          Sechs (5, 0);
        } break;
         case (7):
        {
          Sieben (5, 0);
        } break;
         case (8):
        {
          Acht (5, 0);
        }
        case(9):
        {
          Neun (5, 0);
        } break;
      }
      
            if(second()%2 == 0)
      {
          Doppelpunkt(9, 0);
          Doppelpunkt(10, 0);
      }
      
      if(minute() < 10)
      {
        Null (12, 0);
      }
      else if ((minute()>=10) && (minute()<20))
      {
        Eins (12, 0);
      }
      else if ((minute()>=20) && (minute()<30))
      {
        Zwei(12, 0);
      }
      else if ((minute()>=30) && (minute()<40))
      {
        Drei(12, 0);
      }
      else if ((minute()>=40) && (minute()<50))
      {
        Vier(12, 0);
      }
       else if ((minute()>=50) && (minute()<60))
      {
        Fuenf(12, 0);
      }
      else if (minute()==60)
      {
        Sechs(12, 0);
      }
    
      switch (MinuteBit)
      {
        case (0):
        {
          Null (16, 0);
        } break;
         case (1):
        {
          Eins (16, 0);
        } break;
        case (2):
        {
         Zwei (16, 0);
        } break;
        case (3):
        {
          Drei (16, 0);
        } break;
        case (4):
        {
          Vier (16, 0);
        } break;
        case (5):
        {
          Fuenf (16, 0);
        } break;
        case (6):
        {
          Sechs (16, 0);
        } break;
        case (7):
        {
          Sieben (16, 0);
        } break;
        case (8):
        {
          Acht (16, 0);
        }
        case(9):
        {
          Neun (16, 0);
        } break;
      }
    }
    Ein bisschen lang - aber es funktioniert =)

    Edit: Meine Zeit wird in folgendem Format geliefert: HH:MM:SS.
    Edit: Ich muss gestehen, dass ich deine Möglichkeit immer noch nicht verstehe. Liegt mit Sicherheit daran, dass ich mich mehr mit Spieleprogrammierung beschäftigt habe ... Aber mach dir nix drauß ... deine Lösung ist bestimmt besser, aber meine Funkiutoniert ja auch!

    LG!
    Geändert von NukeNoob (15.04.2012 um 13:33 Uhr)

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von robo_tom_24
    Registriert seit
    04.02.2012
    Ort
    Burgenland, Österreich
    Beiträge
    485
    Wenn ichs dir nochmals erklären soll, als Text, bitte melden
    Für eine Arbeit soll der Code ja auch schön sein

    mfg thomas

+ Antworten

Ähnliche Themen

  1. LCDChar Designer für Eigene Zeichen in BASCOM...
    Von MST_NRW im Forum Open Source Software Projekte
    Antworten: 23
    Letzter Beitrag: 04.03.2012, 11:30
  2. Problem mit LCD03, mit eigene Zeichen erstellen ?
    Von Enterprise im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 22.03.2009, 15:05
  3. EA DOG Display, eigene Zeichen in Bascom !?
    Von comex im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 27.02.2007, 01:44
  4. Große Zeichen auf Display ausgeben
    Von Olle_Filzlaus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 11
    Letzter Beitrag: 28.02.2006, 21:57
  5. Spezielles Ascii zeichen im Hyperterminal ausgeben
    Von Andun im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 18.07.2005, 21:21

Stichworte

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •