Приобрёл датчик dallas 18B20 за 53 руб. ради «поиграться». А между прочим, диапазон измерений у него от -55 до +125 градусов Цельсия, что очень не плохо для дома(не промышленных условий), да и размер, примерно, 0,4×0,4 см. Да, да, 4 миллиметра. Подключать будем конечно к малютке raspberry pi 2. У датчика 3-а ножки, если смотреть на надпись dallas 18B20, то слева — земля (подключаем к пину №9 raspberry pi 2), центральную ножку к GPIO4 (к пин №7), справа подключаем к 3v3 (например к пину №17, первый пин у меня уже занят светодиодом). GPIO4 и 3V3 надо закоротить резистором (сопротивление) 4,7 кОм.
Подключаем датчик при выключенном raspberry pi 2, после чего включаем малинку.
Переходим к настройке.
sudo nano /boot/config.txt
Добавляем в конце строку, которая активирует 1-wire для GPIO4
dtoverlay=w1-gpio,gpiopin=4
Перезапускаем raspberry:
sudo reboot
Подгружаем модули ядра для 1-wire и dallas 18B20:
sudo modprobe w1-gpio
sudo modprobe w1-therm
Чтобы не подгружать их после перезагрузки, нужно в /etc/modules добавить 2-е строки:
w1-gpio
w1-therm
В /sys/bus/w1/devices/ находятся директории с вашими датчиками, начинаются они с «28-»
У меня подключен пока один датчик и поэтому в директории /sys/bus/w1/devices/ есть только:
ls /sys/bus/w1/devices/
28-03155178d4ff w1_bus_master1
где
28-03155178d4ff — это и есть наш датчик температуры dallas 18B20
Узнать, какую температуру он фиксирует, довольно просто, достаточно вывести содержимое файла:
cat /sys/bus/w1/devices/28-03155178d4ff/w1_slave
вместо 28-03155178d4ff конечно подставляйте свой датчик, который у вас определился в raspbian. Каждое устройство будет иметь свой идентификатор.
увидим примерно такую картину:
e0 01 01 01 1f ff 01 01 5e : crc=5e YES
e0 01 01 01 1f ff 01 01 5e t=30000
Смотрим на первую строку. Первый момент: убеждаемся что последняя цифра шестнадцатиричного числа равна crc. В моём примере это 5e=5e. Второй момент — в конце первой строки должно быть написано YES, Если NO, то данные считаны не корректно.
Смотрим на вторую строку и здесь 30000 — это и есть температура, правда умноженная на 1000. Значит чтобы узнать понятное для людей число, надо разделить его на 1000. Получается температура, которую зафиксировал датчик равна 30 градусам Цельсия. Если 30500, то соответственно 30.5 градусов.
Из консольки теперь можно смотреть показания, но я хочу больше.
Так как я любитель веб-решений, потому что кроссплатформенность и не только, поэтому хочу выводить данные на веб-интерфейс.
Закидывать данные будем в mysql, благо мы её уже установили ранее и создали базу с таблицами.
Установку я пропущу, она уже описана у меня на сайте, а вот по созданию базы и таблиц пробегусь быстро.
Подключаемся к mysql:
sudo mysql -u root -p
указываете пароль, который вы вписывали при установке mysql.
Создаём базу sensor_db
mysql> CREATE DATABASE sensor_db CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Создаём пользователя базы с логином pi и паролем raspberry0 (пароль можете указать свой, raspberry0 используется только ради примера), который будет иметь полные права на базу sensor_db:
mysql> GRANT ALL PRIVILEGES ON sensor_db.* TO pi@localhost IDENTIFIED BY 'raspberry0';
mysql> GRANT ALL PRIVILEGES ON sensor_db.* TO 'pi'@'%' IDENTIFIED BY 'raspberry0';
mysql> FLUSH PRIVILEGES;
mysql> exit;
Подключаемся к mysql под пользователем pi и паролем raspberry0:
sudo mysql -u pi -p
Enter password: вписываем пароль raspberry0 для пользователя pi
Делаем базу sensor_db текущей:
mysql> USE sensor_db;
Создаём таблицу sensors001:
mysql> CREATE TABLE sensors001 (place VARCHAR(50), sensdata VARCHAR(30), modelsens VARCHAR(30), pcname VARCHAR(30), datetime DATETIME, other VARCHAR(50));
здесь:
pcname — в это поле будем заносить имя пк, к которому подключен датчик. Макс длина = 30
datetime — поле для даты и времени срабатывания датчиков
modelsens — поле для модели датчика. Макс длина = 30
place — поле для указания места расположения датчика (комната/этаже/гараж и т.д.). Макс длина = 50
sensdata — показания датчика. Макс длина = 30
other — дополнительное поле для пояснений
Смотрим созданное:
mysql> SHOW TABLES;
+———————+
| Tables_in_sensor_db |
+———————+
| sensors001 |
+———————+
1 row in set (0.01 sec)
и ещё смотрим:
mysql> DESCRIBE sensors001;
+————+————-+——+——+———+——-+
| Field | Type | Null | Key | Default | Extra |
+————+————-+——+——+———+——-+
| place | varchar(50) | YES | | NULL | |
| sensdata | varchar(30) | YES | | NULL | |
| modelsens | varchar(30) | YES | | NULL | |
| pcname | varchar(30) | YES | | NULL | |
| datetime | datetime | YES | | NULL | |
| other | varchar(50) | YES | | NULL | |
+————+————-+——+——+———+——-+
6 rows in set (0.01 sec)
Создадим ещё один столбец, который будет автоматически генерироваться и будет PRIMARY KEY:
mysql> ALTER TABLE sensors001 ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id);
mysql> SET NAMES utf8 COLLATE utf8_unicode_ci;
mysql> DESCRIBE sensors001;
+————+————-+——+——+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+————+————-+——+——+———+—————-+
| id | int(11) | NO | PRI | NULL | auto_increment |
| place | varchar(50) | YES | | NULL | |
| sensdata | varchar(30) | YES | | NULL | |
| modelsens | varchar(30) | YES | | NULL | |
| pcname | varchar(30) | YES | | NULL | |
| datetime | datetime | YES | | NULL | |
| other | varchar(50) | YES | | NULL | |
+————+————-+——+——+———+—————-+
7 rows in set (0.01 sec)
Установим bc:
sudo apt-get install bc
Создадим скрипт:
sudo mkdir -p /script/gpio/
sudo chmod -R 0777 /script/gpio/
sudo nano /script/gpio/sensors001.sh
напишем туда:
#! /bin/bash #Указываем свой сенсор sens01="28-03155178d4ff" # снимаем температуру с датчика 28-03155178d4ff #TemperatureFull=$(cat /sys/bus/w1/devices/28-03155178d4ff/w1_slave | grep "t=" | cut -f 2 -d "=") TemperatureFull=$(cat /sys/bus/w1/devices/$sens01/w1_slave | grep "t=" | cut -f 2 -d "=") # выводим температуру в более понятном для человека виде, то есть # оставляем целое число из умножения TemperatureFull на 0.001, чтобы получить правильную температуру # и оставляем 1 символ после запятой(получается выводим первые 4 символа строки, за это отвечает cut -c 1-4) #TemperatureC=$(echo "scale=1; $TemperatureFull*0.001" | bc -l); echo $TemperatureC | cut -c 1-4 TemperatureC=$(echo "scale=1; $TemperatureFull*0.001" | bc -l); TempC=$(echo $TemperatureC | cut -c 1-4); #echo $TempC #Если надо оставить только целое число без десятых, то можно использовать : #TemperatureC=$(echo "scale=0; $TemperatureFull*0.001" | bc -l); echo ${TemperatureC%.*} # Заносим в БД. Между -p и паролем raspberry0 пробела быть не должно. mysql -D sensor_db -u pi -praspberry0 << EOF USE sensor_db; SET NAMES utf8 COLLATE utf8_unicode_ci; INSERT INTO sensors001 VALUES ('','комната №1',$TempC,'dallas 18B20','raspi001',NOW(),'дополнительной информации нет'); EOF #echo "$TempC занесено в базу"
Делаем исполняемым:
sudo chmod +x /script/gpio/sensors001.sh
После выполнения скрипта данные с датчика записываются в базу. Посмотрим, как они там выглядят. Выполняем в консольке, не в клиенте mysql(между -p и паролем raspberry0 пробела быть не должно!):
mysql -D sensor_db -u pi -praspberry0 -e "select * from sensors001";
Теперь выведем эти данные на веб-интерфейс, чтобы смотреть в браузере. Для этого редактируем index.php, расположенный в корне веб-сервера. Файл index.html оттуда надо удалить.
sudo rm /var/www/index.html
sudo nano /var/www/index.php
вписываем туда:
<html> <head> <title>датчик температуры</title> <meta http-equiv="Refresh" content="<?=$delay?>" /> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <?php header("Content-Type: text/html; charset=utf-8"); header('Refresh: 5; url=' .$_SERVER['PHP_SELF']); ?> <div id="div2"> <?php // указываем исходные данные $db_host = 'localhost'; $db_name = 'sensor_db'; $db_username = 'pi'; $db_password = 'raspberry0'; $db_table_to_show = 'sensors001'; // соединяемся с mysql $connect_to_db = mysql_connect($db_host, $db_username, $db_password) or die("Could not connect: " . mysql_error()); // подключаемся к БД mysql_select_db($db_name, $connect_to_db) or die("Could not select DB: " . mysql_error()); // исправляем проблему кодировки mysql_query('SET NAMES utf8 COLLATE utf8_unicode_ci'); //выводим только последние 21 снятий показаний $qr_result = mysql_query('select * from sensors001 ORDER BY datetime DESC LIMIT 21') or die(mysql_error()); // показываем на сайте заголовки HTML-таблицы echo '<table border="1">'; echo '<thead>'; echo '<tr>'; echo '<th> место </th>'; echo '<th> показания </th>'; echo '<th> модель датчика </th>'; echo '<th> дата/время </th>'; echo '<th> имя ПК </th>'; echo '<th> дополнительно </th>'; echo '</tr>'; echo '</thead>'; echo '<tbody>'; // выводим в HTML-таблицу нужные показатели датчика из таблицы MySQL while($data = mysql_fetch_array($qr_result)){ echo '<tr>'; echo '<td>' . $data['place'] . '</td>'; echo '<td>' . '<div id="text-center">' . $data['sensdata'] . '</div>'.'</td>'; echo '<td>' . '<div id="text-center">' . $data['modelsens'] . '</td>'; echo '<td>' . $data['datetime'] . '</td>'; echo '<td>' . $data['pcname'] . '</td>'; echo '<td>' . $data['other'] . '</td>'; echo '</tr>'; } echo '</tbody>'; echo '</table>'; // закрываем соединение с сервером БД mysql_close($connect_to_db); ?> </div> </body> </html>
Ещё создаём там же где и index.php файл style.css
sudo nano /var/www/style.css
вписываем туда:
#div2{ height:200px; width:750px; border:1px solid black; overflow-y:auto; padding-right:5px; } #text-center{ text-align: center; }
Можно открывать http:// ip-адрес-сайта/index.php и увидим табличку с данными из mysql
Осталось только закинуть скрипт /script/gpio/sensors001.sh в cron, чтобы он выполнялся, например, каждый час.
sudo crontab -e
добавляем в конце:
0 */1 * * * /script/gpio/sensors001.sh
Сохраняем, закрываем.
Примечание:
Если надо подключить несколько датчиков dallas 18B20 к raspberry py 2, то подключать их надо по схеме:
и в /sys/bus/w1/devices/ у вас будет несколько устройств, начинающихся с «28-»
Радуемся показаниям температуры на веб-интерфейсе.