Este tema lo vimos antes en un artículo anterior con un servidor propio, ahora usaremos una aplicación de un tercero para enviar los tweets, de modo similar a lo que vimos aquí usando el DigiX
En efecto la empresa ThingSpeak te proporciona la aplicación ThingTweet para poder enviar tuits, específicamente, ThingTweet es un proxy que permite a nuestro Arduino enviar actualizaciones de status hacia Twitter usando una llamada a la API de ThingTweet.
Mas detalles tras el salto
Requisitos
- Arduino Uno
- Ethernet Shield
- Acceso a Internet
- Cable de Red
- Red Local con DHCP
- Cable USB B para Arduino
Procedimiento
Por el lado del hardware es muy simple, hay que conectar el Arduino Uno con el Ethernet Shield y el cable USB para cargar el sketch, hay que conectar el cable de red al Ethernet shield y al router de la red local.
En relación al software hay que ir al sitio www.thingspeak.com crear una cuenta y cuando ingreses vas a la sección de apps y elijes la aplicación Thingtweets,
esto te llevará a la página de Twitter donde ingresas tu user y password para dar el permiso a la aplicación de enviar twits por esta cuenta, vas a obtener una clave de API que te permite enviar el tweet y la usaremos en el sketch de ejemplo que mostramos a continuación
El sketch de ejemplo tomamos directo de GitHub
/* */ #include <SPI.h> #include <Ethernet.h> // Local Network Settings byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x03, 0x09 }; // Must be unique on local network // ThingSpeak Settings char thingSpeakAddress[] = "api.thingspeak.com"; String thingtweetAPIKey = "aaaKRCDWA1DAAG19"; // Variable Setup long lastConnectionTime = 0; boolean lastConnected = false; int failedCounter = 0; // Initialize Arduino Ethernet Client EthernetClient client; void setup() { // Start Serial for debugging on the Serial Monitor Serial.begin(9600); // Start Ethernet on Arduino startEthernet(); delay(1000); // Update Twitter via ThingTweet updateTwitterStatus("Probando twitter desde Arduino @thingspeak"); } void loop() { // Print Update Response to Serial Monitor if (client.available()) { char c = client.read(); Serial.print(c); } // Disconnect from ThingSpeak if (!client.connected() && lastConnected) { Serial.println("...disconnected"); Serial.println(); client.stop(); } // Check if Arduino Ethernet needs to be restarted if (failedCounter > 3 ) {startEthernet();} lastConnected = client.connected(); } void updateTwitterStatus(String tsData) { if (client.connect(thingSpeakAddress, 80)) { // Create HTTP POST Data tsData = "api_key="+thingtweetAPIKey+"&status="+tsData; client.print("POST /apps/thingtweet/1/statuses/update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Connection: close\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("Content-Length: "); client.print(tsData.length()); client.print("\n\n"); client.print(tsData); lastConnectionTime = millis(); if (client.connected()) { Serial.println("Connecting to ThingSpeak..."); Serial.println(); failedCounter = 0; } else { failedCounter++; Serial.println("Connection to ThingSpeak failed ("+String(failedCounter, DEC)+")"); Serial.println(); } } else { failedCounter++; Serial.println("Connection to ThingSpeak Failed ("+String(failedCounter, DEC)+")"); Serial.println(); lastConnectionTime = millis(); } } void startEthernet() { client.stop(); Serial.println("Connecting Arduino to network..."); Serial.println(); delay(1000); // Connect to network amd obtain an IP address using DHCP if (Ethernet.begin(mac) == 0) { Serial.println("DHCP Failed, reset Arduino to try again"); Serial.println(); } else { Serial.println("Arduino connected to network using DHCP"); Serial.println(); } delay(1000); }
Una vez que cargamos el sketch anterior, vamos a la consola serial (Tools -> Serial Monitor) y esta es la salida
Con esto podemos enviar un tuit desde el arduino, esto es solo un primer ejemplo.
Si tienes alguna duda o idea para compartir no olvides que puedes usar el formulario al final de este post
Hola Manuel y amigos de intenet de las cosas…
Me dirijo a ustedes nuevamente, por favor en esta ocacion deseo que me ayuden con lo siguiente: buscando skecth de Arduino y Thingpeak logre hacer exactamente lo que quiero, pero tengo un solo detalle y ya he leído un montos de paginas y no se me ocurre como darle una solución. Hice el siguiente programa basado en este: http://community.thingspeak.com/tutorials/arduino/update-thingspeak-channels-and-twitter-with-arduino-ethernet/ lo tuve que modificar ya que esta pensado en un IDE antiguo de Arduino. como te contaba logre hacer exactamente lo que sale ahí con el siguiente Skecth.
#include
#define DHTPIN 2 // Conectamos a la entrada del Pin Digital 2
#define DHTTYPE DHT11 // El tipo de sensor que estamos ocupando
DHT dht(DHTPIN, DHTTYPE);
#include
#include
// Local Network Settings
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; // Must be unique on local network
// ThingSpeak Settings
char thingSpeakAddress[] = «api.thingspeak.com»;
String writeAPIKey = «XXXXXXXXXXX»; // Write API Key for a ThingSpeak Channel
String thingtweetAPIKey = «XXXXXXXXXXX»; // Write API Key for a ThingSpeak Channel
const int updateThingSpeakInterval = 5000; // Time interval in milliseconds to update ThingSpeak (5000 =5 seconds)
const long updateTwitterInterval = 61000; // Time interval in milliseconds to update Twitter (3600000 = 1 hour)
// Variable Setup
long lastConnectionTime = 0;
long lastTweetTime = 0;
boolean lastConnected = false;
int failedCounter = 0;
// Initialize Arduino Ethernet Client
EthernetClient client;
void setup(){
dht.begin();
{
// Start Serial for debugging on the Serial Monitor
Serial.begin(9600);
// Start Ethernet on Arduino
startEthernet();
}
}
void loop()
{
int h = dht.readHumidity();
int t = dht.readTemperature();
// Print Update Response to Serial Monitor
if (client.available())
{
char c = client.read();
Serial.print(c);
}
// Disconnect from ThingSpeak
if (!client.connected() && lastConnected)
{
Serial.println(«…disconnected»);
Serial.println();
client.stop();
}
// Update
if(!client.connected() && (millis() – lastConnectionTime > updateThingSpeakInterval))
{
updateThingSpeak(«field1=»+(String(t))+»&field2=»+(String(h)));
}
// Update Twitter Status via ThingTweet
if(!client.connected() && (millis() – lastTweetTime > updateTwitterInterval))
{
updateTwitterStatus(«La Temperatura en mi shack es: «+(String(t) + «°C, » + String(h) + » Humedad.@thingspeak CE2R «));
}
// Check if Arduino Ethernet needs to be restarted
if (failedCounter > 3 ) {startEthernet();}
lastConnected = client.connected();
}
void updateThingSpeak(String tsData)
{
if (client.connect(thingSpeakAddress, 80))
{
client.print(«POST /update HTTP/1.1\n»);
client.print(«Host: api.thingspeak.com\n»);
client.print(«Connection: close\n»);
client.print(«X-THINGSPEAKAPIKEY: «+writeAPIKey+»\n»);
client.print(«Content-Type: application/x-www-form-urlencoded\n»);
client.print(«Content-Length: «);
client.print(tsData.length());
client.print(«\n\n»);
client.print(tsData);
lastConnectionTime = millis();
if (client.connected())
{
Serial.println(«Connecting to ThingSpeak…»);
Serial.println();
failedCounter = 0;
}
else
{
failedCounter++;
Serial.println(«Connection to ThingSpeak failed («+String(failedCounter, DEC)+»)»);
Serial.println();
}
}
else
{
failedCounter++;
Serial.println(«Connection to ThingSpeak Failed («+String(failedCounter, DEC)+»)»);
Serial.println();
lastConnectionTime = millis();
}
}
void updateTwitterStatus(String tsData)
{
if (client.connect(thingSpeakAddress, 80))
{
// Create HTTP POST Data
tsData = «api_key=»+thingtweetAPIKey+»&status=»+tsData;
Serial.println(«Connected to ThingTweet…»);
Serial.println();
client.print(«POST /apps/thingtweet/1/statuses/update HTTP/1.1\n»);
client.print(«Host: api.thingspeak.com\n»);
client.print(«Connection: close\n»);
client.print(«Content-Type: application/x-www-form-urlencoded\n»);
client.print(«Content-Length: «);
client.print(tsData.length());
client.print(«\n\n»);
client.print(tsData);
lastTweetTime = millis();
}
}
void startEthernet()
{
client.stop();
Serial.println(«Connecting Arduino to network…»);
Serial.println();
delay(1000);
// Connect to network amd obtain an IP address using DHCP
if (Ethernet.begin(mac) == 0)
{
Serial.println(«DHCP Failed, reset Arduino to try again»);
Serial.println();
}
else
{
Serial.println(«Arduino connected to network using DHCP»);
Serial.println();
}
delay(1000);
}
El problema es que en la siguiente linea:
updateTwitterStatus(«La Temperatura en mi shack es: «+(String(t) + «°C, » + String(h) + » Humedad.@thingspeak CE2REF»));
Al tratar de colocar el simbolo % de la siguiente manera:
updateTwitterStatus(«La Temperatura en mi shack es: «+(String(t) + «°C, » + String(h) + » % de Humedad.@thingspeak CE2REF»));
No me aparece nada…. nada de nada… pero solo en Twitter ya que a thingpeak siguen llegando los datos…. no entiendo que puede esta sucediendo…. esteticamente se ve mucho mejor expresar la humedad en % ….
Mi cuenta en twitter es @Aficiona2dChile por si le quieres dar un vistazo… les agradeceria una orientacion…
Muchas Gracias!!!
En el post anterior no se ve esta linea…
#include
#include
// Local Network Settings
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; // Must be unique on local network
ahrora si…
#include SPI.h
#include Ethernet.h
faltan los
Yo tengo un problema al publicar los tweets o alertas, lo que pasa es qe tengo un codigo para ello usando la función que publicaste muy parecida, y una para mandar mensajes de texto, pero desde una GSM Shield V2 con modem M10, lo que me gustaria saber si existe algun intervalo de tiempo para mandar los tweets, porque se supone que es instantaneo, pero la conexion no me permite publicar en redes sociales, solo mandar SMS, por ejemplo tengo esto
enviarsms();
delay(2000);
Updatetweet(«Alerta, se ha detectado…..etc»);
Serial.println(«Alertas publicadas»);
Teniendo esas instrucciones despues de que se conecta ala red la GSM mediante GPRS
NO LOGRO PUBLICAR EN TWITTER ESPERO ME AYUDEN GRACIAS
(Editamos el codigo ya que es mejor usar herramientas como github.com o bitbucket.com)
Ya solucione algo, que twitter no acepta publicaciones repetidas pero quisiera agregarle una etiqueta de tal forma que se pueda actualizar sin problema, ya que ese es el motivo no puedo mantener la alerta publicada con el mismo msj, al menos agregandole una variable no se un numero y se actualice
Angel, veo que ya encontraste el problema, efectivamente no puedes tuitear lo mismo varias veces.
Nosotros con una Raspberry Pi usamos una funcion que nos entrega la fecha/hora y con eso evitamos que el tuit sea el mismo.
En Arduino es mas complejo, porque no tiene un reloj de tiempo real, una solucion seria instalar un modulo gps que te entrega la fecha y hora exacta y concatenarlo con el mensaje del tuit, pero aumentara el costo del proyecto. Lo otro es usar la funcion millis() pero eso solo cambiara el tuit, no aportara informacion util al mismo.
Saludos
JZ
HOLA 😀 me ayudaria de como usar 2 Canales en thigspeak con ARDUINO
hola, he buscado como hacer un monitoreo de 2 sensores DHT22 con thingspeak , arduino y ETHERNET SHIELD, hay muchos códigos en Internet pero quiero, que un sensor me mande las señales a canal 1 y el otro sensor me mande las señales a canal 2.
Alguien me podría ayudar 😀