News LCD Display
Live RSS news feeds displayed on a text LCD. Larger Image
This Internet of Things example uses mbed's networking features to display live RSS news feeds on the LCD. It is based on earlier networking examples from the cookbook that read a web page and the Text LCD library to display characters on a text LCD. CNN Technology news is used for the live RSS feed.
Wiring
The same hardware and wiring setup is used as the Internet LCD Clock, Weather LCD Display andGeolocation LCD Display.
Ethernet Magjack Connector
Mbed | Sparkfun Ethernet Breakout |
---|---|
TD+ | P1 |
TD- | P2 |
RD+ | P7 |
RD- | P8 |
Note: Different magjack connectors can use different pin outs even though they look the same. These pins are for connectors from Sparkfun in 2011. If you are having trouble with your initial network setup, try this example code first. Once it works, it will confirm correct wiring on the connector (at least on the input side). Magjack Pinouts are posted for other common connectors. More connections to the unused pins including one to 3.3V and a capacitor should be added for long cables, but this setup works well with short cables. If you still get the net error message, make sure that DHCP service is enabled for your mbed. On some networks, you need to add the module's MAC address to enable the DHCP server to give it an IP address. It times out with an error, if no IP address is returned in about fifteen seconds. If the news does not display on the LCD after seeing "net OK", you may have DNS problems or a very slow network.
Text LCD
Mbed pins | Text LCD pins |
---|---|
GND | GND |
5V or 3.3V* | VCC |
VO to GND via 1k resistor | |
P15 | RS |
GND | RW |
P16 | E |
N/C | D0 |
N/C | D1 |
N/C | D2 |
N/C | D3 |
P17 | D4 |
P18 | D5 |
P19 | D6 |
P20 | D7 |
Where N/C is not connected and the top left pin of the TextLCD’s header is GND and the right most pin is D7 in the LCD orientation shown in the images above. The resistor sets the contrast and some LCDs may need a different value or a contrast adjust potentiometer. See Text LCD for additional help, if needed.
(*) Note: some older LCDs may use 5V, but 3.3V is more common on current LCDs. If you cannot find a data sheet to confirm this, try 3.3V first and if the display is still blank (after double checking all other connections and code) it might need 5V. To save jumper wires, this setup uses the four bit interface to transfer ASCII characters to the LCD.
Example Code
RSS_News_Display
#include "mbed.h" #include "EthernetNetIf.h" #include "HTTPClient.h" #include "TextLCD.h" //CNN Tech News RSS Feed - get web page with XML // displays titles on LCD from XML "<title>....title text...</title>" TextLCD lcd(p15, p16, p17, p18, p19, p20); // rs, e, d0-d3 EthernetNetIf eth; HTTPClient http; HTTPResult result; bool completed = false; void request_callback(HTTPResult r) { result = r; completed = true; } int main() { char *tstartXML = "<title>"; //RSS XML start title char *tendXML ="</title>"; //RSS XML end title char *tsptr; char *teptr; int i=0,j=0; // the eth and HTTP code has be taken directly from the HTTPStream documentation page // see http://mbed.org/cookbook/HTTP-Client-Data-Containers lcd.cls(); lcd.printf("net setup"); EthernetErr ethErr = eth.setup(); if (ethErr) { lcd.printf("\n\r net error"); return -1; } lcd.printf("\n\r net ok"); HTTPStream stream; char BigBuf[2048 + 1] = {0}; stream.readNext((byte*)BigBuf, 2048); //Point to buffer for the first read //CNN Tech News RSS Feed - get web page with XML HTTPResult r = http.get("HTTP://rss.cnn.com/rss/cnn_tech.rss", &stream, request_callback); while (!completed) { Net::poll(); // Polls the Networking stack if (stream.readable()) { // check for end of file BigBuf[stream.readLen()] = 0; // Transform this buffer in a zero-terminated char* string tsptr = BigBuf; // displays titles on LCD from XML "<title>....title text...</title>" do { tsptr = strstr(tsptr,tstartXML); // find <title> in string - NULL if not teptr = strstr(tsptr,tendXML); // find <\title> in string - NULL if not if (tsptr!=NULL) tsptr = tsptr + strlen(tstartXML);// move to char after "<title>" if ((tsptr!=NULL)&&(teptr!=NULL)) { i=0; // loop to scroll characters slowly across LCD for (j=0; (j+15)<(strlen(tsptr)-strlen(teptr)); j++) { lcd.cls(); // clear screen before writing a new line // loop to output a line on the LCD for (i=0; ((i<16)&&(tsptr[i+j-1] != '<')); i++) { lcd.putc(tsptr[i+j]); } if (j==0) wait(1.2); //add first line delays for scroll timing wait(.2); //delay for character scroll timing } wait(.4); lcd.cls(); //clear LCD between news items wait(.2); } } while (tsptr!=NULL); // No more "<title>"s in BigBuf to display stream.readNext((byte*)BigBuf, 2048); //Buffer has been read, now we can put more data in it } } if (result == HTTP_OK) { lcd.cls(); lcd.printf(" Read complete\n\r"); } else { lcd. printf(" Error %d\n", result); return -1; } }
Import programNews_LCD_display
Live RSS news feeds are displayed on a basic text LCD See http://mbed.org/users/4180_1/notebook/news-lcd-display/
A small portion of the RSS news feed web page containing XML is seen below. The data displayed on the LCD is the title. The format is "<title>....title text.....</title>". The code uses ad hoc parsing with strstr (i.e., this searches a large string for a substring) to find the "<title>' and "</title>" strings in the read buffer. The data on the web page is too large in many cases to read all of it into a memory buffer given mbeds RAM size, so it is split into several smaller buffers for each read and processed as the data streams in.
Example_RSS_XML_news_item
<pubDate>Fri, 20 Apr 2012 15:49:58 EDT</pubDate> <feedburner:origLink>http://www.cnn.com/2012/04/20/tech/social-media/facebook-privacy-policy/index.html?eref=rss_tech</feedburner:origLink></item> <item> <title>Debate reopens on violent video games</title> <guid isPermaLink="false">http://www.cnn.com/2012/04/19/tech/gaming-gadgets/games-violence-norway-react/index.html?eref=rss_tech</guid> <link>http://rss.cnn.com/~r/rss/cnn_tech/~3/gLgxLndGOFU/index.html</link> <description>Norway's alleged mass killer testified on Thursday that he played video games as a way to train for a shooting spree that killed 77 people last summer. In particular, Anders Behring Breivik said at his trial that he played "Call of Duty: Modern Warfare 2" as a means of shooting practice, according to CNN's report.<div class="feedflare"> <a href="http://rss.cnn.com/~ff/rss/cnn_tech?a=gLgxLndGOFU:VNLHDpHwbuM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_tech?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_tech?a=gLgxLndGOFU:VNLHDpHwbuM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_tech?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_tech?a=gLgxLndGOFU:VNLHDpHwbuM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/rss/cnn_tech?i=gLgxLndGOFU:VNLHDpHwbuM:V_sGLiPBpWU" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_tech?a=gLgxLndGOFU:VNLHDpHwbuM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rss/cnn_tech?d=qj6IDK7rITs" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_tech?a=gLgxLndGOFU:VNLHDpHwbuM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rss/cnn_tech?i=gLgxLndGOFU:VNLHDpHwbuM:gIN9vFwOqvQ" border="0"></img></a> </div><img src="http://feeds.feedburner.com/~r/rss/cnn_tech/~4/gLgxLndGOFU" height="1" width="1"/></description>
Video Demo
In the video above, mbed is powered up and obtains an IP address from the DHCP server. Net OK appears on the LCD. It then opens and reads a portion of the web page, searches for news items displaying them as they are found on the LCD and reads through the rest of the web page. When it reaches the end of the web page, "Read Complete" is displayed.
Ideas for further enhancements
1. Add a loop to keep reading and displaying the RSS feed.
2. Add other RSS news feed to cycle through.
3. Add code to display the description text after each title.
4. Add pushbuttons to select different RSS feeds or stop the display and show the description.
5. Instead of pushbuttons, use touch switch input or an IR remote.
6. Experiment with different scrolling ideas.
7. Use a Google RSS news feed. Google also has several RSS news feeds and news can be searched to generate a new RSS feed. Here is an example https://news.google.com/news/feeds?q=mbed&output=rss.
8. Items that span across a read buffer boundary will not be displayed. Modify the code to add this feature and reduce the buffer size to 512B.
9. Use Power over Ethernet (PoE) to power the device and avoid the extra wires for power. Sparkfun has one PoE option.
10. Upgrade to a larger display such as a color LCD or VGA.
11. Instead of ad hoc parsing code, use an XML parser like SPXML to read the RSS news items. Some RSS feeds have web pages that are too large to save in memory and streaming of data through the parser will be required. It could also be written to a file for demos in a prototype, but small flash devices can wear out with constant use, so such an approach would not work out well long term for a product.
3 comments on News LCD Display:
Please log in to post comments.
Good work Jim, finally got News_LCD_Display working. Somehow, I must not have downloaded all the libraries the first time. Had to slow the scroll speed by 0.1 sec, and maybe add a 0.1 second to LCD clear delay. Do you think a 4 x 20 LCD HD44780 would work? Hard to find one at 3.3 volts. Thanks, Don DeGregori.