Система контроля параметров солнечных панелей
Несколько месяцев назад мастер установил небольшую автономную солнечную систему. После нескольких месяцев эксплуатации системы, он пришел к выводу, что необходимо дополнительно установить систему контроля за параметрами солнечной системы.
Такой мониторинг дает четкую информацию о различных параметрах системы, обнаружении неисправностей, полученной энергии и т.д.
Все эти параметры можно просматривать как на встроенном в контроллер дисплеи, так и на экране смартфона удаленно отслеживать все важные параметры солнечной фотоэлектрической системы в режиме реального времени со своего смартфона.
В этой статье мастер поделится с нами своим опытом по сборке такой системы мониторинга на базе ESP32 и датчика тока ACS723.
Технические характеристики устройства следующие:
1. Входное напряжение — 0-24 В (может быть увеличено до 50 В)
2. Входной ток: 0-15А
3. Номинальная мощность солнечной панели — 250 Вт (12 В) / 500 Вт (24 В).
Инструменты и материалы:
— Плата ESP32 — 30 контактов;
-Датчик тока ACS723;
-Дисплей;
-Резисторы;
-Керамические конденсаторы;
-Понижающий модуль питания LM2596;
-Датчик температуры;
-Винтовой зажим 3P;
-Винтовой зажим 2P;
-Штыревой разъем;
-Перемычки;
-Печатная плата;
-Паяльные принадлежности;
-Кусачки;
-3D-принтер;
Шаг первый: принцип работы
Напряжение и ток солнечной панели измеряются датчиками напряжения и тока соответственно. Здесь используется схема делителя напряжения для измерения напряжения, а датчик тока холла AC723 используется для измерения тока солнечной панели. Аналогичным образом температура окружающей среды измеряется датчиком температуры DS18B20.
Собранные данные со всех датчиков обрабатываются платой ESP32. Обработанные данные затем отображаются на OLED-дисплеи, а также передаются в облако для удаленного мониторинга. Удаленный мониторинг осуществляется через приложение Blynk, установленное на смартфоне.
Шаг второй: измерение напряжения
Напряжение солнечной панели измеряется с помощью схемы делителя напряжения сети, состоящим из двух резисторов R1=47К и R2=6,8К. Выход R1 и R2 соединен с аналоговым выводом ESP32 GPIO pin 34. Выходной сигнал делителя напряжения сглаживается с помощью керамического конденсатора С1.
Аналоговые входы ESP32 могут использоваться для измерения постоянного напряжения от 0 до 3,3 В. Солнечная панель, которую мастер установил, может генерировать напряжение до 24 В. Чтобы считать это напряжение нужного его понизить. Понижает мастер с помощью цепи делителя напряжения.
Измерение напряжения:
Для схемы делителя напряжения:
Vout = R2 / (R1 + R2) x Vin
Vin = (R1 + R2) / R2 x Vвых.
Функция analogRead () считывает напряжение и преобразует его в число от 0 до 4095.
Калибровка:
Выходное значение считывается с одного из аналоговых входов Arduino и его функции analogRead (). Эта функция выводит значение от 0 до 4095, что составляет 3,3 / 4095 для каждого шага.
Vin = Vout * (R1 + R2) / R2; R1 = 47 кОм и R2 = 6,8 кОм
Vin = счетчик АЦП * (3,3 / 4095) * ((47 + 6,8) / 6,8) Вольт
Можно использовать солнечную панель с более высоким напряжением, выбрав соответствующие резисторы R1 и R2.
Для расчета значений сопротивления делителя напряжения можно использовать этот онлайн- калькулятор.
Шаг третий: измерение тока
Для измерения тока он использовал датчик ACS 723 -20AUvariant. Датчик ACS712 считывает текущее значение и преобразует его в соответствующее значение напряжения. Значение, связывающее два измерения, называется чувствительностью. Выходную чувствительность можно получить из таблицы данных. Согласно паспорту базовая чувствительность составляет 200 мВ / А.
Калибровка:
Аналоговое значение считывания= analogRead (Pin);
Напряжение АЦП = (3,3 / 4095) * значение аналогового считывания
Ток = (ADCVoltage — Offset Voltage) / чувствительность
В соответствии с техническими данными напряжение смещения составляет 0,1 * Vcc (0,5 В), а чувствительность составляет 200 мВ / А.
Примечание: Выходной сигнал ACS723 понижается с помощью цепи делителя напряжения, состоящей из R4 и R5.
Шаг четвертый: измерение температуры
Для измерения температуры окружающей среды мастер использовал выносной датчик DS18B20. Он использует однопроводной протокол для связи с микроконтроллером. Однопроводным устройствам требуется подтягивающий резистор, подключенный к их сигнальной линии, чтобы плата правильно считала их. Здесь мастер использовал резистор 4,7 кОм (R6) в качестве подтягивающего резистора. Он подключается к печатной плате через 3-контактный винтовой зажим.
Для сопряжения с датчиком температуры DS18B20, необходимо установить библиотеку One Wire library и библиотеку температуры Dallas.
Подключение датчика:
Красный провод -> Vcc
Желтый провод -> DATA
Черный провод -> GND
Шаг пятый: подключение OLED-дисплея
Для отображения параметров солнечной панели он использовал 0,96-дюймовый OLED-дисплей. Дисплей имеет разрешение 128 x 64 и использует шину I2C для связи с ESP32. Используются два контакта SCL (GPIO22), SDA (GPIO21) в ESP32.
мастер использует библиотеку Adafruit_SSD1306 для отображения параметров.
Подключение дисплея следующее:
ESP32 — -> OLED
3,3 В —> VCC
GND -> GND
GPIO21 —-> SDA
GPIO22 —-> SCL
Шаг шестой: печатная плата
Схема разработана в EasyEDA. Затем мастер разработал печатную плату. Плату можно изготовить самостоятельно или заказать на соответствующем сервисе.
Файлы можно скачать ниже.
Gerber_PCB_Solar_Power_Monitoring V1.0.rar
После изготовления платы нужно произвести ее монтаж согласно схемы.
На всей печатной плате компонент меньшей высоты — это датчик тока ACS723, который является единственным компонентом SMD, используемым в этом проекте.
Сначала нанесите паяльный флюс на все 8 контактных площадок, а затем нанесите небольшое количество припоя на угловые контактные площадки. Установите и выровняйте диодную микросхему с помощью пинцета. Удерживайте микросхему на месте, касаясь контактных площадок кончиком паяльника, чтобы припой расплавил контакт и контактную площадку.
Убедитесь, что точечный символ на печатной плате и микросхеме ACS723 совпадает. Символ точки представляет штифт номер -1.
Дальше нанесите припой на все контактные площадки, и все готово.
Шаг седьмой: корпус
Для устройства мастер спроектировал корпус с помощью Autodesk Fusion 360.
Он состоит из двух частей: 1. Основной корпус 2. Верхняя крышка.
Основной корпус предназначен для размещения печатной платы. Верхняя крышка предназначена для закрытия основного корпуса и установки OLED-дисплея.
Настройки при печати следующие:
Скорость печати: 60 мм / с
Высота слоя: 0,2 мм (также подходит 0,3)
Плотность заполнения: 20%
Температура экструдера: 200°C
Температура кровати: 60°C
Файлы для печати можно загрузить здесь.
Шаг восьмой: сборка
Теперь нужно собрать основной блок. Печатная плата устанавливается на 4 стойки в корпусе. В стойки нужно установить резьбовые вставки.
OLED-дисплей крепится с помощью термоклея или двустороннего скотча. Дисплей подключается к плате с помощью шлейфа. Кабель от датчика температуры протягивается через отверстие в корпусе.
Шаг девятый: программное обеспечение
Чтобы использовать плату ESP32 с библиотекой Arduino, нужно использовать Arduino IDE с поддержкой платы ESP32.
Перед загрузкой кода нужно установить следующие библиотеки:
1. ESP32
2. Blynk
3. Adafruit_SSD1306
4. One Wire
5. Dallas Temperature
Шаг десятый: приложение Blynk
Blynk — самая популярная платформа Интернета вещей для подключения любого оборудования к облаку, разработки приложений для управления им и управления. С помощью Blynk Library можно подключить более 400 моделей оборудования, включая ESP8266, ESP32, NodeMCU и Arduino, к Blynk Cloud.
Загрузите приложение Blynk
1. Для Android
2. Для iPhone
Создайте новую учетную запись в приложении Blynk.
Нажмите значок QR в верхней строке меню. Создайте копию этого проекта, отсканировав QR-код, показанный выше. После успешного сопряжения проект сразу же будет на вашем телефоне. Для него мастер сделал приложение Sol Weather Station.
Чтобы начать его использовать:
Загрузите приложение Blynk
Коснитесь значка QR-кода и наведите камеру на код
После создания проекта токен аутентификации будет отправлен на почтовый ящик пользователя.
Чтобы загрузить код Arduino на плату Wemos, нужно следовать этим инструкциям.
После установки вышеуказанных библиотек нужно вставить приведенный ниже код Arduino.
В код нужно прописать код авторизации из шага 1, ssid и пароль роутера.
Показать / Скрыть текст//======================================================================================// // // // Solar Panel Energy Monitoring V1.0 Firmware // // // // Developed by Debasish Dutta, Last Update: 06.05.2021 // // // //======================================================================================// #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <DallasTemperature.h> #include <OneWire.h> #include "Wire.h" #include <WiFi.h> #define BLYNK_PRINT Serial #include <BlynkSimpleEsp32.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define INPUT_VOLTAGE_SENSE_PIN 34 #define INPUT_CURRENT_SENSE_PIN 35 #define TEMP_SENSE_PIN 4 #define VOLTAGE_SCALE 7.911 // R1+R2 / R2 // ( 47K + 6.8K ) / 6.8K #define CURRENT_SCALE 1.5 // R4+R5 / R5 // ( 1K + 2K ) / 2K double mVperAmp = 200; //Sensityvit of the sensor // use 100 for 20A Module and 66 for 30A Module double ACSoffset = 514; // Ideally it should be ( 0.1 x Vcc ) // measured value is 514mV unsigned long last_time =0; unsigned long current_time =0; float power =0 ; // Power in Watt float energy =0 ; // Emergy in Watt-Hour float tempC=0; // temperaure in Celcius //float tempF = 0; temperature in F float saving=0; // cost saving WiFiClient client; // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // GPIO where the DS18B20 is connected to const int oneWireBus = 2; // Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(TEMP_SENSE_PIN); DallasTemperature sensors(&oneWire); //========================= Variables for wifi server setup ============================= // Your WiFi credentials. // Set password to "" for open networks. char ssid[] = "XXXX"; // WiFi Router ssid char pass[] = "XXXX"; // WiFi Router password // copy it from the mail received from Blynk char auth[] = "XXXX"; //========================= Setup Function ================================================ void setup() { Serial.begin(115200); Blynk.begin(auth, ssid, pass); sensors.begin(); if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); for (;;); } display.clearDisplay(); display.setTextColor(WHITE); display.display(); delay(500); } //========================= Loop Function ================================================ void loop() { // read voltage and current float voltage = abs( return_voltage_value(INPUT_VOLTAGE_SENSE_PIN)) ; float current = abs( return_current_value(INPUT_CURRENT_SENSE_PIN)) ; // read temperature from DS18B20 sensors.requestTemperatures(); // get temperatures tempC = sensors.getTempCByIndex(0); //tempF = sensors.getTempFByIndex(0); // Calculate power and energy power = current * voltage ; // calculate power in Watt last_time = current_time; current_time = millis(); energy = energy + power *(( current_time -last_time) /3600000.0) ; // calculate power in Watt-Hour // 1 Hour = 60mins x 60 Secs x 1000 Milli Secs saving = 6.5 * ( energy /1000 ); // 6.5 is cost per kWh // used just for example // ================= Display Data on Serial Monitor ================================================ /* Serial.print("Voltage: "); Serial.println(voltage); Serial.print("Current: "); Serial.println(current); Serial.print("Power: "); Serial.println(power); Serial.print("Energy: "); Serial.println(energy); Serial.print("Temp: "); Serial.println(tempC); Serial.println(voltage); delay(1000); */ // ================= Display Data on OLED Display ================================================ // Display Solar Panel Voltage display.setTextSize(1); display.clearDisplay(); display.setCursor(10, 10); display.print(voltage,1); display.print(" V"); // Display Solar Panel Current display.setCursor(70, 10); if (current >0 && current < 1 ) { display.print(current*1000,0); display.print(" mA"); } else { display.print(current,2); display.print(" A"); } // Display Solar Panel Power in Watt display.setTextSize(2); display.setCursor(10,25); display.print(power); display.print(" W"); // Display Energy Generated by the Solar Panel display.setCursor(10,45); if ( energy >= 1000 ) { display.print(energy/1000,3); display.print(" kWh"); } else { display.print(energy,1); display.print(" Wh"); } display.display(); display.clearDisplay(); // ================= Display Data on Blynk App ================================================ Blynk.run(); Blynk.virtualWrite(0, voltage ); // virtual pin 0 Blynk.virtualWrite(1, current ); // virtual pin 1 Blynk.virtualWrite(2, power); // virtual pin 2 Blynk.virtualWrite(3,energy/1000);// virtual pin 3 Blynk.virtualWrite(4,tempC ); // virtual pin 4 Blynk.virtualWrite(5,saving); // virtual pin 4 //delay(1000); } //========================= Function to Calculate Solar Panel Voltage =================================== double return_voltage_value(int pin_no) { double tmp = 0; double ADCVoltage = 0; double inputVoltage = 0; double avg = 0; for (int i = 0; i < 100; i++) { tmp = tmp + analogRead(pin_no); } avg = tmp / 100; ADCVoltage = ((avg * 3.3) / (4095)) + 0.184 ; // 0.184 is offset adjust by heat and try inputVoltage = ADCVoltage * VOLTAGE_SCALE; return inputVoltage; } //========================= Function to Calculate Solar Panel Current =================================== double return_current_value(int pin_no) { double tmp = 0; double avg = 0; double ADCVoltage = 0; double Amps = 0; for (int z = 0; z < 150; z++) { tmp = tmp + analogRead(pin_no); } avg = tmp / 150; ADCVoltage = ((avg*3331) / 4095); // Gets you mV Amps = ((ADCVoltage * CURRENT_SCALE — ACSoffset ) / mVperAmp); // 1.5 is the scaling for voltage divider return Amps; }
Шаг одиннадцатый: тестирование
Теперь устройство готово к тестированию. Подключение должно быть следующим:
1. Подключите отрицательную клемму нагрузки к отрицательной клемме выходной винтовой клеммы, а затем положительную клемму к выходной положительной клемме. Мастер подключил выходную клемму к входной клемме солнечного контроллера заряда.
2. Подключите отрицательную клемму солнечной панели к отрицательной клемме входной винтовой клеммы, а положительную — к входной положительной клемме.
Винтовые клеммы входа и выхода могут использоваться для проводов сечением от 26 до 10AWG.
Убедитесь, что вы подключаетесь с правильной полярностью, так как схема не имеет защиты от обратной полярности.
После всех подключений вы увидите параметры вашей солнечной панели, отображаемые на OLED-дисплее. Также параметры можно проверить на смартфоне, открыв приложение Blynk.
Все готово, а реализацию всего проекта можно посмотреть на видео.
Источник (Source)
Источник: