The whole project is based on Arduino, NodeMCU provides access to the Internet over WiFi. The display is built from single LEDs. Since they can be really bright it adopts illumination based on light conditions.
I've found those 8x8 LED modules:
So I've decided to combine few to build a display. In my case there are 3 lines, each consists of 8 modules, 24 it total, this give us 1532 single LEDs!
To drive single module I've chosen MAX72xx, I also wanted to improve my soldering skills, so I've decided to go for 24 PIN DIP chips and solder them to prototype boards:
Well that worked out pretty well when it comes to those skills, but I would recommend to use LED modules combined with MAX Chip, this will save you at least a few hours, not mentioning time spent afterwards when single cable gets loose ;) Such combo-module has only 3 wires instead of 16.
So we have hardware part for our display: 24 led modules with drivers. Now it's time to light them up! I've decided to go for Arduino Mega, because it has two serial ports, so it's easier to debug things (one port will be used for communication with EPS8266). You could also use Uno, in this case you would have to daisy chain MAX chips and change addressing in software. I've used separate line for each Max chip, but Uno just does not have enough digital output pins.
I was looking for an API that will join all led modules into one canvas, so that you can print sprites on it without bothering with transitions between LED modules. I did not find anything that would make me happy so I've decided to implement one by myself. It provides not only simple canvas, but fonts and few animations. Basically everything that will be needed to display time and weather.
So ... we have a display and API to control it. Now we need to get date and weather. Arduino does not support Internet connectivity and it definitely does not have enough resources to process incoming data. So I've decided to use NodeMCU. With few Lua scripts I was able to implement simple API that is accessible over serial port. Arduino connects over it with NodeMCU, obtains time, date, weather and displays it.
In order to provide date NodeMCU connects with NTP server and receives UTC time, afterwards it calculates local date from it. I could use one of Internet services to grab the local date, but I was looking for solution that will remain stable for long time. Those services can change their API or just go offline, but NTP protocol will remain unchanged. In worst case you will have to change server name. Current implementation supports also failover through many different servers, so probably you will not have to bother with it soon ;)
Getting the weather was a bit tricky, because I had to find an API that will return response small enough so it could be parsed by NodeMCU. I've decided to use yahoo weather. They provide nice REST API with small and simple response. Hopefully they will keep interfaces stable for long time.....
First you have to build the display, I've already described it in this post: Arduino LED Display. You can use the same pin numbers on Mega, so that you will not have to alter software.
After the display is ready, you should connect ESP8266 and photoresistor. Schematic below contains all hardware elements together:
The area on right top corner is the display itself - 8x3 LED modules. Each single module exposes 3 PINs, those are MAX 72xxx PINs responsible for communication over SPI.
Here you will find exact schematic of single module including SPI PINs:
Next one is just another representation:
Those last two schematics can be found here: https://github.com/maciejmiklas/LEDDisplay/tree/master/doc/fritzing
Now it's time to build a software.
You need to compile this project https://github.com/maciejmiklas/LEDClock and upload into Arduino.
Here is a compiled software for those with the same hardware setup.
You can use Sloeber for compilation, just follow those steps:
I am using EPS8266 with Lua interpreter, this combination is called NodeMCU.
In order to provide weather and time to Arduino you will have to clone NodeMCUUtil, modify few scripts and finally upload those into NodeMCU. Below you will find exact instruction:
This is how it looks like: