HCC Forth-gg
14 mei 2003

Temperatuurmeting via I2C

Willem Ouwerkerk



Soms willen we om de een of andere reden de temperatuur van een ruimte of apparaat meten. Dit kunnen we met een thermometer doen of als we ook iets willen schakelen met een ouderwets bimetaal. Nu kunnen we dit ook op een andere manier doen, er zijn chips waar een temperatuur sensor en I2C bus zijn ingebouwd.

Het 'Egel werkboek beschrijft al een aantal voorbeelden schakelingen met I2C, met dit artikel voeg ik er nog een aan toe. Ik gebruik hier de LM75CIM, deze chip heeft drie adres ingangen, waardoor we acht van deze temperatuur sensors op een I2C bus aan kunnen sluiten.

Iets over de LM75

De LM75 meet temperaturen met stapjes van een halve graad, het temperatuur bereik loopt van -55 tot +125 graden Celcius, de nauwkeurigheid is 2 graden Celcius. Er is een thermostaat uitgang waarvan we de boven- en ondergrens via de I2C bus in kunnen stellen en er is een configuratie register waarmee we de chip in diverse modes in kunnen stellen. De LM75 geeft de temperatuur als een 9-bits signed getal waar 0, nul graden is.
In dit voorbeeld gebruiken we maar een deel van de mogelijkheden van deze chip, van de temperatuur worden slechts 8-bits gebruikt.

Over de software

Omdat de chip opstart met het temperatuur register geselecteerd kan het voorbeeld uitermate simpel blijven. Er is een routine TEMPERATUUR gedefinieerd, die de metingen van acht verschillende LM75 sensors als 8 bits signed getal op de stack kan zetten. De code maakt gebruik van de bibliotheek file I2C-PRIM.FRT om de LM75 uit te lezen en bestaat uit slechts 12 regels tekst. De rest van de code definieert een simpele datalogger, die 30 monsters kan bewaren.

Het woord THERMOMETER laat de leds op het AT51 bord even flitsen bij het opstarten. Daarna komt hij in een eindeloze lus terecht waar 30 maal achter elkaar, elke twee seconden, de temperatuur gemeten wordt. Deze wordt opgeslagen in de array METINGEN en tegelijkertijd getoond op de leds. Na elke 30 monsters, wordt het gemiddelde daarvan uitgerekend en nog eens 15 seconden op de leds getoond. Daarna begint het bemonsteren van de temperatuur weer opnieuw.


b4i2c.frt (ByteForth source)
 \ ------------------------------------------------
 \ PROJECT : I2C thermometer met LM75CIM, 406 bytes
 \ AUTEUR  : Willem Ouwerkerk, November 26, 1999
 \ ------------------------------------------------

 NEEDS I2C-PRIM.FRT \ Gebruik I2C primitieven

 $90 CONSTANT LM75-ID             \ LM75 basis adres

 : SELECT-CHIP ( chip -- dev-id ) \ Max. 8 chips
    7 AND 2*  LM75-ID  +
    ;

 : TEMPERATUUR   ( chip -- u )    \ Lees temperatuur
    START-BIT                     \ als 8-bits getal
    SELECT-CHIP  1 OR  BYTE-UIT
    BYTE-IN  ACK-BIT              \ msb
    BYTE-IN  NACK-BIT  DROP       \ Gooi lsb weg
    STOP-BIT  
    ;

 \ Nu de temperatuur datalogger

 : SECONDEN   ( u -- )       \ Wacht u seconden
    FOR  4 FOR  250 MS  NEXT
    NEXT
    ;

 30 CONSTANT AANTAL          \ 30 metingen
 AANTAL VARIABLES METINGEN   \ Reserveer ruimte

 $90 SFR LEDS                \ Led uitvoer

 : GEMIDDELDE    ( -- )      \ Toon gemiddelde temp.
    0.  AANTAL 0 DO          \ Bereken gem. temp.
        I FROM METINGEN M+
    LOOP
    AANTAL UM/MOD INVERT
    TO LEDS                  \ Gemiddelde op leds
    DROP                     \ Gooi rest weg
    ;

 : THERMOMETER   ( -- )
    SETUP                    \ Start Forth machine
    CLEAR LEDS  1 SECONDEN   \ Toon opstarten
    SET LEDS    1 SECONDEN
    BEGIN
        AANTAL 0 DO          \ Doe aantal metingen
            0 TEMPERATUUR    \ Lees 1 sensor uit
            DUP INVERT
             TO LEDS         \ Toon op leds
            I TO METINGEN    \ Bewaar data
            2 SECONDEN       \ Wacht even
        LOOP
        SET LEDS 1 SECONDEN  \ Leds even uit
        GEMIDDELDE
        15 SECONDEN          \ Toon gemiddelde temp.
    AGAIN
    ;

 ' THERMOMETER RESET-VEC SET-VECTOR

 \ Einde

egeltje top