Używamy plików cookies (tzw. ciasteczka) by spersonalizować treść i ogłoszenia oraz by analizować ruch na stronie.  W sposób automatyczny dzielimy się informacjami o Twoim użyciu tego portalu z dostawcami ogłoszeń, którzy mogą połączyć te informacje z informacjami, które im udzieliłaś/łeś lub, które sami zebrali. Korzystanie z witryny bez zmiany ustawień dotyczących cookies oznacza, że będą one zamieszczane w Państwa urządzeniu końcowym.  Możecie Państwo dokonać w każdym czasie zmiany ustawień dotyczących cookies zmieniając opcje przeglądarki.

Pomiar intensywności światła (DS2438 i SFH203P)

SolarSensorRAW

1-Wire i RPi miały umożliwić pomiar 'zmiennych środowiskowych'.  Sama temperatura to jeszcze dużo za mało, by poczuć satysfakcję z wyboru rozwiązania.  Znalazłem więc w sieci przykłady pomiaru intensywności światła z wykorzystaniem DS2438Z (Smart Battery Monitor), zrobiłem prostą płytkę i proszę - wszystko działa.  To ciągłe 'działa i działa' jest zaskakujące.  1-wire, okazuje się, jest tak proste, że zwykły człowiek z lutownicą może sobie ze wszystkim poradzić.

Nie wiem, czy to wina mojej przeglądarki, ale Google zapytany o 'czujnik światła' lub 'czujnik wilgoci' zwraca prawie wyłącznie produkty HobbyBoards. Sklep ten zaprzestał publikowania schematów ww. płytek, zostały jedynie cienie na różnych forach, że kiedyś, przed laty, można było takie schematy znaleźć.  Powoli, analizując przykłady teoretyczne, udało mi się sklecić następującą płytkę:

SolarSensor BoardUmożliwia ona w teorii podłączenia wszystkiego na raz tj. Fotodiody SFH203P do pomiaru intensywności światła, czujnika HIH firmy Honeywell do pomiaru wilgotności i czujnika DS18B20 do pomiaru temperatury.  Rezystory R1 to 390Ohm, R2 to 100K, kondensatory C1 i C2 to 0,1uF.

W mojej pierwszej płytce podłączyłem wyłącznie fotodiodę.  Chciałem zrobić prosty czujnik do powieszenia na ścianie domu, który mierzyłby intensywność światła i temperaturę. Sam DS2438 posiada wbudowany czujnik podobny do DS18B20.  W prostej paczce jest więc wszystko, co potrzeba.  Ostatecznie więc miejsce na DS18B20 ma jedynie sens, jeśli płytkę potraktuje się jako 'bazę' a czujniki umieszczone w innych miejscach podłączy się przewodami.

Wykorzystałem obudowę Z43J firmy Kradex, bo... była najmniejsza.  Nie jest to, generalnie, poprawne rozwiązanie, bo nie gwarantuje żadnej wodoszczelności.  Nie znalazłem jednak innej obudowy, która byłaby niewielka i miałaby jakąś szybkę lub kopułkę tak, by nie trzeba było wiercić otworu na czujnik.  

SolarSensor Ready

Wybór fotodiody i czujnika wilgotności ograniczony był w moim wypadku do tego, co wspiera OWFS, a OWFS bazuje głównie na... produktach Hobby Boards.  Gdy więc do sieci 1-wire podłączy się DS2438Z, odnaleźć go można jako oddzielny katalog ze strukturą plików i pod-katalogów odpowiadającym potencjalnym wykorzystaniom:

SolarSensor tree

OWFS dokonuje wszystkich niezbędnych przeliczeń dla wybranych, supportowanych zastosowań.  Korzystając z nich nie trzeba nic korygować, wpina się kable i sprawdza jasność w LUXach w pliku "illuminance"   w katalogu "S3-R1-A".

Aby uprościć odczytywanie danych czujnika napisałem kilka skryptów:

1. Plik php umieszczony w /var/www, który umożliwia odczyt wskazań czujnika przez przeglądarkę

<?php
if ($MainDir = opendir('/mnt/1wire/26.27XXXXXXXXXX/S3-R1-A')) {
	$TempFile = fopen("/mnt/1wire/26.27XXXXXXXXXX/S3-R1-A/illuminance", "r");
	if (!$TempFile) {
		echo "

Problems with illuminance file!

"; } else { $Luminance = fgets($TempFile); echo "

Luminance = "; echo $Luminance." LUX

"; } } else { echo "

Sensor missing!!

"; }

2. Skrypt w PYTHONie, który wysyła wskazania czujnika do bazy SQL

#!/usr/bin/python

import MySQLdb;

from time import localtime, strftime
timer = strftime("%Y-%m-%d %H:%M:%S", localtime())

try:
	fo = open("/mnt/1wire/26.27XXXXXXXXXX/S3-R1-A/illuminance", "r")
except:
	print timer + " : Error reading sensor data"
else:
	illuminance = fo.read()
	lux = illuminance.split(".")
	lux = lux[0].strip()
	
	try:
		db = MySQLdb.connect("yourserver","youruser","yourpassword","yourdatabase" )
	except:
		print timer + " : Error connecting to the SQL database"
	else:
		cursor = db.cursor()
		sql = "INSERT INTO Light(Time, Lux) VALUES ('" + timer + "',"+ lux + ")"
		
		try:
			cursor.execute(sql)
			db.commit()
			print timer + " : Sending data ok"
		except:
			db.rollback()
			print timer + " : Error executing query"
	
		db.close()
	
	fo.close()

Plik z powyższym kodem należy uczynić 'wykonywalnym' komendą "chmod +x yourfile.py".  Uruchomienie kodu/wykonanie skryptu dokonuje sie przez "./yourfile.py"

Jeśli nie macie zainstalowanej MySQLdb i po uruchomieniu pliku zobaczycie komunikat:

Traceback (most recent call last):
	File "yourfile.py", line 3, in 
	import MySQLdb
	ImportError: No module named MySQLdb

należy uruchomić "apt-get install python-mysqldb" i wszystko powinno działać.

 

Aby skrypt uruchamiał się automatycznie co ileś-tam minut należy dodać go do CRONa poprzez komendę

crontab -e

i dodanie linii:

*/20 * * * * /var/yourdir/yourfile.py >> /var/yourdir/log/yourfile.log 2>&1

"*/20" oznacza, że skrypt wykonywany będzie co 20 minut.  Część zaznaczona na czerwono nie jest konieczna, umożliwia jednak zapisywanie odpowiedzi skryptu w oddzielnym pliku.

To tyle.  Efekty z wykorzystaniem skryptów do wykresów można zobaczyć pod http://www.edom-plc.pl/wago/wykresy/light.html