Raspberry 3 GPIO DHT22(AM2301)

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Misko
Сообщения: 36
Зарегистрирован: Вс янв 14, 2018 5:57 pm
Благодарил (а): 17 раз
Поблагодарили: 0

Raspberry 3 GPIO DHT22(AM2301)

Сообщение Misko » Вс янв 14, 2018 6:12 pm

Здравствуйте, помогите подключить датчик DHT22 через GPIO.
Температуру и влажность показывает из консоли командой
sudo ./dht.py 2302 4
как и чем данные подтянуть в MD?
Спасибо
Аватара пользователя
VooDooN
Сообщения: 307
Зарегистрирован: Сб июн 11, 2016 12:02 am
Благодарил (а): 170 раз
Поблагодарили: 64 раза

Re: Raspberry 3 GPIO DHT22(AM2301)

Сообщение VooDooN » Вс янв 14, 2018 7:21 pm

Можно попробовать так:
1) Добавить в объект ThisComputer новое свойство типа TempFromDHT22.
2) В этом же объекте, добавить метод типа getTempFromDHT22.
3) Внутри вставить типа такой код:

Код: Выделить всё

$answer = shell_exec("sudo ./dht.py 2302 4");
//$answer - если ответ содержит много текста, то разобрать его с помощью регулярных выражений
$this->setProperty('TempFromDHT22', $answer);
4) В объекте onNewMinute добавить вызов метода

Код: Выделить всё

callMethod('ThisComputer.getTempFromDHT22');
5) Если все сработает, то в ThisComputer.TempFromDHT22 будут попадать данные с датчика.
Писал на скорую руку, может где-то накосячил. Через скрипты тоже можно это сделать. Есть разные способы

[Updated]
Про влажность забыл добавить. Для нее тоже отдельное свойство нужно сделать и в том же самом методе getTempFromDHT22 разбирать с помощью регулярных выражений ответ от shell_exec и записывать в разные свойства температуру и влажность.
За это сообщение автора VooDooN поблагодарил:
Misko (Вс янв 14, 2018 7:30 pm)
Рейтинг: 1.16%
Misko
Сообщения: 36
Зарегистрирован: Вс янв 14, 2018 5:57 pm
Благодарил (а): 17 раз
Поблагодарили: 0

Re: Raspberry 3 GPIO DHT22(AM2301)

Сообщение Misko » Вс янв 14, 2018 7:34 pm

VooDooN писал(а):Можно попробовать так:
1) Добавить в объект ThisComputer новое свойство типа TempFromDHT22.
2) В этом же объекте, добавить метод типа getTempFromDHT22.
3) Внутри вставить типа такой код:

Код: Выделить всё

$answer = shell_exec("sudo ./dht.py 2302 4");
//$answer - если ответ содержит много текста, то разобрать его с помощью регулярных выражений
$this->setProperty('TempFromDHT22', $answer);
4) В объекте onNewMinute добавить вызов метода

Код: Выделить всё

callMethod('ThisComputer.getTempFromDHT22');
5) Если все сработает, то в ThisComputer.TempFromDHT22 будут попадать данные с датчика.
Писал на скорую руку, может где-то накосячил. Через скрипты тоже можно это сделать. Есть разные способы

[Updated]
Про влажность забыл добавить. Для нее тоже отдельное свойство нужно сделать и в том же самом методе getTempFromDHT22 разбирать с помощью регулярных выражений ответ от shell_exec и записывать в разные свойства температуру и влажность.
при выполнении скрипта, выводятся такие данные
Temp=25.4* Humidity=34.7%
теоретически я могу их подправить убрать Temp= и Humidity
в каком формате лучше сделать ?
в php не силен поэтому прошу помощи
Аватара пользователя
VooDooN
Сообщения: 307
Зарегистрирован: Сб июн 11, 2016 12:02 am
Благодарил (а): 170 раз
Поблагодарили: 64 раза

Re: Raspberry 3 GPIO DHT22(AM2301)

Сообщение VooDooN » Вс янв 14, 2018 7:59 pm

Можно так (без различных проверок на ошибки):

Код: Выделить всё

