本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于ESP32开发板的DIY太阳能电池板监控系统
发布时间:2021-05-18
分享到:
基于ESP32开发板的DIY太阳能电池板监控系统
发布时间:2021-05-18
分享到:

几个月前,我安装了一个小型的离网太阳能系统。我总是很好奇看到我的太阳能光伏系统的性能,而且好消息是我正在使用的充电控制器具有自己的本地显示器以进行监控。但是,我严重缺少远程监视功能。因此,我决定制作自己的监视系统,该系统必须同时具有本地和远程监视设施。

为什么我们需要监控?

1.它提供有关各种太阳能参数,提取的能量,故障检测,太阳能发电厂的历史分析以及相关的能量损失的清晰信息。

2.您可以轻松地衡量您的太阳能产量以及每月电费的节省。

3.您可以从智能手机实时跟踪太阳能光伏系统的所有重要参数。

在本文中,我将向您展示我使用ESP32开发板和ACS723电流传感器制作了一个简单的太阳能监控系统。

规格:

1.输入电压-0- 24V(可以扩展到50V)

2.输入电流:0 -15A

3.太阳能电池板额定值-250W(12V)/ 500W(24V)

视频展示:

组件清单:

1. ESP32开发板-30针(Banggood / Aliexpress)

2. ACS723传感器(LCSC)

3. OLED显示屏(亚马逊/ Banggood)

4.电阻器(亚马逊/ Banggood)

5.陶瓷电容器(亚马逊/ Banggood)

6. XL7015降压转换器模块(Amazon)

7.温度传感器(亚马逊/ Banggood)

8.螺丝端子3P- 3.5mm间距(LCSC)

9.螺丝端子2P-9.52mm间距(LCSC)

10.排针(Amazon / Banggood)

11.跳线MF(Amazon)

12. PCB

13.助焊剂(Banggood)

14.锡膏(Banggood)

补充工具:

1.烙铁(亚马逊/ Banggood)

2.少年(亚马逊/ Banggood)

3.剥线钳(Amazon / Banggood)

4. 3D打印机(Amazon / Banggood)

步骤1:如何运作?

太阳能电池板的电压和电流分别由电压和电流传感器感测。此处,使用分压器网络测量太阳能电池板电压,使用AC723霍尔效应电流传感器测量太阳能电池板电流。同样,DS18B20温度传感器可感测环境温度。

来自所有传感器的原始传感器数据由ESP32板处理,并执行所有必要的数学运算来计算功率,能量。然后将处理后的数据发送到OLED显示器以进行本地监视,还发送到云以进行远程监视。远程监控是通过安装在智能手机上的Blynk应用程序完成的。

步骤2:测量电压

太阳能电池板电压由分压器网络感测,该分压器网络由两个电阻R1 = 47k和R2 = 6.8k组成。R1和R2的输出连接到ESP32模拟引脚GPIO引脚34。使用陶瓷电容器C1平滑分压器的输出。

电压测量

ESP32的模拟输入可用于测量0至3.3V之间的DC电压。我考虑过的太阳能电池板可以产生24V(开路电压)。要读取此电压,我们必须逐步使用可通过分压器网络完成的电压。

用于分压器电路

Vout = R2 /(R1 + R2)x Vin

Vin =(R1 + R2)/ R2 x Vout

AnalogRead()函数读取电压并将其转换为0到4095之间的数字

校准 :

我们将使用Arduino的模拟输入之一及其AnalogRead()函数读取输出值。该函数输出的值在0到4095之间,每个增量为3.3 / 4095

Vin = Vout *(R1 + R2)/ R2; R1 = 47k和R2 = 6.8k

Vin = ADC计数*(3.3 / 4095)*((47 + 6.8)/ 6.8)伏

您可以通过选择适当的电阻器R1和R2来使用更高电压的太阳能电池板。

步骤3:测量电流

对于电流测量,我使用了霍尔效应电流传感器ACS 723 -20AUvariant。根据ACS723传感器的电流检测范围,还有其他变体。ACS712传感器读取电流值并将其转换为相关的电压值。将这两个测量值关联起来的值为“灵敏度”。输出灵敏度可以从数据表中获得。根据数据表,灵敏度为200mV / A

校准:

模拟读取值= AnalogRead(Pin);

ADCVoltage =(3.3 / 4095)*模拟读取值

以安培计的电流=(ADCVoltage –失调电压)/灵敏度

根据数据表,失调电压为0.1 * Vcc(0.5V),灵敏度为200mV / A

注意: ACS723的输出通过由R4和R5组成的分压器网络降压。

步骤4:测量温度

