Kategoriarkiv: 1-wire

Hemmabygd Stevenson screen

Stevenson screenFör att förbättra temperaturmätningarna i Sundhult har jag byggt en en egen Stevenson screen. Det är ett skydd som skall hindra att direkt solstrålning skall påverkar avläsningen av sensorn.

Tanken är alltså att sensorn hela tiden skall befinna sig i skugga, men att luften inte skall stå stilla utan ha möjlighet  cirkulera. Finare Stevenson screens har en fläkt i botten för att hålla samma jämna flöde genom mätrummet hela tiden. Varianten jag byggde är en mer budgetvariant.

Stevenson screenVita plastfat för blommor utgör en stor del  Stevenson screenen. Genom att borra tre hål för gängad stång (5mm) i plastfaten, och i mitten ett betydligt större (ca 70mm) med hålsåg i mitten har man skapat alla delar som behövs. Faten monteras med en mutter under och en över så de fixaras och låses fast. Nästa fat monteras så att man inte kan se in i utrymmet inne i faten, men så mycket isär det bara går för att luften skall flöda så lätt som möjligt. Fatet längst upp skall bara ha tre hål för den gängade stången, så att regn och snö inte når sensorn.

Stevenson screenen monteras sedan på en konsol så att det kommer ut från väggen, och på en höjd av 150 cm.

Vår Stevenson screen  har en temperatursensor och en fuktsensor som finns mitt i mätrummet.

Den här filmen visar delarna som Stevenson screenen byggd av:

Här visas hur det ser ut när den är monterad på väggen, och hur kopplingspunkten till nätet ser ut:

 

Så skriver man till display på 1-wirenätverket

LCD Display i 1wirenätverketTill 1-wirenätverket har vi kopplat en 4-radig LCD display, som är väldigt lätt att hanter. Genom att bara skriva till en fil dyker texten upp på displayen.

Den display vi har i Sundhult är köpt hos m.nu, och är i praktiken en  LCD-drivkretsmed 1-wiregränssnitt, och själva displayen. Jag har valt att bygga flera ”sidor” med information som roterar. Det är information om panna och kulverttemperaturer, hur varmt det är i de olika utrymmena i ekonomibyggnaden, generationsskifteshuset och manhuset.

Displayen kan bygga in i en låda, och där finns också knappar som man kan läsa av, och några digitala utgångar som man kan koppla dioder till för att indikera exempelvis larm eller annat.

Här berättar jag lite mer om displayen:

För att skriva till dsiplayen direkt från ett bash-script så gör man så här:

#/bin/sh
#
# Script to write to the display
#
cd /mnt/1wire/FF.A80300000100/
#
# Start backlight
#
echo -n 1 > backlight;
#
# Get temperature and write to display
#
# Read temperature and use python to do som rounding
# Write to first line of the display (line20.0)
temperature=`cat /mnt/1wire/[1wire ID]/temperature | python -c "print round(float(raw_input()),1)"| sed 's/ //g'`;
echo -n "Temperature is: $temperature'C" > line20.0;

Vill man hellre använda Python kan man ta dessa raderna:

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# LCD-display sökväg
#
LCD = "/mnt/1wire/[Display ID]/"
def skriv(rad, text):
 """
 Skriv till display
In:
 rad: Vilken rad på displayen det skall skrivas till 1-4
 text: Texten som skall skrivas till displayen. Max 20 tecken
 """
if rad == 1:
 LCDLine = open(LCD + "line20.0", "w")
 elif rad == 2:
 LCDLine = open(LCD + "line20.1", "w")
 elif rad == 3:
 LCDLine = open(LCD + "line20.2", "w")
 elif rad == 4:
 LCDLine = open(LCD + "line20.3", "w")
LCDLine.write(text)
 LCDLine.close()
def backlight(on):
 """
 Tänd backgrundsbelysningen
In:
 on: 0 = släck, 1 = tänd
 """
LCDBacklight = open(LCD + "backlight", "w")
if on == 1:
 LCDBacklight.write("1")
 else:
 LCDBacklight.write("0")
 LCDBacklight.close()
#
# Exempel
#
backlight(1)
skriv(1, "Skriv rad 1")
temperatur = "24"
skriv(2, "Ute: " + temperatur + "\xDFC")

Läs mer om vårt 1-wirenätverk.

Så anslöt jag temperatursensorer till 1-wirenätet

ds1820_i_kopplingslistTill 1-wirenätverket i Sundhult har jag anslutit massor av temperaturgivare, och här visar jag lite hur jag gjort.

CAT5-kabel har använts i nätet

Själva nätet har jag byggt med nätverkskabel, CAT5, som jag köpt på Biltema. Eftersom jag inte hittade någon direkt standard för vilken färg som skulle användas till vad när en CAT5-kabel användes för 1-wire hittade jag på min egen. Notera att leverantörer av olika färdiga 1-wireenheter kan använda färgerna helt annorlunda!

