Använda twitter och väder för att posta anteckningar och temperatur till kontor dörr
========
Målet med detta projekt är att använda ett Twitter-konto för att skicka
anteckningar till din kontor dörr, som är utrustad med en 20 x 4 LCD
(Visa). Detta projekt utgör i princip en implementering av
den idé som diskuteras i denna artikel IEEE spektrum:
http://Spectrum.IEEE.org/Geek-Life/hands-on/Send-a-tweet-to-your-Office-Door
Som en tilläggsprodukt visar det även aktuell temperatur (Läs i
från weather.gov) i en given plats. Genomförandet bygger på
kombinationen av en Arduino Uno ombord med en Arduino Ethernet
Sköld. Den totala kostnaden är ungefär $120. Det förutsätts att du
är bekanta med Arduino verktyg.
Maskin- och programvara
=====================
Hårdvara
--------
$45,95 - Arduino Ethernet Shield: http://www.sparkfun.com/products/9026
$29,95 - Arduino Uno: http://www.sparkfun.com/products/9950
$14.95 - 20 x 4 LCD vit på blå: http://www.hacktronics.com/LCDs/20-x-4-LCD-White-on-Blue/flypage.tpl.html (kunde få liknande från sparkfun.com att minimera fraktkostnaderna)
$11,95 - Arduino projekt kapsling: http://www.sparkfun.com/products/10088 (värd för både styrelsen och sköld)
USB-kabel A $3,95 - till B - 6 fot: http://www.sparkfun.com/products/512 (valfritt; du bör ha en redan)
$2,99 - 9 ledare 24 AWG strandsatta-skärmad 6FT: http://www.frys.com/product/3550794?site=sr:SEARCH:MAIN_RSLT_PG (för att koppla upp LCD-displayen till styrelsen)
$2,99 - 3 FT CAT6 patchkabel: http://www.frys.com/product/5979924?site=sr:SEARCH:MAIN_RSLT_PG (för att koppla upp styrelsen att din Internet-router)
$1,90 - 6 pin rätvinkliga kvinnliga huvud: http://www.sparkfun.com/products/9429 (två av dem, för LCD-anslutning)
$1,90 - projektet Box: http://www.futurlec.com/ProjectBoxes.shtml (för visning)
--------------
$116.53 - TOTALT
Programvara
--------
--Arduino skiss: ingår i slutet av detta instructable. Skissen
måste ändras för att möta dina individuella specifikationer. Den innehåller
kommentarer med beskrivning av varje ändring och hur det kan göras.
--Du kommer att behöva kompilera och ladda skissen till styrelsen med Arduino verktyg: http://arduino.cc/en/Main/Software
För att kunna kompilera det behöver du även följande bibliotek för Arduino-verktyg:
--Arduino EthernetDHCP: http://gkaindl.com/software/arduino-ethernet/dhcp
--Text Finder bibliotek: http://www.arduino.cc/playground/Code/TextFinder
Arduino skiss: bzdoor2lcd.pde
------------------------------
Få "markerade" senaste tweet från Twitter-konto "BZDoor" och Visa det på den
LCD-display, som jag har fast på min kontor dörr. Av utvalda jag menar tweets som
börja med nyckeln "BZD" bara. Jag använder Twitter-konto för att skriva anteckningar på min
Office dörren om kontorstid, att vara ute för kaffe, etc. :-)
//
Krets:
LCD stift 1,3,5,16 till Arduino digital stift GND
LCD stift 2 till Arduino digital pin + 5V
LCD pin 15 via Resitor 330 ohm till Arduino digital pin + 5V
LCD stift 14 till Arduino digital stift 2
LCD stift 13 till Arduino digital stift 3
LCD stift 12 till Arduino digital stift 4
LCD stift 11 till Arduino digital stift 5
LCD stift 4 till Arduino digital pin 9
LCD stift 6 till Arduino digital stift 8
#include < SPI.h >
#include < Ethernet.h >
#include < EthernetDHCP.h >
#include < TextFinder.h >
#include < LiquidCrystal.h >
LiquidCrystal lcd (9, 8, 5, 4, 3, 2);
byte [mac] = {0x90, 0xA2, 0xDA, 0x00, 0x4F, 0x8A};
byte ip [] = {192,168,1,177};
byte [server] = {199,59,148,10}; Twitter.com
byte server_weather [] = {140,90,113,200}; Weather.gov
#define NUM_CHAR_USERNAME 7 / / "BZDoor:" är användarnamn med 6 tecken +:
#define TWEET_OFFSET NUM_CHAR_USERNAME + 5 / / nyttig info från tweet visas visas efter "BZDoor: BZD"
char tweet [NUM_CHAR_USERNAME + 140]; 147 = "BZDoor:" + 140 för faktiska tweet
char old_tweet [] = {"BZDoor: BZD inga uppdateringar. Ha en trevlig dag! Aktuella temp: NA Cris "};
char temperatur [8].
Klient-klient (server, 80);
TextFinder finder(client);
Klienten client_weather (server_weather, 80);
TextFinder finder_weather(client_weather);
void setup()
{
LCD.BEGIN(4,20);
LCD.Clear();
LCD.Print("BZDoor2LCD");
Serial.BEGIN(9600);
Serial.println("BZDoor2LCD");
Ethernet.BEGIN (mac, ip);
}
void loop()
{
(1) kontrollera om ny tweet i BZDoor konto;
check_for_new_valid_tweet();
2) check för temperatur; också Visa signatur;
check_for_new_temperature();
(3) rensa upp;
client.stop();
client.flush();
client_weather.stop();
client_weather.flush();
(4) också klart "tweet" lagringsmatrisen; annars om senaste tweet är kortare
än den tidigare blir rester från föregående en del av senaste;
för (int jag = 0; jag < NUM_CHAR_USERNAME + 140; i ++) tweet [i] = "";
5) dröjsmål 2 minuter innan nästa uppdatering;
Delay(120000);
}
void check_for_new_valid_tweet() {
ansvariga med 1 och 2 rader med 4 x 20 LCD;
ansluta till Twitter (RSS för användare BZDoor: 316663659) och få den senaste tweeten;
denna kontroll kommer att ske varje andra 2 minuter, så om fler tweets har bokförts
har bokförts inom dessa 2 minuter bara senaste tweet skall bearbetas.
om (client.connect()) {
client.println ("GET http://www.twitter.com/statuses/user_timeline/316663659.rss HTTP/1.0"); BZDoor;
client.println();
} annat {
lcd.setCursor(0,0); LCD.Print ("Twitter anslutning");
lcd.setCursor(0,1); LCD.Print ("misslyckades!");
Serial.println ("Twitter anslutning misslyckades.");
}
om (client.connected()) {
få senaste tweet i Bzdoors konto genom att helt enkelt analysera objekt och title-Taggar;
om ((finder.find ("< element >") & & (finder.getString ("< title >", "</title >", tweet, 140)! = 0))) {
endast tweets som börjar med de tre tecknen "BZD" kommer att visas
på LCD-skärmen på office dörren; alla andra kommer att skrivas ut endast till
den Arduino seriell monitor
Serial.println(tweet);
en ordinarie tweet i Bzdoors konto är alltid i ett av två format:
1) "BZDoor: detta är ett Hello World! Tweet! ", som inte visas på LCD;
2) "BZDoor: BZD någon uppdatering", som visas på LCD eftersom börjar med nyckel BZD;
om (tweet [8] == 'B' & & tweet [9] == "Z" & & tweet [10] == hade ") {
Detta är en tweet som har en uppdatering från BZDoor som ska visas på office dörren;
display_tweet(tweet);
också kopiera denna senaste PIKA till old_tweet kedjan;
strncpy (old_tweet, tweet, 80 + TWEET_OFFSET);
} annat {
display_tweet(old_tweet); första gången detta säger inga nya uppdateringar;
}
} annat {
lcd.setCursor(0,0); LCD.Print kunde ("inte hitta artikeln");
lcd.setCursor(0,1); LCD.Print ("fält i senaste PIKA");
Serial.println kunde ("inte hitta fältet artikeln i senaste PIKA");
}
} annat {
lcd.setCursor(0,0); LCD.Print ("frånkopplad från");
lcd.setCursor(0,1); LCD.Print ("twitter");
Serial.println ("frånkopplad från twitter");
}
}
void display_tweet (char msg[]) {
Visa endast 40 tecken på de två första raderna av den
20 x 4 LCD-skärm; på tredje och fjärde raden används för
temperatur och signatur-bildskärm.
LCD.Clear();
Visa tweet är första 40 tecken;
lcd.setCursor(0,0);
för (int jag = TWEET_OFFSET; jag < TWEET_OFFSET + 20; i ++) {
om (msg [i]! = 0) lcd.print(msg[i]);
annat lcd.print(' ');
}
lcd.setCursor(0,1);
för (int jag = TWEET_OFFSET + 20; jag < TWEET_OFFSET + 40; i ++) {
om (msg [i]! = 0) lcd.print(msg[i]);
annat lcd.print(' ');
}
skriva ut också till seriell bildskärm;
char buffer_row [20].
strncpy (buffer_row, msg + TWEET_OFFSET, 20); buffer_row [20] = '\0';
Serial.println(buffer_row);
strncpy (buffer_row, msg + TWEET_OFFSET + 20, 20); buffer_row [20] = '\0';
Serial.println(buffer_row);
}
void check_for_new_temperature() {
ansvariga med 3 och 4 rader med 4 x 20 LCD;
ansluta till www.weather.gov och få temperatur för Fargo flygplats.
om (client_weather.connect()) {
client_weather.println ("GET /xml/current_obs/KFAR.xml HTTP/1.0");
client_weather.println();
} annat {
lcd.setCursor(0,2); LCD.Print ("väder anslutning");
lcd.setCursor(0,3); LCD.Print ("misslyckades!");
Serial.println ("väder anslutning misslyckades.");
}
om (client_weather.connected()) {
om ((finder_weather.getString ("< temp_f >","</temp_f >", temperatur, 8)! = 0)) {
lcd.setCursor(0,2);
LCD.Print ("Curr temp:"); LCD.Print(temperature); LCD.Print "F".
lcd.setCursor(0,3); LCD.Print ("Cris");
också till seriell utskriftsövervakare
Serial.println ("Curr temp:"); Serial.println(temperature); Serial.println "F".
Serial.println ("Cris");
} annat {
lcd.setCursor(0,2); LCD.Print ("aktuell temp: NA");
lcd.setCursor(0,3); LCD.Print ("Cris");
Serial.println kunde inte ("hitta temp_f i vädret ström");
}
} annat {
lcd.setCursor(0,2); LCD.Print ("aktuell temp: NA");
lcd.setCursor(0,3); LCD.Print ("Cris");
Serial.println ("frånkopplad från väder");
}
}