我已使用外部DS18B20探针测量环境温度。它使用单线协议与微控制器通信。单线设备需要在其信号线上连接一个上拉电阻,以便电路板正确读取。在这里,我使用了一个4.7K电阻(R6)作为上拉电阻。

可以通过3针螺丝端子将其钩接到PCB上。

要与DS18B20温度传感器接口,您需要安装One Wire库和Dallas Temperature库。您可以阅读本文以获取有关DS18B20传感器的更多详细信息。

连接如下:

红线-> Vcc

黄线->数据

黑线-> GND

以上所有内容在PCB上都有清晰的标签,以免造成混淆。

步骤5:连接OLED显示器

为了在本地显示太阳能电池板参数,我使用了0.96英寸的OLED显示屏。它的分辨率为128 x 64,并使用I2C总线与ESP32进行通信。使用了ESP32中的两个引脚SCL(GPIO22),SDA(GPIO21)沟通。

我正在使用Adafruit_SSD1306库来显示参数。首先,您必须下载Adafruit_SSD1306。然后安装它。

连接应如下所示:

ESP32 --> OLED

3.3V ---> VCC

地线->地线

GPIO21 ----> SDA

GPIO22 ----> SCL

步骤6:PCB设计

我已经使用EasyEDA在线软件绘制了原理图,然后为该项目设计了定制PCB。PCB设计用于安装不同的模块,而不是使用大量的组件。我已经从JLCPCB订购了我的PCB,并在7天内收到了它。

您可点击以下载以下附件的Gerber文件(点击下载)。

步骤7:PCB组装

对于焊接,您将需要一个体面的烙铁,焊料,钳口和万用表。优良作法是根据组件的高度进行焊接。首先焊接较小高度的部件。

您可以按照以下步骤焊接组件:

1.将组件脚推入它们的孔中,然后翻转PCB的背面。

2.将烙铁头的尖端固定在焊盘和组件支脚的连接处。

3.将焊料送入接头中,使焊料在引线周围全程流动并覆盖焊盘。

一旦它四处流淌,将尖端移开。

步骤8:焊接ACS723

在整个PCB中,高度较小的组件是电流传感器ACS723,这是此项目中使用的唯一SMT组件。

首先,在所有8个焊盘上施加助焊剂,然后在角焊盘上施加少量焊料。使用镊子放置并对准二极管芯片。用烙铁头触碰焊盘时,将芯片固定在适当的位置,以使焊料将引脚和焊盘融化在一起。

确保PCB和ACS723 IC上的点符号匹配在一起。点符号代表-1号插针。

现在,将焊料涂到所有的焊盘上,就可以完成了。如果在焊接过程中弄糟,则可以使用拆焊芯除去多余的焊料。

步骤9:3D打印的外壳

为了使产品具有良好的商业外观,我使用Autodesk Fusion 360设计了一个用于该项目的外壳。所有组件的尺寸和PCB安装孔均通过游标卡尺测量,然后在设计时考虑相同因素。

外壳分为两部分:1.主体2.顶盖

主体的基本设计是保留PCB板。顶盖将盖住主体开口并安装OLED显示器。

我使用Creality CR-10打印机和1.75毫米绿色PLA灯丝打印部件。我花了大约6个小时来打印主体,大约花了2个小时来打印顶盖。
我的设置是:

列印速度:60毫米/秒

层高:0.2mm(0.3也可以)

填充密度:20%

挤出机温度:200摄氏度

床温:60摄氏度

从Thingiverse下载STL文件

步骤10:组装3D打印外壳

可以将PCB安装在3D打印外壳的4个支架上。您可以使用4 x M3螺钉直接固定PCB,也可以安装带螺纹的散热插件以提高可靠性。在这里,我在每个支架上都使用了热插入件。

将PCB安装到主体上之后,我们可以移动安装OLED显示器。可以使用热胶或强力胶带将OLED显示器安装在顶盖的背面。

将跳线从OLED显示器连接到PCB OLED端口。PCB上的插头引脚已明确标记。

将温度传感器电缆插入机箱右侧的孔中。然后将电线连接到螺丝端子。

现在,使用4 x M3螺钉关闭顶盖。

为了使外壳更具吸引力,我在顶盖上贴了一个Instructables标签。

步骤11:软件和库

要将ESP32板与Arduino库一起使用,您必须将Arduino IDE与ESP32板一起使用。如果您还没有这样做,可以通过遵循Sparkfun的本教程,轻松地将ESP32开发板支持安装到Arduino IDE 。

安装库:

在上传代码之前,请安装以下库:

1. ESP32

2.布林克

3. Adafruit_SSD1306

4.一根线

5.达拉斯温度

