Changes from v1
- Instead of creating a lattice from cardboard for each of the letter cells, I used 12mm MDF and used a large (16mm) countersink bit to create countersunk holes with a bevel around the LED, a bit like the reflector in a torch, and painted it white to reflect as much of the light as possible.
- Use an LDR to allow automatic brightness adjustment based on the light level in the room.
- Display the temperature – because why not.
I originaly thought of reading and displaying the temperature from the PICAXE 18M2+, however there wasn't a lot of program memory left, and additionally reading the temperature using the readtemp12 command actually stops the chip from doing anything else – like responding to button presses – for about ¾ of a second, so I decided instead to use a separate PICAXE 08M2 to read and display the time.
Light Reflector Array
Light reflector array drilled in to a piece of MDF. I drilled pilot holes first, then used large countersink to produce the beveled edge:-

I wandered a bit in the lower left corner, so stuck on some cardboard to fill the holes along the edge.
This program is used on a PICAXE 08M2 to read the temperature from a DS18B20 temperature sensor and display it on a 3 digit 7 segment LED display. A MAX7219 LED driver is used to drive the display.
The main processor can also control this chip through 2 inputs; one to control the brightness level, and the other display the temperature in farenheit.
#picaxe 08m2
#no_data
; Project: Word Clock v2.
; File: ReadDisplayTemp.bas
; Description:
; Read temperature from a DS18B20 and display on a three
; digit 7 segment LED display using a MAX7219 LED display
; driver.
;
; Copyright (C) 2014 Marc Symonds
; All rights reserved.
;
; This software may be used and redistributed, with or without
; modification, as long as it is understood that this software
; is provided as-is without any explicit or implied warranties
; of merchantablity or fitness of purpose.
; MAX7219 Pins
symbol MAX7219_LOAD = C.1
symbol MAX7219_CLK = C.0
symbol MAX7219_DIN = C.2
; MAX7219 Registers
symbol MAX7219_NOOP = $00
symbol MAX7219_DIGIT0 = $01
symbol MAX7219_DIGIT1 = $02
symbol MAX7219_DIGIT2 = $03
symbol MAX7219_DIGIT3 = $04
symbol MAX7219_DIGIT4 = $05
symbol MAX7219_DIGIT5 = $06
symbol MAX7219_DIGIT6 = $07
symbol MAX7219_DIGIT7 = $08
symbol MAX7219_DECODE_MODE = $09
symbol MAX7219_INTENSITY = $0A
symbol MAX7219_SCAN_LIMIT = $0B
symbol MAX7219_SHUTDOWN = $0C
symbol MAX7219_TEST_MODE = $0F
; DS18B20 Pins
symbol DS18B20_DQ = C.4
; Pins used by main processor to control display.
symbol DISPLAY_F = C.5 ; Display in Farenheit.
symbol DISPLAY_FP = pinC.5
symbol LOW_BRIGHTNESS = C.3 ; Display brightness high or low.
symbol LOW_BRIGHTNESSP = pinC.3
symbol P_Register = b0
symbol P_Data = b1
symbol V_Temp1 = b3
symbol V_Temp2 = b4
symbol V_Neg = b8
symbol V_TempFrac = b9
symbol V_TempWhole = b10
symbol V_Digit0 = b11
symbol V_Digit1 = b12
symbol V_Digit2 = b13
symbol V_Temperature = w3 ; b6 b7
symbol V_LowBrightness = b14
letThereBeLight:
setfreq m4
; This long delay is to allow the chip to be more easily programmed later,
; because further down we "disconnect" the chip so that it stops looking for
; new downloads.
pause 3000
let V_LowBrightness = 0
input DISPLAY_F
input LOW_BRIGHTNESS
gosub MAX7219_Initialise
; We are using C.5 (serial in) as an input (to display farenheit), so we need
; to stop the chip from scanning the serial in pin looking for a new download.
; Once the disconnect command has run, you have to do a hard-reset to download
; a new program; see the manual.
disconnect
main:
setfreq m4
readtemp12 DS18B20_DQ, V_Temperature
setfreq m8
gosub displayTemp
if LOW_BRIGHTNESSP <> V_LowBrightness then
let V_LowBrightness = LOW_BRIGHTNESSP
if V_LowBrightness = 0 then
let P_Data = $05
else
let P_Data = $0E
end if
gosub MAX7219_SetIntensity
end if
;pause 1000
sleep 2
goto main
; The 3 digit 7 segment display I'm using has some segments that don't work;
; notably the e segment of the first character, and the DP segments of the
; first and third characters.
; So the displaying of the temperature below is a bit more complicated than
; would normally be required, to work around the problems with the display.
displayTemp:
let V_Neg = 0
if V_Temperature > $7FFF then
let V_Temperature = -V_Temperature
let V_Neg = 1
end if
if DISPLAY_FP = 1 then
; Convert C to F. 115/64 = 1.7968 (1.8 ish), and 512 is 32 * 16 (temp from DS18B20 is in 16th's of a degree).
let V_Temperature = V_Temperature * 115 / 64 + 512
end if
let b9 = V_Temperature & 15 * 10 / 16 ; frac
let b10= V_Temperature / 16 ; whole
; Work out what to display in each of the three digits.
if V_Neg = 1 then
let V_Digit0 = 10 ; minus sign.
if b10 > 99 then ; Can't display anything below -99, so show EE. If it's below -99 we're probably dead anyway.
let b12 = 11 ; E
let b13 = 11 ; E
elseif b10 > 9 then
let b12 = b10 / 10
let b13 = b10 % 10
else
let b12 = b10 | $80 ; Turn on DP
let b13 = b9
end if
else
if b10 > 99 then
let b11 = b10 / 100
let b12 = b10 / 10 % 10
let b13 = b10 % 10
elseif b10 < 20 then
if b10 > 9 then
let b11 = b10 / 10
else
let b11 = 15 ; blank
end if
let b12 = b10 % 10 | $80 ; Turn on DP
let b13 = b9
else
let b11 = 15
let b12 = b10 / 10
let b13 = b10 % 10
end if
end if
; Display it.
let b0 = MAX7219_DIGIT0
let b1 = b11
gosub MAX7219_SendCmdAndDataTo1
let b0 = MAX7219_DIGIT1
let b1 = b12
gosub MAX7219_SendCmdAndDataTo1
let b0 = MAX7219_DIGIT2
let b1 = b13
gosub MAX7219_SendCmdAndDataTo1
return
; ********************************************************************************
; *** MAX7219 Functions **********************************************************
; ********************************************************************************
MAX7219_Initialise:
output MAX7219_LOAD
output MAX7219_CLK
output MAX7219_DIN
low MAX7219_LOAD
low MAX7219_CLK
low MAX7219_DIN
pause 10
gosub MAX7219_TestModeOff
gosub MAX7219_ShutdownOff
let b0 = MAX7219_SCAN_LIMIT
let b1 = $02 ; Using 3 digits.
gosub MAX7219_SendCmdAndDataTo1
let b0 = MAX7219_DECODE_MODE
let b1 = $7 ; Use BCD for digits 0, 1 and 2.
gosub MAX7219_SendCmdAndDataTo1
let b1 = $0C ' Max brightness.
gosub MAX7219_SetIntensity
return
MAX7219_ShutdownOff:
let b0 = MAX7219_SHUTDOWN
let b1 = $01
goto MAX7219_SendCmdAndDataTo1 ; Return will be peformed by this function
#rem
MAX7219_ShutdownOn:
let b0 = MAX7219_SHUTDOWN
let b1 = $00
goto MAX7219_SendCmdAndDataToBoth ; Return will be peformed by this function
#endrem
MAX7219_TestModeOn:
let b1 = $01
goto MAX7219_TestModeSet ; Return will be peformed by this function
MAX7219_TestModeOff:
let b1 = $00
MAX7219_TestModeSet:
let b0 = MAX7219_TEST_MODE
goto MAX7219_SendCmdAndDataTo1 ; Return will be peformed by this function
MAX7219_SetIntensity:
; b1 = Intensity level for top half.
; b2 = Intensirt level for bottom half.
let b0 = MAX7219_INTENSITY
; *** Fall-through ***
MAX7219_SendCmdAndDataTo1:
; b0 = Register.
; b1 = Data for chip 1.
gosub MAX7219_SendCmdAndData
; For 7219 you only need to pulse the LOAD pin to load the data.
pulsout MAX7219_LOAD, 1
return
MAX7219_SendCmdAndData:
; b0 = Register.
; b1 = Data.
; b3 & b4 used as temp.
let b3 = b0
gosub MAX7219_Send
let b3 = b1
; *** Fall-through is intended. ***
MAX7219_Send:
; b3 = Data to send
for b4 = 0 to 7
if b3 > 127 then
high MAX7219_DIN
else
low MAX7219_DIN
end if
pulsout MAX7219_CLK, 1
b3 = b3 * 2
next
low MAX7219_DIN
return
#rem
3 Digit/7 Segment display Pins
1 1 1 a
2 1 0 9 8 7 ---
| | | | | | f| |b
+-----------+ | g |
| | ---
| 8. 8. 8. | e| |c
| | | |
+-----------+ --- O
| | | | | | d
1 2 3 4 5 6
1 = Digit 0 cathode
2 = Segment e
3 = Segment d
4 = Digit 1 cathode
5 = Segment c
6 = DP
7 = Digit 2 cathode
8 = Segment b
9 = Segment g
10 = Segment a
11 = Segment f
12 = NC
#endrem
Recent Comments