В настоящее время все большую популярность набирает возобновляемая энергетика или, как ее еще называют, "зеленая энергетика". Одним из самых значимых элементов подобной энергетики является преобразование энергии солнечного излучения в электрическую энергию. Эту операцию выполняют солнечные панели, стоимость которых в последнее время неуклонно снижается. Однако эффективность работы солнечной панели значительным образом от интенсивности солнечного излучения в месте ее установки. Поэтому солнечные панели желательно устанавливать в местах с наибольшей плотностью потока солнечного излучения (в рассматриваемой местности).
Обычно измерение плотности потока солнечного излучения осуществляют с помощью пиранометров (pyranometer, прибор для измерения солнечной радиации), однако данные устройства очень дороги и не подходят для использования в домашних условиях. В этом случае стоимость пиранометра будет составлять значительную величину от стоимости используемых вами солнечных панелей, что, конечно же, с экономической точки зрения невыгодно. Поэтому в данной статье мы рассмотрим создание своими руками простого измерителя интенсивности солнечного излучения (солнечной радиации) на основе платы Arduino и протестируем его работу в различных условиях эксплуатации. Также на нашем сайте вы можете посмотреть проект солнечной панели, следящей за движениями Солнца.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress) (Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158).
- Датчик интенсивности света/датчик освещенности (Light Intensity Sensor Module) BH1750.
- Соединительные провода.
- Компьютер с установленной Arduino IDE.
- Программа Teraterm для построения графика солнечной радиации (можно свободно скачать в сети).
Выбор датчика интенсивности света
Для измерения интенсивности светового потока в нашем проекте можно использовать большое число разнообразных датчиков. Простейшим из них является фоторезистор, который может измерять интенсивность падающего на него света, но делает он это неточно. Для нашего проекта нам необходим сравнительной дешевый датчик, но при этом обладающий достаточной точностью измерения светового потока. В качестве такого датчика мы выбрали датчик освещенности BH1750, который плохо подходит для измерения интенсивности прямых солнечных лучей, но хорошо работает в качестве измерителя интенсивности окружающего (рассеянного) света. Датчик BH1750 поддерживает диапазон измерения интенсивности света вплоть до 65535 lx (люкс – единица измерения освещённости), что составляет половину фотометрической яркости яркого солнечного света.
В следующей таблице представлены яркости различных источников света.
Brightest Sunlight (очень яркий солнечный свет) | Illuminance |
Bright Sunlight (яркий солнечный свет) | 100000-110000 Lux |
Shaded Clear sky (пасмурное небо) | 20000 Lux |
Датчик BH1750 способен измерять освещенность в условиях ясного/безоблачного неба. BH1750 является цифровым датчиком, работает от напряжения 3.3V и подключается к микроконтроллерам (микроконтроллерным платам) по интерфейсу I2C. Более подробно про датчик BH1750 вы можете прочитать в статье про его подключение к плате Arduino.
Схема проекта
Схема измерителя солнечной радиации на основе платы Arduino представлена на следующем рисунке.
Как видим, схема очень проста. Датчик BH1750 подключается к плате Arduino Nano по интерфейсу I2C. При этом датчик BH1750 имеет внутренние подтягивающие резисторы для интерфейса I2C, поэтому отпадает необходимость в использовании внешних подтягивающих резисторов. Подавая на плату Arduino питание 5V мы на ее выводе 3.3V получаем стабилизированное с помощью ее внутреннего регулятора напряжение 3.3V, которое используется для питания датчика BH1750. Контакт ADDR датчика замыкается на землю, что приводит к тому, что адрес по умолчанию датчика BH1750 становится его адресом I2C.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В коде программы мы будем использовать режим непрерывной работы датчика BH1750 с высоким разрешением и измерять интенсивность света каждую секунду.
Первым делом в программе подключим используемые библиотеки. Библиотека Wire.h используется для осуществления связи по интерфейсу I2C, а библиотека BH1750.h – для работы с датчиком BH1750.
1 2 |
#include <Wire.h> #include <BH1750.h> |
Далее внутри функции setup инициализируем связь по протоколу I2C (библиотека BH1750 не делает этого автоматически) и последовательную связь со скоростью 9600 бод для целей отладки.
1 2 3 4 5 6 |
void setup(){ Serial.begin(9600); Wire.begin(); lightMeter.begin(); Serial.println(F("BH1750 Test begin")); } |
Затем внутри функции void loop(), мы будем конвертировать значение интенсивности светового потока (Flux value) в значение солнечной радиации (irradiance). Для подобной конвертации нет строгой математической формулы, но можно использовать приближенную формулу, основанную на длине волны светового излучения. Интенсивность светового потока (flux) может быть конвертирована в значение интенсивности света, приходящейся на м2 (W/m2), при помощи умножения ее на коэффициент 0.079. Обоснование подобного подхода можно посмотреть по этой ссылке.
После этого полученное значение интенсивности света мы будем выводить через последовательный порт связи (UART) чтобы сохранять данные в формате excel для дальнейшего построения графика.
1 2 3 4 5 6 7 8 |
void loop() { float lux = lightMeter.readLightLevel(); float irr = (lux*0.0079); Serial.print("irradiance: "); Serial.print(irr); Serial.println(" W/m2"); delay(1000); } |
Тестирование работы проекта
После сборки проекта вы можете протестировать его работу в различных условиях освещенности. Условия проведения измерений, в которых данный измеритель солнечной радиации тестировали его авторы, изменялись от условий яркого солнечного света до условий пасмурной погоды, поэтому они смогли протестировать его в широком диапазоне интенсивностей светового потока. Результаты их измерений показаны на следующем графе.
Эти измерения производились авторами проекта в штате Западная Бенгалия (Индия) 27 октября 2021 года с 12 PM до 2.45 PM.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/* Example of BH1750 library usage. This example initialises the BH1750 object using the default high resolution continuous mode and then makes a light level reading every second. Connection: VCC -> 3V3 or 5V GND -> GND SCL -> SCL (A5 on Arduino Uno, Leonardo, etc or 21 on Mega and Due, on esp8266 free selectable) SDA -> SDA (A4 on Arduino Uno, Leonardo, etc or 20 on Mega and Due, on esp8266 free selectable) ADD -> (not connected) or GND ADD pin is used to set sensor I2C address. If it has voltage greater or equal to 0.7VCC voltage (e.g. you've connected it to VCC) the sensor address will be 0x5C. In other case (if ADD voltage less than 0.7 * VCC) the sensor address will be 0x23 (by default). */ #include <Wire.h> #include <BH1750.h> BH1750 lightMeter; void setup(){ Serial.begin(9600); // Initialize the I2C bus (BH1750 library doesn't do this automatically) Wire.begin(); // On esp8266 you can select SCL and SDA pins using Wire.begin(D4, D3); // For Wemos / Lolin D1 Mini Pro and the Ambient Light shield use Wire.begin(D2, D1); lightMeter.begin(); Serial.println(F("BH1750 Test begin")); } void loop() { float lux = lightMeter.readLightLevel(); float irr = (lux*0.0079); Serial.print("irradiance: "); Serial.print(irr); Serial.println(" W/m2"); delay(1000); } |