{"id":2541,"date":"2020-06-09T13:12:16","date_gmt":"2020-06-09T11:12:16","guid":{"rendered":"https:\/\/willem.aandewiel.nl\/?p=2541"},"modified":"2023-05-04T12:17:22","modified_gmt":"2023-05-04T10:17:22","slug":"an-esp8266-ticker","status":"publish","type":"post","link":"https:\/\/willem.aandewiel.nl\/index.php\/2020\/06\/09\/an-esp8266-ticker\/","title":{"rendered":"An ESP8266 Ticker"},"content":{"rendered":"\n<p>[ 33,473 keer bekeken \/ views ]<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">INTRODUCTION<\/h2>\n\n\n\n<p>From the moment I saw the MAX7219 Dot matrix modules I wanted to build a news ticker. I wanted the option to enter my own messages without having to install special Apps on my phone or tablet. So the ticker must be approachable via a web interface. In addition to the messages to be entered by myself, it must also be possible to get the current weather and news items from the Internet and display them on the news ticker. Of course, the time must also be shown!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Hardware<\/h2>\n\n\n\n<p>An ESP8266 with built-in WiFi will suite this project just fine. <br>The <strong><em><a rel=\"noreferrer noopener\" href=\"https:\/\/opencircuit.nl\/Product\/1of-Wemos-D1-processor-bord-bouwpakket\" target=\"_blank\">1of!-Wemos<\/a><\/em><\/strong> and <strong><em><a rel=\"noreferrer noopener\" href=\"https:\/\/opencircuit.nl\/Product\/1of-ESP12-processor-bord-bouwpakket\" target=\"_blank\">1of!-ESP12<\/a><\/em><\/strong> processor boards are ideal for small <a href=\"https:\/\/willem.aandewiel.nl\/index.php\/2019\/02\/20\/1of-platform-for-developing-esp8266-devices\/\" target=\"_blank\" rel=\"noreferrer noopener\">prototype<\/a> projects of this kind.<br>To make the intensity of the display dependent on the ambient light, I use a Light-Dependent Resistor (LDR).<br>As a display, naturly, the MAX7219 Dot Matrix modules are used.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Connecting the parts<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-1024x562.png\" alt=\"\" class=\"wp-image-2543\" width=\"512\" height=\"281\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-1024x562.png 1024w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-300x165.png 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-768x422.png 768w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker.png 1200w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">The Firmware<\/h2>\n\n\n\n<p>For developing firmware for the ESP8266 I use a so-called <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/mrWheel\/ESP8266_Framework\" target=\"_blank\">Framework<\/a> which contains everything for connecting to WiFi, retrieving the time via NTP a file browser to download- and upload files from the internal files system (SPIFFS) and there is a web server for the User Interface. Also updating the firmware \u201cOver The Air\u201d is part of that Framework in the form of an Update Server.<br>All that needs to be added is control of the MAX7219 dot matrix display and functions to get the weather and news.<\/p>\n\n\n\n<p>Depending on the type of MAX7219 you use, you must enter the corresponding definition at HARDWARE_TYPE. Depending on how many modules you use you have to adjust the definition of MAX_DEVICES (there are four MAX7219&#8217;s on one module). You can use the firmware with one, two, three or four modules. You can also use two modules next to and on top of each other with a BIG Font you can then use double height letters (this is not part of the firmware).<\/p>\n\n\n\n<p>ESP-ticker.h contains a few #define statements that are important:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#define   HARDWARE_TYPE          MD_MAX72XX::FC16_HW\n\/\/#define HARDWARE_TYPE        MD_MAX72XX::GENERIC_HW\n#define   MAX_DEVICES                 8<\/pre>\n\n\n\n<p>Of course you have to install the Arduino ESP8266 core (read <a rel=\"noreferrer noopener\" href=\"https:\/\/willem.aandewiel.nl\/index.php\/2018\/09\/27\/aan-de-slag-met-de-esp8266\/2\/\" target=\"_blank\">here<\/a> how to do that). The ESP ticker has been tested with version 2.7.4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The User (web) Interface<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-tickerMessages.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-tickerMessages.png\" alt=\"\" class=\"wp-image-2544\" width=\"435\" height=\"335\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-tickerMessages.png 869w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-tickerMessages-300x231.png 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-tickerMessages-768x592.png 768w\" sizes=\"auto, (max-width: 435px) 100vw, 435px\" \/><\/a><figcaption class=\"wp-element-caption\">Entering local messages<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-tickerSettings.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-tickerSettings.png\" alt=\"\" class=\"wp-image-2545\" width=\"435\" height=\"334\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-tickerSettings.png 869w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-tickerSettings-300x230.png 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-tickerSettings-768x589.png 768w\" sizes=\"auto, (max-width: 435px) 100vw, 435px\" \/><\/a><figcaption class=\"wp-element-caption\">Edit settings<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/FSexplorer.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/FSexplorer.png\" alt=\"\" class=\"wp-image-2546\" width=\"425\" height=\"386\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/FSexplorer.png 850w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/FSexplorer-300x272.png 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/FSexplorer-768x698.png 768w\" sizes=\"auto, (max-width: 425px) 100vw, 425px\" \/><\/a><figcaption class=\"wp-element-caption\">FileSystem Explorer<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/updateServer.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/updateServer.png\" alt=\"\" class=\"wp-image-2547\" width=\"425\" height=\"152\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/updateServer.png 850w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/updateServer-300x107.png 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/updateServer-768x274.png 768w\" sizes=\"auto, (max-width: 425px) 100vw, 425px\" \/><\/a><figcaption class=\"wp-element-caption\">Update Server<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Extra Libraries<\/h2>\n\n\n\n<p>You need to install the following libraries (but look at the actual code for an up-to-date list of libraries):<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ https:\/\/github.com\/ropg\/ezTime\n#include &lt;ezTime.h>\n\n\/\/ https:\/\/github.com\/jandrassy\/TelnetStream\n#include &lt;TelnetStream.h> \u00a0 \u00a0 \u00a0\n\n\/\/ https:\/\/github.com\/mrWheel\/ModUpdateServer\n#include &lt;ModUpdateServer.h> \u00a0\n\u200b\n\/\/ version 0.15.0 - https:\/\/github.com\/tzapu\/WiFiManager\n#include &lt;WiFiManager.h> \u00a0 \u00a0 \n<\/pre>\n\n\n\n<p>To control the MAX7219 display you also need the following libraries from \u201cMarco Colli\u201d:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">- MD_Max72xx\n- MD_Parola<\/pre>\n\n\n\n<p>You install them with the Arduino Library Manager:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/libraryManager.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/libraryManager.jpg\" alt=\"\" class=\"wp-image-2549\" width=\"475\" height=\"304\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/libraryManager.jpg 950w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/libraryManager-300x192.jpg 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/libraryManager-768x492.jpg 768w\" sizes=\"auto, (max-width: 475px) 100vw, 475px\" \/><\/a><figcaption class=\"wp-element-caption\">Library Manager<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">WEERLIVE.NL<\/h2>\n\n\n\n<p>We collect the weather from <a href=\"http:\/\/weerlive.nl\" target=\"_blank\" rel=\"noreferrer noopener\">weerlive.nl<\/a>. Here you must register and request an \u201cAPI key\u201d. The service is free for private use, as long as you do not request the weather too often (fair use). The firmware allows a maximum of one request every 15 minutes.<br>You enter the API key on the settings page of the web server. Here you also indicate for which place you want the weather (but this is only an indication. In the middle of the Netherlands the weather always comes from De Bilt).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">NEWSAPI.ORG<\/h2>\n\n\n\n<p>This <a href=\"https:\/\/newsapi.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">organisation<\/a> collects news reports from all over the world. You must also request an \u201cAPI key\u201d for this service. The service is free for \u201cdevelopers\u201d if you request new messages for less then 500 times a day (note: The delivered messages are at least 15 minutes old!). That is a maximum of 1x per 5 minutes.<br>You enter the API key on the settings page of the web server.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">OBTAINING THE FIRMWARE<\/h2>\n\n\n\n<p>You can download the firmware from <a href=\"https:\/\/github.com\/mrWheel\/ESP_ticker\" target=\"_blank\" rel=\"noreferrer noopener\">github<\/a>. It is a bit too much to explain the whole firmware here but the most important things take place in the main loop () function:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">void loop()\n{\n \u00a0handleNTP();\n \u00a0httpServer.handleClient();\n \u00a0MDNS.update();\n\u200b\n \u00a0\/\/--- het heeft geen zin om het weer op te halen als je geen API-key hebt --\n \u00a0if ((millis() > weerTimer) &amp;&amp; (strlen(settingWeerLiveAUTH) > 5))\n  {\n \u00a0 \u00a0weerTimer = millis() + (settingWeerLiveInterval * (60 * 1000)); \/\/ Interval in Minutes!\n \u00a0 \u00a0getWeerLiveData();\n  }\n \u00a0\n \u00a0\/\/--- het heeft geen zin om nieuws op te halen als je geen API-key hebt --\n \u00a0if ((millis() > newsapiTimer) &amp;&amp; (strlen(settingNewsAUTH) > 5))\n  {\n \u00a0 \u00a0newsapiTimer = millis() + (settingNewsInterval * (60 * 1000)); \/\/ Interval in Minutes!\n \u00a0 \u00a0getNewsapiData();\n  }\n\u200b\n \u00a0if (P.displayAnimate()) \/\/ done with animation, ready for next message\n  {\n \u00a0 \u00a0msgType++;\n \u00a0 \u00a0DebugTf(\"msgType[%d]\\r\\n\", msgType);\n\u00a0\n \u00a0 \u00a0switch(msgType)\n \u00a0  {\n \u00a0 \u00a0 \u00a0case 1: \u00a0 if (!(millis() > timeTimer)) \u00a0return;\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0inFX \u00a0= random(0, ARRAY_SIZE(effect));\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0outFX = random(0, ARRAY_SIZE(effect));\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0snprintf(actMessage, LOCAL_SIZE, weekDayName[weekday()]);\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0P.displayText(actMessage, PA_CENTER, (MAX_SPEED - settingTextSpeed), 1000\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  , effect[inFX], effect[outFX]);\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0DebugTf(\"Animate IN[%d], OUT[%d] %s\\r\\n\", inFX, outFX, actMessage);\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0break;\n \u00a0 \u00a0 \u00a0case 2: \u00a0 if (!(millis() > timeTimer)) \u00a0return;\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0timeTimer = millis() + 60000;\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0inFX \u00a0= random(0, ARRAY_SIZE(effect));\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0outFX = random(0, ARRAY_SIZE(effect));\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0sprintf(actMessage, \"%s\", updateTime());\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0P.displayText(actMessage, PA_CENTER, (MAX_SPEED - settingTextSpeed), 2000\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  , effect[inFX], effect[outFX]);\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0DebugTf(\"Animate IN[%d], OUT[%d] %s\\r\\n\", inFX, outFX, actMessage);\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0break;\n \u00a0 \u00a0 \u00a0case 3:\n \u00a0 \u00a0 \u00a0case 6: \u00a0 nextLocalBericht();\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0P.setTextEffect(PA_SCROLL_LEFT, PA_NO_EFFECT);\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0break; \u00a0 \u00a0\n \u00a0 \u00a0 \u00a0case 4: \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n \u00a0 \u00a0 \u00a0case 5: \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n \u00a0 \u00a0 \u00a0case 7: \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n \u00a0 \u00a0 \u00a0case 8: \u00a0 nextNieuwsBericht();\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0P.setTextEffect(PA_SCROLL_LEFT, PA_NO_EFFECT);\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0break;\n \u00a0 \u00a0 \u00a0case 9: \u00a0 snprintf(actMessage, LOCAL_SIZE, \"** %s **\", tempMessage);\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0utf8Ascii(actMessage);\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0P.setTextEffect(PA_SCROLL_LEFT, PA_NO_EFFECT);\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0break;\n \u00a0 \u00a0 \u00a0case 10: \u00a0nextNieuwsBericht();\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0break;\n \u00a0 \u00a0 \u00a0default: \u00a0msgType = 0;\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0return;\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n \u00a0  } \/\/ switch()\n\n \u00a0 \u00a0\/\/DebugTln(actMessage);\n \u00a0 \u00a0valueIntensity = calculateIntensity(); \/\/ read analog input pin A0\n \u00a0 \u00a0DebugTf(\"Intensity set to [%d]\\r\\n\", valueIntensity);\n \u00a0 \u00a0P.setIntensity(valueIntensity);\n \u00a0 \u00a0\/\/ Tell Parola we have a new animation\n \u00a0 \u00a0P.displayReset();\n\n  } \/\/ dislayAnimate()\n \u00a0\n} \/\/ loop()\n<\/pre>\n\n\n\n<p>The \u201cswitch\u201d statement ensures that alternate local messages (entered via the web interface) or news messages are displayed. If the msgType is 1 or 2, the day name and time are printed respectively. If the msgType is greater than 10 then all will be displayed again.<\/p>\n\n\n\n<p>For the firmware to compile correctly you need the following IDE settings:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"413\" height=\"375\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ArduinoIDEsettings.png\" alt=\"\" class=\"wp-image-2550\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ArduinoIDEsettings.png 413w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ArduinoIDEsettings-300x272.png 300w\" sizes=\"auto, (max-width: 413px) 100vw, 413px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><s>SPIFFS<\/s><\/h2>\n\n\n\n<p>After flashing the firmware don&#8217;t forget to also flash <s>SPIFFS<\/s>! <a rel=\"noreferrer noopener\" href=\"https:\/\/willem.aandewiel.nl\/index.php\/2018\/09\/27\/aan-de-slag-met-de-esp8266\/2\/\" target=\"_blank\">Here<\/a> you find a Dutch post on how to do that. <br><strong>UPDATE<\/strong><br>As SPIFFS is depreciated for the esp8266 you now have to use (and flash) the <strong><em>LittleFS<\/em><\/strong>!<br><a rel=\"noreferrer noopener\" href=\"https:\/\/arduino-esp8266.readthedocs.io\/en\/latest\/filesystem.html#uploading-files-to-file-system\" target=\"_blank\">Here<\/a> you find more information on how to do this.<\/p>\n\n\n\n<p class=\"has-background has-medium-font-size\" style=\"background-color:#93cef5\">If you like this post please consider to give a donation <!-- Begin PayPal Donations by https:\/\/www.tipsandtricks-hq.com\/paypal-donations-widgets-plugin -->\n\n<form action=\"https:\/\/www.paypal.com\/cgi-bin\/webscr\" method=\"post\" target=\"_blank\">\n    <div class=\"paypal-donations\">\n        <input type=\"hidden\" name=\"cmd\" value=\"_donations\" \/>\n        <input type=\"hidden\" name=\"bn\" value=\"TipsandTricks_SP\" \/>\n        <input type=\"hidden\" name=\"business\" value=\"Willem@Aandewiel.nl\" \/>\n        <input type=\"hidden\" name=\"return\" value=\"https:\/\/willem.aandewiel.nl\/index.php\/thank-you-for-your-donation\/\" \/>\n        <input type=\"hidden\" name=\"item_number\" value=\"YAPPgenerator\" \/>\n        <input type=\"hidden\" name=\"rm\" value=\"0\" \/>\n        <input type=\"hidden\" name=\"currency_code\" value=\"EUR\" \/>\n        <input type=\"image\" style=\"cursor: pointer;\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2022\/09\/bmc-button-75.png\" name=\"submit\" alt=\"PayPal - The safer, easier way to pay online.\" \/>\n        <img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"https:\/\/www.paypalobjects.com\/en_US\/i\/scr\/pixel.gif\" width=\"1\" height=\"1\" \/>\n    <\/div>\n<\/form>\n<!-- End PayPal Donations -->\n<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SHOW OFF<\/h2>\n\n\n\n<p>I like to be able to see the interior of my &#8220;projects&#8221;. That&#8217;s why I often use plexiglass for the structure or cabinet and why would I deviate from that for the ESP ticker?<\/p>\n\n\n\n<p>I used two pieces of plexiglass (30x24cm and 30x6cm). Plexiglas can be easily cut with a fine hacksaw. By heating it locally with hot air (300 * C) you can bend it well (around the corner of a table, for example). The 1of!-Wemos board and the MAX7219 displays (2 pieces) are screwed onto the rectangular piece of plexiglass of 30x6cm. In order to properly mount the MAX7219\u2019s, it is easiest to remove the two outer 8&#215;8 display units from the PCB. That is quite simple because they are in a socket. You must be very careful not to bend the legs. Now you can screw the unit to the Plexiglas with four M2.5 or M3 bolts and nuts. On the other side you screw the processor board.<br>Make a hole for the LDR and glue it with, for example, hot-glue.<br>It is wise to test the unit now. The MD_parola library is very rigid in what is left and right and top and bottom. You don&#8217;t want the newspaper to be &#8220;turned upside down&#8221; when you&#8217;ve put it all together!<br><br>The larger piece of Plexiglas is bent in a U-shape serves as a cover.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-a.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"512\" data-id=\"2551\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-a-1024x512.jpg\" alt=\"\" class=\"wp-image-2551\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-a-1024x512.jpg 1024w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-a-300x150.jpg 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-a-768x384.jpg 768w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-a.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-b.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"575\" data-id=\"2552\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-b-1024x575.jpg\" alt=\"\" class=\"wp-image-2552\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-b-1024x575.jpg 1024w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-b-300x169.jpg 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-b-768x431.jpg 768w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-b.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-c.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"335\" data-id=\"2553\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-c-1024x335.jpg\" alt=\"\" class=\"wp-image-2553\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-c-1024x335.jpg 1024w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-c-300x98.jpg 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-c-768x251.jpg 768w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-c.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-d.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" data-id=\"2554\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-d-1024x768.jpg\" alt=\"\" class=\"wp-image-2554\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-d-1024x768.jpg 1024w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-d-300x225.jpg 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-d-768x576.jpg 768w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-d.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-f.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" data-id=\"2555\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-f-1024x768.jpg\" alt=\"\" class=\"wp-image-2555\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-f-1024x768.jpg 1024w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-f-300x225.jpg 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-f-768x576.jpg 768w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/ESP-ticker-f.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/figure>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/LDR-rotated.jpg\" alt=\"\" class=\"wp-image-2556\" width=\"238\" height=\"209\" srcset=\"https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/LDR-rotated.jpg 950w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/LDR-300x264.jpg 300w, https:\/\/willem.aandewiel.nl\/wp-content\/uploads\/2020\/06\/LDR-768x677.jpg 768w\" sizes=\"auto, (max-width: 238px) 100vw, 238px\" \/><figcaption class=\"wp-element-caption\">The LDR is glued to the rectangular base with hot glue<\/figcaption><\/figure>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>[ ] INTRODUCTION From the moment I saw the MAX7219 Dot matrix modules I wanted to build a news ticker. I wanted the option to enter my own messages without having to install special Apps on my phone or tablet. &hellip; <a href=\"https:\/\/willem.aandewiel.nl\/index.php\/2020\/06\/09\/an-esp8266-ticker\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,6,10,20],"tags":[127,126,47,124,128,125,104,106],"class_list":["post-2541","post","type-post","status-publish","format-standard","hentry","category-arduino","category-esp8266","category-hardware","category-wifi","tag-1of-esp12","tag-1of-wemos","tag-esp8266","tag-lichtkrant","tag-max7219","tag-ticker","tag-webserver","tag-wifi"],"views":33473,"_links":{"self":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts\/2541","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/comments?post=2541"}],"version-history":[{"count":37,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts\/2541\/revisions"}],"predecessor-version":[{"id":7779,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/posts\/2541\/revisions\/7779"}],"wp:attachment":[{"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/media?parent=2541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/categories?post=2541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/willem.aandewiel.nl\/index.php\/wp-json\/wp\/v2\/tags?post=2541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}