Beim Arduino mit rtc Datum auslesen und in einem String umwandeln.

  • Hallo zusammen


    Ich programmiere mir gerade einen Monitor für meinen Arduino, soweit so Gut. Ich benutze dazu das Terminal Putty 062 , was auch ganz Gut funktionirt, Da ich aber nicht mit Serial.Print die Daten auf dem Putty ausgeben kann ohne das er eweig schrollt möchte ich gerne das Datum aus der RTC in einem String zur weiter Verarbeitung nutzen......meine Frage:


    Ich möchte gerne mein System Datum in einen Text umwandeln. Ist das möglich? und zwar lese ich aus meiner RTC 1307 das Datum mit datum[4] für Tag datum[5] für Monat und datum[6] für Jahr aus. Aus diesen 3 Angaben möchte ich einen String machen wie z.B 2-7-13 ist das möglich. Ich bin soweit das ich die UHR sowie die Pumpensteuerung und Beleuchtungssteuerung realisiert habe , jedoch komme ich nicht mit dem Datum zurecht. Villeicht hat ja einer Ahnung von C++ und kann mir weiter helfen. Ich hänge einmal ein Bild an damit man sieht was ich meine. Also die Uhr wird ohne zu Scrollen angezeigt, die Pumpen werden mit Pumpe 1 und Pumpe 2 angezeigt jenach dem welche an ist, Mittig wird der Status der Beleuchtung angezeigt, Hauptbeleuchtung, Blaue Stunde, Mondlicht, Unwetter u.s.w. das klappt auch soweit nur das Datum bereitet mir noch Probleme. Das alles wird auf einem Netbook ausgegeben und ich kann es über TeamViever vom Hauptprogramm steuern.

  • Hi Jürgen,


    ohne Code kann man dir da schlecht helfen, man weiss nichtmal welche Library benutzt wird, etc.


    Der Screenshot sagt ja eigentlich nicht viel aus.


    Du kannst allerdings mal versuchen, die 3 werte in variablen zu schreiben, und die dann mit print auszugeben?


    Viele Grüße


    Markus

  • Hallo


    ich hab selber noch nicht viel Ahnung vlt hilft dir das ja


    Gruß Kalli


    Code
    DateTime now = RTC.now(); 
      char string[ 10 ] = { "" };
      lcd.setCursor(0, 0);
      sprintf(string,"%02d/%02d/%d",now.day(),now.month(),now.year());
      lcd.print(string); 
      sprintf(string,"%02d:%02d:%02d",now.hour(),now.minute(),now.second());
  • Hallo Markus


    Der code ist ja nicht das Problem, Ich weiss nur nicht wenn ich das Datum mit datum[ 4 ] datum[ 5 ] datum[ 6 ] auslese gibt er mir den Tag,Monat,Jahr an das kann ich auch mit int tage = datum[ 4 ] u.s.w in Variablen packen, aber dann möchte ich die Variablen in einem String zusammen fassen und den String so in den Putty ausgeben: z.B wenn es der heutige Tag wäre 02-07-13 aber wenn ich das mit Serial.print auf dem Putty ausgeben will dann scrollt der Bildschirm. Der Code womit ich beim Putty ausgeben kann ohne zu scrollen habe ich eingefügt, weil man da die Cursor Positionen angibt. Denn es muss ja möglich sein das Datum in einem String zu packen und der String wird jeden tag erneuert. ich weis auch nicht ob ich in den Anweisungen zur Ausgabe bei dem Putty die Unten stehen wo ich die Schriftzüge für den Monitor erstellt habe ob ich da auch die Variablen ausgeben kann dann wäre es ja noch einfacher. Aber das ist mir bis jetzt noch nicht gelungen, da gibt er mir immer Fehlermeldungen irgend was mit Char* raus wo ich dann nicht mehr weiter weis.



    #define ANSI_ESCAPE_SEQUENCE(c) "\33[" c
    #define ESC_RESET ANSI_ESCAPE_SEQUENCE("0m")
    #define ESC_BOLD_ON ANSI_ESCAPE_SEQUENCE("1m")
    #define ESC_ITALICS_ON ANSI_ESCAPE_SEQUENCE("3m")
    #define ESC_UNDERLINE_ON ANSI_ESCAPE_SEQUENCE("4m")
    #define ESC_INVERSE_ON ANSI_ESCAPE_SEQUENCE("7m")
    #define ESC_STRIKETHROUGH_ON ANSI_ESCAPE_SEQUENCE("9m")
    #define ESC_BOLD_OFF ANSI_ESCAPE_SEQUENCE("22m")
    #define ESC_ITALICS_OFF ANSI_ESCAPE_SEQUENCE("23m")
    #define ESC_UNDERLINE_OFF ANSI_ESCAPE_SEQUENCE("24m")
    #define ESC_INVERSE_OFF ANSI_ESCAPE_SEQUENCE("27m")
    #define ESC_STRIKETHROUGH_OFF ANSI_ESCAPE_SEQUENCE("29m")
    #define ESC_FG_BLACK ANSI_ESCAPE_SEQUENCE("30m")
    #define ESC_FG_RED ANSI_ESCAPE_SEQUENCE("31m")
    #define ESC_FG_GREEN ANSI_ESCAPE_SEQUENCE("32m")
    #define ESC_FG_YELLOW ANSI_ESCAPE_SEQUENCE("33m")
    #define ESC_FG_BLUE ANSI_ESCAPE_SEQUENCE("34m")
    #define ESC_FG_MAGENTA ANSI_ESCAPE_SEQUENCE("35m")
    #define ESC_FG_CYAN ANSI_ESCAPE_SEQUENCE("36m")
    #define ESC_FG_WHITE ANSI_ESCAPE_SEQUENCE("37m")
    #define ESC_FG_DEFAULT ANSI_ESCAPE_SEQUENCE("39m")
    #define ESC_BG_BLACK ANSI_ESCAPE_SEQUENCE("40m")
    #define ESC_BG_RED ANSI_ESCAPE_SEQUENCE("41m")
    #define ESC_BG_GREEN ANSI_ESCAPE_SEQUENCE("42m")
    #define ESC_BG_YELLOW ANSI_ESCAPE_SEQUENCE("43m")
    #define ESC_BG_BLUE ANSI_ESCAPE_SEQUENCE("44m")
    #define ESC_BG_MAGENTA ANSI_ESCAPE_SEQUENCE("45m")
    #define ESC_BG_CYAN ANSI_ESCAPE_SEQUENCE("46m")
    #define ESC_BG_WHITE ANSI_ESCAPE_SEQUENCE("47m")
    #define ESC_BG_DEFAULT ANSI_ESCAPE_SEQUENCE("49m")
    #define ESC_CURSOR_POS(L,C) ANSI_ESCAPE_SEQUENCE(#L ";" #C "H")
    #define ESC_CURSOR_UP(L) ANSI_ESCAPE_SEQUENCE(#L "A")
    #define ESC_CURSOR_DOWN(L) ANSI_ESCAPE_SEQUENCE(#L "B")
    #define ESC_CURSOR_FORWARD(C) ANSI_ESCAPE_SEQUENCE(#C "C")
    #define ESC_CURSOR_BACKWARD(C) ANSI_ESCAPE_SEQUENCE(#C "D")
    #define ESC_CURSOR_POS_SAVE ANSI_ESCAPE_SEQUENCE("s")
    #define ESC_CURSOR_POS_RESTORE ANSI_ESCAPE_SEQUENCE("u")
    #define ESC_ERASE_DISPLAY ANSI_ESCAPE_SEQUENCE("2J")
    #define ESC_ERASE_LINE ANSI_ESCAPE_SEQUENCE("K")


    #define ESC_CURSOR_OFF ANSI_ESCAPE_SEQUENCE("?25l")
    #define ESC_CURSOR_ON ANSI_ESCAPE_SEQUENCE("?25h")



    void s(char* str)


    { // put string to Serial - short form
    Serial.print(str);
    }


    void sendcursor(int r, int c)
    { // set ANSI terminal cursor to specified row and column
    char str[12];

    sprintf(str,"\33[%d;%dH",r,c);
    s(str);
    }


    void settext(char* fg, char* bg, char* cup, char* str)
    // send text to terminal with foreground color, background color, cursor position
    {
    s(cup);
    s(fg);
    s(bg);
    s(str);

    }


    void clearsquare(char* fg, char* bg, int r1, int c1, int r2, int c2)




    { // clears a square on the terminal window with colors set
    s(fg);
    s(bg);
    for (int i=0;i<r2-r1;i++)
    {
    sendcursor(r1+i, c1);
    for (int i=0;i<c2-c1;i++) s(" ");
    }
    }


    char time[]=__TIME__;
    int stunden,minuten,sekunden,datum;


    void ShowScreen()
    // Die Bildschirmmaske ausgeben (was gleich bleibt)


    {
    char* color;
    s(ESC_BG_GREEN);
    s(ESC_FG_GREEN);
    s(ESC_ERASE_DISPLAY);
    s(ESC_CURSOR_OFF);
    for (int i=0;i<6;i++)
    {


    // clearsquare(ESC_FG_BLACK,color, 2+i,2+2*i, 15-i,32-2*i);
    }
    }


    void showTime()


    // Die veränderlichen Teile des Bildschirms ausgeben (Zeitanzeige)
    {
    char textbuffer[10];

    sprintf(textbuffer,"%02d:%02d:%02d",stunden,minuten,sekunden);


    // Zeit nochmal ausgaben und zwar mit doppelter Textgröße weiter unten


    // Titel
    settext(ESC_FG_BLUE, ESC_BG_GREEN, ESC_CURSOR_POS(3, 25), "\33#3");
    settext(ESC_FG_BLUE, ESC_BG_GREEN, ESC_CURSOR_POS(3, 25), "AQUA-CONTROL");
    settext(ESC_FG_RED, ESC_BG_GREEN, ESC_CURSOR_POS(4, 25), "\33#4");
    settext(ESC_FG_RED, ESC_BG_GREEN, ESC_CURSOR_POS(4, 25), "AQUA-CONTROL");
    settext(ESC_FG_RED, ESC_BG_GREEN, ESC_CURSOR_POS(5, 25), "************");
    // Untertitel Datum
    settext(ESC_FG_RED, ESC_BG_GREEN, ESC_CURSOR_POS(5, 50), "\33#3");
    settext(ESC_FG_RED, ESC_BG_GREEN, ESC_CURSOR_POS(5, 50), "Datum:");
    settext(ESC_FG_BLUE, ESC_BG_GREEN, ESC_CURSOR_POS(6, 50), "\33#4");
    settext(ESC_FG_BLUE, ESC_BG_GREEN, ESC_CURSOR_POS(6, 50), "Datum:");
    // Untertitel Temeratur
    settext(ESC_FG_BLUE, ESC_BG_GREEN, ESC_CURSOR_POS(15, 5), "\33#3");
    settext(ESC_FG_BLUE, ESC_BG_GREEN, ESC_CURSOR_POS(15, 5), "Temperatur:");
    settext(ESC_FG_RED, ESC_BG_GREEN, ESC_CURSOR_POS(16, 5), "\33#4");
    settext(ESC_FG_RED, ESC_BG_GREEN, ESC_CURSOR_POS(16, 5), "Temperatur:");
    // Pumpen Status
    settext(ESC_FG_BLUE, ESC_BG_GREEN, ESC_CURSOR_POS(15, 50), "\33#3");
    settext(ESC_FG_BLUE, ESC_BG_GREEN, ESC_CURSOR_POS(15, 50), "Pumpe:");
    settext(ESC_FG_RED, ESC_BG_GREEN, ESC_CURSOR_POS(16, 50), "\33#4");
    settext(ESC_FG_RED, ESC_BG_GREEN, ESC_CURSOR_POS(16, 50), "Pumpe:");
    // Untertitel Uhrzeit
    settext(ESC_FG_RED, ESC_BG_GREEN, ESC_CURSOR_POS(5, 5), "\33#3");
    settext(ESC_FG_RED, ESC_BG_GREEN, ESC_CURSOR_POS(5, 5), "Uhrzeit:");
    settext(ESC_FG_BLUE, ESC_BG_GREEN, ESC_CURSOR_POS(6, 5), "\33#4");
    settext(ESC_FG_BLUE, ESC_BG_GREEN, ESC_CURSOR_POS(6, 5), "Uhrzeit:");
    // Uhr anzeige
    settext(ESC_FG_RED, ESC_BG_GREEN, ESC_CURSOR_POS(7, 5), "\33#3");
    s(textbuffer);
    settext(ESC_FG_RED, ESC_BG_GREEN, ESC_CURSOR_POS(8, 5), "\33#4");
    s(textbuffer);




    }



    void tickOneSecond()
    {
    sekunden++;
    if (sekunden>=60) {sekunden=0;minuten++;}
    if (minuten>=60) {minuten=0;stunden++;}
    if (stunden>=24) {stunden=0;}

    }


    // RTC 1307 auslesen und im Programm angeben.


    #include "LCD4Bit_mod.h"
    #include "Wire.h"


    #define DS1307_I2C_ADDRESS 0x68 // I2C Adresse

    char buffer[20] = ""; // Speicherbereich für Datenkonvertierung

    LCD4Bit_mod lcd = LCD4Bit_mod(2); // LCD-Display

    /****************************************************************************************************
    * Konvertierung BCD-kodierter Dezimalzahl
    */
    byte bcdToDec(byte val)
    {
    return ( (val/16*10) + (val%16) );
    }


    /****************************************************************************************************
    * Zeit und Datum aus DS1307 auslesen und konvertieren
    */
    void getDateDs1307(int date[])
    {
    Wire.beginTransmission(DS1307_I2C_ADDRESS); // I2C-Kommunikation im Schreibmodus starten
    Wire.send(0x00); // Registerzeiger auf 0 setzen
    Wire.endTransmission(); // I2C-Kommunikation beenden
    Wire.requestFrom(DS1307_I2C_ADDRESS, 7); // I2C-Kommunikation im Lesemodus starten

    date[ 0 ] = bcdToDec(Wire.receive() & 0x7f); // Sekunden
    date[ 1 ] = bcdToDec(Wire.receive()); // Minuten
    date[ 2 ] = bcdToDec(Wire.receive() & 0x3f); // Stunden
    date[ 3 ] = bcdToDec(Wire.receive()); // Wochentag
    date[ 4 ] = bcdToDec(Wire.receive()); // Tag
    date[ 5 ] = bcdToDec(Wire.receive()); // Monat
    date[ 6 ] = bcdToDec(Wire.receive()); // Jahr
    }

    /**************************** Geschatete Pin für LED bestimmen ************************************************************************
    */



    int ledPin1 = 10; // LED GRÜN an analog pin 10
    int ledPin2 = 9; // LED BLAU an analog pin 9
    int ledPin4 = 11; // Status LED1
    int ledPin5 = 12; //Status LED2

  • Danke jokerjux


    ich bin für jeden Tipp dankbar und werde es gleich einmal ausprobieren. Das Dumme ist ich habe meinen Mega am Aquarium angeschlossen und Programiere an meinem Großen PC , da habe ich auch einen Mega aber keine RTC 1307 und es ist immer so lästig das Programm rüber zu senden zu meinem Netbook am Aquarium der mir als Monitor dient. Dadurch das ich an dem Mega an meinem PC keine Clock habe kann ich auch nicht sehen ob er die Zeit und das Datum anzeigt :) naja ich werde mir wohl noch eine RTC bestellen müssen , da ich ziemlich Faul bin immer alles zum Netbook zu senden und vor allen Dingen bei jedem Test am Netbook resettet der Controller am Aqua und dann ist die Zeit wo er Hoch gedimmt hat vorbei und die IF Abfragen stimmen Zeitlich nicht mehr. Ich muss mir unbedingt eine Sicherheits Abfrage einbauen damit der Mega nach dem resetten wieder in dem alten Zustand ist und alles so schaltet als wenn er nicht aus gewesen :thumbup: