Samstag, 30. April 2011

Temperatur wird getwittert

Beschreibung:
Die Temperatur wird mit dem NTC Thermistor gemessen und an Twitter gesendet.

Der NTC Thermistor wird mit einem 1k Widerstand an das Ethernet Shield auf dem Arduino angeschlossen.

Die Werte für B und R25 im Quellcode müssen mit den Werten des NTC Thermistors ersetzt werden (im Datenblatt zu finden).

Schaltplan:



Code:
/*
Vorlage für die Temperaturmessung:
Temperaturmessung mit einem NTC Thermistor
von Thomas Ecker
www.physicalcomputing.at
Mai 2010
*/

#if defined(ARDUINO) && ARDUINO > 18   // Arduino 0019 or later
#include 
#endif
#include 
#include 
#include 
#include 
#include 

// Ethernet Shield Settings
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// Your Token to Tweet (get it from http://arduino-tweet.appspot.com/)
Twitter twitter("DEIN TWITTER TOKEN");

// Message to post
char temp[5];
char text[50];

int SensorPin = 0; // Für den Senoreingang wird Analog 0 gewählt
float sensorWert = 0; // Variable, die den Sensor Wert annimmt
float u1 =0; // Spannung u1 am Spannungsteiler
float u2 = 0; // Spannung u2 am Spannungsteiler
float i = 0; // Strom in A
float Rntc = 0; // Widerstand des Thermistors zum Zeitpunkt der Messung
float T = 0; // Variable für gemessene Temperatur
float B = 3950; // Wert aus Datenblatt des Thermistors
float Tn = 298.16; // Nenntemperatur in K
float R25 = 4700; // Nennwiderstand in Ohm bei Nenntemperatur (aus Datenblatt)

void setup()
{
  delay(1000);
  Serial.begin(9600);
  EthernetDHCP.begin(mac);
}

void loop()
{
  EthernetDHCP.maintain();
  
  sensorWert = analogRead(SensorPin); // Wert am Sensor wird gelesen
  u2 = (sensorWert * 5)/1024; // Spannung am Sensor wird berechnet
  u1 = 5-u2; // Spannung am Vorwiderstand wird berechnet
  i = u1/1000; // Strom wird berechnet
  Rntc = u2/i; // Widerstand des Thermistors zum Zeitpunkt der Messung

  T = (B*Tn)/(B+(log(Rntc/R25)*Tn)); // Berechnung der Temperatur
  T = T-273.15; // Umrechnung von K in °C

  Serial.print ("Temperatur = ");
  Serial.print (T);
  Serial.println (" C");
  
  ftoa(temp, (double)T, 2);
  
  sprintf(text,"%s Grad Celsius <- Aktuelle Temperatur in meinem Zimmer",temp);
  
  Serial.println (text);

  Serial.println("connecting ...");
  if (twitter.post(text)) {
    // Specify &Serial to output received response to Serial.
    // If no output is required, you can just omit the argument, e.g.
    // int status = twitter.wait();
    int status = twitter.wait(&Serial);
    if (status == 200) {
      Serial.println("OK.");
    } else {
      Serial.print("failed : code ");
      //Serial.println(status);
    }
  } else {
    Serial.println("connection failed.");
  }
  
  delay (1800000); // Temperatur wird alle halbe Std gemessen
}

char *ftoa(char *a, double f, int precision)
{
  long p[] = {0,10,100,1000,10000,100000,1000000,10000000,100000000};
  
  char *ret = a;
  long heiltal = (long)f;
  itoa(heiltal, a, 10);
  while (*a != '\0') a++;
  *a++ = '.';
  long desimal = abs((long)((f - heiltal) * p[precision]));
  itoa(desimal, a, 10);
  return ret;
}

Keine Kommentare:

Kommentar veröffentlichen