Archiv für Processing

Temperatur mit dem Arduino erfassen und auf dem Computer ausgeben Vol. 2

Posted in Arduino, Elektronik, Maxim/Dallas, Processing with tags , , , , , , , on 3. August 2009 by crackburg

Der Chip…:

Diesmal kommt anders als im vorherigen Beispiel ein Maxim/Dallas DS18b20 (Datenblatt) zum Einsatz. Vorteil gegenüber dem vorher verwendeten DS1620 ist zum einen, dass dieser Chip nur einen anstatt drei Portpins belegt. Zum anderen kann man mit der OneWire-Technologie von Dallas viel grössere Kabellängen realisieren, was ja für einen externen Sensor an sich wünschenswert ist. Das TO92-Gehäuse macht die Freude fast rund. Lässt es sich doch wunderbar mit Schrumpfschlauch abdichten und verwenden.

Und nun zu den Nachteilen. Da hätten wir als erstes die Auslesegeschwindigkeit. Jedes mal wenn man den Chip ausliest, dauert es ca. eine Sekunde bis er einen Wert zurückliefert. Nachdem ich vorher in meinem Hauptprojekt alle delays entfernt habe, ist so eine Zwangspause natürlich erstmal ärgerlich. Aber da ich ja nicht mit permanent wild schwankenden Temperaturen zu kämpfen habe, werde ich einfach die Temperatur nicht so häufig auslesen.

Mein zweiter Kritikpunkt ist die Codegrösse die entsteht wenn man den DS18b20 mit der Library von Miles Burton verwendet. War vorher mein kompletter Code samt Libs in etwa 6KB gross, so nimmt die Temperaturanfrage und DallasTemperature lib schon diese grösse ein. Was heisst das sich durch verwendung des Ds18b20 mein kompilierter Code auf die doppelte Grösse aufgebläht hat. Das habe ich aber auch pragmatisch gelöst und den Atmega88 durch einen Atmega168 ersetzt.

Die Schaltung…:

Pin 1 am DS18b20 geht auf Masse (GND). Pin 2 geht auf einen Digitaleingang am Arduino (bei mir D5). Ausserdem geht von Pin 2 ein 4,7 Kiloohm Pullup-Widerstand auf +5V (VCC). Pin 3 geht auf +5V(VCC). Beim Betrieb im parasitären Modus, zieht sich der DS18b20 seine Versorgungsspannung über die Datenleitung. Aber in Zeiten von Ebola und Schweinegrippe, muss man ja nicht auch noch die Bauteile zu parasitärem Verhalten ermutern.

Arduino Code:

/*
DallasTemperature.CPP –  Dallas Temperature Control Library 1.0.0 Author: Miles Burton, miles@mnetcs.com
Code basiert auf dem Beispiel von Miles Burton, miles@mnetcs.com
*/

#include <DallasTemperature.h>

DallasTemperature tempSensor;

void setup(void) {
// inputs/outputs initialsieren
// seriellen port starten
Serial.begin(9600);
tempSensor.begin(5); // Die Datenleitung geht in den digitalen Pin 5 am Arduino
}

void loop(void) {

// Bei der Library anfragen ob das Geraet gueltig ist
switch(tempSensor.isValid())
{
case 1:
Serial.println(„Invalid CRC“);
tempSensor.reset(); // Versuch den Chip erneut zu erkennen
return;
case 2:
Serial.println(„Not a valid device“);
tempSensor.reset(); // Versuch den Chip erneut zu erkennen
return;
}

// getTemperature liefert einen float-Wert zurueck. Dies ist immer eine positive Zahl.

Serial.print(„Temp: „);
//Temperatur abfragen und auf der seriellen ausgebendas abfragen der Temperatur braucht ca. 1sek. deswegen der „delay“ an dieser Stelle
Serial.print(tempSensor.getTemperature());
Serial.print(„C“);
Serial.println();
}

Processing Code:

import processing.serial.*;

Serial myPort;  // Die serielle Schnittstelle
PFont fontA;
String tempBuffer = null;
int lf = 10;    // Linefeed in ASCII

String Temperatur = „keine Daten“;

void setup() {

size(200, 200);
background(210);
// Alle verfügbaren seriellen Ports auflisten:
println(Serial.list());

/*Auswahl der seriellen Schnittstelle. die erste ist 0, die zweite ist 1 usw.*/
myPort = new Serial(this, Serial.list()[1], 9600);
/* Die Schrift laden. Schriften muessen im Datenverzeichnis des Sketches vorliegen.
um eine Schrift zu erstellen, verwende den Menuepunkt /Tools/create Font.
fontA = loadFont(„ArialRoundedMTBold-48.vlw“);*/

// Schrift und deren groesse definieren (in Pixeln)
textFont(fontA, 20);
}

void draw() {

while (myPort.available() > 0) { //Warten bis Daten auf der seriellen vorhanden sind
redraw();
String inBuffer = myPort.readStringUntil(lf); //So lange den inhalt der seriellen Schittstelle in den inBuffer lesen bis ein Linefeed kommt

if (inBuffer != null && inBuffer.startsWith(„Temp:“)) //wenn der inBuffer nicht leer ist und mit Temp: beginnt
{
Temperatur = inBuffer; // schreibe den Inhalt von inBuffer nach Temperatur
}

if (inBuffer != null && tempBuffer != inBuffer) {
background(210);
fill(51);
text (Temperatur, 1 , 20);
String tempBuffer = inBuffer;

}
}
}

Advertisements