Arduino-Projekt Temperaturüberwachung

Dieses Projekt ist die vollständige Version des Projektes, das ich bereits im letzten Arduino-Beitrag angefangen und dokumentiert habe.

Projektziel

Arduino-Projekt "Temperaturmelder"

Für meine Blumen möchte ich ein kleines Gerät, dass mich warnt, wenn die Aussentemperatur zu tief oder zu hoch wird. Für mich sind das 0 Grad wegen der frostempfindlichen Pflanzen sowie 25 Grad, weil dann ein erhöhter Giessbedarf besteht. Die Limiten sollen aber ebenso wie der abgedeckte Temperaturbereich im Programm gesetzt werden können, so dass jeder diese Variablen an seine eigene Klimazone und an seine eigenen Bedürfnisse anpassen kann. Ein zusätzliches RGB-Led zeigt mir zudem die Temperatur in einem Farbverlauf an, wobei die tiefste Temperatur ein reines Blau (RGB 0/0/255), die höchste ein reines Rot (RGB 255/0/0) und die Temperaturen dazwischen von Blau über Blaugrün, Grün und Grünrot in Rot übergehen.

 

In meinem Experimenter Kit ist das die Kombination aus den Projekten 1 (blinkendes LED), 10 (Temperatursensor) und 12 (RGB-Led).

Komponenten und Verkabelung

Der Hardware-Teil besteht aus 3 Baugruppen.

  1. Mit dem RGB-LED gebe ich eine generelle Farbanzeige zur aktuellen Temperatur. Im unteren Drittel ist das LED bläulich, geht dann im mittleren Bereich in Grün über und im letzten Drittel wird es immer röter, bis wir beim reinen Rot sind. Das entspricht dem erwähnten Vorprojekt.
  2. Mit einem grünen LED (ein blaues habe ich im Moment nicht) gebe ich den Frostalarm aus, d.h. das LED brennt, wenn die Temperatur unter das definierte Minimum sinkt. Das gleiche in Rot gibt es für den Hitzealarm, wenn die Temperaturmaximallimite überschritten wird.
  3. Der mit einem analogen Pin verkabelte Temperatursensor liefert die eigentliche Temperatur.

Verkabelundsschema

Dank der Fritzing-Software habe ich jetzt ein schönes Schema meiner Schaltung als Dokumentation:

Steckplatine für den Temperaturmelder

Stromanschluss

  • Für den Strom wird ein rotes Kabel vom + der vertikalen Leiterbahn rechts zum 3.3V-Anschluss gezogen
  • Vom – der vertikalen Leiterbahn rechts geht ein schwarzes Kabel zum GND links auf dem Board
  • Das Board ist via USB mit dem PC verbunden oder alternativ mit einer 9V-Batterie

RGB-LED

Gruppe RGB-LED

Die oberste Gruppe ist für das RGB-LED.

 

  • Das lange Füsschen (Nr 2 von oben) erhält den Stromanschluss, d.h. es wird via rotes Kabel mit der vertikalen +Leiterbahn verbunden
  • Die anderen 3 Füsschen erhalten je einen 560-Ohm-Widerstand und werden mit den digitalen, PWM-fähigen Pins Nr 3, 5 und 6 verkabelt. Die Farben sind bei meinem LED von oben nach unten 1 Rot, 3 Grün und 4 Blau

2 LEDs für Frost- und Hitzealarm

LEDs für Frost- und Hitzealarm

Die zweite Gruppe enthält die zwei LEDs für den Frost und den Hitzealarm.

  • Blaues LED für Frostalarm: Der +Pol (langes Füsschen) wird mit einem roten Kabel mit Pin 7 verbunden (eigentlich ist es ein grünes LED, mein Experimentierkit hat keine blauen LEDs), der -Pol mit einem Widerstand, der bis in die -Leiterbahn ganz rechts führt
  • Rotes LED für Hitzealarm: Dasselbe wie oben, aber mit Pin 8

 

 

Temperatursensor

analoger Temperatursensor

Die letzte Gruppe ist das wichtigste am ganzen, nämlich der Temperatursensor. Es handelt sich um einen IC-TMP36, der gemäss Herstellerdokumentation einen Temperaturbereich von -40 bis +120 Grad erfassen kann. Hier handelt es sich um ein analoges Bauteil. Das mittlere Füsschen wird deshalb mit dem analogen Anschluss A0 verbunden, das untere mit der rechten +Leiterbahn auf dem Steckbrett und das obere mit der -Leiterbahn für GND.

 

 

Programmcode

Den Programmcode füge ich hier ohne grosse Erläuterungen ein, ich habe versucht, im Code zu dokumentieren, was wo passiert. Ausserdem habe ich nun mein Arduino Cheat Sheet online publiziert. Eine Mini-Einführung zu arduinospezifischen Sprachelementen findet sich dort.

