Программа на C считывает показания температуры и влажности с датчика DHT22. Скрипт на bash запускает с определенным интервалом скомпилированную C-программу. Показания температуры и влажности с метками даты и времени пишутся в текстовые файлы. Интервал считывания показаний задается при запуске скрипта. Потом на основании полученных данных можно построить графики температуры и влажности, используя библиотеку dygraph-combined-dev.js.
Схему подключения датчика можно посмотреть в статье Монитор температуры и влажности на DHT11 / DHT22 и WebIOPi в Raspberry Pi.
За основу взят скрипт из [1], с. 58-59. Программа на C из [1] не пошла - выдавала нули, поэтому использовал программу с ресурса https://forum.odroid.com/viewtopic.php?p=94697#, она использует библиотеку wiringPi. Установите wiringPi командами
sudo apt install git-core
git clone git://git.drogon.net/wiringPi
cd wiringPi/
./build
Проверьте версию
gpio -v
Посмотрите нумерацию контактов GPIO
gpio readall
Для компиляции требуется программа locking.c, взята с ресурса https://github.com/technion/lol_dht22.
Скомпилируйте dht22 командой
gcc -o dht22 dht22.c locking.c -lwiringPi -pthread
Можно не компилировать, а использовать готовую программу из каталога скачанного архива. Главное - задать правильный параметр при запуске. Находясь в каталоге с программой, проверьте ее работу командой
./dht22 1
Вы должны увидеть значения влажности и температуры. Параметр 1 - это контакт GPIO1 в нумерации wiringPi, к которому подключен DHT22. Физически это контакт 12 на разъеме GPIO Raspberry Pi 3.
Сам скрипт sensor1.sh состоит из двух функций - монитора датчика и записи лога в текстовые файлы. Добавлены вывод даты и времени и запись лога показаний в текстовые файлы dht22_temp.txt, dht22_humi.txt.
Файл sensor1.sh
#!/bin/bash
# Description : A simple bash script to monitor or log the temp sensors
SLEEP=$2
# Укажите полный путь к файлам LOG1 и LOG2
# Пример: LOG1="/home/pi/zgo/html/dht22_humi.txt"
LOG1="dht22_humi.txt"
LOG2="dht22_temp.txt"
function dht22_mon {
# echo Polling DHT22 every $SLEEP seconds.
for (( ; ; ))
do
# echo Temperature and humidity is:
mdate="$(date +%Y-%m-%d\ %H:%M:%S)"
echo -n $mdate,
./dht22 1 | awk '{print $2,$5}'
sleep $SLEEP
done
}
function dht22_log {
# echo Logging DHT22 to file every $SLEEP seconds. >> $LOG
for (( ; ; ))
do
# echo Temperature and humidity is: >> $LOG
mdate="$(date +%Y-%m-%d\ %H:%M:%S)"
echo -n $mdate, >> $LOG1
./dht22 1 | awk '{print $2}' >> $LOG1
echo -n $mdate, >> $LOG2
./dht22 1 | awk '{print $5}' >> $LOG2
sleep $SLEEP
done
}
case $1 in
dht22_mon)
dht22_mon
;;
dht22_log)
dht22_log
;;
*)
echo ------------------------------------------------------------------
echo
echo DHT22 tool syntax.
echo The tool has two modes, monitor and log.
echo Monitor will print to screen and log will log to a file.
echo ------------------------------------------------------------------
echo -- Monitor Mode --
echo
echo To poll the DHT22 every 5 seconds the syntax would be:
echo "./sensor.sh dht22_mon 5"
echo ------------------------------------------------------------------
echo -- Log Mode --
echo Log mode accepts two variables the name of the sensor, polling time.
echo
echo To log the DHT22 every 5 seconds the syntax would be:
echo "./sensor.sh dht22_log 5 &"
echo ------------------------------------------------------------------
;;
esac
# END
Скачать файлы
Распакуйте скачанный архив в отдельную директорию в домашнем каталоге. Перейдите в этот каталог и запустите скрипт командой
./sensor1.sh dht22_mon 5
Если скрипт не запускается, дайте скрипту права на выполнение командой chmod +x sensor1.sh.
После запуска скрипта вы должны увидеть примерно следующее:
Первое число - влажность в процентах, второе - температура в градусах Цельсия. Проверьте запись лога командой
nohup ./sensor1.sh dht22_log 5 &
Скрипт запустится в фоновом режиме. Для остановки скрипта введите kill [идентификатор_процесса].
Для записи ваших показаний надо удалить из текстовых файлов dht22_temp.txt, dht22_humi.txt старые данные. Это удобно делать в редакторе mcedit - встроенном редакторе Midnight Commander (mc). Установите менеджер mc командой sudo apt install mc, перейдите в папку с данными и дайте команду, например, mcedit dht22_temp.txt. Чтобы посмотреть последнюю строчку данных (для проверки работы скрипта), нажмите Ctrl+End. Если файл большой и курсор находится в середине файла, то нажмите Ctrl+Home для перехода к началу файла. Поставьте курсор на первую строку данных, нажмите F3 и стрелку вниз. Строка будет выделена. Для ускорения процесса нажимайте Page Down. Дойдя до нужной даты, нажмите F8 (Удалить помеченный блок). Редактор выдаст сообщение о том, что блок слишком велик и восстановить его не удастся. Нажмите Продолжить. Блок будет удален. Для сохранения файла нажмите F2 и затем еще раз Сохранить. Редактор может выдать предупреждение - файл используется внешней программой, записать поверх? Нажмите Да. Для выхода из редактора нажмите два раза Esc.
Для построения графика можно использовать готовую библиотеку dygraph-combined-dev.js [7].
Для проверки скрипта использовал Raspberry Pi с уже установленным веб-сервером Apache. Для построения графика воспользовался материалами с ресурса [7]. Файлы скопируйте в папку /var/www/html.
Измените права на папку командами
sudo chown -R pi:pi /var/www/html
sudo chmod -R 755 /var/www/html
Файлы temp.html и dht22_temp.txt
На компьютере локальной сети в адресной строке браузера введите IP адрес Raspberry Pi и имя файла - temp.html или humi.html. Например, так:
192.168.1.28/temp.html
Если у вас есть доступ к Raspberry Pi через Samba, вы можете сразу открыть, например, temp.html или humi.html
Иногда при считывании показаний в файл данных записывается сбойное значение, которое может быть в несколько раз больше или меньше типовых значений. На графике это выглядит как пик или ломаная линия. Чтобы привести график к нормальному виду, удалите сбойное значение из файла данных. Как это сделать, описано в статье WebIOPi-0.7.1 и Raspberry Pi 3 - подключение датчика давления BMP180 .
Использованные источники и ресурсы.
1. Brendan Horan, Practical Raspberry Pi, Apress 2013 p.54-60
2. https://forum.odroid.com/viewtopic.php?p=94697#
3. http://wiringpi.com/download-and-install/
4. http://htmlbook.ru/html/div
5. https://losst.ru/komanda-echo-v-linux
6. http://wiki.ayac.ru/skripty/bash-dobavlenie-daty-v-vyvod-komandy
7. http://electromost.com/news/raspberry_pi_dlja_domashnej_avtomatizacii_grafiki_parametrov/2015-09-18-136
8. http://www.opennet.ru/docs/RUS/linux_base/node44.html
9. https://ru.wikipedia.org/wiki/Nohup
|