风筝
发表于: 2020-12-16 10:24:36 | 显示全部楼层

在可再生能源领域,太阳能是一项很重要的能源,因为利用太阳能发电是最简单且商业上可行的可再生能源。说到太阳能电池板,需要监控太阳能电池板输出的输出功率,以便从太阳能电池板获得最佳功率输出。这就是为什么需要实时监控系统的原因。在大型太阳能发电厂中,它还可用于监视每个太阳能板的功率输出,从而有助于识别灰尘堆积。它还可以防止在运行期间出现任何故障情况。


在本篇文章中,我们将通过结合基于MPPT(Maximum Power Point Tracker)的电池充电技术来制造基于IoT的太阳能监控系统,这将有助于减少充电时间并提高效率。另外,我们将测量面板温度、输出电压和电流,以改善电路的安全性。最后,最重要的是,我们将使用ThingSpeak云服务来监视输出数据。在本文中,我们将使用ESP32 IoT开发板监控太阳能板的输出电压、电流和功率。


为IoT太阳能监控系统选择正确的组件

有了太阳能监视系统,监视和检测任何太阳能系统中的故障变得非常容易。这就是为什么在设计这样的系统时组件选择会是非常重要的部分。以下是我们使用的组件清单。

●    ESP32开发板

●    MPPT电路板

●    分流电阻

●    锂电池(首选7.4v)。

●    Wi-Fi连接

●    太阳能电池板温度传感器

●    分压器电路


ESP32开发板

对于支持IoT的应用,选择正确类型的开发板是非常重要的,该开发板将能够处理其模拟引脚上的数据,并通过任何类型的连接协议(例如Wi-Fi或云端)将数据发送到服务器。我们专门选择了ESP32,因为它是一款具有众多功能的低成本微控制器。此外,它还具有内置的Wi-Fi无线,通过它我们可以非常轻松地连接到互联网。


太阳能电路板

太阳能充电电路是一种从太阳能电池板获取更高电压并将其转换为充电电压的电路,以便可以有效地为电池充电。对于这个项目,我们将使用基于LT3562的MPPT充电控制器电路板。我们选择此板是因为该电路配备了Maximum Power Point Tracking(MPPT),这对低功率太阳能电池板项目非常有利。这是从太阳能电池板为小型锂电池充电的一种有效方法。

MPPT-Charge-Controller-Circuit-Board.jpg


分流电阻

任何电阻都遵循欧姆定律,这意味着如果一定量的电流流过电阻器,就会出现一定量的压降。分流电阻器也不例外,它专门用于测量电流。根据流过太阳能电池板的标称电流,选择一个分流电阻,该分流电阻将产生足够的电压,该电压可由微控制器单元测量。但是,与此同时,电阻的瓦数也很重要。


可以使用以下公式计算电压降。这就是欧姆定律-

V = I x R

V是在“ I”期间将产生的电压,即流过电阻“ R”的电流量。例如,当1A电流流过时,1欧姆电阻将产生1V的压降。


对于电阻的瓦数,可以使用以下公式:

P = I2R

其中,I是最大电流,R是电阻值。对于使用1欧姆电阻的1A电流,1瓦的功耗就足够了。但是,这对于小型太阳能电池板项目很有用,但根本不适合与太阳能电网相关的应用。这时,实际上需要使用非侵入式电流测量技术。它可以精确地测量电流,其中可以测量非常少的电流以及非常大的电流。


锂电池

锂电池的选择是任何涉及太阳能电池板项目的重要组成部分。由于微控制器单元始终保持打开状态并不断检查和提交数据,因此至少需要100毫安的电流才能稳定运行。


电池容量应该在无太阳直射的情况下为微控制器供电至少4-5天。从电池角度来看,充电电流必须大于负载电流也很重要。如果有人用电池连接100mA的负载并提供小于此值的充电电流,这是非常不寻常的。为了安全起见,我们的充电电流至少应比负载电流大5倍。


