Несколько датчиков DHT12 к одной ардуине

justMike
Offline
Зарегистрирован: 05.11.2014

Добрый день! Возникла необходимость собирать данные с 7 датчиков температуры и влажности DHT12, которые опрашиваются по i2c. Как решить задачу, учитывая, что адреса всех датчиков одинаковые?

rkit
Offline
Зарегистрирован: 23.11.2016

Нет никакого практического смысла ставить 7 таких датчиков в радиусе одной шины i2c. Ты влажность в каждом ящике стола измерять собрался, что ли?

sadman41
Offline
Зарегистрирован: 19.10.2016

см. SoftwareWire, например.

Хотя, как мне помнится, подобные датчики от AOSONG переключаются в режим OneWire (не далласовский) и опрашиваются как стандартные DHT-шки с той же точностью.

b707
Онлайн
Зарегистрирован: 26.05.2017

justMike пишет:
Добрый день! Возникла необходимость собирать данные с 7 датчиков температуры и влажности DHT12, которые опрашиваются по i2c. Как решить задачу, учитывая, что адреса всех датчиков одинаковые?

мультиплексор I2C

justMike
Offline
Зарегистрирован: 05.11.2014

Мне необходимо мониторить влажность в 7 ульях. Я тоже думаю про SofrwareWire, только не могу найти, как опросить датчик DHT12 функциями стандартной библиотеки Wire, на базе которой написана SofrwareWire. Есть у кого примеры работы с DHT12 через библиотеку Wire?

sadman41
Offline
Зарегистрирован: 19.10.2016

Я бы вам советовал по ульям I2C не раскидывать, а пойти стандартным для DHT путем. Зачем лишний пин занимать?

b707
Онлайн
Зарегистрирован: 26.05.2017

justMike пишет:
не могу найти, как опросить датчик DHT12 функциями стандартной библиотеки Wire, на базе которой написана SofrwareWire. Есть у кого примеры работы с DHT12 через библиотеку Wire?

что-то вы сами себе противоречите. Сначала пишете, что у вас датчики подключены по I2C, теперь - что не знаете, как их подключить через Wire.

Может вы не в курсе, что I2C и Wire - это одно и то же?

rkit
Offline
Зарегистрирован: 23.11.2016

justMike пишет:
Мне необходимо мониторить влажность в 7 ульях

И все 7 ульев в радиусе 3х метров?

justMike
Offline
Зарегистрирован: 05.11.2014

Дело в том, что я пробовал подключать по протоколу 1-Wire, подключая по схеме на рисунке: 

 

К сожалению, опросить по протоколу 1-Wire у меня не получилось. Зато получилось опросить по I2C

b707
Онлайн
Зарегистрирован: 26.05.2017

justMike пишет:

К сожалению, опросить по протоколу 1-Wire у меня не получилось. Зато получилось опросить по I2C

потому что Wire и 1-Wire - это разные протоколы

justMike
Offline
Зарегистрирован: 05.11.2014

b707 пишет:

что-то вы сами себе противоречите. Сначала пишете, что у вас датчики подключены по I2C, теперь - что не знаете, как их подключить через Wire.

Может вы не в курсе, что I2C и Wire - это одно и то же?

Не знаю, как их подключить, используя библиотеку Wire. 

Данная библиотека позволяет Ардуино взаимодействовать с различными устройствами по интерфейсу I2C / TWI.

 

justMike
Offline
Зарегистрирован: 05.11.2014

rkit пишет:

justMike пишет:
Мне необходимо мониторить влажность в 7 ульях

И все 7 ульев в радиусе 3х метров?

Вообще в радиусе 10 метров. На этом расстоянии может не работать? Если да, то почему?

sadman41
Offline
Зарегистрирован: 19.10.2016

https://robototehnika.ru/file/DHT12.pdf страница 10, подключение по One Wire \ Single bus

А, ну я вижу, что такая же схема. Тогда должно работать, DHT нет смысла подделывать. Ищите неконтакт или ошибку в коде. Возможно, что слишком быстро опрашиваете или библиотека не для той модели сенсора.

justMike
Offline
Зарегистрирован: 05.11.2014

sadman41 пишет:
https://robototehnika.ru/file/DHT12.pdf страница 10, подключение по One Wire \ Single bus А, ну я вижу, что такая же схема. Тогда должно работать, DHT нет смысла подделывать. Ищите неконтакт или ошибку в коде. Возможно, что слишком быстро опрашиваете или библиотека не для той модели сенсора.

Не знаю, что я делал не так, но что-то делал не так. Попробовал повторно подключить и опросить - и все получилось! Отсюда 2 вопроса: что дает более надежное подключение - 1Wire или I2C? И как подключать несколько устройств 1Wire с одинаковым адресом?

 

b707
Онлайн
Зарегистрирован: 26.05.2017

justMike пишет:

 как подключать несколько устройств 1Wire с одинаковым адресом?

так не бывает, у каждого устройства 1Wire уникальный адрес.

