Temperaturmåling med Raspberry Pi

Raspberry Pi'en er forholdsvis nem at udvide, så den bliver til mere end blot f.eks. et mediecenter. Eksempel på temperaturmåling og et program til logning udviklet i C# Mono .Net.

Konstruktion

Grundideen til dette eksperiment skyldes bl.a. ølbrygning, hvor en Raspberry Pi kan indgå i ølbrygning til styrring af en grydes temperatur. På hjemmesiden Raspbrew kan man læse om et lignende projekt, som har været behjælpelig mht. diagramopbygningen.

Temperaturensensoren er en Dallas DS18B20, der ikke koster det helt store. Prisen ligger på omkring 35-50 kr., men kan fåes billigere hvis den bestilles fra udlandet.

Prototype konstruktionen ser måske en smule uoverskuelig ud, men det er blot:

  • Ledning fra ben P1-01 til ben 3 (rød) på sensoren.
  • Ledning fra ben P1-06 til ben 1 (grøn) på sensoren.
  • Ledning fra ben P1-07 til ben 2 (gul) på sensoren.
  • Mellen de to ledninger sættes en 4700 ohm modstand.
  • Evt. tilslut en nr. 2 sensor parallelt med den første.

Kommunikation med måler

For at komme i kontakt med temperaturensensoren skal der indlæses to moduler, som Raspbbery Pien ikke loader som udgangpunkt.

sudo modprobe w1_gpio && sudo modprobe w1_therm

Vil indlæse modulerne og du er klar til at kunne måle temperaturen, men hvis du genstarter din Raspberry, mangler modulerne igen. For at indlæses modulerne hver gang din Raspberry Pi starter, som du tilføje en linie i "/etc/modules".

sduo nano /etc/modules

Indsæt linien:

sudo sh -c "echo 'w1_gpio\nw1_therm\n' >> /etc/modules"

For at teste om konstruktionen er gået godt, vil du mappen "/sys/bus/w1/devices" kunne finde et identifikationsnummer på din temperatursensor.

ls -l /sys/bus/w1/devices/

Hvis du har flere temperatursensorer har de alle et unikt nummer. For at kalde temperatursensoren skrives:

cat /sys/bus/w1/devices/28-000004811ef6/w1_slave

Dette vil give følgende resultat:

I linie 2 ses værdien "t=22312". Det er temperaturen 22,3 grader.

Program til logning

I denne prototype vil jeg gerne gemme de enkelte temperaturmålinger i en fil, hvor jeg kan læse klokken og temperatur.

Til programmet vil jeg gerne bruge C# Mono .Net, men for at Raspberry Pien kan afvikle programmet skrevet i Mono, skal Mono først installeres.

sudo apt-get install mono-complete

Det tager lidt tid at installerer. Så der er plads til en kop kaffe eller hjemmebryg.

Bemærk at der i koden til programmet er en kommentar omkring en fejl i ARM Mono .Net. Så hvis du koder og tester på en Intel processor, så kan du godt lave noget i Mono .Net, der opfører sig anderledes på den ARM baserede Raspberry Pi.

Opret en fil f.eks. "TempSensor.cs" på din Raspberry og indsæt koden:

using System; using System.Diagnostics; public class TempSensor { private const string tempParm = "t="; private const string crcParm = "crc="; public static void Main() { LogTemp("28-000004811ef6"); LogTemp("28-00000481d5ff"); } public static void LogTemp(string deviceName) { Process p = new Process(); p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.CreateNoWindow = true; p.StartInfo.FileName = "cat"; p.StartInfo.Arguments = "/sys/bus/w1/devices/" + deviceName + "/w1_slave"; p.Start(); string output = p.StandardOutput.ReadToEnd(); p.WaitForExit(); string[] lines = output.Split('\n'); string crcLine = lines[0]; string tempLine = lines[1]; int crcIndex = crcLine.IndexOf(crcParm); string crc = crcLine.Substring (crcIndex + crcParm.Length); int tempIndex = tempLine.IndexOf(tempParm); string currentTemp = tempLine.Substring (tempIndex + tempParm.Length); double temp = 0; double.TryParse (currentTemp, out temp); temp = temp / (double)1000; // Raspberry Pi Mono bug. // Math.Round not working properly. Overflow Exception // http://www.raspberrypi.org/phpBB3/viewtopic.php?f=34&t=17988 //temp = Math.Round (temp, 2, MidpointRounding.AwayFromZero); Console.WriteLine("Device: " + deviceName); Console.WriteLine("Datetime: " + DateTime.Now.ToShortTimeString()); Console.WriteLine("Current temp: " + temp.ToString()); Console.WriteLine("CRC: " + crc); Console.WriteLine("--------------------"); } }

For at kompilerer koden til et program skrives:

mcs TempSensor.cs

Hvis alt går godt vil du efterfølgende have en "TempSensor.exe" fil i samme mappe.

mono TempSensor.exe

Hver gang programmet køres udskrives den aktuelle temperatur på skærmen.

Automatisk logning

Hvis du f.eks. løbende gerne vil holde øje med temperaturen i et rum, kan du sætte Raspberry Pi til automatisk at kører programmet i et bestemt interval. For at oprette sådan en automatisk kørsel (cron job) åbnes crontab:

crontab -e

Tilføj f.eks. denne linie:

*/30 * * * * mono /home/pi/development/TempSensor/TempSensor.exe >> /home/pi/development/TempSensor/temp.txt

Dette vil hver 30. minut kører programmet og gemme det, der normalt udskrives på skærmen i en tekstfil med navnet "temp.txt".

This is the end...

Et lille simpelt eksempel på at en Raspberry Pi kan bruges til andet end blot afspille film. Hvis du søger på nettet, kan du finde sider med mange andre små og store projekter.

Læs også

Xubuntu 13.10 Xubuntu 13.10

Gennemgang af min Xubuntu installation. Det medfølgende script virker med lidt individuelle justeringer fint til Xubuntu 12.04, 12.10, 13.04 og 13.10.

Brug Raspberry Pi som DLNA-server Brug Raspberry Pi som DLNA-server

Raspberry Pi kan bruges som DLNA-server til at afspille film, billeder og musik fra dit tv, telefon eller computer.

Tag et billede med din Raspberry Pi Tag et billede med din Raspberry Pi

Tilslut et webcam til din Raspberry Pi for at bruge computeren til at tage billeder med.

Raspberry Pi opsætning Raspberry Pi opsætning

Generel opsætning af en Raspberry Pi, der er en lille computer, der bl.a. kan bruges som mediecenter, server eller til styring af andre enheder.

Steam klient til Linux Steam klient til Linux

Steam klienten til Linux blev frigivet i 2013, og udvalget af spil er stødt stigende, da firmet bag Valve, selv ønsker at bruge Linux som spil- og underholdningsplatform. Steam er både til gratis og købe spil.