AlarmingTweet

 by willnue
Contest WinnerFeatured

Step 6: Upload the Arduino Code

Edit the the following sketch being sure to update it for your network settings as well as your ThingTweet API key. See the comments inline to get a better understand about what it going on.

I have also attached a copy of the .pde file you can download as well.

###### Start Sketch ######

// AlarmingTweet by willnue - www.nuewire.com
// Adds tweet capabilties to the GE 45142 Choice-Alert Wireless Control Center
// Requires Ethernet Shield for sending tweets

//ThingTweet code details
//-----------------------
/*
ThingTweet App to Update a Twitter Status

The ThingTweet sketch is designed for the Arduino + Ethernet Shield.
This sketch updates a Twitter status via the ThingTweet App
(http://community.thingspeak.com/documentation/apps/thingtweet/) using HTTP POST.
ThingTweet is a Twitter proxy web application that handles the OAuth.

Getting Started with ThingSpeak and ThingTweet:

* Sign Up for a New User Account for ThingSpeak - https://www.thingspeak.com/users/new
* Link your Twitter account to the ThingTweet App - Apps / ThingTweet
* Enter the ThingTweet API Key in this sketch under "ThingSpeak Settings"

Created: March 7, 2011 by Hans Scharler (http://www.iamshadowlord.com)
*/

//Libraries
//------------------------
#include <SPI.h>
#include <Ethernet.h>

//Ethernet shield Settings
//------------------------
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xB2, 0xAD, 0xEF, 0xEF }; // Must be unique on local network
byte ip[] = { 192, 168, 1, 5 }; // Must be unique on local network
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };

//Define pins used
//-----------------------
#define pinPwr 5 //Analog pin for Power LED on control center
#define pinArm 4 //Analog pin for Armed LED on control center
#define pinZn1 0 //Analog pin for Zone 1 LED on control center
#define pinZn2 1 //Analog pin for Zone 2 LED on control center
#define pinZn3 2 //Analog pin for Zone 3 LED on control center
#define pinZn4 3 //Analog pin for Zone 4 LED on control center


//Global variables
//-----------------------
boolean prevPwr = false; // Last state of LED (ON = true, OFF = false)
boolean prevArm = false; // Last state of LED (ON = true, OFF = false)
boolean prevZn1 = false; // Last state of LED (ON = true, OFF = false)
boolean prevZn2 = false; // Last state of LED (ON = true, OFF = false)
boolean prevZn3 = false; // Last state of LED (ON = true, OFF = false)
boolean prevZn4 = false; // Last state of LED (ON = true, OFF = false)

String ledReport = ""; // string for storing LED status message
boolean pinAlerts[] = {false, false, false, false, false, false}; //Alert Status of pins
int i=0; //Counter

//Twitter options
//-----------------------
unsigned long tweetInterval = 300000; //Minimum to wait between sending tweets (in milliseconds) - 60000 per minute
unsigned long LastTweet = 0; //Variable to hold last tweet time (in milliseconds)
boolean sendTweet = true; //Flag for sending tweet
String tweetText = ""; //string for storing tweet


// ThingSpeak Settings
//-----------------------
byte server[] = { 184, 106, 153, 149 }; // IP Address for the ThingSpeak API
String thingtweetAPIKey = "YOUR API KEY HERE"; // Write API Key for a ThingSpeak Channel
Client client(server, 80);
long lastConnectionTime = 0;
boolean lastConnected = false;
int resetCounter = 0;

//Debug options
//-----------------------
boolean debugMode = true; //Enable to debug readings to serial console


void setup() {

Ethernet.begin(mac, ip, gateway, subnet); //Start up the Ethernet shield
delay(1000);

// Update Twitter via ThingTweet
if(!client.connected())
{
updateTwitterStatus("AlarmingTweet Started up!");
}

if (debugMode == true) {
Serial.begin (9600); //Open the serial port for debug output
tweetInterval = 60000; //Overide the tweet interval for testing
}
}


