Temperaturen loggen mit LM75 und Tiny-RTC-Modul

Hier können Sie ihre eigenen Projekte vorstellen
Antworten
Heinrichs
Beiträge: 185
Registriert: Do 21. Okt 2010, 18:31

Temperaturen loggen mit LM75 und Tiny-RTC-Modul

Beitrag von Heinrichs » Fr 1. Feb 2013, 12:54

Die Tiny-RTC-Platine besitzt standardmäßig neben dem RTC-Baustein DS1307 auch ein 4 KByte-EEPROM (AT24C32). Hierdurch bietet sich die Möglichkeit, in Verbindung mit einem LM75-Temperatursensor Temperaturen zu messen und zusammen mit einem Zeitstempel im EEPROM zu speichern. Beide Bausteine arbeiten mit dem I2C-Bus.

Das folgende BASCOM-Programm speichert bei jeder Betätigung derTaste Ta0 (angeschlossen an PortD.2) die Zeit (hh:mm:ss) im EEPROM, beginnend mit der EEPROM-Adresse 0 sowei die zugehörige Temperatur. Jeder einzelne Eintrag wird duch ein einziges Byte repräsentiert; ein Datensatz besteht also aus 4 Bytes. Auf die Verwendung lokaler Variablen wurde hier bewusst verzichtet. Zu Testzwecken wird der EEPROM-Schreibvorgang durch eine LED an PortD.6 und durch eine Terminalausgabe dokumentiert; wer diese Kontrolle nicht benötigt, kann die entsprechenden Codezeilen entfernen.

Code: Alles auswählen

' Datei für Attiny-Platine von E. Eube, G. Heinrichs und U. Ihlefeldt
' Tempertatur- und Timestamplogger mit dem LM75 un dem Tiny-RTC-Modul
' Bei jedem Betätigen von Ta0 werden ein Timestamp (Uhrzeit: hh:mm:ss)
' und die Temperatur auf dem EEPROM abgespeichert.
' Zur Kontrolle werden alle Werte auch an ein Terminal gesendet.
' LED an PortD.6 zur Kontrolle des Schreibvorgangs
'----------------------------------------------------------------------------

$regfile = "attiny2313.dat"                                 'Attiny2313
$crystal = 4000000                                          '4 MHz
$baud = 9600
$framesize = 40

'**********************************************************
'******************* Deklarationen ************************

Dim Clockadr0 As Byte
Dim Clockadr1 As Byte
Dim Eepromadr0 As Byte
Dim Wert As Byte
Dim Lownibble As Byte
Dim Highnibble As Byte
Dim Gefunden As Byte
Dim Adresse As Word
Dim Sekunden As Byte
Dim Minuten As Byte
Dim Stunden As Byte
Dim Temperatur As Byte
Dim Tempadr1 As Byte

Declare Sub Clocklesen()
Declare Sub Temperaturlesen()
Declare Sub Loggen()
Declare Sub Schreiben(a As Word , W As Byte)

'****************** Initialisierung ***********************

Ddrb = &B11111111                                           'Port B als Ausgangsport
Ddrd = &B01110000                                           'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111                                          'Eingänge auf high legen

Clockadr0 = 208                                             'Adresse im write-Modus
Clockadr1 = Clockadr0 + 1                                   'Adresse im read-Modus
Eepromadr0 = 160
Tempadr1 = 159

Config Scl = Portb.7
Config Sda = Portb.5

Waitms 20

'**********************************************************
'******************** Hauptprogramm ***********************

Adresse = 0                                                 'Startadresse für EEPROM-Aufzeichnung

Do

  Do
  Loop Until Pind.2 = 0
  Call Loggen()

Loop


'**********************************************************
'******************* Unterprogramme ***********************

Sub Temperaturlesen()
  I2cstart
  I2cwbyte Tempadr1
  I2crbyte Temperatur , Nack
  I2cstop
  Waitms 300
End Sub


Sub Loggen()
  Call Temperaturlesen()
  Call Clocklesen()
  Call Schreiben(adresse , Stunden)
  Adresse = Adresse + 1
  Call Schreiben(adresse , Minuten)
  Adresse = Adresse + 1
  Call Schreiben(adresse , Sekunden)
  Adresse = Adresse + 1
  Call Schreiben(adresse , Temperatur)
  Adresse = Adresse + 1
  Waitms 100
End Sub

