All of the code and instruction provided is done so with no guarantee of success. I've bugtested the code to the best of my ability, and it should work in most cases, but certain things can throw it off. Details of such are within.
Step 1: Required Pieces/Parts for the Project
(1) Arduino Uno board
(1) Breadboard (I used a MakerShield prototyping shield instead, but a breadboard works just as well, albeit less compact)
(1) LED, your choice of color
(>12) Breadboard cables
(1) 16x2 Character LCD display, compatible with the LiquidCrystal library (works with larger LCD's with tweaking)
(1) Potentiometer, preferably 10K ohms.
(1) USB to USB-B cable (standard USB-to-Arduino cable)
Step 2: Wiring up the LCD and the LED
Picture is from http://arduino.cc/en/Tutorial/LiquidCrystal. Make sure you test it using the "Hello World!" program described. The screen may need to have the contrast turned all the way up for it to display properly.
The LED just goes in digital pin 13 and the GND pin next to it. Make sure the polarity is correct (Longer leg should be the + leg, short legs goes to ground).
Step 3: Getting the Required Software and Libraries
Obviously to use the LiquidCrystal440 Library, you will need the first piece of software: The Arduino coding interface, which I assume all Arduino users have (if not, just check the Arduino.cc website)
The second piece of software you will need is Python. Python is an easy to learn programming language for the PC, Linux, or Mac. It is available for free here: http://www.python.org/.
The final thing you need is the extension that will let the Python computer program work with the Arduino itself, via the serial cable. The required extension is Pyserial, available here: http://pyserial.sourceforge.net/. Make sure you get the correct version of Pyserial to work with your version of Python (2.7 to 2.7, 3.1 to 3.1, etc).
Step 4: The Arduino Code
// Read the comment lines to figure out how it works
int startstring = 0; // recognition of beginning of new string
int charcount = 0; // keeps track of total chars on screen
#include
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
lcd.begin(16,2); // Initialize the LCD size 16x2. Change if using a larger LCD
lcd.setCursor(0,0); // Set cursor position to top left corner
pinMode(13, OUTPUT);
}
void loop() {
char incomingByte = 0; // for incoming serial data
if (Serial.available() > 0) { // Check for incoming Serial Data
digitalWrite(13, HIGH);
incomingByte = Serial.read();
if ((incomingByte == '~') && (startstring == 1)){ // Check for the closing '~' to end the printing of serial data
startstring = 0; // Set the printing to off
delay(5000); // Wait 5 seconds
lcd.clear(); // Wipe the screen
charcount = 0; // reset the character count to 0
lcd.setCursor(0,0); // reset the cursor to 0,0
}
if (startstring == 1){ // check if the string has begun if first '~' has been read
if (charcount <= 30){ // check if charcount is under or equal to 30
lcd.print(incomingByte); // Print the current byte in the serial
charcount = charcount++; // Increment the charcount by 1 yes I know it's awkward
}
}
if (charcount == 31){ // if the charcount is equal to 31 aka the screen is full
delay(500);
lcd.clear(); // clear the screen
lcd.setCursor(0,0); // set cursor to 0,0
lcd.print(incomingByte); // continue printing data
charcount = 1; // set charcount back to 1
}
if (incomingByte == '~'){ // Check if byte is marker ~ to start the printing
startstring = 1; // start printing
}
}
digitalWrite(13, LOW);
delay(10); // 10ms delay for stability
}
Step 5: The Python Code
import urllib2
#import pyserial Library
import serial
#import time library for delays
import time
#import xml parser called minidom:
from xml.dom.minidom import parseString
#Initialize the Serial connection in COM3 or whatever port your arduino uses at 9600 baud rate
ser = serial.Serial("\\.\COM3", 9600)
i = 1
#delay for stability while connection is achieved
time.sleep(5)
while i == 1:
#download the rss file feel free to put your own rss url in here
file = urllib2.urlopen('http://news.sky.com/feeds/rss/world.xml')
#convert to string
data = file.read()
#close the file
file.close()
#parse the xml from the string
dom = parseString(data)
#retrieve the first xml tag (<tag>data</tag>) that the parser finds with name tagName change tags to get different data
xmlTag = dom.getElementsByTagName('title')[2].toxml()
# the [2] indicates the 3rd title tag it finds will be parsed, counting starts at 0
#strip off the tag (<tag>data</tag> ---> data)
xmlData=xmlTag.replace('<title>','').replace('</title>','')
#write the marker ~ to serial
ser.write('~')
time.sleep(5)
#split the string into individual words
nums = xmlData.split(' ')
#loop until all words in string have been printed
for num in nums:
#write 1 word
ser.write(num)
# write 1 space
ser.write(' ')
# THE DELAY IS NECESSARY. It prevents overflow of the arduino buffer.
time.sleep(2)
# write ~ to close the string and tell arduino information sending is finished
ser.write('~')
# wait 5 minutes before rechecking RSS and resending data to Arduino
time.sleep(300)
Step 6: Getting it to Work.
If it doesn't work:
Check the port in the python file. Your Arduino may be labeled differently or be numbered differently.
Check that the RSS feed doesn't have a ~ in the data. That will throw things out of whack.
Try running the .py file from the command line as an administrator. Sometimes the script doesn't have proper permissions to access the COM ports.







































Visit Our Store »
Go Pro Today »




I was wondering, if I do have the PC working on chewing up the web data, why do I need Arduino at all? I mean, I can have a much cheaper USB-to-Serial connecting the USB port of the PC to an LCD. As a matter of fact, CrystalFontz sell USB connected LCD screens, so the PC could simply manage the display too.
I did play with CrystalFontz a while back. Recently built few things where the micro-controller is basically standalone, connect to the Internet and display stuff on visual screen. See my Instructables. If the display is a small VGA one it has a higher wife-acceptance factor :-) The "old" 15" LCD display has now good use in the living room
I used the Arduino because I had it on hand and this was never meant to be a permanent build. I built it for fun, got it to work then took it apart and went onto the next Arduino project.
If you want to increment, you only need this:
charcount++;
That will increment by one.
the ++ modifier essentially acts as variable = variable + 1
So in this case it says variable = variable = variable + 1
It works, but should simply say charcount++ for the sake of simplicity and easier reading. Thanks for pointing it out.
In case you care: the reason it's undefined is that the C language spec says modifying the same variable multiple times within the same expression without an intervening "sequence point" is undefined. There are no sequence points in that expression, and charcount is being modified twice. This exact topic used to be a common question on the C programming groups on USENET. About once a week someone would ask why one compiler would behave differently than another when compiling "i = i++" (often the question was "which one is right?").
Here's a Stack Overflow question on this topic: http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors-i-i-i-i-i-etc
In terminal type: python -m serial.tools.list_ports
Find the port matching the one in the Arduino settings and copy paste into your python script.
and impressive
but the python language , this is the first time i see somebody using it in arduino
really really goooood
big thank you bro
even your project is simple but a new stuff has been learned today
Nice article thanks.
1. question though in the beginning of the arduino code.
Is the below lines a typo? shouldn't it include something?
or is it usingLiquidCrystal lcd(12, 11, 5, 4, 3, 2); as the include I no you said we need to download a new library but i never seen an include with pin assistants included, maybe it does not matter I'm just curious.
#include // import the LiquidCrystal Library
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Or in my case, I for get the ; or even just one space in the wrong place.
but I've dealt with this thru .html .php .pl /.cgi now a little C with the arduino, and Ive been noticing python gaining some ground again lately, so Ive been thinking about dabbling in it. any way good day and keep them coming.