{"id":5759,"date":"2026-01-28T17:09:54","date_gmt":"2026-01-28T16:09:54","guid":{"rendered":"https:\/\/www.rommelkist.nl\/elec\/?p=5759"},"modified":"2026-02-11T12:41:14","modified_gmt":"2026-02-11T11:41:14","slug":"test","status":"publish","type":"post","link":"https:\/\/www.rommelkist.nl\/elec\/elektronica\/test\/","title":{"rendered":"Een nieuw klokje"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Nou ja, het nieuwe jaar is alweer bijna een maand oud en sinds december geen nieuw bericht geplaatst. Tja, druk met andere zaken! Maar daar gaat dit hier, nu niet over! <br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2026\/02\/alleen-klokje.jpeg\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"491\" src=\"https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2026\/02\/alleen-klokje.jpeg\" alt=\"\" class=\"wp-image-5824\" srcset=\"https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2026\/02\/alleen-klokje.jpeg 500w, https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2026\/02\/alleen-klokje-300x295.jpeg 300w, https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2026\/02\/alleen-klokje-425x417.jpeg 425w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><figcaption class=\"wp-element-caption\">Het is vijf voor half vijf<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Een nieuw klokje. Voor de verandering.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2026\/01\/Klokje.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"642\" src=\"https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2026\/01\/Klokje-1024x642.jpg\" alt=\"\" class=\"wp-image-5766\" srcset=\"https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2026\/01\/Klokje-1024x642.jpg 1024w, https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2026\/01\/Klokje-300x188.jpg 300w, https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2026\/01\/Klokje-768x482.jpg 768w, https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2026\/01\/Klokje-425x267.jpg 425w, https:\/\/www.rommelkist.nl\/wp-content\/uploads\/2026\/01\/Klokje.jpg 1264w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Het 15:30, of een paar minuten later &#8230;<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Deze klok wordt gevormd door een RGB-LED-ring met 12 Neopixels. De LED&#8217;s geven zowel de uren als de minuten (per vijf) aan. Uren zijn rood, minuten zijn blauw. Waanneer de uren en de minuten samenvallen (bijvoorbeeld 5 over \u00e9\u00e9n, of kwart voor tien) is de LED groen.<br>Met het pot-metertje is de intensiteit van de LED in te stellen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Uiteindelijk heb ik drie versies gemaakt voor wat betreft de tijdinstelling. <br>In de eerste Arduino Nano-versie heb ik gewoon de tijd ingevoerd in de code op het moment van uploaden van de sketch. Dat werkte prima, gebruikmakend van de millis()-functie. Natuurlijk moet je dan telkens wanneer de stroom eraf is geweest, ook telkens de tijd in de code aanpassen en de Arduino opnieuw flushen. Niet handig dus.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n    if ( millis() - msTick &gt;999) {\n        msTick=millis();\n        seconde++;   \n    }\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">De tweede versie maakte gebruik van een Arduino Nano met een RTC (<a href=\"https:\/\/www.vdrelectronics.com\/ds3231-precisie-rtc-module-gebruiken-met-arduino?srsltid=AfmBOoqPtAeX0-CtdGq8lI84oze-PwyutPyxYrFPI1wxrSGZN9Er7WmP\">DS3231<\/a>)-module. Deze module heeft een oplaadbare batterij aan boord die ervoor zorgt dat de tijd en de datum vastgehouden worden wanneer de stroomvoorziening afgekoppeld wordt. Ook dat werkte prima, maar de oplaadbare batterij (CR2032) deed het niet meer (te oud). Waardoor het ook weer gerommel met de tijd opleverde. Snel een nieuwe oplaadbare batterij regelen lukte even niet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hieronder de Arduino-code van de tweede versie. Rommelig en vast ineffici\u00ebnt, maar &#8230; &#8217;t werkte wel.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n#include &lt;Adafruit_NeoPixel.h&gt;\n\n#define PIN 6\n#include &quot;RTClib.h&quot;\n\nRTC_DS3231 rtc;\n\n\/\/ Parameter 1 = number of pixels in strip\n\/\/ Parameter 2 = pin number (most are valid)\n\/\/ Parameter 3 = pixel type flags, add together as needed:\n\/\/   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w\/WS2812 LEDs)\n\/\/   NEO_KHZ400  400 KHz (classic &#039;v1&#039; (not v2) FLORA pixels, WS2811 drivers)\n\/\/   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)\n\/\/   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)\nAdafruit_NeoPixel strip = Adafruit_NeoPixel(12, PIN, NEO_GRB + NEO_KHZ800);\n\nString hourStr;\nString minuteStr;\nint hour;\nint minute;\nint brightness = 0;\n\nuint32_t kleur = strip.Color (255,0,0); \/\/ rood\nuint32_t kleur2 = strip.Color (0,0,255); \/\/ blauw\nuint32_t kleur3 = strip.Color (0,255,0); \/\/ groen\n\nint LDRPin = A0;\n\n\nvoid setup() {\n  strip.begin();\n  strip.show(); \/\/ Initialize all pixels to &#039;off&#039;\n  strip.setBrightness(0);\n\n  Serial.begin(115200);\n  Serial.println (&quot;Neopixel_klok_12u_incl_rtc.ide&quot;);\n  Serial.println (&quot;--------------------------------------------------------&quot;);\n\n  if (! rtc.begin()) {\n    Serial.println(&quot;Couldn&#039;t find RTC&quot;);\n    Serial.flush();\n    while (1) delay(10);\n  }\n\n  if (rtc.lostPower()) {\n    Serial.println(&quot;RTC lost power, let&#039;s set the time!&quot;);\n    \/\/ When time needs to be set on a new device, or after a power loss, the\n    \/\/ following line sets the RTC to the date &amp; time this sketch was compiled\n    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));\n    \/\/ This line sets the RTC with an explicit date &amp; time, for example to set\n    \/\/ January 21, 2014 at 3am you would call:\n    \/\/rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));\n  }\n  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));\n}\n\n\nvoid loop() {\n  DateTime now = rtc.now();\n\n  hourStr = (now.hour() &lt; 10 ? &quot;0&quot; : &quot;&quot;) + String(now.hour(), DEC); \n  minuteStr = (now.minute() &lt; 10 ? &quot;0&quot; : &quot;&quot;) + String(now.minute(), DEC);\n\n  hour = hourStr.toInt();\n  minute = minuteStr.toInt();\n\n  int ldr = analogRead (LDRPin);\n  brightness = map (ldr, 0 , 1024, 0 , 100);\n\n  if (hour&gt;11){\n    hour = hour-12;\n  } \n\n  displaytime();\n\n  Serial.print (hour);\n  Serial.print (&quot;:&quot;);\n  Serial.println (minute);  \n}\n\n\nvoid displaytime() {\n  strip.setBrightness(0);\n  strip.show();\n  strip.setBrightness(brightness);\n\n  switch (hour) {\n  case 1: \n    een(); \n    break;\n  case 2: \n    twee(); \n    break;\n  case 3: \n    drie(); \n    break;\n  case 4: \n    vier(); \n    break;\n  case 5: \n    vijf(); \n    break;\n  case 6: \n    zes(); \n    break;\n  case 7: \n    zeven(); \n    break;\n  case 8: \n    acht(); \n    break;\n  case 9: \n    negen(); \n    break;\n  case 10: \n    tien(); \n    break;\n  case 11: \n    elf(); \n    break;\n  case 12: \n    twaalf(); \n    break;\n  }\n\n  if ((minute &gt;=0) &amp;&amp; (minute &lt;5) &amp;&amp; (hour == 0))\n  {\n    twaalfum();\n  }\n  else if ((minute &gt;=0) &amp;&amp; (minute &lt;5))\n  {\n    twaalfm();\n  }\n\n  if ((minute &gt;=5) &amp;&amp; (minute &lt;10) &amp;&amp; (hour == 1)){\n    eenum();\n  }\n  else if((minute &gt;=5) &amp;&amp; (minute &lt;10)){\n    eenm();\n  }\n\n  if ((minute &gt;=10) &amp;&amp; (minute &lt;15) &amp;&amp; (hour == 2)){\n    tweeum();\n  }\n  else if ((minute &gt;=10) &amp;&amp; (minute &lt;15)){\n    tweem();\n  }\n\n  if ((minute &gt;=15) &amp;&amp; (minute &lt;20) &amp;&amp; (hour == 3)){\n    drieum();\n  }\n  else if ((minute &gt;=15) &amp;&amp; (minute &lt;20)){\n    driem();\n  }\n\n  if ((minute &gt;=20) &amp;&amp; (minute &lt;25) &amp;&amp; (hour == 4)){\n    vierum();\n  }\n  else if ((minute &gt;=20) &amp;&amp; (minute &lt;25)){\n    vierm();\n  }\n\n  if ((minute &gt;=25) &amp;&amp; (minute &lt;30) &amp;&amp; (hour == 5)){\n    vijfum();\n  }\n  else if ((minute &gt;=25) &amp;&amp; (minute &lt;30)){\n    vijfm();\n  }\n\n  if ((minute &gt;=30) &amp;&amp; (minute &lt;35) &amp;&amp; (hour == 6)){\n    zesum();\n  }\n  else if ((minute &gt;=30) &amp;&amp; (minute &lt;35)){\n    zesm();\n  }\n\n  if ((minute &gt;=35) &amp;&amp; (minute &lt;40) &amp;&amp; (hour == 7)){\n    zevenum();\n  }\n  else if ((minute &gt;=35) &amp;&amp; (minute &lt;40)){\n    zevenm();\n  }\n\n  if ((minute &gt;=40) &amp;&amp; (minute &lt;45) &amp;&amp; (hour == 8)){\n    achtum();\n  }\n  else if ((minute &gt;=40) &amp;&amp; (minute &lt;45)){\n    achtm();\n  }\n\n  if ((minute &gt;=45) &amp;&amp; (minute &lt;50) &amp;&amp; (hour == 9)){\n    negenum();\n  }\n  else if ((minute &gt;=45) &amp;&amp; (minute &lt;50)){\n    negenm();\n  }\n\n  if ((minute &gt;=50) &amp;&amp; (minute &lt;55) &amp;&amp; (hour == 10)){\n    tienum();\n  }\n  else if ((minute &gt;=50) &amp;&amp; (minute &lt;55)){\n    tienm();\n  }\n\n  if ((minute &gt;=55) &amp;&amp; (minute &lt;60) &amp;&amp; (hour == 11)){\n    elfum();\n  }\n  else if ((minute &gt;=55) &amp;&amp; (minute &lt;60)){\n    elfm();\n  }\n\n  strip.setBrightness(brightness);\n  strip.show();\n}\n\n\/\/ Uren = rood\n\nvoid een() {\n  strip.setPixelColor(1, kleur); \n}\nvoid twee() {\n  strip.setPixelColor(2, kleur); \n}\nvoid drie() {\n  strip.setPixelColor(3, kleur); \n}\nvoid vier() {\n  strip.setPixelColor(4, kleur); \n}\nvoid vijf() {\n  strip.setPixelColor(5, kleur); \n}\nvoid zes() {\n  strip.setPixelColor(6, kleur);\n}\nvoid zeven() {\n  strip.setPixelColor(7, kleur);\n}\nvoid acht() {\n  strip.setPixelColor(8, kleur);\n}\nvoid negen() {\n  strip.setPixelColor(9, kleur);\n}\nvoid tien() {\n  strip.setPixelColor(10, kleur);\n}\nvoid elf() {\n  strip.setPixelColor(11, kleur);\n}\nvoid twaalf() {\n  strip.setPixelColor(0, kleur); \n}\n\n\n\/\/ Minuten = blauw\n\nvoid eenm() {\n  strip.setPixelColor(1, kleur2); \n}\nvoid tweem() {\n  strip.setPixelColor(2, kleur2); \n}\nvoid driem() {\n  strip.setPixelColor(3, kleur2); \n}\nvoid vierm() {\n  strip.setPixelColor(4, kleur2); \n}\nvoid vijfm() {\n  strip.setPixelColor(5, kleur2); \n}\nvoid zesm() {\n  strip.setPixelColor(6, kleur2);\n}\nvoid zevenm() {\n  strip.setPixelColor(7, kleur2);\n}\nvoid achtm() {\n  strip.setPixelColor(8, kleur2);\n}\nvoid negenm() {\n  strip.setPixelColor(9, kleur2);\n}\nvoid tienm() {\n  strip.setPixelColor(10, kleur2);\n}\nvoid elfm() {\n  strip.setPixelColor(11, kleur2);\n}\nvoid twaalfm() {\n  strip.setPixelColor(0, kleur2); \n}\n\n\/\/ Uren &amp; minuten = groen\n\nvoid eenum() {\n  strip.setPixelColor(1, kleur3); \n}\nvoid tweeum() {\n  strip.setPixelColor(2, kleur3); \n}\nvoid drieum() {\n  strip.setPixelColor(3, kleur3); \n}\nvoid vierum() {\n  strip.setPixelColor(4, kleur3); \n}\nvoid vijfum() {\n  strip.setPixelColor(5, kleur3); \n}\nvoid zesum() {\n  strip.setPixelColor(6, kleur3);\n}\nvoid zevenum() {\n  strip.setPixelColor(7, kleur3);\n}\nvoid achtum() {\n  strip.setPixelColor(8, kleur3);\n}\nvoid negenum() {\n  strip.setPixelColor(9, kleur3);\n}\nvoid tienum() {\n  strip.setPixelColor(10, kleur3);\n}\nvoid elfum() {\n  strip.setPixelColor(11, kleur3);\n}\nvoid twaalfum() {\n  strip.setPixelColor(0, kleur3); \n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Voor de derde versie wilde ik de tijd van een NTP-server op het internet gebruiken. Dus had ik WiFi nodig en dus heb ik een ESP32-C3 Super Mini gebruikt.<br>De derde versie werkt helemaal zoals gewenst. Hieronder deels de code: de functies die voor de omzetting van de opgehaalde tijd (<em>hour, minute<\/em>) zorgen zijn gelijk gebleven in alle versies en heb ik hieronder voor het gemak achterwegen gelaten.<br>Een voordeel van deze laatste opzet is ook dat het geheel fysiek een stuk kleiner is geworden.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n#include &lt;WiFi.h&gt;\n#include &lt;time.h&gt;\n\n#include &lt;Adafruit_NeoPixel.h&gt;\n\n#define LEDPin 10\n\n\/\/ Parameter 1 = number of pixels in NeoPixel\n\/\/ Parameter 2 = pin number (most are valid)\n\/\/ Parameter 3 = pixel type flags, add together as needed:\n\/\/   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w\/WS2812 LEDs)\n\/\/   NEO_KHZ400  400 KHz (classic &#039;v1&#039; (not v2) FLORA pixels, WS2811 drivers)\n\/\/   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)\n\/\/   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)\n\/\/Adafruit_NeoPixel NeoPixel = Adafruit_NeoPixel(12, LEDPin, NEO_GRB + NEO_KHZ800);\nAdafruit_NeoPixel NeoPixel(12, LEDPin, NEO_GRB + NEO_KHZ800);\n\n\nString hourStr;\nString minuteStr;\nint hour;\nint minute;\nint brightness = 0;\n\nuint32_t kleur = NeoPixel.Color (255,0,0); \/\/ rood\nuint32_t kleur2 = NeoPixel.Color (0,0,255); \/\/ blauw\nuint32_t kleur3 = NeoPixel.Color (0,255,0); \/\/ groen\n\nint LDRPin = A0;\n\n\nconst char* ssid = &quot;XXXXXXX_2.4&quot;;       \/\/ Vervang door uw netwerknaam\nconst char* password = &quot;xxxxxxxxxx&quot;;    \/\/ Vervang door uw wachtwoord\n\nconst char* ntpServer = &quot;pool.ntp.org&quot;; \/\/ Aanbevolen NTP-serverpool\nconst long  gmtOffset_sec = 3600;       \/\/ Voorbeeld: +1 uur voor Midden-Europa (UTC+1)\nconst int   daylightOffset_sec = 3600;  \/\/ 1 uur voor zomertijd\n\nvoid setup() {\n\n    NeoPixel.begin();\n    NeoPixel.show(); \/\/ Initialize all pixels to &#039;off&#039;\n    NeoPixel.setBrightness(0);\n\n    Serial.begin(115200);\n    Serial.println (&quot;Neopixelklok_ESP32_C3_1.ide&quot;);\n    Serial.println (&quot;--------------------------------------------------------&quot;);\n\n    Serial.print(&quot;Verbinden met &quot;);\n    Serial.println(ssid);\n    WiFi.begin(ssid, password);\n    while (WiFi.status() != WL_CONNECTED) {\n        delay(500);\n        Serial.print(&quot;.&quot;);\n    }\n    Serial.println(&quot;\\nVerbonden met WiFi&quot;);\n\n    \/\/ Initialiseer en synchroniseer tijd met NTP-server\n    configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);\n\n    \/\/ Voorbeeld voor de tijdzone van Nederland\/Belgi\u00eb (Midden-Europese tijd)\n  setenv(&quot;TZ&quot;, &quot;CET-1CEST,M3.5.0,M10.5.0\/3&quot;, 1);\n  tzset();\n\n}\n\nvoid loop() {\n    printLocalTime();\n    delay(1000); \/\/ Lees tijd elke seconde uit\n}\n\nvoid printLocalTime() {\n    struct tm timeinfo;\n    if(!getLocalTime(&amp;timeinfo)){\n        Serial.println(&quot;Kan tijd niet ophalen&quot;);\n        return;\n    }\n    \/\/ Formatteer en print de tijd\n    \/\/char timeString&#x5B;50];\n    char hourStr&#x5B;4];\n    char minuteStr&#x5B;4];\n\n    \/\/strftime(timeString, sizeof(timeString), &quot;%A, %B %d %Y %H:%M:%S&quot;, &amp;timeinfo);\n    \/\/Serial.println(timeString);\n\n    strftime(hourStr, sizeof(hourStr), &quot;%H&quot;, &amp;timeinfo);\n    \/\/Serial.println(hourStr);\n    \/\/int n = atoi(str);\n    hour = atoi(hourStr);\n    \/\/Serial.println(hour);\n\n    strftime(minuteStr, sizeof(minuteStr), &quot;%M&quot;, &amp;timeinfo);\n    \/\/Serial.println(minuteStr);\n    minute = atoi(minuteStr);\n    \/\/Serial.println(minute);\n\n    int ldr = analogRead (LDRPin);\n    brightness = map (ldr, 0 , 4095, 0 , 100);\n\n    if (hour&gt;12){\n        hour = hour-12;\n    } \n\n    displaytime();\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Het programmeren van de ESP ging verbazend soepel. In een volgend artikeltje meer daarover.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nou ja, het nieuwe jaar is alweer bijna een maand oud en sinds december geen nieuw bericht geplaatst. Tja, druk met andere zaken! Maar daar gaat dit hier, nu niet over! Een nieuw klokje. Voor de verandering. Deze klok wordt gevormd door een RGB-LED-ring met 12 Neopixels. De LED&#8217;s geven zowel de uren als de minuten (per vijf) aan. Uren zijn rood, minuten zijn blauw. Waanneer de uren en de minuten samenvallen (bijvoorbeeld 5 over \u00e9\u00e9n, of kwart voor tien) is de LED groen.Met het pot-metertje is de intensiteit van de LED in te stellen. Uiteindelijk heb ik drie versies gemaakt<span class=\"more-link\"><a href=\"https:\/\/www.rommelkist.nl\/elec\/elektronica\/test\/\">Read More &rarr;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","footnotes":""},"categories":[6,3,206],"tags":[131,37,145,144],"class_list":["entry","author-admin","post-5759","post","type-post","status-publish","format-standard","category-arduino","category-elektronica","category-programmeren","tag-esp32-c3","tag-klok","tag-led-strip","tag-neopixel"],"_links":{"self":[{"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/posts\/5759","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/comments?post=5759"}],"version-history":[{"count":26,"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/posts\/5759\/revisions"}],"predecessor-version":[{"id":5825,"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/posts\/5759\/revisions\/5825"}],"wp:attachment":[{"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/media?parent=5759"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/categories?post=5759"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rommelkist.nl\/elec\/wp-json\/wp\/v2\/tags?post=5759"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}