void loop() {

if (sendTweet == true){
if (millis() >= (LastTweet + tweetInterval)){ //Check to see if enough time has passed to send again

tweetText = "AlarmingTweet ALERT : ";
if (pinAlerts[0] == true){
tweetText += "Zone 1 / ";}
if (pinAlerts[1] == true){
tweetText += "Zone 2 / ";}
if (pinAlerts[2] == true){
tweetText += "Zone 3 / ";}
if (pinAlerts[3] == true){
tweetText += "Zone 4 / ";}
if (pinAlerts[4] == true){
tweetText += "ARM State / ";}
if (pinAlerts[5] == true){
tweetText += "ALARM State / ";}

// Update Twitter via ThingTweet
if(!client.connected())
{
updateTwitterStatus(tweetText);
if (debugMode == true) { // Print values out to the console
Serial.print("Tweeting : ");
Serial.println(tweetText);
Serial.println();
}
}

// Disconnect from ThingSpeak
if (!client.connected() && lastConnected)
{
if (debugMode == true) { // Print values out to the console
Serial.println();
Serial.println("...disconnected.");
Serial.println();
}
client.stop();
}

lastConnected = client.connected();

LastTweet = millis(); //Reset the time of the last tweet
for( i = 0; i < 6; i++) { //Clear the alert flags
pinAlerts[i] = false;
}
}
}

sendTweet = false; //Reset Tweet flag before checking LEDs

prevPwr = checkLED(pinPwr, prevPwr); //Check LED status
prevArm = checkLED(pinArm, prevArm); //Check LED status
prevZn1 = checkLED(pinZn1, prevZn1); //Check LED status
prevZn2 = checkLED(pinZn2, prevZn2); //Check LED status
prevZn3 = checkLED(pinZn3, prevZn3); //Check LED status
prevZn4 = checkLED(pinZn4, prevZn4); //Check LED status

// Print Update Response to Serial Monitor
if (client.available())
{
char c = client.read();
Serial.print(c);
}


delay(500); // General delay between loops
}


boolean checkLED(int ledPin, boolean prevVal){
boolean curVal = false; // Current state of LED (ON = true, OFF = false)
int ledReading = 1023; // variable to store reading from LED (set to 5v/1023 by default)

ledReading = analogRead(ledPin); // read the value of the LED
delay(10); // delay 10ms to let the ADC recover

if (ledReading < 100){ //Check the LED to see if it is ON (reading < 0.5v)
curVal = true;
}

if (prevVal != curVal){ //Check to see if the value changed from the previous reading
sendTweet = true; //Set the flag to send a tweet
pinAlerts[ledPin] = true; //Flag an Alert for this pin
}

if (debugMode == true) { // Print values out to the console
Serial.print("Pin ");
Serial.print(ledPin);
Serial.print(" : ");
Serial.print(ledReading);
Serial.print(", ");
if (prevVal == true)
Serial.print("ON");
else
Serial.print("OFF");
Serial.print("/");
if (curVal == true)
Serial.print("ON");
else
Serial.print("OFF");
Serial.print(", ");
if (sendTweet == true)
Serial.print("TWEET");
else
Serial.print("-----");
Serial.println();

Serial.print("Alerts : ");
for( i = 0; i < 6; i++) {
if (pinAlerts[i] == true)
Serial.print("Y");
else
Serial.print("N");
Serial.print(", ");
}
Serial.println();

//Un-comment below to check each LED individually
//sendTweet = false; //Reset Tweet flag individually for testing
}

return curVal; //Return the current reading
}

void updateTwitterStatus(String tsData)
{
if (client.connect() && tsData.length() > 0)
{
// Create HTTP POST Data
tsData = "api_key="+thingtweetAPIKey+"&status="+tsData;

if (debugMode == true) { // Print values out to the console
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);
}
else
{
if (debugMode == true) { // Print values out to the console
Serial.println("Connection Failed.");
Serial.println();
}
}
}

###### End Sketch ######






 
Remove these adsRemove these ads by Signing Up
jmolina9 says: Jan 17, 2013. 9:24 AM
Is good, but can you explain what does the 6 led cables do, because I want it to usenot in a tweet way. I wnat go build it with a regular sms to send it go differents cellphones
willnue (author) in reply to jmolina9Jan 31, 2013. 9:01 PM
The 6 LED cables allow the Arduino to sense what the GE system is doing. So if the GE system lights the LED for Zone 1, the Arduino "sees" it and sends a tweet that there is an alarm in zone 1.
roebuj says: Jun 27, 2011. 1:16 PM
Awesome project WillNue! It's put together well and finished off nicely. Good luck, you have my vote!
Pro

Get More Out of Instructables

Already have an Account?

close

PDF Downloads
As a Pro member, you will gain access to download any Instructable in the PDF format. You also have the ability to customize your PDF download.

Upgrade to Pro today!