另一方面,电池电压需要高于微控制器所需的常规电压调节器输入电压。例如,可以在3.3V和5.0V线性稳压器之间连接一个7.4V锂电池(因为线性稳压器比LDO和开关需要更高的压降电压)。


在我们的项目中,我们使用了4000mAH电池,额定电压为7.4V。我们使用了5.0V的稳压器,可为ESP32提供足够的电流和电压输出。


分压器

分压器是太阳能电池板电压测量的重要组成部分。应该选择一个分压器,该分压器将根据微控制器I / O电压输入对电压进行分压。

Solar-Power-Monitoring.png

选择上述电阻时,应使分压器输出电压不超过微控制器的最大I / O电压(ESP32为3.3V)。但是,建议使用电位器,因为它可以灵活地选择更高或更低额定电压的任何太阳能电池板,并且可以使用万用表轻松设置电压。


在本文中,MPPT电路板上有一个电位器,用作分压器。我们将分压器的分频系数设置为6V。我们连接了两个万用表,一个在电位器的输入中,另一个在电位器的输出中,并设置了一个值,当输入电压为18V时,输出将为3V,因为太阳能电池板的标称输出电压是18V。


太阳能电池板温度传感器

太阳能电池板的功率输出与太阳能电池板的温度直接相关。因为随着太阳能电池板温度的升高,太阳能电池板的输出电流呈指数增长,而电压输出却开始线性下降。


根据功率公式,瓦数等于电压乘以电流(W = V x A),即使在增加电流之后,降低输出电压也会降低太阳能电池板的输出功率。现在,我们想到的下一个问题是,如何测量太阳温度?好吧,这很有趣,因为太阳能电池板通常会暴露在直射阳光下并暴露在高温环境中。测量太阳能电池板温度的最佳方法是使用平面温度传感器。还建议使用直接置于太阳能电池板中的K型热电偶。


在本文中,我们使用了基于热敏电阻的温度传感器模块,如下所示。

Temperature-Sensor.jpg


基于物联网的太阳能监控系统电路图

IoT太阳能监控器的完整电路图如下所示。原理图很简单。红色的双点划线板是我们用于该项目的MPPT电路板。

Solar-Power-Monitoring-Circuit.png


设置ThingSpeak

首先使用ThingSpeak创建一个帐户,然后转到“my channel”选项,然后单击“New Channel”。

填写各个字段名称创建一个新通道。

ThingSpeak-Setup.jpg


现在,在设置字段后,转到提供API密钥的API Keys字段。需要在代码中以及通道ID中提供此密钥。

ThingSpeak-and-its-Setup-Process.jpg

ThingSpeak地址可以在同一页面上找到。

ThingSpeak-API-Request.jpg

通过上述步骤,您可以非常轻松地设置ThingSpeak。


使用ESP32进行太阳能监控的Arduino代码

完整的ESP32太阳能监控代码可在本页底部找到。该代码首先定义您的SSID、密码和其他一些常量参数,如下所示。

  1. // define WiFi SSID & PWD for uplink.
  2. #define WLAN_SSID   "xxxx"
  3. #define WLAN_PASS   "xxxxxxxxxx"
复制代码

在此字段中,需要设置自定义的SSID和密码。

  1. // resistance at 25 degrees C
  2. #define THERMISTORNOMINAL 10000         
  3. // temp. for nominal resistance (almost always 25 C)
  4. #define TEMPERATURENOMINAL 25   
  5. // The beta coefficient of the thermistor (usually 3000-4000)
  6. #define BCOEFFICIENT 3950
  7. // the value of the 'other' resistor
  8. #define SERIESRESISTOR 10000   
复制代码

在标称温度下提供了热敏电阻的标称欧姆。根据热敏电阻的数据表设置该值。放入热敏电阻的Beta系数和串联电阻值。

  1. // define Analog for Current and Voltage
  2. const int curr_an_pin = 35;
  3. const int volt_an_pin = 34;
  4. const int ntc_temp_an_pin = 33;
