В статье представляю новое устройство с сетевым интерфейсом TinyOneWireNet - точный люксметр на базе микросхемы BH1750.
Предыдущая статья Навигация по рубрике Следующая статья
Общее описание.
В качестве сенсора уровня освещенности в люксметре используется микросхема BH1750. Естественно, измерительные параметры устройства определяются этой микросхемой.
- Люксметр рассчитан на измерение части спектра видимого диапазона.
- Уровень освещенности 1…65535 люкс.
- Обеспечивается подавление шума частотой 50/60 Гц.
- Время измерения – 200 мс.
Принципиальная схема и конструкция датчика.
Микросхема BH1750 имеет интерфейс I2C с уровнями логических сигналов 3,3 В. Поэтому главная проблема при разработке устройства – это согласование уровней сигналов напряжением 3,3 В с 5-вольтовой логикой PIC-контроллера. Появление 5 В на выводах микросхемы BH1750 недопустимо.
Я подошел к решению этого вопроса строго. При любом варианте программного управление напряжение 5 В на BH1750 попасть не должно.
Диоды VD1 и VD2 не пропускают 5 В от PIC-контроллера. Вывод RA3 может работать только как вход. От него беды ждать не приходится. Перемычку U1 необходимо замыкать при программировании PIC-контроллера непосредственно в устройстве.
Для проверки собрал макет.
Но для следующего устройства с 3-вольтовым интерфейсом I2C разработал печатную плату и корпус.
С небольшими доработками в эту плату можно установить и BH1750. Возможно, будет сделана универсальная плата для I2C устройств с питанием 3,3 В.
Работа с люксметром в системе Ардуино.
Подключил датчик к выводу 2 платы Ардуино, задал адрес.
Для работы с люксметром в библиотеке TinyOneWireNet.h есть 3 традиционные функции.
uint8_t startMeasurement_LuxMeter(uint8_t adr); // запуск измерения люксметра
uint8_t readCode_LuxMeter(uint8_t adr, uint16_t * code); // чтение результата измерений люксметра (код)
uint8_t readLux_LuxMeter(uint8_t adr, uint16_t * lux); // чтение результата измерений люксметра (люкс)
Последовательность операций также привычная.
- Запустить измерение.
- Выдержать паузу не менее 200 мс.
- Считать результат.
Скетч для вывода результатов работы датчика через монитор последовательного порта похож на аналогичные программы для датчика температуры DS18B20 и датчика освещенности на фоторезисторе.
// измерение освещенности (люксметр)
#include <TinyOneWireNet.h>
#define NET_PIN 2 // вывод данных сети
#define BETWEEN_COM_TIME 2 // пауза между командами (мс)
TinyOneWireNet sens(NET_PIN);
uint16_t lx;
void setup() {
Serial.begin(9600);
sens.onLine(10);
}
void loop() {
if( sens.startMeasurement_LuxMeter(47) == 0 ) {
delay(1000);
if( sens.readLux_LuxMeter(47, & lx) == 0 ) {
Serial.print("Light= ");
Serial.print(lx);
Serial.println(" lx");
}
else Serial.println("Error");
}
else {
Serial.println("Error");
delay(1000);
}
delay(BETWEEN_COM_TIME);
}
Следующая статья об измерителе температуры и влажности воздуха с использованием сенсора AHT10.