如何安装库?

您可以阅读Sparkfun的本教程来安装Arduino库。

第12步:与Blynk应用交互

Blynk是最流行的物联网平台,用于将任何硬件连接到云,设计用于控制它们的应用程序以及大规模管理已部署的产品。借助Blynk库,您可以将400多种硬件模型(包括ESP8266,ESP32,NodeMCU和Arduino)连接到Blynk Cloud。

步骤1:

下载Blynk应用

1.对于Android

2.对于iPhone

第2步:

获取身份验证令牌为了连接Blynk应用程序和您的硬件,您需要身份验证令牌。

1.在Blynk应用程序中创建一个新帐户。

2.按顶部菜单栏上的QR图标。通过扫描上面显示的QR码,为该项目创建一个副本。一旦成功检测到,整个项目将立即在您的手机上。我已经制作了Sol Weather Station应用程序。欢迎您尝试一下!

要开始使用它:

1.下载Blynk应用:http ://j.mp/blynk_Android或http://j.mp/blynk_Android

2.触摸QR码图标,然后将相机指向下面的代码,请尽情享受我的应用程序!

3.创建项目后,我们将通过电子邮件向您发送身份验证令牌。

4.检查您的电子邮件收件箱,然后找到“身份验证令牌”。

步骤3:

为Wemos开发板准备Arduino IDE要将Arduino代码上传到Wemos开发板,您必须遵循以下Instructables

步骤4:

安装完上述库后,粘贴下面给出的Arduino代码。
输入步骤1中的身份验证码,ssid和路由器密码。

然后上传代码。

// ================================================ ===================================== //
// //
//太阳能电池板能量监控V1.0固件//
// //
//由Debasish Dutta开发,最新更新: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串行
    #include <BlynkSimpleEsp32.h>
    
    #define SCREEN_WIDTH 128 // OLED显示宽度(以像素为单位)
    #define SCREEN_HEIGHT 64 // OLED显示高度(以像素为单位)
    #define INPUT_VOLTAGE_SENSE_PIN 34
    #定义INPUT_CURRENT_SENSE_PIN 35
    #定义TEMP_SENSE_PIN 4
    #定义VOLTAGE_SCALE 7.911 // R1 + R2 / R2 //(47K + 6.8K)/ 6.8K
    #定义CURRENT_SCALE 1.5 // R4 + R5 / R5 //(1K + 2K)/ 2K
    
    双倍mVperAmp = 200; //传感器的灵敏度// //对于100A模块使用100,对于30A模块使用66
    双ACSoffset = 514;//理想情况下应为(0.1 x Vcc)//测量值为514mV
    无符号长last_time = 0;
    无符号长current_time = 0;
    浮动功率= 0; //瓦特功率
    浮动能量= 0; //瓦特小时的能值
    浮点温度tempC = 0; // Celcius的温度
    // float tempF = 0; 温度(单位:F)
    浮动保存= 0; // 节约成本  
   
    
     WiFiClient客户端;
    //声明连接到I2C的SSD1306显示器(SDA,SCL引脚)
    Adafruit_SSD1306显示(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire,-1);
    // DS18B20连接到的GPIO
    const int oneWireBus = 2;    
    //设置一个OneWire实例以与任何OneWire设备进行通信
    OneWire oneWire(TEMP_SENSE_PIN);
    达拉斯温度传感器(&oneWire);
    
// =========================用于wifi服务器设置的变量=================== ===========
     
  //您的WiFi凭据。
  //将开放网络的密码设置为“”。
  char ssid [] =“ XXXX”; // WiFi路由器ssid
  char pass [] =“ XXXX”; // WiFi路由器密码
  
  //从Blynk收到的邮件中复制
  char auth [] =“ XXXX”;  
  
// =========================设置功能====================== ========================== 
    
void setup(){
  Serial.begin(115200);
  Blynk.begin(auth,ssid,pass);
  sensor.begin();
  
  
  如果(!display.begin(SSD1306_SWITCHCAPVCC,0x3C)){ 
    Serial.println(F(“ SSD1306分配失败”));
    为了 (;;);
  }  
  display.clearDisplay();  
  display.setTextColor(WHITE);
  display.display();  
  延迟(500);
}

// ========================循环功能===================== ========================== 
    

