========
El objetivo de este proyecto es utilizar una cuenta de Twitter para enviar
Notas a la puerta de la oficina, que está equipado con un 20 x 4 LCD
(pantalla). Este proyecto presenta, básicamente, una implementación de
la idea discutida en este artículo de espectro de IEEE:
http://Spectrum.IEEE.org/geek-Life/Hands-on/Send-a-Tweet-to-your-Office-Door
Como una mejora, también muestra la temperatura actual (leer en
de weather.gov) en un lugar determinado. La aplicación se basa en
la combinación de una placa Arduino Uno con un Arduino Ethernet
Escudo. El costo total es de aproximadamente $120. Se supone que usted
están familiarizados con herramientas de Arduino.
Hardware y software
=====================
Hardware
--------
$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 blanco en azul: http://www.hacktronics.com/LCDs/20-x-4-LCD-White-on-Blue/flypage.tpl.html (podría conseguir similar de sparkfun.com para reducir al mínimo los gastos de envío)
$11.95 - Arduino proyecto recinto: http://www.sparkfun.com/products/10088 (acoge la Junta y el escudo)
$3.95 - Cable USB A B - 6 pies: http://www.sparkfun.com/products/512 (opcional; se debe hacer ya)
$2.99 - 9 conductor 24 AWG trenzado blindado 6FT: http://www.frys.com/product/3550794?site=sr:SEARCH:MAIN_RSLT_PG (para enganchar la pantalla LCD para la Junta)
$2.99 - 3 FT CAT6 Cable de conexión: http://www.frys.com/product/5979924?site=sr:SEARCH:MAIN_RSLT_PG (para enganchar la Junta a su router de Internet)
$1.90 - 6 pin ángulo recto hembra encabezado: http://www.sparkfun.com/products/9429 (dos de ellos, para la conexión del LCD)
$1.90 - cuadro de proyecto: http://www.futurlec.com/ProjectBoxes.shtml (para pantalla)
--------------
$116.53 - TOTAL
Software
--------
-Arduino sketch: incluye al final de este instructivo. El bosquejo
se debe modificar para satisfacer sus especificaciones individuales. Contiene
Comentarios con la descripción de cada cambio y cómo se puede hacer.
--Usted necesitará compilar y cargar el sketch a la placa Arduino herramientas: http://arduino.cc/en/Main/Software
Para poder compilarlo usted también necesitará las siguientes bibliotecas para sus herramientas de Arduino:
-Arduino EthernetDHCP: http://gkaindl.com/software/arduino-ethernet/dhcp
--Biblioteca de buscador texto: http://www.arduino.cc/playground/Code/TextFinder
Sketch de Arduino: bzdoor2lcd.pde
------------------------------
Get "seleccionado" último tweet de la cuenta de Twitter "BZDoor" y mostrar en la
Exhibición del LCD, que he fijado en la puerta de mi oficina. Seleccionado por significo ser tweets que
arranca con la llave "BZD" solamente. Utilizar la cuenta de Twitter para publicar notas sobre mi
puerta de la oficina sobre horas de oficina, siendo hacia fuera para el café, etc.. :-)
//
El circuito:
LCD 1,3,5,16 para pin digital de Arduino GND de los pernos
Pin 2 de la LCD para pin digital de Arduino + 5V
Pin de LCD 15 via Resitor 330 Ohms para pin digital de Arduino + 5V
Pin de LCD 14 para pin digital de Arduino 2
LCD 13 a pin Arduino digital pin 3
Pin de LCD 12 para pin digital de Arduino 4
Pin de LCD 11 al pin digital de Arduino 5
LCD 4 a pin Arduino digital pin 9
Pin de LCD 6 al pin digital de Arduino 8
#include < SPI.h >
#include < Ethernet.h >
#include < EthernetDHCP.h >
#include < TextFinder.h >
#include < LiquidCrystal.h >
LiquidCrystal lcd (9, 8, 5, 4, 3, 2);
mac de bytes [] = {0x90, 0xA2, 0xDA, 0 x 00, 0x4F, 0x8A};
byte ip [] = {192,168,1,177};
servidor de bytes [] = {199,59,148,10}; Twitter.com
Byte [] server_weather = {140,90,113,200}; Weather.gov
#define NUM_CHAR_USERNAME 7 / / "BZDoor:" es el nombre de usuario con 6 caracteres +:
#define TWEET_OFFSET NUM_CHAR_USERNAME + 5 / / información útil del tweet aparezca aparece después de "BZDoor: BZD"
char un tweet [NUM_CHAR_USERNAME + 140]; 147 = "BZDoor:" + 140 para real tweet
char old_tweet [] = {"BZDoor: BZD no hay actualizaciones. ¡Que tengas un buen día! Temperatura actual: NA Cris "};
temperatura de Char [8];
Cliente cliente (servidor, 80);
Finder(client) de TextFinder;
Cliente client_weather (server_weather, 80);
Finder_weather(client_weather) de TextFinder;
void setup()
{
LCD.Begin(4,20);
LCD.Clear();
LCD.Print("BZDoor2LCD");
Serial.Begin(9600);
Serial.println("BZDoor2LCD");
Ethernet.Begin (mac, ip);
}
void loop()
{
(1) comprobar si hay nuevo tweet en la cuenta de BZDoor;
check_for_new_valid_tweet();
(2) control de temperatura; también Mostrar la firma;
check_for_new_temperature();
(3) limpiar;
Client.STOP();
Client.Flush();
client_weather.STOP();
client_weather.Flush();
(4) claro también la matriz de almacenamiento de "tweet"; por otra parte si el último tweet es más corto
que el anterior, restos de la anterior pasarán a formar parte de la última;
para (int i = 0; i < NUM_CHAR_USERNAME + 140; i ++) tweet [i] = ' ';
(5) demora 2 minutos antes de la próxima actualización;
Delay(120000);
}
void check_for_new_valid_tweet() {}
responsable con las filas 1 y 2 de 4 x 20 LCD;
conectar a Twitter (RSS del usuario BZDoor: 316663659) y el tweet más reciente;
Esta comprobación se hará cada otros 2 minutos, así que si han sido escritos más tweets
han sido escritos dentro de esos 2 minutos que se procesará sólo el tweet más reciente;
Si (client.connect()) {}
Client.println ("GET http://www.twitter.com/statuses/user_timeline/316663659.rss HTTP/1.0"); BZDoor;
Client.println();
} else {}
lcd.setCursor(0,0); LCD.Print ("Twitter conexión");
lcd.setCursor(0,1); LCD.Print ("error.");
Serial.println ("Twitter conexión fallada.");
}
Si (client.connected()) {}
obtener el último tweet en la cuenta de BZDoor por simplemente analizar las etiquetas artículo y título;
Si ((finder.find ("< item >") & & (finder.getString ("< title >", "</título >", tweet, 140)! = 0))) {}
sólo tweets que empiezan con los tres personajes que se mostrará "BZD"
en la pantalla LCD en la puerta de la oficina; todos los demás se imprimirá sólo a
monitor serie de Arduino
Serial.println(Tweet);
un regular tweet en la cuenta de BZDoor está siempre en uno de dos formatos:
1) "BZDoor: esto es un Hola mundo! Tweet! ", que no aparece en la pantalla LCD;
2) "BZDoor: BZD alguna actualización", que se visualiza en el LCD porque comienza con clave BZD;
Si (tweet [8] == 'B' & & tweet [9] == 'Z' & & tweet [10] == había ') {}
Esto es un tweet que tiene una actualización de BZDoor a mostrarse en la puerta de la oficina;
display_tweet(Tweet);
también copiar a este último twit a old_tweet matriz;
strncpy (old_tweet, tweet, 80 + TWEET_OFFSET);
} else {}
display_tweet(old_tweet); primera vez, esto dice no hay actualizaciones nuevas;
}
} else {}
lcd.setCursor(0,0); LCD.Print ("no pudo encontrar elemento");
lcd.setCursor(0,1); LCD.Print (campo en el último twit");
Serial.println ("no pudo encontrar campo artículo en último twit");
}
} else {}
lcd.setCursor(0,0); LCD.Print ("desconectado de");
lcd.setCursor(0,1); LCD.Print ("twitter");
Serial.println ("desconectado de twitter");
}
}
void display_tweet (char msg[]) {}
Mostrar sólo 40 caracteres en las dos primeras filas de la
pantalla LCD 20 x 4; las filas terceros y cuarta se usan para
exhibición de la temperatura y la firma;
LCD.Clear();
Mostrar a caracteres primeros 40 del tweet;
lcd.setCursor(0,0);
para (int i = TWEET_OFFSET; i < TWEET_OFFSET + 20; i ++) {}
Si (msg [i]! = 0) lcd.print(msg[i]);
lcd.print(' ') otra cosa;
}
lcd.setCursor(0,1);
para (int i = TWEET_OFFSET + 20; i < TWEET_OFFSET + 40; i ++) {}
Si (msg [i]! = 0) lcd.print(msg[i]);
lcd.print(' ') otra cosa;
}
imprimir también al monitor serial;
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() {}
responsable con 3 y 4 filas de 4 x 20 LCD;
conectarse www.weather.gov y conseguir la temperatura para el aeropuerto de Fargo;
Si (client_weather.connect()) {}
client_weather.println ("GET /xml/current_obs/KFAR.xml HTTP/1.0");
client_weather.println();
} else {}
lcd.setCursor(0,2); LCD.Print ("el tiempo en la conexión");
lcd.setCursor(0,3); LCD.Print ("error.");
Serial.println ("tiempo conexión fallada.");
}
Si (client_weather.connected()) {}
Si ((finder_weather.getString ("< temp_f >","</temp_f > «, temperatura, 8)! = 0)) {}
lcd.setCursor(0,2);
LCD.Print ("cambio de temperatura:"); LCD.Print(Temperature); LCD.Print ("F");
lcd.setCursor(0,3); LCD.Print ("Cris");
imprimir también en el monitor serial
Serial.println ("Curr temperatura:"); Serial.println(Temperature); Serial.println ("F");
Serial.println ("Cris");
} else {}
lcd.setCursor(0,2); LCD.Print ("temperatura actual: NA");
lcd.setCursor(0,3); LCD.Print ("Cris");
Serial.println ("no pudo encontrar temp_f en la corriente del tiempo");
}
} else {}
lcd.setCursor(0,2); LCD.Print ("temperatura actual: NA");
lcd.setCursor(0,3); LCD.Print ("Cris");
Serial.println ("desconectado del tiempo");
}
}