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); } } |