Czujniki DS18B20 i rozległa sieć 1-Wire

1wire sensor3Nadszedł czas na przetestowanie tego, co moduły "wzmacniające" sieć 1-wire potrafią.  Zakupiłem sporą paczkę czujników i zabrałem sie do pracy. Jako że montaż czujników w obudowach łączników ściennych miałem już przećwiczony, wszystko poszło całkiem sprawnie.  Oto kilka zdjęć i szczegółów...

  1. Przy lutowania kabelków ze skrętki do nóżek czujnika DS18B20 pomogła mi tzw. "trzecia ręka", tj. szczypczyki ze szkłem powiększającym z Castoramy za 15 PLN,
  2. Pilnowałem, by utrzymać jednolitość kolorów kabli - by potem nie musieć każdorazowo sprawdzać, co jest czym,
  3. Zamiast używanego wcześniej kleju dwu-składnikowego, wykorzystałem pistolet na klej w sztyfcie... szybko, sprawnie i po krzyku z możliwością korygowania błędów,
  4. Próbowałem umieszczać czujnik tak, by jego główka wystawała nieco poza ramkę, ale widać go bylo na jasnej ścianie.  Ostatecznie wszystkie wklejone są równo z obudową.

1wire sensor1 1wire sensor2

Jakko że wszystkie skrętki z puszek na łączniki ścienne zbiegają się w jednym puntkcie, moja sieć 1-wire ma kształt nierekomendowanej gwiazdy.  Oznacza to że z każdym podłączonym czunikiem spada zdolność poprawnego odczytu.  Do pojedynczej 'dzurki'/magistrali DS2482-800 udało mi się podłączyć maksymalnie 11 czujników.  Nie jest to wynik w żaden sposób miarodajny dla kogokolwiek - nie mam jak zmierzyć długości każdej skrętki, ani zastanawiać się nad zakłóceniami pochodzącymi z przebiegających równolegle przewodów na 230V.  Ostatecznie nie jest to ważne.  DS2482-800 obsłuuje 8 niezależnych kanałów.  W moim module dostępne jest 6.  To spory zapas....

Obecnie do mojego RPi podłączonych jest 16 szt. DS18B20 i jeden czujnik intensywności oświetlenia.  Zajęte są 3 dziurki - czujnik oświetlenia, jako urządzenie zewnętrzne, podpiąłem osobno.  Nadal mam duży zapas na dalszą zabawę.

Kilka słów o skryptach.  W katalogu /var/www umieściłem 2 pliki:

1. sensors.csv, w którym przechowuję nazwy/opisy podłączonych czujników, i który wypełniam stopniowo, po podłączeniu każdego nowegu czujnika:

28.F471B0040000;Salon - przy oknie;
28.B2B3A1040000;Sypialnia - drzwi;
28.87E9A0040000;Salon - kominek;
28.914CA1040000;Pokój Dzieci - drzwi;
...

 

2. sensors.php, który można wywołać z przeglądarki:

<?php
echo "<p>Update of: ".date('Y-m-d H:i:s')."</p>";
if ($MainDir = opendir('/mnt/1wire')) {
	$SensorFile = file("sensors.csv");
	if (!$SensorFile) {
		echo "Opening file with sensor names failed";
	}
	else {
		foreach ($SensorFile as $line){
			$SensorData = explode (";", $line);
			$SensorNumbers[]=$SensorData[0];
			$SensorNames[]=$SensorData[1];
		}
	}
	echo "<ol>";
	while (false !==($MainDirItem = readdir($MainDir))){
		if (preg_match('/[0-9]{2}./', $MainDirItem)) {
			$key = array_search($MainDirItem, $SensorNumbers);
			echo "<li>";
			if (false !==$key){
				echo $SensorNames[$key]." : ";
			}
			else{
				echo $MainDirItem." - no name assigned  : ";
			}	
			$TempFile = fopen("/mnt/1wire/$MainDirItem/temperature", "r");
			if (!$TempFile) {
				echo "...some problems with temp. file opening...";
			}
			else {
				$Temperature = fgets($TempFile);
				echo $Temperature."&deg;C<br>";
			}
			echo "</li>";
		}
	}
	echo "</ol>";
}