diff --git a/TSI_inout_ino/TSI_inout_ino.ino b/TSI_inout_ino/TSI_inout_ino.ino new file mode 100644 index 0000000..426dde8 --- /dev/null +++ b/TSI_inout_ino/TSI_inout_ino.ino @@ -0,0 +1,247 @@ +/* + +Arduino --> ThingTweet via Ethernet +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" +Arduino Requirements: +* Arduino with Ethernet Shield or Arduino Ethernet +* Arduino 1.0 IDE +* Twitter account linked to your ThingSpeak account +Network Requirements: + +* Ethernet port on Router +* DHCP enabled on Router +* Unique MAC Address for Arduino +Created: October 17, 2011 by Hans Scharler (http://www.iamshadowlord.com) +Updated: December 7, 2012 by Hans Scharler (http://www.iamshadowlord.com) +Additional Credits: +Example sketches from Arduino team, Ethernet by Adrian McEwen +*/ + +#include +#include + +// Local Network Settings +byte mac[] = { 0xD4, 0x28, 0xB2, 0xFF, 0xA0, 0xA1 }; // Must be unique on local network + +// ThingSpeak Settings +char thingSpeakAddress[] = "api.thingspeak.com"; +String thingtweetAPIKey = "21I4R9UJQZJSC60Y"; + +// Variable Setup +long lastConnectionTime = 0; +boolean lastConnected = false; +int failedCounter = 0; + +// Initialize Arduino Ethernet Client +EthernetClient client; + +// Specific variables +// Status +int hsopen =-1; +int ethernetstatus = -1; + +//debug options +boolean debug = false; +const int ropen=5; +const int rwait=6; +const int rclosed=7; +const int runknown=8; + +const int eok=A0; +const int efail=A1; +const int eunknown=A2; + +const int topen = 2; +const int tclose = 3; + +// Status LED pins + +void setup() +{ + + pinMode(ropen, OUTPUT); + pinMode(rwait, OUTPUT); + pinMode(rclosed, OUTPUT); + pinMode(runknown, OUTPUT); + + pinMode(eok, OUTPUT); + pinMode(efail, OUTPUT); + pinMode(eunknown, OUTPUT); + + // Taster + pinMode(topen, INPUT); + pinMode(tclose, INPUT); + digitalWrite(topen,HIGH); + digitalWrite(tclose,HIGH); + + // Start Serial for debugging on the Serial Monitor + if(debug){ + Serial.begin(9600); + } + // Start Ethernet on Arduino + setEth(-1); + startEthernet(); + + delay(1000); + + setRoom(hsopen); + // Update Twitter via ThingTweet +} + +void loop() +{ + if((digitalRead(topen)==LOW)&&(hsopen!=1)){ + setRoom(2); + if(updateTwitterStatus("Hackerspace @ Freies Theater: OPENING ---")==0){ + hsopen=1; + } + else + { + hsopen=-1; + } + delay(3000); + setRoom(hsopen); + } + if((digitalRead(tclose)==LOW)&&(hsopen!=0)){ + setRoom(2); + if(updateTwitterStatus("Hackerspace @ Freies Theater: CLOSING ---")==0){ + hsopen=0; + } + else + { + hsopen=-1; + } + delay(3000); + setRoom(hsopen); + } +// Print Update Response to Serial Monitor + if(client.available()) + { + char c = client.read(); + if(debug){ + Serial.print(c); + } + } + + // Disconnect from ThingSpeak + if (!client.connected() && lastConnected) + { + if(debug){ + Serial.println("...disconnected"); + } + client.stop(); + } + + // Check if Arduino Ethernet needs to be restarted + if (failedCounter > 3 ) {startEthernet();} + lastConnected = client.connected(); +} + +int 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()) + { + if(debug){ + Serial.println("Connecting to ThingSpeak..."); + Serial.println(); + } + failedCounter = 0; + return 0; + } + else + { + failedCounter++; + if(debug){ + Serial.println("Connection to ThingSpeak failed ("+String(failedCounter, DEC)+")"); + Serial.println(); + } + return -1; + } + } + else + { + failedCounter++; + if(debug){ + Serial.println("Connection to ThingSpeak Failed ("+String(failedCounter, DEC)+")"); + Serial.println(); + } + lastConnectionTime = millis(); + return -1; + } +} + +void startEthernet() +{ + client.stop(); + if(debug){ + Serial.println("Connecting Arduino to network..."); + Serial.println(); + } + setEth(-1); + delay(1000); + + // Connect to network amd obtain an IP address using DHCP + if (Ethernet.begin(mac) == 0) + { + if(debug){ + Serial.println("DHCP Failed, reset Arduino to try again"); + Serial.println(); + } + setEth(0); + } + else + { + if(debug){ + Serial.println("Arduino connected to network using DHCP"); + Serial.println(); + } + setEth(1); + } + + delay(1000); +} + +void setEth(int statuss){ + if(debug){ + Serial.println("Setting eth "); + Serial.println(statuss); + } + digitalWrite(eok,((statuss==1)?HIGH:LOW)); + digitalWrite(efail,((statuss==0)?HIGH:LOW)); + digitalWrite(eunknown,((statuss==-1)?HIGH:LOW)); +} + +void setRoom(int statuss){ + if(debug){ + Serial.println("Setting room "); + Serial.println(statuss); + } + digitalWrite(ropen,((statuss==1)?HIGH:LOW)); + digitalWrite(rwait,((statuss==2)?HIGH:LOW)); + digitalWrite(rclosed,((statuss==0)?HIGH:LOW)); + digitalWrite(runknown,((statuss==-1)?HIGH:LOW)); +}