2024. április 19., péntek

Gyorskeresés

Útvonal

Cikkek » Számtech rovat

Raspberry Pi-s tapasztalataim 2. rész

  • (f)
  • (p)
Írta: |

Szeretnék egy webkamerás időjárás állomást, ehhez készítem el most a hőmérséklet érzékelőt.

[ ÚJ TESZT ]

Ahogy az első részben már említettem, szeretnék egy webkamerás időjárás állomást, ehhez készítem el most a hőmérséklet érzékelőt a Raspberry Pi-hez. Forrásként ezt a cikket használtam: [link]

Szükség lesz a következőkre:

1db x 4k7 ellenállás
1db x DS18B20 hőmérséklet szenzor
1db x 3 eres 50 cm-es vezeték
3db x szerelhető jumper csatlakozó

Anyagköltség : ~ 600Ft

Képekben:

Kapcsolási rajz

Nagyon egyszerű a kapcsolás, csak az ADAT vezetéket kell összekötni a 3.3V-os vezetékkel úgy, hogy közéjük forrasztjuk a 4k7 ohmos ellenállást.

Miután mindent összekötöttünk, bekapcsolhatjuk a Pi-t majd be kell töltenünk 2 kernel modult a következő parancsokkal:

modprobe w1-gpio
modprobe w1-therm

A hőmérséklet kiolvasása a következő paranccsal lehetséges:

cat /sys/bus/w1/devices/28-*/w1_slave

Eredmény:

root@raspberrypi:~# cat /sys/bus/w1/devices/28-*/w1_slave
71 01 4b 46 7f ff 0f 10 56 : crc=56 YES
71 01 4b 46 7f ff 0f 10 56 t=23062
root@raspberrypi:~#

Ahol is a t=23062 mutatja a hőmérsékletet, ha 1000-rel osztjuk, tehát 23,062 Celsius fok van.

Megjegyzés: a kiolvasás akkor jó, ha a CRC után YES van

Ha egy kicsit szebben szeretnénk megjeleníteni és folyamatosan 5 másodpercenként, pl így:

DS18B20 - Raspberry Pi
16:26:20 : 23.75 *C 74.75 *F
16:26:26 : 23.75 *C 74.75 *F
16:26:31 : 25.25 *C 77.45 *F
16:26:37 : 28.375 *C 83.075 *F
16:26:43 : 29.687 *C 85.4366 *F

Akkor a következő PYTHON kódra lesz szükségünk (Forrás):

import glob
import time
import os
import datetime

#initialize the device
os.system("sudo modprobe w1-gpio")
os.system("sudo modprobe w1-therm")

print "DS18B20 - Raspberry Pi"
#find the device
devicedir = glob.glob("/sys/bus/w1/devices/28-*")
device = devicedir[0]+"/w1_slave"

while True:
#open up the file
f = open (device, 'r')
sensor = f.readlines()
f.close()

#parse results from the file
crc=sensor[0].split()[-1]
temp=float(sensor[1].split()[-1].strip('t='))
temp_C=(temp/1000.000)
temp_F = ( temp_C * 9.0 / 5.0 ) + 32
now = datetime.datetime.now()
dtime = datetime.time(now.hour, now.minute, now.second)

#output
if 'YES' in crc:print dtime,":\t",temp_C,"*C\t",temp_F,"*F"
else:print dtime,"\tCRC check failed."
#wait 5 seconds and repeat
time.sleep(5)

Nincs más dolgunk, mint kicsit pofozni a kódon, hogy egy MySQL adatbázisban tárolja az adatokat, ahonnan PHP-vel szépen kiolvashatjuk és megjeleníthetjük a webkamera képe mellé.

1.Telepítsük az SQLITE3-at:
apt-get install sqlite3

2. Hozzunk létre egy adatbázist:
sqlite3 homerseklet.db

3. Hozzunk létre egy táblát, ahová az adatokat fogjuk írni:
CREATE TABLE adatok(ido TEXT, fok TEXT)

4. Lépjünk ki:
.exit

5. Módosítsuk az előbbi PYTHON kódot:
import glob
import time
import os
import datetime
import sqlite3 as lite
import sys

#initialize the device
os.system("sudo modprobe w1-gpio")
os.system("sudo modprobe w1-therm")

//print "DS18B20 - Raspberry Pi"
#find the device
devicedir = glob.glob("/sys/bus/w1/devices/28-*")
device = devicedir[0]+"/w1_slave"

con = lite.connect('homerseklet.db')

while True:
#open up the file
f = open (device, 'r')
sensor = f.readlines()
f.close()

#parse results from the file
crc=sensor[0].split()[-1]
temp=float(sensor[1].split()[-1].strip('t='))
temp_C=(temp/1000.000)
temp_F = ( temp_C * 9.0 / 5.0 ) + 32
now = datetime.datetime.now()
dtime = datetime.time(now.hour, now.minute, now.second)

#output
if 'YES' in crc:
//print dtime,":\t",temp_C,"*C\t",temp_F,"*F"
ido = time.strftime("%Y-%m-%d %H:%M:%S")
with con:
cur = con.cursor()
cur.execute("INSERT INTO adatok VALUES(?,?)",(ido,temp_C))

else:print dtime,"\tCRC check failed."
#wait 5 seconds and repeat
time.sleep(5)

Ezt a PYTHON scriptet kell futtatni a háttérben, érdemes betenni az automatikusan induló programok közé.

Utolsó lépés a PHP kód megírása

<?php

echo &quot;<H1>Raspberry PI+Webcam+Temp Sensor</H1>&quot;;
echo &quot;<IMG SRC='mjpegstream.php'>&quot;;

date_default_timezone_set('UTC');

try
{$file_db = new PDO('sqlite:homerseklet.db');

}
catch( PDOException $e )
{die( $e->getMessage() );}
$sql = 'SELECT * FROM adatok';
$result = $file_db->query($sql);
$rowarray = $result->fetchall(PDO::FETCH_ASSOC);
$rowno = 0;
echo &quot;<BR>&quot;;
foreach($rowarray as $row)
{
echo &quot;R&amp;#246;gz&amp;#237;t&amp;#233;s ideje:&quot;.$row[ido];
echo &quot; M&amp;#233;rt h&amp;#245;m&amp;#233;rs&amp;#233;klet:<STRONG>&quot;.$row[fok].&quot;&amp;#8451;</STR$
$rowno++;
}

?>

Szükség lesz még egy kis PHP kódra, ami az MJPEG streamer képét áthozza az oldalunkra:
(Persze ehhez az kell, hogy már a háttérben fusson ez is)

mjpegstream.php

<?php
$server = &quot;127.0.0.1&quot;; // kamera szerver címe
$port = 8080; // kamera szerver portja
$url = &quot;/?action=snapshot&quot;; // kép urlje a kamera szerveren
set_time_limit(0);
$fp = fsockopen($server, $port, $errno, $errstr, 30);
if (!$fp) {
echo &quot;$errstr ($errno)<br>\n&quot;; // hibakezelés
} else {
$urlstring = &quot;GET &quot;.$url.&quot; HTTP/1.0\r\n\r\n&quot;;
fputs ($fp, $urlstring);
while ($str = trim(fgets($fp, 4096)))
header($str);
fpassthru($fp);
fclose($fp);
}
?>

Végeredmény:

Folytatom...

Azóta történt

Előzmények

Hirdetés

Copyright © 2000-2024 PROHARDVER Informatikai Kft.