2 X BH1750FVI -> 1 X Arduino

fusic
Offline
Зарегистрирован: 08.02.2017

Помогите подключить 2 датчика освещенности BH1750FVI к одной ардуине.

Про адреса 0х23 и 0х5С знаю.

Как программно с двух читать ?

fusic
Offline
Зарегистрирован: 08.02.2017

 

ап

Волшебник
Offline
Зарегистрирован: 22.12.2016

Они разные бывают, те где адрес менять можно, и где нельзя - пина нету. Для вторых, я бы использовал софтверный I2C, библа есть -погуглите. Тогда цепляете на рзные шины, и проблемы с адресом не существует

fusic
Offline
Зарегистрирован: 08.02.2017

у меня как раз с пином для смены адресса

пример скетча для чтения одного датчика тож есть

не соображу как с двух читать поочереди изменяя состояние этих пинов

Волшебник
Offline
Зарегистрирован: 22.12.2016

Тогда на пин адреса одного сенсор вы подключаете +3.3В , а на пин адреса другого - 0В, т.е. Gnd.

Какой библиотекой пользуетесь? 

fusic
Offline
Зарегистрирован: 08.02.2017

библиотект wire.h и bh1750.h

Волшебник
Offline
Зарегистрирован: 22.12.2016

Вот нашёл для вас другую библиотеку, специально для двух датчиков. Сам не проверял, у меня датчики без адреса.

https://github.com/Genotronex/BH1750FVI_Master         https://github.com/Genotronex/BH1750FVI_Master

fusic
Offline
Зарегистрирован: 08.02.2017

во во эти и используются

наверно невозможно два датчика через один порт читать потому что вот такой конструктор в строке 04 задает адрес устройства (пустые скобки по умолчанию 0х23). Задать другой адресс в том же скетче не удается.

 

#include <Wire.h>
#include <BH1750.h>

BH1750 lightMeter;

void setup(){

  Serial.begin(9600);
  lightMeter.begin();
  Serial.println(F("BH1750 Test"));

}


void loop() {

  uint16_t lux = lightMeter.readLightLevel();
  Serial.print("Light: ");
  Serial.print(lux);
  Serial.println(" lx");
  delay(1000);

}

 

fusic
Offline
Зарегистрирован: 08.02.2017

пробовал вот так. всегда дает 65535

что не так ??

 


#include <Wire.h>
#include <BH1750.h>

void setup(){

  Serial.begin(9600);
  Serial.println(F("BH1750 Test"));
}

void loop() {
  uint16_t lux ;
  Wire.beginTransmission(0x23);
  Wire.requestFrom(0x23, 2);
  lux = Wire.read();
  Wire.endTransmission(0x23);

  Serial.print("Light: ");
  Serial.print(lux);
  Serial.println(" lx");
  delay(500);
 
}

 

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

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

Во-первых нужно учитывать, что у этого датчика есть несколько режимов замера. От них зависит время конвертации (замера).

// No active state
#define BH1750_CMD_POWERDOWN                                    0x00
// Wating for measurment command
#define BH1750_CMD_POWERON                                      0x01
// Reset data register value - not accepted in POWER_DOWN mode
#define BH1750_CMD_RESET                                        0x07

// Start measurement at 1 lux resolution. Measurement time is approx 120ms.
#define BH1750_CONTINUOUS_HIGHRES                               0x10
// Start measurement at 0.5 lux resolution. Measurement time is approx 120ms.
#define BH1750_CONTINUOUS_HIGHRES_2                             0x11
// Start measurement at 4 lux resolution. Measurement time is approx 16ms.
#define BH1750_CONTINUOUS_LOWRES                                0x13
// Start measurement at 1 lux resolution. Measurement time is approx 120ms.
// Device is automatically set to Power Down after measurement.
#define BH1750_ONETIME_HIGHRES                                  0x20
// Start measurement at 0.5 lux resolution. Measurement time is approx 120ms.
// Device is automatically set to Power Down after measurement.
#define BH1750_ONETIME_HIGHRES_2                                0x21
// Start measurement at 4 lux resolution. Measurement time is approx 16ms.
// Device is automatically set to Power Down after measurement.
#define BH1750_ONETIME_LOWRES                                   0x23

Это время нужно будет выжидать после подачи команды на конвертацию в том случае, если вы выбираете однократный (*ONETIME*) замер (для экономии энергии, например). Имейте в виду, что датчик при чтении выдает результаты предыдущего замера. Таким образом, если замеры проводятся редко, необходимо будет провести две операции замера подряд для получения актуальных данных. Результаты первого - в /dev/null, второго можно использовать. 