$answer = shell_exec("sudo ./dht.py 2302 4");
$pattern = '(\d+\.*\d*)';
preg_match_all($pattern, $answer, $matches);

$this->setProperty('TempFromDHT22', $matches[0][0]);
$this->setProperty('HumFromDHT22', $matches[0][1]); 
Тогда температура будет попадать в ThisComputer.TempFromDHT22, а влажность в ThisComputer.HumFromDHT22.
За это сообщение автора VooDooN поблагодарил:
Misko (Пн янв 15, 2018 12:42 am)
Рейтинг: 1.16%
fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Raspberry 3 GPIO DHT22(AM2301)

Сообщение fandaymon » Вс янв 14, 2018 8:11 pm

Misko писал(а):
при выполнении скрипта, выводятся такие данные
Temp=25.4* Humidity=34.7%
теоретически я могу их подправить убрать Temp= и Humidity
в каком формате лучше сделать ?
в php не силен поэтому прошу помощи
Поскольку скрипт написан на питоне, то можно просто из самого скрипта отдавать параметры нужным объектам. Добавить в начало import urllib
и в том месте, где выводятся параметры принтом сделать

#print "Temp : ", temperature, "C"
link="http://127.0.0.1/objects/?op=set&object ... p=value&v=" + str(round(temperature,1))
f=urllib.urlopen(link)

#print "Humidity : ", humidity, "%"
link="http://127.0.0.1/objects/?op=set&object ... p=value&v=" + str(round(humidity))
f=urllib.urlopen(link)

В первом блоке, то что было в переменной temperature будет присваиваться температурному датчику TempSensor01 (создать в Мажордомо свой и подставить своё название)
Во втором блоке, то что было в переменной humidity будет присваиваться датчику HumSensor01

Далее поставить питоновский скрипт в крон для выполнения каждую минуту и в PHP разбираться не придётся...
За это сообщение автора fandaymon поблагодарил:
Misko (Пн янв 15, 2018 12:47 am)
Рейтинг: 1.16%
Misko
Сообщения: 36
Зарегистрирован: Вс янв 14, 2018 5:57 pm
Благодарил (а): 17 раз
Поблагодарили: 0

Re: Raspberry 3 GPIO DHT22(AM2301)

Сообщение Misko » Пн янв 15, 2018 12:46 am

VooDooN писал(а):Можно так (без различных проверок на ошибки):

Код: Выделить всё

$answer = shell_exec("sudo ./dht.py 2302 4");
$pattern = '(\d+\.*\d*)';
preg_match_all($pattern, $answer, $matches);

$this->setProperty('TempFromDHT22', $matches[0][0]);
$this->setProperty('HumFromDHT22', $matches[0][1]);
Тогда температура будет попадать в ThisComputer.TempFromDHT22, а влажность в ThisComputer.HumFromDHT22.
не выходит каменный цветок, не пойму в чем проблема, попроовал другой способ, добавил в onNewMinute

Код: Выделить всё

$answer = shell_exec("sudo ./dht.py 2302 4");
$pattern = '(\d+\.*\d*)';
preg_match_all($pattern, $answer, $matches);
//$this->setProperty('TempFromDHT22', $matches[0][0]);
//$this->setProperty('HumFromDHT22', $matches[0][1]); 
setGlobal("ThisComputer.TempFromDHT22",$matches[0][0]);
setGlobal("ThisComputer.HumFromDHT22",$matches[0][1]); 
тоже не работал, так же пробовал выводить без текста показания только температуры, но так же получается 0.
полагаю, показания показываются не сразу при выполнении скрипта, а от 3-10 секунд, мне кажется тут и затык.
как закончить собирать показания после ожидания ?
Misko
Сообщения: 36
Зарегистрирован: Вс янв 14, 2018 5:57 pm
Благодарил (а): 17 раз
Поблагодарили: 0

Re: Raspberry 3 GPIO DHT22(AM2301)

Сообщение Misko » Пн янв 15, 2018 12:48 am

