martinbulinski.de

Temperaturmessung am Gameport Drucken E-Mail
  
Mittwoch, 12. November 2008 um 08:42

Nach den ersten Versuchen, mit dem Gameport meinen Gaszähler auszulesen, interessierten mich nun die “analogen” Eingänge am Gameport. Diese messen allerdings keine Spannung, sondern einen Widerstand. Kann man damit die Außentemperatur messen?

 

Die Anschlüsse

Die Anschlüsse für Potentiometer, die gewöhnlich in Joysticks verbaut werden, um die Position des Steuerknüppel zu ermitteln, sind folgende:

An PIN1 liegen 5V, da kommt das eine Ende der Potentiometer ran.
Das andere Ende legt man an die PINs 3, 6, 11 oder 13.

Die Messung erfolgt am Gameport intern über Kondensatoren, die abhängig vom angelegten Widerstand verschieden schnell entladen werden. Damit mißt man also nicht direkt den Widerstand, sondern die Zeit, die es braucht, eine bestimmte Triggerschwelle zu erreichen, um daraus auf den Widerstand rückzuschliessen.

Typische Potentiometer, die in Joysticks verbaut werden, haben einen Widerstand von 100KOhm.

Der Fühler

Da ich noch einen PT1000-Temperaturfühler rumliegen hatte, hab ich ihn testweise angeschlossen. Zwar sind diese Fühler sehr linear und genau, aber mit 15EUR verflucht teuer. Wenn ich was neues hätte kaufen müssen, würde ich mich für andere Sensoren und Meßmethoden entscheiden.
Lt. Norm soll die Temperatur in 2m über Grund gemessen werden. Ich habe den Fühler in ca. 130cm Höhe über dem Boden in einen Strauch gehängt und zusätzlich in ein Stück Kabelkanal geschoben, um ihn nicht der direkten Sonnenstrahlung auszusetzen (die zaubert sonst nämlich 20Grad auf den Sensor, auch wenns knapp über 0 ist).
Also, Fühler anschliessen und Programm schreiben:

Das Programm

Wieder ein kleiner Auszug aus meinem C-Programm. Adresse 0×201 ist der Gameport.

/* Lesevorgang initialisieren */
    outb(0,0x201);
/* Schleife bis Poti-Timeout */
    potizaehler = 0;
    while ( potizaehler < 256)
      {
       potitmp = inb(0x201);
       potitmp = potitmp & 15;
       potizaehler = potizaehler + 1;
       if (potitmp != 15) {break;}
      }
/* Jetzt hast Du in potizaehler den aktuellen Widerstand als Zahl */

Die Messung an den analogen Pins startet man, indem man eine null in die Adresse schreibt. Dadurch gehen die Pins auf eins.
Dann nur noch abwarten, bis der entsprechende Pin wieder auf 0 geht und die vergangene Zeit messen.
In meinem Codeausschnitt schleife ich nur bis 256, der Wert hat bei meiner Rechnergeschwindigkeit (800MHz) ausgereicht und wurde bisher nicht erreicht. Eine Abbruchbedingung sollte man auf jeden Fall haben.

Achtung! Ich habe festgestellt, dass zwischen den einzelnen Lesezyklen ein wenig Zeit vergehen sollte, sonst haben die Kondensatoren nicht genügen Zeit, wieder aufgeladen zu werden und man verfälscht die Messung.
Überhaupt ist diese Messung natürlich alles andere als genau, eigentlich müsste man die Interrupts abschalten und bei Hardwarewechsel neu eichen.
Ich habe auch nur eine Genauigkeit von 0,41 Grad Celsius erreicht. Aber ich bin genügsam ;-)

Das Ergebnis

Auch hier werte ich die Meßergebnisse mit mySQL aus und erstelle über jpgraph ein hübsches Bild für den hauseigenen Webserver. Das war der Temperaturverlauf am Ostersamstag, den 7.4.07.

Aktualisiert ( Montag, 12. Januar 2009 um 07:16 )
 
Benutzerbewertung: / 3
SchwachPerfekt 

Anmeldung



Wer ist online

Wir haben 4 Gäste online