Arduino Hacking: RSS onto an LED Dot Matrix Display Panel

We’ve been playing with Arduinos for the last few weeks.  Yesterday I bought a Freetronics Dot Matrix Display (DMD) from Jaycar for $30 or so, and I’ve cobbled together a couple of scripts to drive some RSS content to it.  It works 🙂


I have a SainSmart Mega 2560, but there’s no reason this shouldn’t work with any Uno compatible. Note – this DMD doesn’t work with the Mega unless you overwrite a couple of files (Thanks @TheRevva for sharing)

Before starting, two ruby gems are needed – SerialPort and FeedJira -thanks @johndagistino [protected] for the steer.  It’s also worth spending time going through the code samples Freetronics have made available on github – linked at the bottom their product page

Note – I still have a problem with serial comms in that it doesn’t work unless I have the Serial Monitor open.

1
2
3
gem install serialport
 
gem install feedzilla

 

This is the ruby test script that I’ve used to grab two rss feeds, and pass the headlines in one at a time into to Arduino over the serial port.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
require "serialport"
require "feedjira"
 
def showfeed(feedurl)
    #params for serial port
    port_str = "/dev/tty.usbmodem621"  #NB port may be different for you, copy this from port selected in Arduino IDE
    baud_rate = 9600
    data_bits = 8
    stop_bits = 1
    parity = SerialPort::NONE
      
    sp = SerialPort.new(port_str, baud_rate, data_bits, stop_bits, parity)
    feed = Feedjira::Feed.fetch_and_parse(feedurl)
    sp.write feed.title
    puts feed.title
    sp.write "   "
    sleep(8)
 
    feed.entries.each do |entry|
        sp.write entry.title
        puts entry.title
        sp.write "   "
        sleep(8)
    end
end

And lastly, the Arduino sketch to drive the rss feed onto the display:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// dmd-rss.ino
 
#include "SPI.h"     
#include "DMD.h"
#include "TimerOne.h"
#include "Arial_black_16.h"<arial_black_16.h>
// you can remove the fonts if unused
#include "SystemFont5x7.h"
 
#define DISPLAYS_ACROSS 1  
#define DISPLAYS_DOWN 1      
/* change these values if you have more than one DMD connected */
DMD dmd(DISPLAYS_ACROSS,DISPLAYS_DOWN);
 
void ScanDMD()
{
  dmd.scanDisplayBySPI();
}
 
void drawText(String dispString, int scrollspeed)
{
  dmd.clearScreen( true );
  dmd.selectFont( SystemFont5x7 );
  char newString[256];
  int sLength = dispString.length();
  dispString.toCharArray( newString, sLength+1 );
  dmd.drawMarquee(newString,sLength,( 32*DISPLAYS_ACROSS )-1 , 0 );
  long start=millis();
  long timer=start;
  long timer2=start;
  boolean ret=false;
  while(!ret){
    if ( ( timer+1000-scrollspeed ) < millis() ) {
      ret=dmd.stepMarquee( -1 , 0 );
      timer=millis();
    }
  }
}
 
void setup()
{
    Serial.begin(9600);
   Timer1.initialize( 5000 );          
/*period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker.*/
 
   Timer1.attachInterrupt( ScanDMD ); 
/*attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI()*/
 
   dmd.clearScreen( true );           
/* true is normal (all pixels off), false is negative (all pixels on) */
}
 
void loop() {
   
  String content = "";
  char character;
 
  while(Serial.available()) {
      character = Serial.read();
      content.concat(character);
      Serial.println(content);
  }
 
  if (content != "") {
    drawText(content,980);
    delay(1000);
    dmd.clearScreen( true);
    delay(500);
  }
  else {
    delay(500);
    }
     
}

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *