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.