I, recently, embarked on building a useful if not glitzy digital clock. My first idea involved something retro: using four, seven segment, LED’s to look like something from the late 1970’s. At the same time, I was also playing around with 8×8 LED Arrays, using the MAX7219 chip. While playing with that, I connected one of my 1307 RTC’s to the array and loaded up a sketch to show the date and time on the arrays. Then, it hit me…this is a much cooler clock and I can do more with it.
So, I built a prototype using one of my Half-Byte Console boards, minus the video, audio and Nunchucky connector. Hardware wise, it was really simple…connect the arrays to pins 10, 11 and 12, the RTC to A4 and A5 and, for extra coolness, a BMP180 temp and humidity sensor to the sca and scl on the RTC. Viola! modify the code to handle the BMP180 and Presto! A cool clock.
Prototype clock for developing Embedded Tiny Basic
I decided to build a second one to take to work. I thought it might be useful to be able to throw up a custom message to scroll for when, say, I was in a meeting. The more I thought, the more I was convinced this thing needed some kind of control program that would be easily modified from, say, a smartphone and Bluetooth.
Well, I already had the genesis of that control program: Half Byte Tiny Basic.
So, I looked at the source and made a copy. I then went in and removed stuff I would not need, like all of the graphics statements and functions. I removed the TVOut library, and all of the video handling code. And TONE. I miss TONE.
I did not need the Nunchuck code, so it was gone as well. What was left was a nice, small shell of my control program. I added the libraries for the 8×8 LED Array (MAXMATRIX) and added statements to manipulate the arrays: SCROLL to display text, SET to turn on or off individual LEDs, and DIRECTION to tell the arrays which way to scroll the text. I already had code to handle the DHT-11 temperature sensor, so I left that in (and decided to use it instead of the BMP180) and added T
Random dots on the clock
EMP and HUMID to scroll those values across the arrays, and added code for the RTC.I was going to add a mechanism that would interrupt the running program if a signal from the serial device was detected, but, there was already one there…the IN(0) function. So I left it. I now had a decent little programming language for the clock. With HB Tiny Basic’s ability to autorun whatever is in the EEPROM, if it lost power, th
Clock, in action
e clock would just start running on its own. Sweet!
The HC-06 Bluetooth module works very nicely. It connects to the serial pins and communicates as if the device were connected directly to the controlling device-a PC or smartphone. Everything fits nicely into these cheap pencil boxes I picked up from Wal-Mart for a buck each. They are just big enough for the HB Console board and are wide enough for the LED Arrays. They don’t look all that impressive, until you power up the clock…the bright LED’s shine through the translucent plastic nicely.
Embedded Tiny Basic is useful for giving some level of intelligence to other wise dumb devices. While you only have about 1K of RAM to use for Embedded Tiny Basic, I think that will be adequate for most things. There is, currently, no motor control, but it could be quickly and easily added. The functionality that is there is probably going to be good for quite a few projects. If not, it can be modified quickly. I am already seeing where it can be modified, even for just this particular project. I have a few others in mind, so stayed tuned for those.
In the mean time, below is a list of the additions and a release date for the language is forthcoming. I need to clean up the code-a bunch-before releasing it and, as well, making sure I have all you will need in order to compile and use Embedded Tiny Basic.
New statements and function:
SET col,row,on or off
SCROLL var or “text”
Scrolls whatever is in the quotes
If there are no quoted strings, a variable value or number is displayed
DIRECTION 1-4 (1 is left, 2 is right, 3 is up and 4 is down)
TIME (sends the date and time to the LED array)
HUMID (sends humidity to LED array)
Temp (sends the temp to LED array)
X=TEMP(0 or 1)
Get the current temperature and put it in variable 'x'
A zero means use Celsius, a one means Farenheit
Below is the listing for the current “HELLO” app:
100 PRINT “Welcome to Half-Byte LED Programmable Clock”
110 SCROLL ” HALF-”
111 SCROLL “BYTE Clock…..”
112 IF HOUR(0)<12 SCROLL ” Good Morning! ”
114 IF HOUR(0)>11 IF HOUR(0)<18 SCROLL ” Good Afternoon! ”
116 IF HOUR(0)>17 IF HOUR(0)<=23 SCROLL ” Good Evening! ”
125 IF IN(0)<>-1 GOTO 600
130 SCROLL “. Temp is ”
145 SCROLL “F ”
150 SCROLL “Humidity is ”
155 SCROLL “%”
170 SCROLL ” Hello! ”
180 IF IN(0)<>-1 GOTO 600
190 IF RND(99)>50 GOTO 110
200 SCROLL ” ”
265 IF IN(0)<>-1 GOTO 600
300 SET 16+(X),Y,1
310 SET 16+(X),H-Y,1
320 SET 16+(W-X),Y,1
330 SET 16+(W-X),H-Y,1
340 IF IN(0)<>-1 GOTO 600
350 SET 16+(P),Q,0
360 SET 16+(P),H-Q,0
370 SET 16+(W-P),Q,0
380 SET 16+(W-P),H-Q,0
390 IF IN(0)<>-1 GOTO 600
410 IF K-O>1 GOTO 110
590 GOTO 230
600 SCROLL “DONE “
A note about how the arrays are referenced, using SET. Embedded Tiny Basic is setup to handle up to four arrays. My clock only uses two, but Basic does not know this, so individual LED addressing has to be offset by 16. Normally, with four arrays, the upper left LED would be 0,0. In my clock, it would be 16,0 since I am only using the RIGHT MOST TWO arrays, each are 8 across and 8 down.
Some other things to note from the listing above…the line IF IN(0)<>-1 GOTO 600 that is sprinkled through out the program will poll the serial port to see if there is a key press. If there is a keypress, we want to stop execution and goto line 600. In this case, it just says ‘Done’ and stops. Lines 205, 400 and 410 make up a timer. Lines 200 through 590 just displays a random dot pattern, as a distraction. We don’t want this all day, so we only let it run for about a minute. Line 205 records the minute it started and line 400 gets the minute after each pattern is displayed. Line 410 evaluates the elapsed time by subtracting the start time from the end time. If the result is greater than a one, it goes back to the clock routine. Otherwise, it displays a new pattern. Lines 112 through 116 determines if it is morning, afternoon or evening.
The Scroll statement is lacking and somewhat buggy. I am working on fixing it, and adding more functionality to it, to make it more versatile, like PRINT currently is. I also want to add a mechanism to the language to allow it to receive messages, via Bluetooth, from, say, a smartphone. Limited gameplay may also show up in a future release.
Embedded Tiny Basic will be released soon.