Så här valde jag att göra:

  • Grön til referens (GND)
  • Grönvit till signal (DQ)
  • Orange till +5V

Det går faktiskt att använda 1-wire med para två ledare, så kallad parasitmatning. Det man förlorar då är att temperaturavläsningen kan ta något längre tid, samt att om man har enheter som displayer så vill man ha bra spänningsmatning till. Jag tycker det är bättre att köra ett tre ledarsystem.

En 1-wire temperatorsensor med krympslang omHylslist för åskans skull

Vi har haft en del problem med att sensorer gått sönder i samband med åskväder. För att underlätta byte av sensorer så lödde vi fast hylslister (finns på Elfa), som man bara kan trycka i en sensor utan  verktyg.

Krypslang

För att skydda sensorerna har och lödningarna har sedan krympslang användas. Krympslang finns att köpa exempelvis på Biltema. Det är en form av gummislang man trär över och som krymper när den värms (använd värmepistol).

I den här filmen visas hur en sensor monteras.

Vilken höjd sätter jag sensorn på?

En temperatursensor bör placeras cirka 150 cm ovan mark, och om det går en bit från väggen. Är det utomhus skall det inte vara nära fönster eller ventil som kan ge oönskat värmetillskott, eller direkt solstrålning som kan påverka mätreslutatet. Utomhus kan man använda sig av en Stevenson screen för att skugga givaren, som man kan bygga själv med vita plastfat för blommor och gängad stång.

Hur monterar jag sensorn på ackumulatortanken?

Jämförelse analog och digitalt avlästa mätvärden

På ackumulatortankar brukar det finns dykrör, som tuber in i tanken där man för in en termometer. Då kan det hända att pannans reglersystem är upptar den platsen, eller analoga givare som finns i direkt anslutning till tanken. Jag har fäst givare direkt på utsidan av tanken, och eftersom det rör sig om relativt långsamma processer och att metallen som tanken är gjord av håller nästan samma temperatur som vattnet har det inte varit några problem.

I bilden här intill syns den analoga mätaren placerad dykröret vid botten av tanken, och under den mätningen som gjort med 1-wiretemperatursensorn fäst på utsidan av tanken.

 

Så sparar jag temperaturer till databasen

Measure_SundhultJag har tidigare berättat hur jag byggt ett 1-wirenätverk som läser av temperaturer i Sundhult. Nästa steg för mig har varit att stoppa in temperaturerna i en databas för att kunna plocka fram historisk data. I denna post berättar jag hur jag gått tillväga.

Databasen jag valde att använda är MySQL, mest för att jag tidigare använt den en del, främst via gränssnittet phpMyAdmin. Därför tänkte jag att det kan vara en genväg för mig att installera LAMP på min Raspberry Pi, även om jag visste att det kan komma att gå segt.

Via phpMyAdmin konfigurerade jag sedan upp en databas, fixade en tabell med rätt formatering. Allt det där går säkert lätt att göra via MySQL’s kommandorad, men jag valde alltså den långa vägen. Skriv gärna i kommentarerna nedan om du har kunskap hur man skall göra för att bygga sin databas via kommandoraden.

För att få in LAMP på Raspberry Pi gjorde jag så här.

sudo apt-get update
sudo apt-get install apache2 php5 libapache2-mod-php5 mysql-server mysql-client php5-mysql phpmyadmin

Eftersom jag är sugen på att köra det via python, och passa på att lära mig det, installerade jag också en koppling mellan python och MySQL också.

sudo apt-get install python-mysqldb

Sedan har jag gjort det här skriptet för att läsa ut to temperaturer och stoppa in i min databas kallad 1wire, i en tabell kallad ute med en kolumn för varje temperatur.

Så här ser tabellstrukturen ut:

Tabellstruktur för 1wire

#!/usr/bin/python
# -*- coding: utf-8 -*-
import MySQLdb as databas
#
# Utetemperaturen vid  manhuset
#
fil = open('/mnt/1wire/[ID]/temperature', 'r')
uteManhuset = round(float(fil.read()), 1)
fil.close()
#
# Utetemperaturen vid maskinhallen
#
fil = open('/mnt/1wire/[ID]/temperature', 'r')
uteMaskinhallen = round(float(fil.read()), 1)
fil.close()
#
# Spara temperaturer till databasen
#
con = databas.connect('localhost', 'USER', 'PASSWORD', '1wire')
query = 'INSERT INTO Ute(Manhuset,Maskinhallen) VALUES(%s,%s)'
with con:
 cur = con.cursor()
 cur.execute(query % (uteManhuset, uteMaskinhallen))
if con:
 con.close()

Det skriptet körs sedan var femte minut som ett cron-jobb.

Kom mycket gärna med förslag om förbättringar!

Så rapporterar vi till temperatur.nu