fandaymon писал(а):
Misko писал(а):
при выполнении скрипта, выводятся такие данные
Temp=25.4* Humidity=34.7%
теоретически я могу их подправить убрать Temp= и Humidity
в каком формате лучше сделать ?
в php не силен поэтому прошу помощи
Поскольку скрипт написан на питоне, то можно просто из самого скрипта отдавать параметры нужным объектам. Добавить в начало import urllib
и в том месте, где выводятся параметры принтом сделать

#print "Temp : ", temperature, "C"
link="http://127.0.0.1/objects/?op=set&object ... p=value&v=" + str(round(temperature,1))
f=urllib.urlopen(link)

#print "Humidity : ", humidity, "%"
link="http://127.0.0.1/objects/?op=set&object ... p=value&v=" + str(round(humidity))
f=urllib.urlopen(link)

В первом блоке, то что было в переменной temperature будет присваиваться температурному датчику TempSensor01 (создать в Мажордомо свой и подставить своё название)
Во втором блоке, то что было в переменной humidity будет присваиваться датчику HumSensor01

Далее поставить питоновский скрипт в крон для выполнения каждую минуту и в PHP разбираться не придётся...
здравствуйте вот текст вывода, куда вставлять ваш код ?

Код: Выделить всё

if humidity is not None and temperature is not None:
   print('Temp={0:0.1f}*  Humidity={1:0.1f}%'.format(temperature, humidity))
else:
    print('Failed to get reading. Try again!')
    sys.exit(1)
 
fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Raspberry 3 GPIO DHT22(AM2301)

Сообщение fandaymon » Пн янв 15, 2018 1:45 am

Код: Выделить всё

if humidity is not None and temperature is not None:
  # print('Temp={0:0.1f}*  Humidity={1:0.1f}%'.format(temperature, humidity))
  link="http://127.0.0.1/objects/?op=set&object=TempSensor01&p=value&v=" + str(round(temperature,1))
  f=urllib.urlopen(link)
  link="http://127.0.0.1/objects/?op=set&object=HumSensor01&p=value&v=" + str(round(humidity))
  f=urllib.urlopen(link)
else:
    print('Failed to get reading. Try again!')
    sys.exit(1)
В Мажордомо должен быть датчик температуры TempSensor01 и датчик влажности HumSensor01. Конечно никто не мешает обозвать их по другому и поменять в тексте программы на свои названия
За это сообщение автора fandaymon поблагодарили (всего 2):
Misko (Пн янв 15, 2018 10:33 am) • Yashalta (Вс фев 17, 2019 11:39 am)
Рейтинг: 2.33%
Misko
Сообщения: 36
Зарегистрирован: Вс янв 14, 2018 5:57 pm
Благодарил (а): 17 раз
Поблагодарили: 0

Re: Raspberry 3 GPIO DHT22(AM2301)

Сообщение Misko » Пн янв 15, 2018 10:35 am

fandaymon писал(а):

Код: Выделить всё

if humidity is not None and temperature is not None:
  # print('Temp={0:0.1f}*  Humidity={1:0.1f}%'.format(temperature, humidity))
  link="http://127.0.0.1/objects/?op=set&object=TempSensor01&p=value&v=" + str(round(temperature,1))
  f=urllib.urlopen(link)
  link="http://127.0.0.1/objects/?op=set&object=HumSensor01&p=value&v=" + str(round(humidity))
  f=urllib.urlopen(link)
else:
    print('Failed to get reading. Try again!')
    sys.exit(1)
 
В Мажордомо должен быть датчик температуры TempSensor01 и датчик влажности HumSensor01. Конечно никто не мешает обозвать их по другому и поменять в тексте программы на свои названия
Добавил датчик в объект ThisComputer.TempSensor01 и ThisComputer.HumSensor01 выполню скрипт данные не появляются.
Куда копать дальше может стоит сразу передавать {0:0.1f} - температура и {1:0.1f} - влажность ?
Misko
Сообщения: 36
Зарегистрирован: Вс янв 14, 2018 5:57 pm
Благодарил (а): 17 раз
Поблагодарили: 0

Re: Raspberry 3 GPIO DHT22(AM2301)

Сообщение Misko » Пн янв 15, 2018 10:45 am

fandaymon, О заработало! Благодарствую!
Ответить