Sub Clocklesen
  'Adressieren (write)
  I2cstart
  I2cwbyte Clockadr0
  Gefunden = Not Err
  If Gefunden = 1 Then
    I2cwbyte 0                                              'Regpointer DS1307-RAM auf 0
    I2cstop
    I2cstart
    'Adressieren (read)
    I2cwbyte Clockadr1

    'Sekunden lesen
    I2crbyte Wert , Ack                                     'Nach Ack wird automatisch das nächste Register ausgelesen
    Lownibble = Wert Mod 16                                 'BCD-Code!
    Highnibble = Wert / 16
    Wert = 10 * Highnibble
    Sekunden = Wert + Lownibble

    'Minuten lesen
    I2crbyte Wert , Ack                                     'Nach Ack wird automatisch das nächste Register ausgelesen
    Lownibble = Wert Mod 16
    Highnibble = Wert / 16
    Wert = 10 * Highnibble
    Minuten = Wert + Lownibble

    'Stunden lesen
    I2crbyte Wert , Nack
    Wert = Wert And &B00111111
    Lownibble = Wert Mod 16
    Highnibble = Wert / 16
    Wert = 10 * Highnibble
    Stunden = Wert + Lownibble
  End If
  I2cstop
End Sub

Sub Schreiben(a As Word , W As Byte)
  Local H As Byte
  Local L As Byte
  H = High(a)
  L = Low(a)
  I2cstart
  I2cwbyte Eepromadr0
  Gefunden = Not Err
  If Gefunden = 1 Then
    Portd.6 = 1                                             'Bei jedem Schreibvorgang blitzt LED an PortD.6 auf
    I2cwbyte H
    I2cwbyte L
    I2cwbyte W
    Printbin W                                              'zur Kontrolle zum Terminal
    I2cstop
    Waitms 100                                              'Zeit zum Brennen
    Portd.6 = 0
  End If
End Sub

Um die Daten aus dem EEPROM auszulesen, kann man das nächste Programm benutzen.

Code: Alles auswählen

' Datei für Attiny-Platine von E. Eube, G. Heinrichs und U. Ihlefeldt
' Temperaturlogger-Ausgabe (hh:mm:ss:Temperatur)
' Ausgabe über Terminal
'----------------------------------------------------------------------------

$regfile = "attiny2313.dat"                                 'Attiny2313
$crystal = 4000000                                          '4 MHz
$baud = 9600
$framesize = 40

'**********************************************************
'******************* Deklarationen ************************

Declare Function Lesen(a As Word) As Byte
Declare Sub Schreiben(a As Word , W As Byte)
Dim Adresse As Word
Dim Adrlow As Byte
Dim Adrhigh As Byte
Dim Wert As Byte
Dim Gefunden As Byte
Dim Eepromadr0 As Byte
Dim Eepromadr1 As Byte
Dim Datensaetze As Word
Dim Maxdat As Word


'****************** Initialisierung ***********************

Ddrb = &B11111111                                           'Port B als Ausgangsport
Ddrd = &B01110000                                           'D4, D5, D6 als Ausgang; Rest als Eingang
Portd = &B10001111                                          'Eingänge auf high legen

Eepromadr0 = 160                                            'Adresse im write-Modus
Eepromadr1 = Eepromadr0 + 1                                 'Adresse im read-Modus

Config Scl = Portb.7
Config Sda = Portb.5

Datensaetze = 100                                           'maximal 1024

Wait 5

'**********************************************************
'******************** Hauptprogramm ***********************

Maxdat = 4 * Datensaetze
Maxdat = Maxdat - 1

For Adresse = 0 To Maxdat
    Wert = Lesen(adresse)
    Printbin Wert
    Waitms 2
Next Adresse

End



'**********************************************************
'******************* Unterprogramme ***********************

Sub Lesen(a As Word) As Byte
  Local H As Byte
  Local L As Byte
  Local W As Byte
  H = High(a)
  L = Low(a)
  I2cstart
  I2cwbyte Eepromadr0
  I2cwbyte H
  I2cwbyte L
  I2cstop

  'Adressieren (read)
  I2cstart
  I2cwbyte Eepromadr1
  I2crbyte W , Nack                                         'Nach Ack wird automatisch das nächste Register ausgelesen
  I2cstop
  Lesen = W
End Sub

Das Programm wartet vor dem Auslesen der EEPROM-Daten 5 Sekunden; dies gibt die Gelegenheit, nach dem Starten des Terminalprogramms ggf. das häufig beim Einschalten produzierte Byte 255 rechtzeitig im Terminalfenster zu löschen. Dann kann man nach der Datenübertragung die Datensätze im EXCEL-Format speichern (4 Spalten!).

Antworten