Pages: 1 2 3 [4] 5   Go Down
Author Topic: Arduino WordClock  (Read 15415 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A few more pictures:



* 2013-08-22 13.53.47 (Small).jpg (27.74 KB, 640x480 - viewed 44 times.)

* 2013-08-22 13.53.58 (Small).jpg (27.78 KB, 640x480 - viewed 36 times.)

* 2013-08-22 14.07.55 (Small).jpg (26.83 KB, 640x480 - viewed 32 times.)

* 2013-08-25 22.30.15 (Small).jpg (63.78 KB, 640x480 - viewed 39 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A little more...


* 2013-08-28 10.31.01 (Small).jpg (83.27 KB, 640x480 - viewed 41 times.)

* 2013-08-28 10.32.32 (Small).jpg (90.54 KB, 640x480 - viewed 40 times.)

* 2013-09-23 16.54.53 (Small).jpg (79.65 KB, 640x480 - viewed 42 times.)

* 2013-09-23 17.13.55 (Small).jpg (54.88 KB, 640x480 - viewed 40 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

And the last batch.


* 2013-09-23 17.15.18 (Small).jpg (99.54 KB, 640x480 - viewed 47 times.)

* IMGP1082 (Small).JPG (95.64 KB, 640x480 - viewed 46 times.)

* IMGP1084 (Small).JPG (90.21 KB, 640x480 - viewed 40 times.)
Logged

Norfolk UK
Offline Offline
Edison Member
*
Karma: 66
Posts: 2467
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Right now everything follows very nearly the original project from Riva, besides the enclosure.
What I would like to do in the future is to change the rotary encoder with two capacitive touch buttons to make it real stealthy ;-)
I like that idea, it annoyed me so much having buttons sticking out the back on the first wordclock I built I went for the hidden rotary encoder on the second version. It means you have to remove the back to adjust the clock but I have not needed to do that for about 8 months now. The clock back almost sits on the encoder shaft so pressing the clock back will scroll the date & temperature.

In order to make it work with the three MAX7219, I had to modify the MAX library provided by Riva.
Initially, the library only supported 2 MAX ICs and to make the four corner leds work, I had to make it support all possible addresses of the three MAXes.
The library is just a cut down version of the LedControl library. I had cut it down because the original clock used a ATmega8 and I was running out of Flash memory. The current code has a constant to define how many MAX chips are connected and should work.
Code:
const int numDevices = 2;               // Number of MAX7219 LED Driver Chips (1-8)

I just didn't realize yet how I will introduce some extended ASCII characters.
Just add then to this array.
Code:
prog_uchar font10x7 [] PROGMEM = {      // Large Ascii Font Matrix
I didn't yet found where should I extend the loadBufferLong to accept all of the 255 characters. I think it is from the standard AVR library...
The loadBuferLong is not from the ARV library. Just change the 0x7F to the new upper limit on the characters in the font10x7 array.
Code:
void loadBufferLong(int ascii){
    if (ascii >= 0x20 && ascii <=0x7f){

You will also need to adjust this code to send pixel data to the extra MAX chip.
Code:
// Display Buffer on LED matrix
void printBufferLong(){
    for (int a=0;a<7;a++){                              // Loop 7 times for a 10x7 font
        unsigned long x = bufferLong [a];               // Get buffer entry
        int y = (x>>24) & 0xff;                         // Mask off left hand character
        lc.setRow(1,a,y);                               // Send row to relevent MAX7219 chip
        y = (x>>16) & 0xff;                             // Mask off right hand character
        lc.setRow(0,a,y);                               // Send row to relevent MAX7219 chip
    }
}

The other suggestion of replacing some unused characters of the fefault ASCII table is easier to implement. The only problem is that I did not figured yet how can I concatenate a character specified at the position 0x7f (for example) in an Birthday message or in a string of a Month...
I did see that for example you've used the character 0x7f (the 127 position) with the º character and that you've specified it's use in the temperature string.
How can I use such a character in a month string? Let's say "Março" that means March?
If your using Windows then you could use character map to build the string up using the characters you need and then copy/paste into the sketch. As your matrix is a higher density you probably don't need the extra wide font I use and could maybe find/define the entire ASCII set with little problem.

Ho! Here are some pictures:
Looking good, I like the higher density of LED's
Logged

There is no such thing as a stupid question but there are a lot of inquisitive idiots.

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
In order to make it work with the three MAX7219, I had to modify the MAX library provided by Riva.
Initially, the library only supported 2 MAX ICs and to make the four corner leds work, I had to make it support all possible addresses of the three MAXes.
Quote
The library is just a cut down version of the LedControl library. I had cut it down because the original clock used a ATmega8 and I was running out of Flash memory. The current code has a constant to define how many MAX chips are connected and should work.
Code:
const int numDevices = 2;               // Number of MAX7219 LED Driver Chips (1-8)

Well, I did saw that constant and it was the first logic change I've made.
What I described was what was happening *after* changing that constant. I now understand that the problem was the "stripped down" version of the MAX library...

Quote
I just didn't realize yet how I will introduce some extended ASCII characters.
Quote
Just add then to this array.
Code:
prog_uchar font10x7 [] PROGMEM = {      // Large Ascii Font Matrix

Well, that was what I have tried, but without success even after changing the upper limit from 0x7f (127) to 0xff (255) as you suggest below.

Here is what I did:
After the last character you have in the font10x7 - the symbol º (that by the way is not in the correct position of the ASCII, but I understand that you put it there just for convenience), I created a new character that for this matter isn't relevant. That additional character will be in the 128 position (original 127 plus 1).
The quick test I've made was to call that new character I've added (at the position 0x80) after the 0x7f (º) you concatenate at the end of the temperature scrolling string.
The result is just a blank space...

I didn't yet found where should I extend the loadBufferLong to accept all of the 255 characters. I think it is from the standard AVR library...
Quote
The loadBuferLong is not from the ARV library. Just change the 0x7F to the new upper limit on the characters in the font10x7 array.
Code:
void loadBufferLong(int ascii){
    if (ascii >= 0x20 && ascii <=0x7f){

Yes, I did that. I changed the upper limit to 0xff which is 255 and the only position I used was after 0x7f which is 0x80 (which is position 128).
I then changed the end of the temperature string to test the new character visibility, like so:
Code:
    int x=strlen(chrBuffer);
    hrBuffer[x++] = 0x7f; // the º character at the position 127
    chrBuffer[x++] = 0x80; // my new character at the position 128 which don't show in the scrolling text
    chrBuffer[x++] = ' ';
    chrBuffer[x++] = ' ';
    chrBuffer[x] = 0x0;
    scrollRamMessage();
[/color]

Quote
You will also need to adjust this code to send pixel data to the extra MAX chip.
Code:
// Display Buffer on LED matrix
void printBufferLong(){
    for (int a=0;a<7;a++){                              // Loop 7 times for a 10x7 font
        unsigned long x = bufferLong [a];               // Get buffer entry
        int y = (x>>24) & 0xff;                         // Mask off left hand character
        lc.setRow(1,a,y);                               // Send row to relevent MAX7219 chip
        y = (x>>16) & 0xff;                             // Mask off right hand character
        lc.setRow(0,a,y);                               // Send row to relevent MAX7219 chip
    }
}

Thanks for the tip, but I think I don't need this because the third MAX only controls the four leds on each corner. It is not used to show anything when a message is scrolling.

Quote
The other suggestion of replacing some unused characters of the fefault ASCII table is easier to implement. The only problem is that I did not figured yet how can I concatenate a character specified at the position 0x7f (for example) in an Birthday message or in a string of a Month...
I did see that for example you've used the character 0x7f (the 127 position) with the º character and that you've specified it's use in the temperature string.
How can I use such a character in a month string? Let's say "Março" that means March?
Quote
If your using Windows then you could use character map to build the string up using the characters you need and then copy/paste into the sketch. As your matrix is a higher density you probably don't need the extra wide font I use and could maybe find/define the entire ASCII set with little problem.

I think I don't understand.
Consider that the string you defined as March is written like this: Márch (acute in a).
Consider that the "á" (acute a) is defined at the position 128 (0x80) and that you are able to show it alone in the scrolling text (I'm not at this moment).
How do you redefine the code for March string in the following code so is shows as Márch (small a with acute) and not March?

Code:

prog_uchar Month03[] PROGMEM = {
    "March \0"};


Thanks for your time and help.
Logged

Norfolk UK
Offline Offline
Edison Member
*
Karma: 66
Posts: 2467
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

How can I use such a character in a month string? Let's say "Março" that means March?
Quote
If your using Windows then you could use character map to build the string up using the characters you need and then copy/paste into the sketch. As your matrix is a higher density you probably don't need the extra wide font I use and could maybe find/define the entire ASCII set with little problem.

I think I don't understand.
Consider that the string you defined as March is written like this: Márch (acute in a).
Consider that the "á" (acute a) is defined at the position 128 (0x80) and that you are able to show it alone in the scrolling text (I'm not at this moment).
How do you redefine the code for March string in the following code so is shows as Márch (small a with acute) and not March?

If you have defined the acute a (á) as character 0x80 then using Windows Character Map program just select the 'System' font and make up the string you need and then copy/paste it into your sketch. As an example I did this and end up with 'M€rch'. In the system font the a looks like a vertical bar but in the forum font it looks like a euro currency sign.




Thanks for your time and help.

If I get time I will investigate the problem of going beyond character 0x7F
[/quote]
Logged

There is no such thing as a stupid question but there are a lot of inquisitive idiots.

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I'm sorry Riva I think I did not explain me correctly.

I am able to construct any string in my language as my keyboard have all those special characters. I think your suggestion about the windows character map was just to make me find that characters.
The problem is that whatever character I made a string of - lets say Março (for March), the "ç" cedilla does not show in the rotating string because I can't call characters with values >= 0x7f and I don't know how can I concatenate whatever character position specified in the font10x7 into a month string or other message.

Something like this:

Assume I have replaced the character int font10x7 at position 0x7f with the character "ç".
How would I change the code below in order to replace the fourth letter - the c, with the one (correct) I created at the position 0x7f?

Code:
prog_uchar Month03[] PROGMEM = {
    "Março \0"};

I know this is not the way, but you get the point  smiley-evil

Code:
prog_uchar Month03[] PROGMEM = {
    "Mar"+0x7f+"o \0"};

What I was asking was if there was a simpler solution to define the strings I need with special characters (months and names in aniversaries) in a more friendly way than the one you use to put together the string for advertising the temperature:

Code:
void doTemperature(){
    chrBuffer[0] = ' ';
    chrBuffer[1] = ' ';
    chrBuffer[2] = 'I';
    chrBuffer[3] = 't';
    chrBuffer[4] = 's';
    chrBuffer[5] = ' ';
    chrBuffer[6] = 0x0;

If someday you want and find time to investigate this, I appreciate if you could share a possible solution with me.
Thank you.
Logged

Norfolk UK
Offline Offline
Edison Member
*
Karma: 66
Posts: 2467
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Home at last and after testing I can add more characters to the font10x7[] definitions and then alter the 0x7f bound in loadBufferLong to display them. I'm not using the wordclock to display though (one is 400 miles away and the other my wife won't allow me to play with any more) but am using a Rainbowduino with the same core code as used in the clock, just the rendering routine is different.
I knocked up an extended (0x20-0xff) double width font based on the Windows Terminal font while at work but it's now 12x8 instead of 10x7 so will need a few more changes to get it working + not all the extended characters are correctly defined. I also had the original (pre double width) 6x8 version but unwittingly messed it up when doing a final search/replace to make it arduino compatible. I will do it again when I go back to work next week.
I used a free GLCD font creator from here to import and convert the terminal font and then knocked up a quick VB6 program to change the font program output from hex to binary and rotate the data through 90 degrees, another VB6 program I had already was then used to double the width.
Logged

There is no such thing as a stupid question but there are a lot of inquisitive idiots.

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Well, in that case I must be doing something wrong or missing something!

I've extended the loadBufferLong to support ascii codes until 255:

Code:
void loadBufferLong(int ascii){
    if (ascii >= 0x20 && ascii <= 0xff) {
   ...

and then, I've just added some test character to the end of the font10x7 definition. So, that additional character is now after 0x7f, so it is on the 0x80 position (at least I think so).

If I explicitly call that character for example in the code below, i don't see anything different in the new scrolling text...
The first position of the array that should hold the new character 0x80, just don't display anything. It is just like a space...

Code:
void doTemperature(){
    chrBuffer[0] = 0x80;
    chrBuffer[1] = ' ';
    chrBuffer[2] = 'I';
    chrBuffer[3] = 't';
    chrBuffer[4] = 's';
    chrBuffer[5] = ' ';
    chrBuffer[6] = 0x0;

Thank you for the link for the GLCD font creator. I didn't knew it and I am going to try it out. From my quick review, It appears that it only exports to an hexadecimal format, that need a good amount of work to make it usable in this project.

Some time ago I came across The LED Matrix Studio here, but didn't did anything with it yet.

I really appreciate your help, support and time.
Best regards
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Riva,

Great work on the clock!
I'm midway through building one with a 6x16 array (6 rows high, 16 columns (two max7219 driving 6x8 each)).
I've got all the basics going great, thanks for the code.

However, the scrolling message doesn't scroll from right to left across both arrays - it runs on both arrays independently (with a slight delay).

I have the MAX7219s cascaded (DOUT to DIN) with parallel load and clk

I can't find why it is doing this. Could it be something to do with my matrix being 6x8 rather than 8x8?
I've tried other code that's supposed to scroll correctly (http://forum.arduino.cc/index.php?topic=170043.msg1265321#msg1265321 and others) but all have the same effect.

Any help is appreciated.
Code attached.

Turns out I had the Max7219 in the wrong order. Riva pointed out in another post that the first Max7219 should be on the right side of the display (I had it on the left...). Swapped over wiring and all fixed!

* Clock_v6006_mod.ino (51.45 KB - downloaded 11 times.)
« Last Edit: January 06, 2014, 08:19:07 am by pippin88 » Logged

Norfolk UK
Offline Offline
Edison Member
*
Karma: 66
Posts: 2467
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Turns out I had the Max7219 in the wrong order. Riva pointed out in another post that the first Max7219 should be on the right side of the display (I had it on the left...). Swapped over wiring and all fixed!
Glad you got it sorted. Had I seen this post earlier I would have asked the chip order but you managed to find the problem okay.
Logged

There is no such thing as a stupid question but there are a lot of inquisitive idiots.

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Riva,
Wondering if you can help me with scrolling font?

My matrix is 6x16 (6 rows, 16 columns).
Now that I have the Max7219s in the correct order, your code works great, however the bottom two rows don't exist, so of course the font is cut off at the bottom.

Can you point me in the right direction for modifying the code to work with my size matrix?

EDIT: Looks like SetScanLimit might be what I need, will have a fiddle.

Thanks heaps,
Nick
« Last Edit: January 07, 2014, 04:42:13 am by pippin88 » Logged

Norfolk UK
Offline Offline
Edison Member
*
Karma: 66
Posts: 2467
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

My matrix is 6x16 (6 rows, 16 columns).
Now that I have the Max7219s in the correct order, your code works great, however the bottom two rows don't exist, so of course the font is cut off at the bottom.
You will have to re-design the font as it's currently 7 rows high.

Can you point me in the right direction for modifying the code to work with my size matrix?
Every character would need to be reduced in height.
From this...

Code:
    B00111111, B00000000, //A
    B11000000, B11000000,
    B11000000, B11000000,
    B11000000, B11000000,
    B11111111, B11000000,
    B11000000, B11000000,
    B11000000, B11000000,
    12,
to something like this...
Code:
    B00111111, B00000000, //A
    B11000000, B11000000,
    B11000000, B11000000,
    B11111111, B11000000,
    B11000000, B11000000,
    B11000000, B11000000,
    B00000000, B00000000,
    12,
You would also need to do the same to the 6x7 number font. You could also adjust the code to take account of the smaller font but it's easier if you just reduce the height and leave the padding at the bottom to maintain 7 rows of font data and one kerning value.
EDIT: Looks like SetScanLimit might be what I need, will have a fiddle.
Scan limit will not help here as the font is physically to large to fit in 6 rows.
Logged

There is no such thing as a stupid question but there are a lot of inquisitive idiots.

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Riva,

Thanks, working on that now. I arrived at the same conclusion regarding using padding at bottom (rather than modifying the row iteration code).

Many thanks for your help.
Can I buy you a beer via donation or something?
Logged

Norfolk UK
Offline Offline
Edison Member
*
Karma: 66
Posts: 2467
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Can I buy you a beer via donation or something?
Just exhibit your finished clock for all to see, as it differs from this design it may be of more use to somone.
Logged

There is no such thing as a stupid question but there are a lot of inquisitive idiots.

Pages: 1 2 3 [4] 5   Go Up
Jump to: