Temperatur und Bewegung via Twitter mit Arduino Ethernet

Da sich unsere drei Bartagame gerade im Winterschlaf befinden, wollen wir immer wissen wie die Temperatur im Terrarium ist und ob sich dort etwas bewegt. Deswegen haben wir einen Arduino Ethernet mit einen Temperatursensor und Bewegungsmelder bestückt. Die Temperatur wird alle 60 Minuten via Twitter bereitgestellt, während eine erkannte Bewegung im Terrarium sofort auf Twitter hochgeladen wird.

Zutaten:
1x Arduino Ethernet
1x Temperatursensor
1x Bewegungssensor
2x 10K Ohm Widerstände
1x 9V Netzteil




Bewegungssensor (Anleitung):
Das Setup das Bewegungssensor hat  bis auf ein paar Kleinigkeiten gut funktioniert. Ein Problem war die Belegung am Sensor selbst. Bei meinem Sensor ist das Kabel mit +, -, Alarm (AL) genau andersrum als auf Bildr angelötet. Weiters ist mir aufgefallen das ich bei einer Spannung von 5V nicht die gewünschten Werte vom Sensor bekomme, daher habe ich den Bewegungssensor an Vin Port vom Arduino angeschlossen. Hier wird er mit vom externen Netzteil mit 9V versorgt und funktioniert einwandfrei.

Temperatursensor (Anleitung):
Der Temperatursensor ist wie in der Arduino Playground Anleitung an den Arduino Ethernet angeschlossen. Er ist am 5V Output vom Arduino angeschlossen, damit ich meinen Temperatur Code nicht an die 9V anpassen musste.




Twitter (Anleitung):
Die Verbindung zu Twitter wird mit der Twitter Library hergestellt. Hier müsst ihr euch einen Token für die Twitter App von NeoCat (http://arduino-tweet.appspot.com) erstellen, die Library installieren und schon geht es los. Noch eines zum Tweeten, Twitter verbietet doppelte Postings. Leider gibt es keine Angabe wann ein doppelter Tweet wieder erlaubt ist. Also müsst ich euch mit etwas zufälligen aushelfen. Ich habe mich dazu entschieden die Arduino Random Function zu verwenden. Mit dieser generiere ich eine zufällige Zahl und hänge sie an den Tweet an. Schon hat man keine doppelten Tweets mehr.

Viel Spaß beim Überwachen. Rene

Code:

#include 
#include 
#include 
#include 
#include     //Um die Temperatur alle 60 Minuten zu messen

#define ThermistorPIN 0 

  //Ethernet MAC Adresse
  byte mac[] = { 0x90, 0xF3, 0xUA, 0xVN, 0x68, 0x57 };  //Deine MAC Adresse

  //Twitter Token für Adrunio API
  Twitter twitter("Twitter-Token");                //Dein Twitter-Token

  //char für Twittermeldungen
  char msg[100] ="";                                 //Buffer für sprintf. Okay Nachricht.
  char msgalarm[100] ="";                            //Buffer für sprintf. Alarm Nachricht.
  char msgbewegung[100]="";                          ////Buffer für sprintf. Bewegungs Nachricht.
  char temperatur[10] ="";                            //Buffer für dtostrf

  //Zufalls Wert
  long randValue;                                

  //Timer für die Temperaturmessung
  TimedAction readTemp = TimedAction(1800000,temperatur_messung);

  //Variablen für Bewegungsmelder
  int movment = 2;
  int state = HIGH;
  int lastState = HIGH;
  int count = 0;

  //Temperaturmessung
  float pad = 10000;                                                                           
  float Thermistor(int RawADC) {
  long Resistance;  
  float Temp;                            

  Resistance=((1024 * pad / RawADC) - pad); 
  Temp = log(Resistance);
  Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
  Temp = Temp - 273.15;                    

  return Temp;                                  

}

void setup()
{
   
   Serial.begin(9600); 

  if (!Ethernet.begin(mac)) {
    Serial.println("failed to get an IP address using DHCP!");
  }

 //Setup für Bewegungspins
 pinMode (movment,INPUT);
 state = digitalRead(movment);

}

void loop()
{
 readTemp.check();
 motion();

}

void temperatur_messung(){
  float temp;
  temp=Thermistor(analogRead(ThermistorPIN)); 

  randomSeed (analogRead (5));                        //Analog 5 für Random (nicht angeschlossen oder Draht angesteckt)
  randValue = random(50000);
  int zufall = randValue;
  dtostrf(temp, 7, 4, temperatur);                     //dtostrf brauche ich um float als string in sprintf darstellen zu können.(http://www.kriwanek.de/arduino/sprachreferenz/166-fehler-bei-floating-ausgabe-mit-sprintf.html)
  sprintf(msg, "Es hat %s°C. Den Kleinen geht es gut. Mr.R. sagt:%i",temperatur,zufall); //Zufall wird angehängt um Duplicate Tweets zu umgehen 😉
  sprintf(msgalarm, "Es hat %s°C. Jemand sollte schauen das die Kleinen nicht erfrieren! Mr.R. sagt:%i",temperatur,zufall);

 if (temp >= 18){
  alles_okay();
  }
 else {
  alarm();
 }

}

void alles_okay(){
 Serial.println("connecting ...");
  if (twitter.post(msg)) {
    int status = twitter.wait(&Serial);
    if (status == 200) {
      Serial.println("OK.");
    } else {
      Serial.print("failed : code ");
      Serial.println(status);
    }
  } else {
    Serial.println("connection failed.");
  }
}

void alarm(){
 Serial.println("connecting ...");
  if (twitter.post(msgalarm)) {
    int status = twitter.wait(&Serial);
    if (status == 200) {
      Serial.println("OK.");
    } else {
      Serial.print("failed : code ");
      Serial.println(status);
    }
  } else {
    Serial.println("connection failed.");
  }
}

void motion(){
  randomSeed (analogRead (5));                        //Analog 5 für Random (nicht angeschlossen oder Draht angesteckt)
  randValue = random(50000);
  int zufall = randValue;
  sprintf(msgbewegung, "Die Kleinen haben sich mehr als gewöhlich bewegt! Hunger? Mr.R. sagt:%i",zufall); //Zufall wird angehängt um Duplicate Tweets zu umgehen 😉

   if (state==LOW && lastState==HIGH){
   count++;
   }
   lastState=state;
   state=digitalRead(movment);

  if (count >= 20){
     Serial.println("connecting ...");
  if (twitter.post(msgbewegung)) {
    int status = twitter.wait(&Serial);
    if (status == 200) {
      Serial.println("OK.");
    } else {
      Serial.print("failed : code ");
      Serial.println(status);
    }
  } else {
    Serial.println("connection failed.");
  }
    count=0;

}
}