Hitanemi

Hér munt þú setja upp forrit á Raspberry Pi tölvu sem les hitastig af DS18B20 1-wire hitamæli. Fyrsta skrefið er að tengja hitamælinn við tölvuna.

Tengdu 3,3 V pinnan við jákvæðu braut brauðbrettisins og einhvern neikvæðu pinnanna við neikvæðu brautina. Stingdu rauðu og svörtu endum hitanemans í jákvæðu og neikvæðu brautirnar, tilsvarandi. Tengdu gula vírinn í einhverja tóma röð á brauðbrettinu og tengdu svo þá röð við jákvæðu brautina með 4,7 kΩ viðnámi.

Lokaskrefið er að tengja röðina með gula vírnum við GPIO pinna 4. Þá á þetta að vera komið. Tími til að kasta í forrit:

#!/usr/bin/python3
#
# Þetta forrit er gert til að keyra á Raspberry Pi og lesa af DS18B20 1-wire hitamæli.

import os
import glob
import time
import datetime

def read_temp_raw(dev):
    ''' Þetta fall les hrá gögnin af hitamælinum.
    '''
    f = open(dev, 'r')
    lines = f.readlines()
    f.close()
    return lines

def read_temp(dev):
    ''' Þetta fall les hráu gögnin með read_temp_raw(), dregur hitastigs-
    upplýsingarnar úr þeim og skilar sem tölu með einum aukastaf.
    '''
    # Lesum inn línurnar í lista:
    lines = read_temp_raw(dev)
    while lines[0].strip()[-3:] != 'YES':
        lines = read_temp_raw(dev)
    # Finnum stöðu strengsins þar sem hitastigið er gefið upp:
    equals_pos = lines[1].find('t=')
    # Ef hitastigið finnst, þá:
    if equals_pos != -1:
        # Setjum hitastigið í breytu.
        temp_string = lines[1][equals_pos+2:]
        # Hitaneminn gefur hitastigið upp í þúsundustu hlutum úr Celsiusgráðu:
        temp_c = float(temp_string) / 1000.0
        # Skilum svo hitastiginu:
        return temp_c

# Byrjum á því að hlaða 1-wire reklana (ef búið er að hlaða þeim í /etc/modules er þetta óþarfi, en
# það sakar þó ekki):
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

# Ef allt er rétt stillt og hitamælirinn er tengdur við pinna 4 á hann að
# birtast í skráarsafninu undir /sys/bus/w1/devices/
base_dir = '/sys/bus/w1/devices/'
device_folders = glob.glob(base_dir + '28*')

# Skilgreinum skrána sem við ætlum að safna gögnum í. Hin leiðin væri að keyra forritið í skel og
# veita útkomunni yfir í skrá með verkfærum skeljarinnar.
filename = 'log_temps.log'

# Hér byrjar while-lykkjan þar sem við endurtökum mælingarnar í sífellu þar til forritið er stöðvað:
while True:
    try:
        # Opnum gagnaskrána. Við viljum ekki skrifa yfir fyrri gögn svo við opnum hana í „append“ ham:
        logfile = open(filename, 'a')
        # Athugum hvað klukkan er:
        d = str(datetime.datetime.now())
        # Setjum upp lista til að geta lesið af öllum hitanemunum í einu:
        ts = []
        # Lykkjum nú yfir alla hitamælana í device_folders og bætum hitastigunum í ts:
        for device_folder in device_folders:
            device_file = device_folder + '/w1_slave'
            ts.append(str(read_temp(device_file)))
        # Skrifum svo tímann og hitastigin í gagnaskrána:
        logfile.write(d + '\t' + \t'.join(ts) + '\n')
        print(d + '\t' + \t'.join(ts) + '\n')
        # Lokum skránni ef svo kunni að fara að við ákveðum að hætta áður en við skrifum næstu mæligildi:
        logfile.close()
        # Bíðum svo í einhverja skilgreinda stund (þetta þarf að meta fyrir hverjar aðstæður):
        time.sleep(10)
    except KeyboardInterrupt:
        print("end")
        raise