temperatur_nuNi som har koll på bloggen vet att vi Sundhult har ett 1-wirenätverk för temperaturloggning. Utomhustemperaturen skickas också upp till sajten www.temperatur.nu, där vår temperatur presenteras på en egen sida. Här redovisas hur det görs i Raspberry Pi med hjälp av ett python-skript.

För att rapportera temperatur till sajten temperatur.nu skall man skicka upp en skuggtemperatur med 5 minuter som längsta  intervall. Har man möjlighet till det får man göra en ansökan om att rapportera.

Systemet är alltså en Raspberry Pi med m.nu’s 1-wiremodul, där två temperatursensorer (DS1820) läses av. Hur Raspberry Pi:n är konfigurerad har jag berättat i ett tidigare inlägg. Troligtvis kommer det bli fler sensorer framöver för att förbättra mätvärdet och minska påverkan av solinstrålning ännu mer.

 

Så här ser python-skriptet ut idag.

 

#!/usr/bin/python
# -*- coding: utf-8 -*-
import httplib
#
# Temperatur 1
#
fil = open('/mnt/1wire/[SENOR_ID]/temperature', 'r')
temp1 = fil.read()
fil.close()
#
# Temperatur 2
#
fil = open('/mnt/1wire/[SENOR_ID]/temperature', 'r')
temp2 = fil.read()
fil.close()
#
# Beräkna Medel
#
medel = round((float(temp1) + float(temp2)) / 2, 1)
#
# Skicka data till www.temperatur.nu med unikt ID
#
id = "XXXXXXXXXXX"
stad = "Stad"
connection = httplib.HTTPConnection("www.temperatur.nu")
connection.request("HEAD", "/rapportera.php?s=" + stad + "&id=" + id + "&t=" + str(medel))

#
# För felsökning och test
#
#result = connection.getresponse()
#print result.status, result.reason

 

Så byggdes ett 1-wirenät med Raspberry Pi

Raspberry Pi med 1-wire och wifi-adpaterJag vill få koll på lite temperaturer på värmesystemet i Sundhult. För att göra det använder jag ett 1-wirenät från Dallas Semiconductor kopplat till en Raspberry Pi. Här följer en beskrivning av hur jag gjort för att komma igång.

Här finns en film som beskriver installationen. Längre ner på sidan finns en film som visar Raspberry Pi lite närmare, samt en film i två delar som visare lite mer vad 1-wire är för något.

Jag har också en beskrivning av hur jag byggt 1-wirenätet hemma på gården.

 Hur kommer jag igång med Raspberry Pi och 1-wire?

Länklista:

  • Raspberry Pi är köpt på www.m.nu, som också har minneskort, USB-wifi donglar, minneskort 1-wireprylar, nätdelar osv
  • Ladda ner Raspbian från ww.raspberrypi.org
  • Ladda in filen på ett SD-kort med hjälp av guiden på wikin. Se till att den är formaterad med FAT32.
  • Sätt i SD-kort i Raspberry
  • Anslut HDMI-kabel, mus och tangentbord
  • Username är pi och lösenord är raspberry
  • För att starta fönsterhanteraren (desktop) skriv startx på kommandoraden
  • Installera OWFS enligt guiden på wikin hos temperatur.nu
  • Skall du köra en USB-wifi istället för direkt kabel använd Wifi Config som finns i fönsterhanteraren.

OWFS i en Raspberry Pi

Eftersom jag har en tunn klient som ”huvudservern” ser jag till att kopiera över temperaturerna med hjälp av scp  (secure copy) som gör en kopiering av filen genom en ssh-tunnel. För att få det att fungera i ett shell-script sätter man upp krypteringsnycklar på följande vis:

På datorn som filerna skall kopieras till:

ssh-keygen

Följt av

ssh-copy-id -i /home/USER/.ssh/id_rsa.pub USER_ON_REMOTE@REMOTE_SERVER

Nu skall du från datorn som filerna skall kopieras till skriva:

ssh USER_ON_REMOTE_SERVER@REMOTE_SERVER

och då automatiskt bli inloggad.

I mitt fall är REMOTE_SERVER min Raspberry Pi och USER_ON_REMOTE en användare som har rätt att läsa OWFS-filerna för att kunna kopiera temperatur till min ”huvudserver”, där sedan det lagras i databas och skickas till 1-wiredisplay exempelvis.

Kopierar filen gör jag med:

sudo scp -r -i /home/USER/.ssh/id_rsa USER_ON_REMOTE@REMOTE_SERVER:/mnt/1wire/28.* /DESTINATION

för att kopiera data från en DS1820. Den raden sparar jag i ett shell-script (copyFromREMOTE_SERVER.sh) och ser till att filen är exekverbar.

sudo chmod +x copyFromREMOTE_SERVER.sh

Sedan lägger jag in ett cron-jobb som cyklist kopierar temperaturen.

sudo crontab -e

Och där lägger jag in:

*/5 * * * * /home/USER/copyFromREMOTE_SERVER.sh

för att kopiera data var femte minut.