Etikettarkiv: 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.

Ny temperaturserver på gång

Ni som följt Sundhults sidor tidigare vet att vi haft ett temperaturnät, men att det förstörts i ett åskväder. Nu tänkte jag återuppbygga det igen.

Tempearutrmätnätverket består av en rad sensorer som via ett 1-wirenätverk är kopplat till en tunn klient, i vilken alla temperaturer lagras i en databas. Sedan kan man beräkna medlevärden, trender och se hur temperaturer på olika mätställen påverkar varandra. 1-wirenätverket tillåter också en rad andra sensorer och som ger ännu mer funktionalitet, men det huvudsakliga är temperaturavläsning för oss. Data kan presenteras i grafer eller systembilder. Vi har faktiskt temperaturmätning idag också, och levererar temperaturdata till Temperatur.nu och där finns en speciell Sundhultssida med grafer över utetemperaturen här.

I ett åskväder 2009 så slogs alla sensorer ut, plus att den dåvarande tunna klienten slogs ut. Det var för andra gången på ganska kort tid så som alla temperatursensorer gick sönder. Den mätservern kördes på en mjukvara som hette MSure, och nu mer går under namnet Beyond measure. Nackdelen med MSure är att den kräver Windows som operativsystem. När jag nu skall återuppbygga det är jag lite sugen att försöka bygga upp det kring en linux-server.

Jag lyckades skaffa en ny tunn klient via min vän Mattias Weckstén, åkte ned till Kjell & Co och köpte ett USB-wifi-nätverkskort från Levelone (WUA-605), och sedan kutade jag över till Clas Ohlson och köpte 16Gb USB-minne från SAN-disk (Cruzer).

Den tunna klienten är en VXL Itona TC4331 på 1 Ghz, 512b RAM, 4 USB-portar, 2 IDE-portar, 1 paralellport 1 serieport, 1VGA och nätverkskort. Anledningen till att jag vill köra trådlöst nätverkskort är att förhindra att eventuell åska skall vandra från temperaturnätveket  till datornätverket, vilket nog är det som hänt tidigare när åskan förstört för oss.

Min plan är att köra en Ubuntu-server på klienten. Tänkte välja en serverversion utan grafiskt gränssnitt, för att prestandan är begränsad. Dessutom kan jag lätt via ett ’remote-shell’ administera burken på ett lätt sätt. Jag valde att ladda ner Ubuntu Server 10.04 LTS, där LTS står för Long-term support.

Dock har jag haft lite problem att installera Ubuntu från ett USB-minne som jag hade tänkt. USB-minnet ville inte boota. Jag hade ett gammalt 4 Gb USB-minne (SAN-disk micro cruzer) sedan tidigare som jag testade att göra till en bootbar Ubuntu-installation med hjälp av Pendrivelinux och det fungerade att börja installera. Under installationen vill den göra en ompartition, vilket jag godkände.  Senare hängde sig installationen, och sedan dess är inte det minnet heller bootbart, trots försök med Pendrivelinux och UNetbootin.

Eftersom jag inte har någon dator med linux idag så har jag letat efter verktyg i som fungerar i Windows-miljö. Dock har inget verktyg lyckats.

Då bestämde jag mig för att ladda ned VM-ware player, vilket skapar en virtuell dator inne i datorn. Med VM-ware player kan du testa linux, utan att behöva installera om datorn, eller skapa dual boot. Du kan köra operativsystem också om du så önskar. Det finns färdiga installationer som fixar in webserver, databasserver och till och med en WordPress för den som vill testa det.

Det vara bara att köra igång och ange var jag hade Ubuntu-iso-filen. Vips, så fanns det en linux-burk som snurrade här, om än utan grafiskt gränssnitt (eftersom jag tog Ubuntu-serverfilen).Det var inga problem att få tillgång till USB-portarna på den fysika datorn från den virtuella.  Där provade jag att ändra boot-flaggor med hjälp av linux-kommandot fdisk, utan lycka.

Tyvärr har jag inte i skrivande stund hittat något enkelt sätt att fixa ett installations USB-minne som inte kräver grafiskt gränssnitt. Givetvis skall jag fortsätta att kämpa med att få in det, och kommer tala om hur jag lyckas… Om jag nu lyckas.

Till slut lyckades jag starta installtionen

Nu har jag lyckats göra installationen. Lösningen för mig var att köra igång en Ubuntu Desktop i den virtuella maskinen. I den finns ett administrativt verktyg som heter Startup Disk Creator, från vilken jag gjorde ett bootbart USB-minne. I den virtuella maskinen valde jag att via CD-ikonen längst ned monter ISO-filen som en CD-rom, och välja den som källa i Startup Disk Creator.

Jag bootade på ett USB-minne, och hade måldisken, 16gb SAN-disk-minnet, i samtidigt.  Som jag förstod det gick det inte, eller är åtminstone är svårt, att botta och ha samma disk som mål.

Nu är det bara kvar att förstå varför installationen hänger sig efter det att 41% av grundsystemet installerats.

Det kan vara en av två orsaker.:

  1. Minnet, för burken hade 128 Mb, och inte 1 Gb som jag fått för mig. Jag plockade i en 512 Mb
  2. Värme, för jag tyckte det blev varmt. Hade kört med öppet skal, och liggande. Jag skruvade på skalet och placerade den stående, vilket ventilerar burken mer.

Så nu finns det en burk i gång, med webbserver (inklusive php) och  Mysql-databas. Nästa steg är att få igång USB-interfacet till 1-wirenätet, samt att dra igång OWFS som används för att läsa av sensorer på 1-wirenätet.

Att få igång 1-wireinterfacet

Det gick smidigare än väntat att få igång själva 1-wireinterfacet. Killarna hos Temperatur.nu har satt ihop en HowTo-guide att följa som fungerade att köra rätt av.

Det jag vill göra nu är att läsa in data från temperatursensorer och lägga in i en databas.

Nu fungerar det att läsa av temperaturer. Se så vackert!

Tjoff in i databasen

Nu har jag fixat ett schemalagt jobb (crontab) som var femte minut lägger in temperaturen från sensorn i en MySQL-databas genom ett Linux-shell-script.

Nu återstår lite pill för att definiera alla sensorer som skall in, och se till att data hamnar i databasen. Skall fundera ett varv till över hur man skall lägga upp databaserna.

Därefter blir det lite php/jQuery eller liknande för att presentera data på webben. Just nu finns den bara som en textrad på Sundhults Logger.