Dieses Projekt ist die vollständige Version des Projektes, das ich bereits im letzten Arduino-Beitrag angefangen und dokumentiert habe.
Projektziel
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.
- 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.
- 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.
- 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:
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
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
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
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.