Hitanemi

Raspberry Pi hitamæling með DS18B20 hitanema

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.

Hitanemi tengdur

DS18B20 hitanemi tengdur við Raspberry Pi með brauðbretti

Tengdu 3,3 V pinnann 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.

Python 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):
    """Les hrá gögnin af hitamælinum."""
    with open(dev, "r") as f:
        lines = f.readlines()
    return lines


def read_temp(dev):
    """Les hrá gögn og skilar hitastigi í Celsiusgráðum."""
    lines = read_temp_raw(dev)

    while lines[0].strip()[-3:] != "YES":
        time.sleep(0.2)
        lines = read_temp_raw(dev)

    equals_pos = lines[1].find("t=")

    if equals_pos != -1:
        temp_string = lines[1][equals_pos + 2:]
        temp_c = float(temp_string) / 1000.0
        return temp_c

    return None


# 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 í.
filename = "log_temps.log"

# Hér byrjar lykkjan þar sem við endurtökum mælingarnar í sífellu
# þar til forritið er stöðvað.
while True:
    try:
        timestamp = str(datetime.datetime.now())
        temperatures = []

        for device_folder in device_folders:
            device_file = device_folder + "/w1_slave"
            temperatures.append(str(read_temp(device_file)))

        line = timestamp + "t" + "t".join(temperatures) + "n"

        with open(filename, "a") as logfile:
            logfile.write(line)

        print(line)

        # Bíðum í skilgreinda stund.
        time.sleep(10)

    except KeyboardInterrupt:
        print("end")
        raise