Heute mal wieder etwas zum Thema I2C, aber diesmal auf einem RaspberryPi B+

RPi B+ & MCP9808

RPi B+ & MCP9808

Da der neue RaspberryPi2 nun für mein Mediacenter im Wohnzimmer benötigt wird, habe ich den alten RPi B+ über. Damit dient er nun als Testobjekt um einige Dinge auf dem RPi auszuprobieren. Ein großer Vorteil der RPi-Szene ist die unendlich große Vielfalt an Software, Apis und Projekten. Nun habe ich hier einen MCP9808 rumliegen und mit dem möchte ich hier mal ein wenig Temperatur messen und in eine Datei schreiben. Fangen wir mal mit der Hardware an.

Hardware:

Anschlußschema: https://learn.adafruit.com/mcp9808-temperature-sensor-python-library/hardware

  • RPi - MCP9808
  • GND - GND
  • 3,3V - Vdd
  • SCL - SCL
  • SCA - SCA

Software:

Um jetzt nicht ständig das Rad neu zu erfinden, hier ein Hinweis auf eine Webseite wo das Prima erklärt ist, wie man den RPi für I2C vorbereitet.

http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_I2C.html

Nachdem das erledigt ist, kann ich den Temperatursensor am I2C-Bus finden und auslesen.

Weiter geht es mit der Softwareinstallation, die auf der Seite learn.adafruit.com schön erklärt ist. Wenn alles geklappt hat, kann man das Programm simpletest.py im Ordner examples starten und man sieht jede Sekunde die Temperaturanzeige in *C und *F. Aber eine Anzeige ist ja nicht besonders schön, wenn man was dokumentieren will. Also müssen die Daten irgendwie erstmal in eine Datei. Nachdem ich mir das Programm angesehen hatte, war mir klar wie es funktioniert. So als Python-Guru wusste ich natürlich überhaupt nicht wie man in eine Datei schreibt. :) Also, googlen, lesen, probieren und sehen ob es funktioniert.

Nach einer ganzen Zeit des Ausprobierens, hatte ich dann ein Ergebnis. Mein Code sieht wie folgt aus:

#!/usr/bin/python
# Copyright (c) 2014 Adafruit Industries
# Author: Tony DiCola
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

# Can enable debug output by uncommenting:
#import logging
#logging.basicConfig(level=logging.DEBUG)

import time

import Adafruit_MCP9808.MCP9808 as MCP9808


# Define a function to convert celsius to fahrenheit.
def c_to_f(c):
        return c * 9.0 / 5.0 + 32.0

# Default constructor will use the default I2C address (0x18) and pick a default I2C bus.
#
# For the Raspberry Pi this means you should hook up to the only exposed I2C bus
# from the main GPIO header and the library will figure out the bus number based
# on the Pi's revision.
#
# For the Beaglebone Black the library will assume bus 1 by default, which is
# exposed with SCL = P9_19 and SDA = P9_20.
sensor = MCP9808.MCP9808()

# Optionally you can override the address and/or bus number:
#sensor = MCP9808.MCP9808(address=0x20, busnum=2)

# Initialize communication with the sensor.
sensor.begin()

# Loop printing measurements every second.

while True:

	# Zeit und Datum erfassen
	Datum = time.strftime("%d.%m.%Y")
	Uhrzeit = time.strftime("%H:%M:%S")

	# Dateien öffnen
        fobj_in = open("tempdata.txt", "r")
        fobj_out = open("tempdata.txt", "a")

	# Sensor auslesen
        temp = sensor.readTempC()

	# Textausgabe in der Konsole
        print 'Temperature: {0:0.3F}*C / {1:0.3F}*F'.format(temp, c_to_f(temp))

	# In Datei schreiben
        fobj_out.write(Datum + ", " + Uhrzeit +", " + "Temperatur: " +  '{}'.format(temp) + " *C" + "\n")
        
	# 60 Sekunden Pause und dann wieder von vorne
	time.sleep(60.0)


# Dateien schliessen
fobj_in.close()
fobj_out.close()

Eine Anmerkung zu

Datum = time.strftime("%d.%m.%Y")

 Überall im Netz habe ich folgendes gefunden:

Datum = strftime("%d.%m.%Y")

Doch, mit diesem Befehl habe ich immer eine Fehlermeldung bekommen. Erst das Einfügen von time. löste das Problem. Warum das so ist, kann ich nicht genau sagen. Aber egal, es läuft.

Das Ergebnis sieht dann wie folgt aus:

24.02.2015, 05:45:02, Temperatur: 20.3125*C
24.02.2015, 05:46:02, Temperatur: 20.3125*C
24.02.2015, 05:47:03, Temperatur: 20.375*C

Beim Testen war mir noch aufgefallen, das die Zeit des Raspis nicht korrekt war. Mit

sudo dpkg-reconfigure tzdata

 ließ sich das problemlos ändern.

Kleiner Schönheitsfehler an der Ausgabe ist, das ich den Temperaturwert noch gerne auf zwei oder drei Stellen hinter dem Komma begrenzen möchte damit das ordentlich aussieht ;)

Mal schnell angegangen das Problem und hier die Lösung:

fobj_out.write(Datum + ", " + Uhrzeit +", " + "Temperatur: " +  '{0:2.3f}'.format(temp) + "*C" + "\n")

"0:2.3f" formatiert die Ausgabe. Hier zum Nachlesen. So langsam verstehe ich warum Python mittlerweile sehr beliebt ist ;)

Außerdem schwebt mir noch vor das Ganze in einer Tabelle, am besten bei Google, abzulegen. Aber das dann evt. zu einem späteren Zeitpunkt.