Кроме того, устройства можно опрашивать и последовательно, без учета адресов, только тогда вы не сможете лпределить, где какой датчик.

justMike
Offline
Зарегистрирован: 05.11.2014

Хочу все-таки попробовать опросить несколько датчиков по i2c. Вы мне можете помочь кодом с помощью библиотеки Wire?

 

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

justMike пишет:

 как подключать несколько устройств 1Wire с одинаковым адресом?

так не бывает, у каждого устройства 1Wire уникальный адрес.


Это не далласовский 1Wire, а аосонговский One Wire. Он без адресации, просто данные по одному проводу валят.

sadman41
Offline
Зарегистрирован: 19.10.2016

justMike пишет:

Хочу все-таки попробовать опросить несколько датчиков по i2c. Вы мне можете помочь кодом с помощью библиотеки Wire?

 


https://github.com/xreef/DHT12_sensor_library

b707
Онлайн
Зарегистрирован: 26.05.2017

sadman41][quote=b707 пишет:

Это не далласовский 1Wire, а аосонговский One Wire. Он без адресации, просто данные по одному проводу валят.

наплодили названий одинаковых...

А как оно отличает один датчик от другого?

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

А как оно отличает один датчик от другого?

Никак. Один датчик - один провод - один пин контроллера.

justMike
Offline
Зарегистрирован: 05.11.2014

sadman41 пишет:
justMike пишет:

Хочу все-таки попробовать опросить несколько датчиков по i2c. Вы мне можете помочь кодом с помощью библиотеки Wire?

 

https://github.com/xreef/DHT12_sensor_library

Я работаю с этой библиотекой, ей все опрашивается. Но мне нужно сделать опрос нескольких датчиков через SoftwareWire, которая сделана на основе стандартной библиотеки Wire. Соответственно мне надо опросить датчик через функции стандартной библиотеки Wire, чтобы портировать примененное решение на функции библиотеки SoftwareWire. Это у меня не получается сделать даже на основе примеров самой библиотеки Wire. Какова последовательность действий? Сколько байт читать и в каком формате выводить? Я не могу понять.

b707
Онлайн
Зарегистрирован: 26.05.2017

justMike пишет:

Хочу все-таки попробовать опросить несколько датчиков по i2c. Вы мне можете помочь кодом с помощью библиотеки Wire?

 

еще раз соверую - купите мультиплексор за 2.5 бакса:

https://aliexpress.ru/item/32996774174.html

justMike
Offline
Зарегистрирован: 05.11.2014

b707 пишет:

еще раз соверую - купите мультиплексор за 2.5 бакса:

https://aliexpress.ru/item/32996774174.html

Спасибо за совет! Я его уже заказал, но когда он придет, не было бы уже поздно. Если будут соображения по i2c, я был бы признателен

sadman41
Offline
Зарегистрирован: 19.10.2016

SoftwareWire не базируется на Wire, она работает сама по себе. Т.е. напрямую не удастся библиотеку так заюзать... Треба перепиливать ее или вручную писать код работы с датчиком.

Где-то у меня 2320 был, можно потыркать.

b707
Онлайн
Зарегистрирован: 26.05.2017

justMike пишет:

 Если будут соображения по i2c, я был бы признателен

соображение такое - SoftwareWire точно так же не умеет работать с несколькими датчиками с одним адресом на одной шине, как и аппаратное I2C. То есть единственный вариант это поднимать 7 отдельных SoftwareWire на 7 пинах, а это такие костыли...

Если уж занимать 7 пинов - куда как проще, ИМХО, подключить датчики по One Wire - как пишет Садман - каждый на отдельный пин

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Не, там можно извращнуться без семи инстансов.

justMike
Offline
Зарегистрирован: 05.11.2014

b707 пишет:

justMike пишет:

 Если будут соображения по i2c, я был бы признателен

соображение такое - SoftwareWire точно так же не умеет работать с несколькими датчиками с одним адресом на одной шине, как и аппаратное I2C. То есть единственный вариант это поднимать 7 отдельных SoftwareWire на 7 пинах, а это такие костыли...

Если уж занимать 7 пинов - куда как проще, ИМХО, подключить датчики по One Wire - как пишет Садман - каждый на отдельный пин

 

 

Я хочу попробовать поднять 7 SofrwareWire и занять 14 пинов (все равно они больше ни для чего не нужны), только даже опросить 1 датчик библиотекой Wire не получается - или я неправильно изменяю скетч примера, или что-то ещё, но значения с датчика прочитать не могу. Завтра приведу код, может, подскажете, что я делаю не так.
Всем спасибо за участие и ответы! Очень вам благодарен!

b707
Онлайн
Зарегистрирован: 26.05.2017

sadman41 пишет:
Не, там можно извращнуться без семи инстансов.

каким образом? - если не в лом :)

sadman41
Offline
Зарегистрирован: 19.10.2016

Вобщем, для моего AM2320 и SoftwareWire упрощенный скетч (без проверок CRC и пр.) таков:

#include <SoftwareWire.h>