无效循环()
{
 
  //读取电压和电流
  浮动电压= abs(return_voltage_value(INPUT_VOLTAGE_SENSE_PIN));
  浮动电流= abs(return_current_value(INPUT_CURRENT_SENSE_PIN));

 //从DS18B20读取温度
  sensor.requestTemperatures(); //获取温度
  tempC = sensor.getTempCByIndex(0);
  // tempF = sensor.getTempFByIndex(0); 

  //计算功率和能量
  功率=电流*电压; //以瓦为单位计算功率
  last_time = current_time;
  current_time = millis();    
  能量=能量+功率*(((current_time -last_time)/3600000.0); //以瓦特小时为单位计算功率// 1小时= 60分钟x 60秒x 1000毫秒

  节省= 6.5 *(能量/ 1000); // 6.5是每千瓦时的成本//仅用作示例
  

  // ================在串行监视器上显示数据========================== ====================== 
  
 / * Serial.print(“ Voltage:”);
  Serial.println(电压);
  Serial.print(“ Current:”);
  Serial.println(当前);
  Serial.print(“ Power:”);
  Serial.println(power);
  Serial.print(“ Energy:”);
  Serial.println(energy);
  Serial.print(“ Temp:”);
  Serial.println(tempC);
  Serial.println(电压);
  延迟(1000);
* /
// ================ OLED显示器上的显示数据========================== ======================

  //显示太阳能电池板电压 
  display.setTextSize(1);
  display.clearDisplay();
  display.setCursor(10,10);
  display.print(电压,1);
  display.print(“ V”);

  //显示太阳能电池板电流 
  
  display.setCursor(70,10);

  如果(当前> 0 &&当前<1)
  {
   display.print(current * 1000,0);
   display.print(“ mA”);
  }
  别的
  {
  display.print(current,2);  
  display.print(“ A”);
  }

 //以瓦为单位显示太阳能电池板的功率

  display.setTextSize(2);
  display.setCursor(10,25);
  display.print(power);
  display.print(“ W”);

 //显示太阳能电池板产生的能量 
  display.setCursor(10,45);
  
  如果(能量> = 1000)
  {
   display.print(energy / 1000,3);
   display.print(“ kWh”);
  }
  别的
  {
  display.print(energy,1);  
  display.print(“ Wh”);
  }
  display.display();
  display.clearDisplay();
  
  
// =================在Blynk应用程序上显示数据========================== ======================
   Blynk.run();  
   Blynk.virtualWrite(0,voltage); //虚拟引脚0
   Blynk.virtualWrite(1,current); //虚拟针脚1
   Blynk.virtualWrite(2,power); //虚拟引脚2
   Blynk.virtualWrite(3,energy / 1000); //虚拟引脚3
   Blynk.virtualWrite(4,tempC); //虚拟针脚4   
   Blynk.virtualWrite(5,Saving); //虚拟针脚4  
   // delay(1000);
}

// =========================计算太阳能电池板电压的功能================== ==================
  
双return_voltage_value(int pin_no)
{
  双tmp = 0;
  双ADCVoltage = 0;
  double inputVoltage = 0;
  平均双倍= 0;
  对于(int i = 0; i <100; i ++)
  {
    tmp = tmp + AnalogRead(pin_no);
  }
  平均= tmp / 100;
  ADCVoltage =((平均* 3.3)/(4095))+ 0.184; // 0.184通过加热进行偏移调整,然后尝试
  inputVoltage = ADCVoltage * VOLTAGE_SCALE; 
  返回inputVoltage;
}


// =========================计算太阳能电池板电流的功能================= ==================

double return_current_value(int pin_no)
{
  双tmp = 0;
  平均双倍= 0;
  双ADCVoltage = 0;
  双安培= 0;
  对于(int z = 0; z <150; z ++)
  {
    tmp = tmp + AnalogRead(pin_no);
  }
  平均= tmp / 150;
  ADCVoltage =((平均* 3331)/ 4095); //获得mV
  安培=(((ADCVoltage * CURRENT_SCALE-ACSoffset)/ mVperAmp); // 1.5是分压器的缩放比例
  返回安培;
} <br>

步骤13:现场测试
 

现在,我们的设备已准备就绪,可以进行现场测试。连接应如下所示:

1.将负载的负极端子连接到输出螺丝端子的负极端子,然后将正极端子连接到输出正极端子。在这里,我已将out端子连接到我的充电控制器太阳能输入端子。

2.将太阳能电池板的负极端子连接到输入螺丝端子的负极端子,将正极连接到输入正极端子。

输入和输出螺钉端子可用于26-10AWG的线径。

您可以参考上面的接线图以获得更好的理解。

注意:请确保您连接到正确的极性,否则您会看到魔烟。该电路没有反极性保护。

完成所有连接后,您将在OLED显示屏上看到太阳能电池板参数。您可以通过打开Blynk应用程序从智能手机进行检查。

至此,我们的项目就设计完成了,欢迎大家动手实践互动。

 

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论