Vielleicht noch ein kleiner Tipp: Das schwierigste war die Umsetzung des Temperaturbereichs in den Farbverlauf des RGB-Leds. Um die Formeln zu entwickeln und mit verschiedenen Varianten herumzuspielen, empfiehlt sich Excel: in der ersten Spalte lässt man die Temperatur vom tiefsten bis zu höchsten Wert laufen, in den nächsten 3 Spalten berechnet man dazu die RGB-Werte. Wer will, kann sich die Exceldatei Calculating RGB values for temperatures herunterladen.

 

/*
  Program shows the change of temperature in a range from -15 to 35 degrees celsius
  as a color of an RGB LED, 
  the LED changes from full blue (-15) over green to red (+35)
  2 different LEDs show a frost and a heat alarm
  
  Programm zeigt die Temperatur allmählichen Temperaturwechsel von -15 bis +35 Grad
  und zeigt Temperatur in diesem Bereich mit einem Farbverlauf in einem RGB-LED an, 
  wobei kalte Temperaturen blau, mittlere grün und heisse Temperaturen rot angezeigt werden
  zusätzlich gibt es 2 LEDs für einen Frost- und einen Hitzealarm
  unterhalb einer Maximallimite brennt das blaue LED
  und oberhalb einer Minimallimite das rote LED */

int temperaturePin = 0; //the analog pin the TMP36's Vout (sense) pin is connected to
                        //the resolution is 10 mV / degree centigrade 
                        //(500 mV offset) to make negative temperatures an option
  
int ledAnalogOne[] = {3, 5, 6}; //3 PWM-LEDs: 3 red, 5 green, 6 blue
int ledBlue = 7;
int ledRed = 8;

//variables for the temperature and the temperature range                              
float temperature = 15.0;
int range = 50;
int start = -15;

int maximumLedBlue = 0; //frost alarm
int minimumLedRed = 25; //heat alarm

int red = 0;
int green = 0;
int blue = 0;
float tmp = 0.0;
int mydelay = 1000;

byte  black[] = {0, 0, 0}; 

void setup(){
  Serial.begin(9600);
  pinMode(ledBlue, OUTPUT);     
  pinMode(ledRed, OUTPUT);     
  for(int i = 0; i < 3; i++){
   pinMode(ledAnalogOne[i], OUTPUT);   //Set the three LED pins as outputs
  }
  
  setColor(ledAnalogOne, black);      
}

void loop(){
	temperature = getTemperature(temperaturePin); 
	tmp = 2 * 255 / range;

        //converts a temperature to a RGB color
	if (temperature < start) {
	  red = 0;
	  green = 0;
	  blue = 255;
	} else if (temperature <  start + (range / 2)) {
	  red = 0;
	  green = (temperature - start) * tmp;
	  blue = 255 - ((temperature - start) * tmp);
	} else if (temperature < start + range) {
	  red = (temperature - (range/2)- start) * tmp;
	  green = 255 - ((temperature - (range/2) - start) * tmp);
	  blue = 0;
	} else {
	  red = 255;
	  green = 0;
	  blue = 0;
	}

	//frost alarm
	if (temperature <= maximumLedBlue) {
          // blue LED is turned on
	  digitalWrite(ledBlue, HIGH);  
	} else {
         // blue LED is turned off
	  digitalWrite(ledBlue, LOW); 
	} 

	//heat alarm
	if (temperature >= minimumLedRed) {
         // red LED is turned on
	  digitalWrite(ledRed, HIGH);   
	} else {
         // red LED is turned off
	  digitalWrite(ledRed, LOW); 
	} 

	byte color[] = {red, green, blue};
	printToSerial(temperature, color);
	setColor(ledAnalogOne, color);
	//pauses, before the temperature is read again
	delay(mydelay);
}

//fetches a random temperature value
float getRandomTemperature(int start, int range) {
  randomSeed(millis());
  return random(start, start + range);
}

//sets the RGB LED to a RGB color
void setColor(int* led, byte* color){
  //iterates through the 3 pins
  for(int i = 0; i < 3; i++){             
   analogWrite(led[i], 255 - color[i]);                  
 }
}

//prints the temperature and RGB values at the serial interface
void printToSerial(float temperature, byte* color) {
  Serial.print("T: ");
  Serial.print(temperature);
  Serial.print("; RGB: ");
  Serial.print(color[0]);
  Serial.print("/");
  Serial.print(color[1]);
  Serial.print("/");
  Serial.println(color[2]);
}

float getTemperature(int analogPin){
  /* converting from a 0 to 1024 digital range
     to 0 to 5 volts (each 1 reading equals ~ 5 millivolts */
  float voltage = (analogRead(analogPin) * .004882814); 
                                     
  //convert into a temperature		
  return (voltage - .5) * 100;        
}

Hier lässt sich die Gezippte Programmcode zum Arduino-Projekt „Temperaturmelder“ zum Projekt „Temperaturmelder“ herunterladen.

Comments are closed.