const uint8_t deviceAddressI2C = 0x5C;

uint8_t readEnvironmentData(const uint8_t _sdaPin, const uint8_t _sclPin, float& _humidity, float& _temperature) {
  uint8_t rawData[8], rc = false;
  SoftwareWire softWire(_sdaPin, _sclPin);
  softWire.begin();
  // **** for AM2320 ****
  // Wake Up sensor
  softWire.beginTransmission(deviceAddressI2C);
  softWire.endTransmission();
  delayMicroseconds(1000);

  softWire.beginTransmission(deviceAddressI2C);
  // Reading Register Data command
  softWire.write((uint8_t)0x03);
  // Register No
  softWire.write((uint8_t)0x00);
  // How much bytes need
  softWire.write((uint8_t)0x04);
  softWire.endTransmission();
  softWire.requestFrom(deviceAddressI2C, sizeof(rawData));
  Serial.println(softWire.available());
  if (sizeof(rawData) != softWire.available()) {
    goto finish;
  }
  for (uint8_t i = 0x00; sizeof(rawData) > i; i++) {
    rawData[i] = softWire.read();
  }
  _humidity = (rawData[0x02] * 256 + rawData[0x03]) * 0.1;
  _temperature = ((rawData[0x04] & 0x7F) * 256 + rawData[0x05]) * 0.1;
  if (rawData[0x04] & 0x80) {
    _temperature = -_temperature;
  }
  // **** for DHT12 ****
  /*
    softWire.beginTransmission(deviceAddressI2C);
    softWire.write((uint8_t)0x00);
    softWire.requestFrom(deviceAddressI2C, (uint8_t) 0x05);
    delay(1);
    for (uint8_t i = 0; i < 0x05; ++i) {
      rawData[i] = softWire.read();
    }
    _humidity = (rawData[0] + (float) rawData[1] / 10);
    uint8_t scaleValue = rawData[3] & B01111111;
    uint8_t signValue  = rawData[3] & B10000000;

    _temperature = (rawData[2] + (float) scaleValue / 10);// ((rawData[2] & 0x7F)*256 + rawData[3]);
    if (signValue) {  // negative temperature
      _temperature = -_temperature;
    }
    // *************
  */
  rc = true;
finish:
  softWire.~SoftwareWire();
  return rc;
}

void setup() {
  float humidity = 0.00, temperature = 0.00;

  Serial.begin(115200);
  Serial.println("\nAM2320");
  // Use any pair of pins (except A6/A7)
  readEnvironmentData(A3, A2, humidity, temperature);

  Serial.print("humidity: "); Serial.println(humidity);
  Serial.print("temperature: "); Serial.println(temperature);
}

void loop() {}

Для DHT12 я кусок с той библиотеки дернул, но как он будет работать - ХЗ. Проверить не на чем.

P.S. Скетчем "I2C сканер" датчик не показывается, но работает.

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

sadman41 пишет:
Не, там можно извращнуться без семи инстансов.

каким образом? - если не в лом :)

Ну вот, выше скретчик - там изобрАжено.

b707
Онлайн
Зарегистрирован: 26.05.2017

sadman41 пишет:

Ну вот, выше скретчик - там изобрАжено.

что-то, Гриш, я не въезжаю. Ты обращаешься к датчику самым обычным образом, через deviceI2Caddress. Но если у ТС 7 датчиков с одним и тем же адресом - как ты разберешься, какой тебе ответил?

Или когда ты говорил, что можно обойтись без семи инстансов - ты имел в виду только экземпляры класса. а датчики все равно надо вешать каждый на свою шину?

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

Или когда ты говорил, что можно обойтись без семи инстансов - ты имел в виду только экземпляры класса. а датчики все равно надо вешать каждый на свою шину?


Именно так. Под каждый датчик свою пару ног (иначе не выйдет), но семь экземпляров класса нет нужды создавать.

Я себе вообще замоддил библиотеку и ноги без вызова деструктора на ходу меняю, но в данном случае проще так проиллюстрировать.

Я ещё вот чего подумал. Ежели они одновременно не работают, сенсоры эти, то ведь можно попытаться их подключить "внахлёст" - SDA одного и SCL другого на один пин.

justMike
Offline
Зарегистрирован: 05.11.2014

Добрый день! Решил задачу подключением датчиков Am2320 по 1 поводу данных (3 и 4 ноги соединил с землёй). В тестовых условиях успешно работает 7 датчиков в течение 2 недель. Посмотрим, как будет все работать в полевых условиях.
Также хочу добавить, что данные датчики опрашиваются библиотекой для DHT22, что оказалось очень удобно.

tot_samiy_user
Offline
Зарегистрирован: 23.11.2020

Здравствуйте, столкунлся с аналогичной, нужно подключить 5 датчиков AHT10 для измерения влажности но вот адреса у них у всех 0x38. Я в этом деле новенький так что ещё мало чего понимаю. Если не трудно оставьте свой контакт что-бы можно было лично пообщаться, заранее благодарен.