BH1750 зависает на 54612 люкс

Zhyravlev_AS
Offline
Зарегистрирован: 03.04.2013

Привет!

Использую модуль http://ru.aliexpress.com/item/GY-302-BH1750-Chip-Light-Intensity-Light-Module/32555337970.html и эту библиотеку https://github.com/Genotronex/BH1750FVI_Master/

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

Скетч из примера: https://github.com/Genotronex/BH1750FVI_Master/blob/master/BH1750FVI/BH1750_serial/BH1750_serial.ino

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

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

Zhyravlev_AS
Offline
Зарегистрирован: 03.04.2013

Нашел в чем проблема. Подскажите как исправить!?

Информация с датчика "зависает" когда в коде использую код для чтения времени. Код для чтения/записи время брал отсюда http://www.glacialwanderer.com/hobbyrobotics/?p=12использую эти часы DS3231 http://ru.aliexpress.com/item/DS3231-AT24C32-IIC-Module-Precision-Clock-Module-DS3231SN-for-Arduino-Memory-module/32605328102.html

Мой скетч на котором тестирую:

#include <Wire.h>

/** Библиотека для датчика освещения */
#include <BH1750FVI.h> // https://github.com/Genotronex/BH1750FVI_Master/

/** Адрес RTC */
#define DS1307_I2C_ADDRESS 0x68

BH1750FVI LIGHT_SENSOR;

byte date_second,
date_minute,
date_hour,
date_dayOfWeek,
date_dayOfMonth,
date_month,
date_year;

byte bin2dec(byte val)
{
  return byte( (val/16*10) + (val%16) );
}

void date_get()
{
  // Reset the register pointer
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write((byte)0x00);
  Wire.endTransmission();
  
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  // A few of these need masks because certain bits are control bits
  date_second     = bin2dec(Wire.read() & 0x7f);
  date_minute     = bin2dec(Wire.read());
  date_hour       = bin2dec(Wire.read() & 0x3f);  // Need to change this if 12 hour am/pm
  date_dayOfWeek  = bin2dec(Wire.read());
  date_dayOfMonth = bin2dec(Wire.read());
  date_month      = bin2dec(Wire.read());
  date_year       = bin2dec(Wire.read());
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  LIGHT_SENSOR.begin();
  LIGHT_SENSOR.SetAddress(Device_Address_L);
  LIGHT_SENSOR.SetMode(Continuous_H_resolution_Mode);
}

void loop() {
  // put your main code here, to run repeatedly:
  date_get();
  uint16_t light_sensor_current_value = LIGHT_SENSOR.GetLightIntensity();
  
  Serial.print("Lux: ");
  Serial.print(light_sensor_current_value);
  Serial.print(", Time: ");

  String datetime = "";
  datetime += (int)date_hour;
  datetime += ":";
  datetime += (int)date_minute;
  datetime += ":";
  datetime += (int)date_second;
  datetime += " ";
  datetime +=(int)date_dayOfMonth;
  datetime += "/";
  datetime += (int)date_month;
  datetime += "/";
  datetime += (int)date_year;
  datetime += " ";
  datetime += (int)date_dayOfWeek;

  Serial.println(datetime);

  delay(250);
}

В таком состоянии кода датчик освещения возвращает мне 54612 люкс.. ( нужна помощь!) Спасибо!

Zhyravlev_AS
Offline
Зарегистрирован: 03.04.2013

- По своей не внимательности, забыл ранее добавить Wire.begin();
- Так же обнаружил что источником зависания служит:

Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0x00);
Wire.endTransmission();

Если убрать эти строчки, то все работает, датчик не зависает... но время теперь приходит вот такое:

Lux: 718, Time: 0:20:0 20/19/3 28
Lux: 2152, Time: 16:6:1 0/0/0 0
Lux: 54612, Time: 0:0:0 88/0/20 22
Lux: 54612, Time: 20:31:0 3/1/6 19
Lux: 54612, Time: 0:0:16 0/0/0 0
Lux: 384, Time: 8:22:0 20/80/33 0
Lux: 332, Time: 3:19:20 6/16/0 1
Lux: 668, Time: 0:0:0 0/0/22 0
Lux: 911, Time: 20:0:8 36/20/19 80
Lux: 20715, Time: 6:1:3 0/0/0 16
 
Кто-нибуууудь тут есть кто может подсказать как исправить???