Newer
Older
devtimer / ds18b20.py
#!/usr/bin/env python3

import globals

import sys
from time import sleep, time
from threading import Thread

DEBUG = False

'''
  This is based on the widely available DS18B20 temperature probe.
  It is a 1-wire protocol device that returns temperature directly
  degrees C.  The dataline must go on the Pi GPIO 4 (pin 7) which
  should be pulled up to VCC with a 4.7K resistor.

  You have to do several thingsto make this work:

    1) Enable 1-wire support in the Pi:

        edit /boot/config.txt set: dtoverlay=w1-gpio
        reboot

    2) Each 1-wire device is connected to the same pin (7)
       on the Pi.  It distinguishes between them by a uniq
       address.  You have to find that address *for your specific
       device*.  You do this by looking at:

         ls -l /sys/bus/w1/devices

       You'll see the ID of your device there.  That needs to
       be set in the line below for this code to work with
       your device.
'''

DS18B20_ID = "28-0416840ac6ff"


# Read the current temp returned by the probe

def read_probe():

    probe = open("/sys/bus/w1/devices/%s/w1_slave" % DS18B20_ID)
    temp = float(probe.readlines()[-1].split()[-1].split("=")[-1])/1000  # Parse probe output
    temp = int(round((temp * 9/5) +32))                                  # Convert C-F and round into an integer

    # 1-wire interfaces (like the DS18B20 uses) can occasionally
    # return wildly wrong results.  For this reason, we throw away
    # values that have changed more than 10 degrees since the last
    # reading, since that's almost certainly noise.

    if abs(temp - globals.CURRENT_TEMP) <= 10:
        globals.CURRENT_TEMP = temp

    probe.close()


# Update the store temperature every second or so

def monitor_temps():

    while True:
        update_temp = Thread(name="Update Temp", target=read_probe).start()
        sleep(1)

        if DEBUG:
            sys.stdout.write("Temp: %sF\n" % globals.CURRENT_TEMP)


# Run this from the command line
if __name__ == "__main__":
    DEBUG = True
    monitor_temps()