Датчик температуры и влажности DHT11Сейчас я для себя составлю небольшую заметку о том, как подключить датчик температуры и влажности (а именно DHT11) к миникомпьютеру Raspberry Pi 3 Model B (Raspbian Jessie). Особенность данного датчика в том, что он использует всего три ножки подключения: GND,DATA,VCC

Где:

GND земля
DATA данные
VCC  питание, 3.3V

в отличии от DHT22 (там 4), но и характеристики его более продвинутые. Но в целях ознакомления я пожалуй начну с первого датчика, выбирать не приходится. Работаю с тем что есть, а как пойму что это действительно мне нужно, то и будут покупать, но с одним условием не в России, т. к. у нас все дорого.

Наглядная схема подключения:

Схема подключения датчика DHT11 к Raspberry Pi 3

После того, как я его подключил проделываю ниже следующее с целью получения данных: температуры и влажности

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

Данные по датчику DHT11 через Python + Flask

 

Этот пример проще и понятнее, т. к. я задействовал библиотеку, а не самолично пишу код.

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

Еще один вывод данных датчика DHT11

 

Нажимая каждый раз клавишу 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 адрес будет меняться текущее показание.

Задача: Чтобы изменения были динамичны при обращении к 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.

От ekzorchik

Всем хорошего дня, меня зовут Александр. Я под ником - ekzorchik, являюсь автором всех написанных, разобранных заметок. Большинство вещей с которыми мне приходиться разбираться, как на работе, так и дома выложены на моем блоге в виде пошаговых инструкции. По сути блог - это шпаргалка онлайн. Каждая новая работа где мне случалось работать вносила новые знания и нюансы работы и соответственно я расписываю как сделать/решить ту или иную задачу. Это очень помогает. Когда сам разбираешь задачу, стараешься ее приподнести в виде структурированной заметки чтобы было все наглядно и просто, то процесс усвоения идет в гору. Также прошу на https://win.ekzorchik.ru https://lin.ekzorchik.ru https://net.ekzorchik.ru https://voip.ekzorchik.ru https;//home.ekzorchik.ru