Severe Weather Alert
Istvan Papp-Chang
Reginald Humphrey

This project uses mbed networking features to display weather alerts on the LCD. It checks NOAAs severe weather Watch/Warnings/Advisories and displays them on the LCD while sounding an alarm if there is one.
Wiring
Ethernet Connector
| Mbed | Sparkfun Ethernet Breakout |
|---|---|
| TD+ | P1 |
| TD- | P2 |
| RD+ | P7 |
| RD- | P8 |
Text LCD
| Mbed Pins | Text LCD pins |
|---|---|
| GND | GND |
| 5V or 3.3V | Vu or Vout |
| 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 |
Example Code
Severe_Weather_Alert
#include "mbed.h"
#include "EthernetNetIf.h"
#include "HTTPClient.h"
#include "TextLCD.h"
//Severe Weather Alert - 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;
PwmOut speaker(p21);
bool completed = false;
void request_callback(HTTPResult r)
{
result = r;
completed = true;
}
int main()
{
//while(1) {
char *tstartXML = "<title>"; //RSS XML start title
char *tendXML ="</title>"; //RSS XML end title
char *tsptr;
char *teptr;
int i=0,j=0,t=0,c=0,d=0;
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
//NOAA Severe Weather RSS Feed - get web page with XML
HTTPResult r = http.get("http://alerts.weather.gov/cap/wwaatmget.php?x=GAC121&y=0", &stream, request_callback);
while (!completed) {
c=0;
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++) {
c++;
}
i=0;
if (t>0 && c> 51 && d==0 && c!=108) {
speaker.period(1.0/500.0); // 500hz period
speaker =0.5; //50% duty cycle - max volume
wait(2.5);
speaker=0.0; // turn off audio
wait(1);
speaker =0.5; //50% duty cycle - max volume
wait(2.5);
speaker=0.0; // turn off audio
wait(1);
i=0;
d=1;
}
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(.25); //delay for charcter scroll timing
}
wait(.4);
lcd.cls(); //clear LCD between <title> 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
c=0;
t++;
}
}
lcd.cls();
if (result == HTTP_OK) {
lcd.cls();
lcd.printf(" Read complete\n\r");
} else {
lcd. printf(" Error %d\n", result);
return -1;
}
// }
}
Import programSevere_Weather_Alert
Severe weather alert using NOAA RSS feed
Video Demo
In the video above, the mbed 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 weather alerts and displays them while using the speaker to sound an alarm.
Ideas for Further Enhancement
- Implement way to check multiple locations for weather alerts
- Make the alarm use different sounds
Please log in to post comments.