Если же экономить - не ваш стиль, то выбирайте режим продолжающегося замера (*CONTINUOUS*). В этом случае датчик будет производить замер за замером самостоятельно, а при считывании выдаст более-менее актуальный результат.

Итак, для определенности выберем mode = BH1750_CONTINUOUS_LOWRES

  uint8_t  i2cAddress, mode;
  uint16_t  level
   ....

   // _i2cAddress - адрес одного из двух датчиков
  Wire.beginTransmission(i2cAddress);
  // Датчик нужно разбудить (активировать) один раз при продолжающемся замере и каждый раз при одиночных.
  Wire.write(BH1750_CMD_POWERON);
  Wire.endTransmission(true);
  delay(10);

  // "Запись в дачик" идентификатора режима запускает конвертацию (замер) 
  Wire.beginTransmission(i2cAddress); 
  Wire.write(mode); 
  Wire.endTransmission();

  // При необходимости ожидания конца замера (например перед повторным) - необходимо выждать определенное количество миллисекунд 
  // которое зависит от выбранного режима 180ms для H-resolution, 24ms для L-resolution 
  // Если датчик уже работает более 2-х периодов замера подряд (напр. 500мс) в режиме постоянного замера, то ждать нет необходимости. 
  // delay(setModeTimeout);

  // Теперь можно читать с него __два__ байта.
  Wire.beginTransmission(i2cAddress);
  Wire.requestFrom(i2cAddress, (uint8_t) 2);
  level = Wire.read();
  level <<= 8;
  level |= Wire.read();
  Wire.endTransmission(true);

  // result содержит значение уровня освещенности в условных единицах, а не lux-ах, перевод осуществляется по следующей формуле:
  // lux = level / 1.2;

   Вот, в принципе и вся работа с 1750.

   Далее определяйтесь с режимом замера, делайте двойное считывание при одинарном замере или задержку после первого переключения в режим продолжающегося замера, а потом читайте без пауз.  Результат можете вычислять любым доступным способом - через деление во float переменную или как-то иначе.

Волшебник
Offline
Зарегистрирован: 22.12.2016

fusic пишет:

во во эти и используются

наверно невозможно два датчика через один порт читать потому что вот такой конструктор в строке 04 задает адрес устройства (пустые скобки по умолчанию 0х23). Задать другой адресс в том же скетче не удается.

#include <Wire.h>
#include <BH1750.h>

BH1750 lightMeter;

void setup(){

Не та библиотека , у вас BH1750.h   а надо  BH1750FVI.h  

Тогда создать Два конструктора 

BH1750FVI LightSensor1;

BH1750FVI LightSensor2;

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

у одого +5 у другого граунд

fusic
Offline
Зарегистрирован: 08.02.2017

Всё работает всё отлично

СПАСИБО за помощь :)

s600st
Offline
Зарегистрирован: 25.01.2018

С датчиком ВН1750 все отлично! Спасибо! А не могли бы подсказать как можно подключить 2 датчика освещенности GY-49 max44009  к одному Ардуино? А0 я подключил к  Vcc. Нужно два разных адреса указывать?  1001 010х  и 1001 011 ? Как отразить  эти адреса в скетче. И нужно ли корректировать библиотеку?

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

Какую библиотеку?

s600st
Offline
Зарегистрирован: 25.01.2018

Ту что в папке libraries/MAX44009-master

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

У меня нет такой в папке libraries

s600st
Offline
Зарегистрирован: 25.01.2018

Разумеется. Её скачивают с GitHub.

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

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

s600st
Offline
Зарегистрирован: 25.01.2018

Я полагаю, что тот кто не знает как  найти билиотеку на ГитХабе врятли может чем-то  помочь. На рипозиторе GitHub.com в поиске напишите интересующее и получите результат.

s600st
Offline
Зарегистрирован: 25.01.2018

Можете просто я Яндексе написать MAX44009 GitHub и получите все возможные результаты на этом репозиторе относительно этого датчика. Однако там нет скетча для подключения двух датчиков. 

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

Мне-то зачем писать что-то на рипозиторе? У меня проблем с этим модулем нет и никакие библиотеки совершенно не интересуют.

Хотел вам помочь, но вижу, что с таким умищем (и умением скачивать с гитхаба) вам помощь не требуется.

s600st
Offline
Зарегистрирован: 25.01.2018

Спасибо, но помощь нужна только от специалистов. Не засоряйте эфир

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

s600st пишет:

Спасибо, но помощь нужна только от специалистов. Не засоряйте эфир

ок. я - специалист. подымай свою ленивую задницу и звездуй на гитхаб.