Сейчас я для себя составлю небольшую заметку о том, как подключить датчик температуры и влажности (а именно DHT11) к миникомпьютеру Raspberry Pi 3 Model B (Raspbian Jessie). Особенность данного датчика в том, что он использует всего три ножки подключения: GND,DATA,VCC
Где:
GND | земля |
DATA | данные |
VCC | питание, 3.3V |
в отличии от DHT22 (там 4), но и характеристики его более продвинутые. Но в целях ознакомления я пожалуй начну с первого датчика, выбирать не приходится. Работаю с тем что есть, а как пойму что это действительно мне нужно, то и будут покупать, но с одним условием не в России, т. к. у нас все дорого.
Наглядная схема подключения:
После того, как я его подключил проделываю ниже следующее с целью получения данных: температуры и влажности
pi@raspberrypi:~ $ sudo apt-get install build-essential python-dev python-openssl -y
pi@raspberrypi:~ $ git clone https://github.com/adafruit/Adafruit_Python_DHT.git
Cloning into 'Adafruit_Python_DHT'...
remote: Counting objects: 249, done.
remote: Total 249 (delta 0), reused 0 (delta 0), pack-reused 249
Receiving objects: 100% (249/249), 77.00 KiB | 0 bytes/s, done.
Resolving deltas: 100% (142/142), done.
pi@raspberrypi:~ $ cd Adafruit_Python_DHT/
pi@raspberrypi:~/Adafruit_Python_DHT $ sudo python setup.py install
pi@raspberrypi:~/Adafruit_Python_DHT $ sudo examples/AdafruitDHT.py 11 7
Failed to get reading. Try again!
pi@raspberrypi:~/Adafruit_Python_DHT $ sudo examples/AdafruitDHT.py 11 4
Temp=25.0* Humidity=18.0%
pi@raspberrypi:~ $ sudo Adafruit_Python_DHT/examples/AdafruitDHT.py 11 4
Temp=21.0* Humidity=22.0%
- где 4 – это GPIO4 на плате Raspberry Pi 3 Model B
Как видно все достаточно просто. Вот еще одна задумка, кстати у меня так всегда, когда я что-то разобрался, то начинаю придумывать самому себе задачки с интересуемым/изучаемым материалом дабы лучше понять.
Задача: Вывести в браузере значения температуры и влажности, а в качестве Web–сервиса задействовать технологию Flask. (связка Python + Flask)
pi@raspberrypi:~ vi temp
#!/usr/bin/env python
import Adafruit_DHT
from flask import Flask,render_template,request
app = Flask(__name__)
sensor = Adafruit_DHT.DHT11
pin = '4'
@app.route("/temp")
def temp():
humidity,temperature = Adafruit_DHT.read_retry(sensor, pin)
templateData = {
'temperature' : temperature,
'humidity' : humidity
}
return render_template('main.html',**templateData)
if __name__ == "__main__":
app.run(host='0.0.0.0',port=80)
pi@raspberrypi:~ $ chmod +x temp
pi@raspberrypi:~ $ mkdir templates
pi@raspberrypi:~ $ vi templates/main.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
<title>HomeAutomation</title>
</head>
<body>
<table class="table table-bordered">
<thead>
<tr class="active">
<th class="text-center">Температура</th>
<th class="text-center">Влажность</th>
</tr>
</thead>
<tbody>
<tr class="text-center">
<td class="info">{{ temperature|int }}°C</td>
<td class="{% if humidity > 50.0 %}danger{% elif (humidity > 40.0) and (humidity < 50.0) %}warning{% else %}success{% endif %}">
{{ humidity|int }}%
</td>
</tr>
</tbody>
</table>
</body>
</html>
pi@raspberrypi:~ $ sudo ./temp
Этот пример проще и понятнее, т. к. я задействовал библиотеку, а не самолично пишу код.
pi@raspberrypi:~ $ nano main.py
#!/usr/bin/python
from flask import Flask, render_template, redirect, request, current_app
app = Flask(__name__)
from functools import wraps
import json
from Adafruit_DHT import DHT11, read_retry
sensor = DHT11
pin = 4
def support_jsonp(f):
"""Wraps JSONified output for JSONP"""
@wraps(f)
def decorated_function(*args, **kwargs):
callback = request.args.get("callback", False)
if callback:
content = str(callback) + "(" + str(f(*args,**kwargs)) + ")"
return current_app.response_class(content, mimetype="application/javascript")
else:
return f(*args, **kwargs)
return decorated_function
@app.route("/")
def hello():
hum, temp = raw_dht()
return render_template('index.html', humidity = hum, temperature = temp)
@app.route("/dht")
@support_jsonp
def api_dht():
humidity, temperature = raw_dht()
if humidity is not None and temperature is not None:
return "{ temperature: '" + "{0:0.0f}".format(temperature) + "', humidity: '" + "{0:0.0f}".format(humidity) + "' }"
else:
return "Failed to get reading. Try again!", 500
def raw_dht():
return read_retry(sensor, pin)
if __name__ == "__main__":
app.run(host = '0.0.0.0', debug = True, port = 80)
pi@raspberrypi:~ $ nano index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
<title>HomeAutomation</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-sm-3 col-sm-offset-4">
<table class="table table-bordered">
<thead>
<tr class="active">
<th class="text-center">Temperatur</th>
<th class="text-center">Luftfeuchte</th>
</tr>
</thead>
<tbody>
<tr class="text-center">
<td class="info">{{ temperature|int }}°C</td>
<td class="{% if humidity > 50.0 %}danger{% elif (humidity > 40.0) and (humidity < 50.0) %}warning{% else %}success{% endif %}">
{{ humidity|int }}%
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
pi@raspberrypi:~ $ sudo ./main.py
Нажимая каждый раз клавишу F5 и обновляются текущие значения температуры и влажности.
Либо же с использованием библиотеки код будет:
pi@raspberrypi:~ $ nano temp
#!/usr/bin/python
import Adafruit_DHT
sensor = Adafruit_DHT.DHT11
pin = '4'
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
print('Temp={0:0.1f}*C Humidity={1:0.1f}%'.format(temperature, humidity))
else:
print('Failed to get reading. Try again!')
pi@raspberrypi:~ $ ./temp
Temp=24.0*C Humidity=35.0%
Задача: вывести на Web–страницу отдельно показания температуры и отдельно показания влажности.
#!/usr/bin/python
import Adafruit_DHT
In [5]: sensor = Adafruit_DHT.DHT11
In [10]: pin = '4
In [23]: humidity,temperature = Adafruit_DHT.read_retry(sensor,pin)
In [25]: print('Temp={0:0.1f}*C'.format(temperature, humidity))
Temp=24.0*C
разбиваем считываемые значения по переменным которые указываются
в файле main.html
templateData = {
'temperature' : temperature,
'humidity' : humidity
}
return render_tempate('main.html',**templateData)
У меня ошибка при запуске скрипта python:
NameError: global name 'render_tempate' is not defined
нашел ошибку, некорректно была написана функция render_template
return render_template('main.html',**templateData)
Задача: на каждый URL разделить значение температуры и влажности
т. е. http://IP&DNS/temp & http://IP&DNS/hum
были разделены
#!/usr/bin/python
import Adafruit_DHT
from flask import Flask,render_template,request
app = Flask(__name__)
sensor = Adafruit_DHT.DHT11
pin = '4'
@app.route("/temp")
def temp():
humidity,temperature = Adafruit_DHT.read_retry(sensor, pin)
templateData = {
'temperature' : temperature
}
return render_template('temp.html',**templateData)
@app.route("/hum")
def humi():
humidity,temperature = Adafruit_DHT.read_retry(sensor, pin)
templateData = {
'humidity' : humidity
}
return render_template('hum.html',**templateData)
if __name__ == "__main__":
app.run(host='0.0.0.0',port=80)
pi@raspberrypi:~ $ nano templates/temp.html
pi@raspberrypi:~ $ cp templates/temp.html templates/hum.html
в одном файле
<tr class="text-center">
<td class="info">{{ temperature|int }}°C</td>
</tr>
а в другом
<tr class="text-center">
<td class="info">{{ humidity|int }}°C</td>
</tr>
Итого:
Отлично, теперь при каждом обращении на свой URL адрес будет меняться текущее показание.
Задача: Чтобы изменения были динамичны при обращении к URL адрес, как temp так и hum
pi@raspberrypi:~ $ wget http://justgage.com/download/justgage-1.2.2.zip
pi@raspberrypi:~ $ unzip justgage-1.2.2.zip
pi@raspberrypi:~ $ mkdir static
pi@raspberrypi:~ $ cp justgage-1.2.2/*.js static/
Код для работы нужно вставлять в файл *.html
pi@raspberrypi:~ $ nano templates/temp.html
<body>
<div class="wrapper clear">
<div id="g1" class="gauge"></div>
</div>
<script src="{{ url_for('static', filename='raphael-2.1.4.min.js') }}"></script>
<script src="{{ url_for('static', filename='justgage.js') }}"></script>
<script>
document.addEventListener("DOMContentLoaded", function(event) {
var g1;
var g1 = new JustGage({
id: "g1",
value: {{temperature}},
min: 0,
max: 50,
title: "Temperature",
});
});
</script>
</body>
Итак первый кирпичек в знаниях по использованию датчика температуры и влажности заложен. От этой заметки будут отходить и другие как впрочем и от всех моих моего блога. Ведь я пишу и рассматриваю только то что действительно практично и сам использую. Пока на этом я попрощаюсь, с уважением автор блога Олло Александр aka ekzorchik.