{"id":1658,"date":"2012-12-11T13:27:54","date_gmt":"2012-12-11T13:27:54","guid":{"rendered":"https:\/\/blog.ecotronics.ch\/wordpress\/?p=1658"},"modified":"2013-02-10T16:57:56","modified_gmt":"2013-02-10T16:57:56","slug":"arduino-als-uhr","status":"publish","type":"post","link":"https:\/\/blog.ecotronics.ch\/wordpress\/?p=1658","title":{"rendered":"Arduino als Uhr"},"content":{"rendered":"<div id=\"attachment_1663\" style=\"width: 310px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/12\/TimeArduinoCSharp3.jpg\"><img aria-describedby=\"caption-attachment-1663\" decoding=\"async\" loading=\"lazy\" class=\"size-medium wp-image-1663\" title=\"Mit CSharp initialisiert man im Arduino Uhrzeit und Tagesdatum\" src=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/12\/TimeArduinoCSharp3-300x180.jpg\" alt=\"\" width=\"300\" height=\"180\" srcset=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/12\/TimeArduinoCSharp3-300x180.jpg 300w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/12\/TimeArduinoCSharp3-150x90.jpg 150w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/12\/TimeArduinoCSharp3-400x241.jpg 400w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/12\/TimeArduinoCSharp3.jpg 677w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1663\" class=\"wp-caption-text\">Mit CSharp initialisiert man im Arduino Uhrzeit und Tagesdatum<\/p><\/div>\n<p>Noch immer arbeite ich an meinem Fernziel, dem vollautomatisierten Treibh\u00e4uschen. Doch aktuell besch\u00e4ftige ich mich v.a. mit der \u00dcberwachung von verschiedenen Sensorwerten. Im folgenden bringe ich nur ein ganz kleines Bruchst\u00fcck daraus: Noch immer fehlt mir ja eine Realtime Clock, da ich diese Komponente durch unsachgem\u00e4sse Behandlung zerst\u00f6rt habe. Das hat mich dazu gebracht, mich etwas n\u00e4her mit dem Thema &#8220;Arduino und Zeit&#8221; zu besch\u00e4ftigen. Dabei ist mir klar geworden, dass eine <strong>Realtime Clock<\/strong> gar <strong>nicht notwendig<\/strong> ist, <strong>solange man die Stromversorgung des Arduino nicht unterbricht<\/strong>.<\/p>\n<p>Mit der<strong> Library &#8220;Time&#8221; <\/strong>funktioniert der <strong>Arduino <\/strong>n\u00e4mlich selbst <strong>als Uhr<\/strong>. Man muss das Board einzig <strong>mit der aktuellen Zeit initialisieren<\/strong>, z.B. \u00fcber die <strong>serielle Schnittstelle<\/strong>. Den Code dazu stelle ich in diesem Artikel vor. Allerdings wird die aktuelle Uhrzeit nicht manuell \u00fcber die serielle Schnittstelle eingegeben (was zwar m\u00f6glich, aber nicht sehr genau ist), sondern \u00fcber CSharp.<\/p>\n<p>Die \u00dcbergabe der aktuellen Zeit erfolgt mit einem <strong>String genau definierter L\u00e4nge<\/strong>, bzw. f\u00fcr Arduino mit einem <strong>Array of Char<\/strong>. Das CSharp-Programm muss deshalb die Uhrzeit genau so formatieren, wie Arduino sie erwartet. Denken Sie daran, dass ein Array of Char in Arduino immer ein Zeichen zus\u00e4tzlich f\u00fcr das Endzeichen ben\u00f6tigt. Und arbeiten Sie nicht mit Println, sondern mit Print, denn sonst wird der aufbereitete String um das (oder die) Endzeichen l\u00e4nger!<\/p>\n<p>Der Arduino-Code besteht aus einer abgewandelten Version des Beispielprogramms, das in der Time-Library dabei ist. Erg\u00e4nzt wurde es um ein paar Zeilen Code, welche <strong>die Zeit mit einem String aus der seriellen Schnittstelle auslesen<\/strong>.<\/p>\n<p>Nachtrag am 10.02.2013: Inzwischen gibt es ein <a href=\"https:\/\/blog.ecotronics.ch\/wordpress\/2013\/arduino-als-uhr-version-2-mit-rtc-komponente-und-led-display\/\">Update dieses Projekts mit RTC und Anzeige der Uhrzeit<\/a> in einem LED-Display.<\/p>\n<h1>Projektziel<\/h1>\n<p>Arduino mithilfe der <strong>Time-Library<\/strong> und der seriellen Schnittstelle mit dem <strong>Tagesdatum <\/strong>und der <strong>aktuellen Zeit initialisieren<\/strong>, so dass Arduino als Uhr fungiert, und sp\u00e4ter beliebige Sensorwerte mit Datum und Zeit erg\u00e4nzt werden k\u00f6nnen.<\/p>\n<h1>Komponenten<\/h1>\n<p>Die Dokumentation und der Link zum Download der Time Library finden sich auf dem <a href=\"http:\/\/playground.arduino.cc\/Code\/Time\" target=\"_blank\">Arduino Playground<\/a>.<\/p>\n<ul>\n<li>1 Arduino beliebigen Typs<\/li>\n<li>1 Computer mit installierter Arduino IDE, Time-Library und Entwicklungsumgebung f\u00fcr CSharp (z.B. VS Express)<\/li>\n<li>1 USB-Kabel zur Verbindung von Arduino und PC<\/li>\n<li>1 externe Stromversorgung f\u00fcr den Arduino, z.B. \u00fcber 1 9V-Batterie mit zugeh\u00f6rigem Kabel<\/li>\n<\/ul>\n<h1>Best\u00fcckungsplan<\/h1>\n<p>Ein Best\u00fcckungsplan entf\u00e4llt, da es sich um ein reines Codebeispiel handelt. Wichtig ist bei der Verkabelung einzig, dass die <strong>Stromversorgung nicht mehr unterbrochen<\/strong> wird, <strong>sobald <\/strong>man die <strong>Uhrzeit initialisiert<\/strong> hat! Bevor man also den Arduino vom PC abh\u00e4ngt, muss man ihn mit einem externen Netzteil oder mit einer 9V-Batterie mit Strom versorgen.<\/p>\n<h1>Code<\/h1>\n<p>Das Beispiel enth\u00e4lt zwei Teile: den Arduino-Code und den CSharp-Code.<br \/>\nZwei wichtige Tipps noch: <\/p>\n<ul>\n<li>Man kann <strong>nicht gleichzeitig den seriellen Monitor in Arduino ge\u00f6ffnet<\/strong> haben und von <strong>CSharp <\/strong>aus die <strong>Zeit initialisieren<\/strong>. Deshalb muss man zuerst den seriellen Monitor schliessen, bevor man das CSharp-Programm startet. <\/li>\n<li>Ausserdem wird bei den meisten Arduino-Boards die <strong>Setup-Routine aufgerufen, wenn man den Serial Monitor startet <\/strong>(<a href=\"http:\/\/playground.arduino.cc\/Code\/Time\">Quelle<\/a>). Also darf man nach der Zeit-Initialisierung den Monitor nicht mehr \u00f6ffnen, sonst wird die Uhrzeit auf 0 zur\u00fcckgesetzt.<\/li>\n<\/ul>\n<h2>CSharp-Code<\/h2>\n<p>Hier der CSharp-Code, der die aktuelle Zeit an den Arduino schickt:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nusing System;\r\nusing System.IO.Ports;\r\nusing System.Configuration;\r\nusing ch.ecotronics.arduino.time.Properties;\r\n\r\n\/*\r\n * Arduino als Uhr\r\n * Aktuelle Zeit und Tagesdatum an serielle Schnittstelle senden\r\n * Autorin: Silvia Rothen, rothen ecotronics, Bern, Switzerland\r\n * https:\/\/blog.ecotronics.ch\/wordpress\/2012\/arduino-als-uhr\/\r\n *\r\n *\/\r\nnamespace ch.ecotronics.arduino.time {\r\n  class ArduinoTimeSetter {\r\n\r\n    static void Main(string[] args) {\r\n      Settings settings = new Settings();\r\n      SerialPort port = new SerialPort(settings.port, 9600);\r\n      DateTime now = DateTime.Now;\r\n      port.Open();\r\n      \/\/die Zeit wird f\u00fcr Arduino passend formatiert\r\n      String arduinoTime = String.Format(&quot;{0:HHmmssddMMyyyy}&quot;, DateTime.Now);\r\n      Console.WriteLine(arduinoTime);\r\n      \/\/hier wird die Zeit an die serielle Schnittstelle geschickt\r\n      port.Write(arduinoTime);\r\n      while (true) {\r\n        Console.WriteLine(&quot;From Arduino &quot; + port.ReadLine());\r\n      }\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<p>Die serielle Schnittstelle wird \u00fcbrigens in die Konfigurationsdatei ausgelagert, damit man die serielle Schnittstelle auch auf einen anderen Port h\u00e4ngen kann, ohne das CSharp-Programm neu kompilieren zu m\u00fcssen.<br \/>\nIn App.config steht<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot;?&gt;\r\n&lt;configuration&gt;\r\n    &lt;configSections&gt;\r\n        &lt;sectionGroup name=&quot;applicationSettings&quot; \r\n          type=&quot;System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot; &gt;\r\n            &lt;section name=&quot;ch.ecotronics.arduino.time.Properties.Settings&quot; \r\n              type=&quot;System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot; \r\n              requirePermission=&quot;false&quot; \/&gt;\r\n        &lt;\/sectionGroup&gt;\r\n    &lt;\/configSections&gt;\r\n    &lt;startup&gt; \r\n        \r\n    &lt;supportedRuntime version=&quot;v2.0.50727&quot;\/&gt;&lt;\/startup&gt;\r\n    &lt;applicationSettings&gt;\r\n        &lt;ch.ecotronics.arduino.time.Properties.Settings&gt;\r\n            &lt;setting name=&quot;port&quot; serializeAs=&quot;String&quot;&gt;\r\n                &lt;value&gt;COM9&lt;\/value&gt;\r\n            &lt;\/setting&gt;\r\n        &lt;\/ch.ecotronics.arduino.time.Properties.Settings&gt;\r\n    &lt;\/applicationSettings&gt;\r\n&lt;\/configuration&gt;<\/pre>\n<h2>Arduino-Code<\/h2>\n<p>Und hier der Arduino-Code, der die Zeit einliest:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/*\r\n * Arduino als Uhr\r\n * Weiterentwicklung des mit der Time Library mitgelieferten Beispiels\r\n * Autorin: Silvia Rothen, rothen ecotronics, Bern, Switzerland\r\n * https:\/\/blog.ecotronics.ch\/wordpress\/2012\/arduino-als-uhr\/\r\n *\r\n *\/\r\n\r\n#include &lt;Time.h&gt;\r\nchar incoming[15] = {}; \/\/wegen Endzeichen\r\nint led = 13; \r\n\r\nvoid setup() {\r\n  Serial.begin(9600);\r\n}\r\n\r\nvoid loop() {\r\n  int i = 0;\r\n \r\n  \/\/Zeit aus der seriellen Schnittstelle auslesen\r\n  if (Serial.available() &gt; 0) {\r\n    \/\/Array of Char leeren\r\n    memset(incoming, 0, sizeof(incoming));\r\n    \/\/Zeit wird geliefert als HHmmssddMMyyyy, z.B. 23120027112012\r\n    while (Serial.available() &gt; 0 &amp;&amp; i &lt; sizeof(incoming) - 1) {\r\n      incoming[i] = Serial.read();\r\n      i++;\r\n      delay(3);\r\n    }\r\n    \r\n    \/\/in Zeit umwandeln\r\n    char hr[3] = {};\r\n    char min[3] = {};\r\n    char sec[3] = {};\r\n    char day[3] = {};\r\n    char month[3] = {};\r\n    char yr[5] = {};\r\n    hr[0] = incoming[0];\r\n    hr[1] = incoming[1];\r\n    min[0] = incoming[2];\r\n    min[1] = incoming[3];\r\n    sec[0] = incoming[4];\r\n    sec[1] = incoming[5];\r\n    day[0] = incoming[6];\r\n    day[1] = incoming[7];\r\n    month[0] = incoming[8];\r\n    month[1] = incoming[9];\r\n    yr[0] = incoming[10];\r\n    yr[1] = incoming[11];\r\n    yr[2] = incoming[12];\r\n    yr[3] = incoming[13];\r\n    setTime(atoi(hr), atoi(min), atoi(sec), \r\n      atoi(day), atoi(month), atoi(yr));\r\n    Serial.println(&quot;!new Time set&quot;);\r\n  }\r\n \r\n  \/\/Zeit anzeigen\r\n  digitalClockDisplay();\r\n  \/\/1 Sekunde warten\r\n  delay(1000);\r\n}\r\n\r\nvoid digitalClockDisplay(){\r\n  \/\/ Digitalanzeige der Zeit\r\n  printDigits(hour(), &quot;&quot;);\r\n  printDigits(minute(), &quot;:&quot;);\r\n  printDigits(second(), &quot;:&quot;);\r\n  printDigits(day(), &quot; &quot;);\r\n  printDigits(month(), &quot;.&quot;);\r\n  Serial.print(&quot;.&quot;);\r\n  Serial.print(year());\r\n  Serial.println();\r\n}\r\n\r\nvoid printDigits(int digits, char trennzeichen[2] ){\r\n  \/\/ Hilfsfunktion zur Uhrendarstellung: Gibt vorstehenden Doppelpunkt und f\u00fchrende 0 aus\r\n  Serial.print(trennzeichen);\r\n  if(digits &lt; 10) {\r\n    Serial.print('0');\r\n  }\r\n  Serial.print(digits);\r\n}\r\n<\/pre>\n<h1>Demo<\/h1>\n<div id=\"attachment_1661\" style=\"width: 310px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/12\/TimeArduinoCSharp2.jpg\"><img aria-describedby=\"caption-attachment-1661\" decoding=\"async\" loading=\"lazy\" class=\"size-medium wp-image-1661\" title=\"Arduino als Uhr\" src=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/12\/TimeArduinoCSharp2-300x241.jpg\" alt=\"\" width=\"300\" height=\"241\" srcset=\"https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/12\/TimeArduinoCSharp2-300x241.jpg 300w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/12\/TimeArduinoCSharp2-150x120.jpg 150w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/12\/TimeArduinoCSharp2-400x322.jpg 400w, https:\/\/blog.ecotronics.ch\/wordpress\/wp-content\/uploads\/2012\/12\/TimeArduinoCSharp2.jpg 867w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1661\" class=\"wp-caption-text\">Arduino als Uhr<\/p><\/div>\n<p>Viel zu sehen gibt es nicht bei diesem Projekt, hier trotzdem ein  Screenshot der Uhrzeit, die \u00fcber die serielle Schnittstelle angezeigt  wird.<\/p>\n","protected":false},"excerpt":{"rendered":"<p id=\"caption-attachment-1663\" class=\"wp-caption-text\">Mit CSharp initialisiert man im Arduino Uhrzeit und Tagesdatum<\/p>\n<p>Noch immer arbeite ich an meinem Fernziel, dem vollautomatisierten Treibh\u00e4uschen. Doch aktuell besch\u00e4ftige ich mich v.a. mit der \u00dcberwachung von verschiedenen Sensorwerten. Im folgenden bringe ich nur ein ganz kleines Bruchst\u00fcck daraus: Noch immer fehlt mir ja eine Realtime Clock, da ich diese Komponente [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":1663,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[160,158],"tags":[296,185,169,192,190,191],"_links":{"self":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1658"}],"collection":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1658"}],"version-history":[{"count":19,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1658\/revisions"}],"predecessor-version":[{"id":1931,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1658\/revisions\/1931"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=\/wp\/v2\/media\/1663"}],"wp:attachment":[{"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1658"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1658"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ecotronics.ch\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1658"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}