复制代码

上面代码定义了使用的引脚。


  1. #define thingSpeakAddress "xxxxxxxxx"   
  2. #define channelID xxxxx                     
  3. #define writeFeedAPIKey "xxxxxxx"                 
  4. #define readFeedAPIKey "xxxxxxx"                  
  5. #define readFieldAPIKey "xxxxxxxx"               
  6. #define readStatusAPIKey "xxxxxxx"  
复制代码

放置thingSpeakAddress、channelID、Write Feed API密钥。其余的字段不是必需的,但是如果需要从Web接收数据,它们需要填写。

  1. void setup() {
  2.   // put your setup code here, to run once:
  3.   // set the serial port at 115200
  4.   Serial.begin(115200);  //Initialize serial
  5.   delay(1000);
  6.   WiFi.mode(WIFI_STA);
  7.   ThingSpeak.begin(client);  // Initialize ThingSpeak
  8.   // todo: create a task to read an pin for get current & voltage and calculate watt and temperature of the solar panel
  9.   xTaskCreate(
  10.                 wifi_task,               /* Task function. */
  11.                 "wifi_task",             /* String with name of task. */
  12.                 1024 * 2,                /* Stack size in bytes. */
  13.                 NULL,                    /* Parameter passed as input of the task */
  14.                 5,            /* Priority of the task. */
  15.                 NULL);                   /* Task handle. */
  16.   Serial.print("Data Reading.");
  17. }
复制代码

在上面的代码中,初始化ThingSpeak服务,并创建了一个任务,该任务将获取与太阳能电池板相关的数据。


在loop函数中,通过模拟引脚读取电流和电压,然后取平均值。

  1. float solar_curr_adc_val = 0;
  2.   float solar_volt_adc_val = 0;
  3.   for (i = 0; i < NUMSAMPLES; i++) {
  4.                 curr_samples[i] = analogRead(curr_an_pin);
  5.                 volt_samples[i] = analogRead(volt_an_pin);
  6.                 temp_samples[i] = analogRead(ntc_temp_an_pin);
  7.                 delay(10);
  8.   }
  9.   // average all the samples out
  10.   float curr_avg = 0;
  11.   float volt_avg = 0;
  12.   float temp_avg = 0;
  13.   for (i = 0; i < NUMSAMPLES; i++) {
  14.                 curr_avg += curr_samples[i];
  15.                 volt_avg += volt_samples[i];
  16.                 temp_avg += temp_samples[i];
  17.   }
  18.   curr_avg /= NUMSAMPLES;
  19.   volt_avg /= NUMSAMPLES;
  20.   temp_avg /= NUMSAMPLES;
  21.   //Serial.print("ADC VALUE = ");
  22.   //Serial.println(ADC_VALUE);
  23.   // convert adc value to voltages for get actual Current & Voltage.
  24.   float solar_curr = (curr_avg * 3.3 ) / (4095);
  25.   float solar_volt = (volt_avg * 3.3 ) / (4095);
  26.   // by using a voltage divider we step down the actual voltage.
  27.   //for that reason we multiply the 6 with avg voltage to get the actual voltage of the solar panel.
  28.   solar_volt *= 6;
复制代码

通过创建分压器将输入电压除以6倍,从而将太阳能电压乘以6。


温度是使用对数形式从热敏电阻产生的。

  1.   // convert the value to resistance
  2.   temp_avg = 4095 / temp_avg - 1;
  3.   temp_avg = SERIESRESISTOR / temp_avg;
  4.   //Serial.print("Thermistor resistance ");
  5.   //Serial.println(temp_avg);
  6.   float steinhart;
  7.   steinhart = temp_avg / THERMISTORNOMINAL; // (R/Ro)
  8.   steinhart = log(steinhart);  // ln(R/Ro)
  9.   steinhart /= BCOEFFICIENT;  // 1/B * ln(R/Ro)
  10.   steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
  11.   steinhart = 1.0 / steinhart;  // Invert
  12.   steinhart -= 273.15;  // convert absolute temp to C
复制代码

每15秒读取一次数据。

  1. delay(1000);
  2.   count++;
  3.   Serial.print(".");
  4.   if (count >= 15 ) {
  5.                 count = 0;
  6.                 Serial.println("=========================================================================");
  7.                 Serial.print("Solar Voltage = ");
  8.                 Serial.println(solar_volt);
  9.                 Serial.print("Solar Current = ");
  10.                 Serial.println(solar_curr);
  11.                 float solar_watt = solar_volt * solar_curr;
  12.                 Serial.print("Solar Watt  = ");
  13.                 Serial.println(solar_watt);
  14.                 Serial.print("Solar Temperature  = ");
  15.                 Serial.println(steinhart);
  16.                 Serial.println("=========================================================================");
复制代码

但连接到WiFi时,使用函数Thing.Speak.setField();传输各个字段的数据。。

  1.    if (WiFi.status() == WL_CONNECTED) {
  2.                 ThingSpeak.setField(1, solar_volt);
  3.                 ThingSpeak.setField(2, solar_curr);
  4.                 ThingSpeak.setField(3, solar_watt);
  5.                 ThingSpeak.setField(4, steinhart);
  6.                 // write to the ThingSpeak channel
  7.                 int x = ThingSpeak.writeFields(channelID, writeFeedAPIKey);
  8.                 if (x == 200) {
  9.                 Serial.println("Channels update successful.");
  10.                 }
  11.                 else {
  12.                 Serial.println("Problem updating channel. HTTP error code " + String(x));
  13.                 }
  14.                 } else {
  15.                 Serial.println("\r\n############################################################");
  16.                 Serial.println("Failed to update Data to thingSpeak Server. ");
  17.                 Serial.println("WiFi not connected...");
  18.                 Serial.println("############################################################\r\n");
  19.                 }
  20.   Serial.print("Data Reading.");
  21.   }
  22. }
复制代码

在以下代码段中创建的Wi-Fi任务-

  1. void wifi_task( void * parameter ) {
  2.   while (1) {
  3.                 if (WiFi.status() != WL_CONNECTED) {
  4.                 Serial.print("Attempting to connect to SSID: ");
  5.                 Serial.println(WLAN_SSID);
  6.                 while (WiFi.status() != WL_CONNECTED) {
  7.                 WiFi.begin(WLAN_SSID, WLAN_PASS);  // Connect to WPA/WPA2 network. Change this line if using open or WEP network
  8.                 Serial.print(".");
  9.                 delay(5000);
  10.                 }
  11.                 Serial.println("\nConnected.");
  12.                 Serial.println();
  13.                 Serial.println("WiFi connected");
  14.                 Serial.println("IP address: ");
  15.                 Serial.println(WiFi.localIP());
  16.                 }
  17.                 vTaskDelay( 1000 / portTICK_PERIOD_MS);
  18.   }
  19.   vTaskDelete(NULL);
  20. }
复制代码

测试和监控数据

将太阳能电池板与电路连接,并放置在阳光下进行测试,如下所示。

IoT-Based-Solar-Panel-Power-Monitoring.jpg


我们的电路能够从太阳能板上读取输出电压、电流和功率,并通过Thingspeak通道实时更新数据,如下所示。

IoT-Enabled-Solar-Power-Monitoring.png


上图中显示了15分钟的数据。 由于这是一个户外操作项目,因此需要使用适当的PCB以及外壳。希望您喜欢本教程并学到了一些有用的东西。


代码

以下是本文使用的完整代码: main.zip (2 KB, 下载次数: 13)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-27 10:46 , Processed in 0.041664 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表