在可再生能源领域,太阳能是最重要的,因为利用太阳能发电是最简单且商业上可行的可再生能源。说到太阳能电池板,需要监控太阳能电池板输出的输出功率,以便从太阳能电池板获得最佳功率输出。这就是为什么需要实时监控系统的原因。在大型太阳能发电厂中,它还可用于监视每个面板的功率输出,从而有助于识别灰尘堆积。它还可以防止在运行期间出现任何故障情况。在以前的一些文章中,我们已经建立了一些与太阳能相关的项目,例如太阳能手机充电器和太阳能逆变器电路等。如果您正在寻找更多太阳能项目,可以查看一下。
在此项目中,我们将通过结合基于MPPT (最大功率点跟踪器)的电池充电技术来制造基于物联网的太阳能监控系统,这将有助于减少充电时间并提高效率。另外,我们将测量面板温度,输出电压和电流,以改善电路的安全性。最后,最重要的是,我们将使用ThingSpeak云服务来监视来自世界各地的输出数据。请注意,该项目是我们先前构建的MPPT太阳能控制器项目的延续。在这里,我们将使用ESP32 IoT开发板监控面板的输出电压,电流和功率。
为支持IoT的太阳能监控器选择正确的组件
有了太阳能监视器,监视和检测任何太阳能系统中的故障变得非常容易。这就是为什么在设计这样的系统时组件选择成为非常重要的部分的原因。以下是我们使用的零件清单。
- ESP32开发板
- MPPT电路(可以是任何太阳能电路)
- 分流电阻器(例如1欧姆1瓦-适用于高达1A的电流)
- 锂电池(首选7.4v)。
- 活跃的Wi-Fi连接
- 太阳能电池板温度传感器
- 分压器电路(请参阅说明)
Esp32开发板:
对于支持IoT的应用,至关重要的是选择正确类型的开发板,该开发板将能够处理其模拟引脚上的数据,并通过任何类型的连接协议(例如Wi-Fi或云端)将数据发送出去服务器。我们特别选择ESP32,因为它是一款具有众多功能的低成本微控制器。此外,它还具有内置的Wi-Fi无线电,通过它我们可以非常轻松地连接到互联网。
太阳能电路:
太阳能充电电路是一种从太阳能电池板获取更高电压并将其转换为充电电压的电路,以便可以有效地为电池充电。对于这个项目,我们将使用在先前项目之一中已经制造的基于LT3562的MPPT充电控制器电路板。但是,如果您要嵌入此IoT启用监控,则可以使用任何种类的太阳能电路。我们选择此板是因为该电路配备了最大功率点跟踪(MPPT),这对低功率太阳能电池板项目非常有利。这是从太阳能电池板为小型锂电池充电的有效方法。
分流电阻:
任何电阻器都遵循欧姆定律,这意味着如果一定量的电流流过电阻器,就会出现一定量的压降。并联电阻器也不例外,它专门用于测量电流。但是,根据流过太阳能电池板的标称电流,选择一个分流电阻器,该分流电阻器将产生足够的电压,该电压可由微控制器单元测量。但是,与此同时,电阻器的瓦数也很重要。分流电阻器功率的选择也很重要。
可以使用以下公式计算电压降。这就是欧姆定律-
V = I x R
V是在“ I”期间将产生的电压,即流过电阻“ R”的电流量。例如,当1A电流流过时,1欧姆电阻将产生1V的压降。
对于电阻器的瓦数,可以使用以下公式:
P = I 2 R
其中,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电压输入对电压进行分压。
选择上述电阻器时,应使分压器输出电压不超过微控制器的最大I / O电压(ESP32为3.3V)。但是,建议使用电位计,因为它可以灵活地选择更高或更低额定电压的任何太阳能电池板,并且可以使用万用表轻松设置电压。
在我们的案例中,MPPT电路板上有一个电位计,用作分压器。我们将分压器的分频系数设置为6V。我们连接了两个万用表,一个在锅的输入端,另一个在锅的输出端,并设置了一个值,即当太阳能电池板的标称输出电压为18V时,当输入电压为18V时,输出将为3V。
太阳能电池板温度传感器:
太阳能电池板的功率输出与太阳能电池板的温度直接相关。为什么?因为随着太阳能电池板温度的升高,太阳能电池板的输出电流呈指数增长,而电压输出开始线性下降。
根据功率公式,瓦数等于电压乘以电流(W = V x A),即使在增加电流之后,降低输出电压也会降低太阳能电池板的输出功率。现在,我们想到的下一个问题是,如何测量太阳温度?好吧,这很有趣,因为太阳能电池板通常会暴露在直射阳光下并出于明显的原因而暴露在高温环境中。测量太阳能电池板温度的最佳方法是使用平面温度传感器。还建议使用直接置于太阳能电池板中的K型热电偶。
对于我们的应用,我们使用了基于热敏电阻的温度传感器模块,如下所示。
基于物联网的太阳能监控电路图
IoT太阳能监控器的完整电路图如下所示。原理图很简单。红色的双点划线板是我们用于该项目的MPPT板。
设置ThingSpeak
使用ThingSpeak创建一个帐户,然后转到“我的频道”选项,然后单击“新建频道”。
使用字段名称创建一个新通道。
现在,在设置字段后,转到提供API密钥的API密钥字段。需要在代码中以及通道ID中提供此密钥。
ThingSpeak地址可以在同一页面上找到。
通过上述步骤,您可以非常轻松地设置ThingSpeak。如果您想了解有关ThingSpeak及其设置过程的更多信息,可以查看我们以前关于该主题的文章。
使用ESP32进行太阳能监控的Arduino代码
完整的ESP32太阳能监控代码可在本页底部找到。该代码首先定义您的SSID,密码和其他一些常量参数,如下所示。
//定义用于上行链路的WiFi SSID和PWD。 #define WLAN_SSID“ xxxx” #define WLAN_PASS“ xxxxxxxxxx”
//在25摄氏度时的电阻 #define THERMISTORNOMINAL 10000 //温度。用于标称电阻(几乎始终为25 C) #define TEMPERATURENOMINAL 25 //热敏电阻的beta系数(通常为3000-4000) #define BCOEFFICIENT 3950 // //'其他'电阻的值 #define SERIESRESISTOR 10000
在标称温度下提供了热敏电阻的标称欧姆。根据热敏电阻的数据表设置该值。放入热敏电阻的Beta系数和串联电阻值。
//定义电流和电压的模拟 常量const int curr_an_pin = 35; const int volt_an_pin = 34; const int ntc_temp_an_pin = 33;
PIN在此处定义。
#define somethingSpeakAddress“ xxxxxxxxx” #define channelID xxxxx #define writeFeedAPIKey“ xxxxxxx” #define readFeedAPIKey“ xxxxxxx” #define readFieldAPIKey“ xxxxxxxx” #define readStatusAPIKey“ xxxxxxx”
放置thingSpeakAddress,channelID,Write Feed API密钥。其余的事情不是必需的,但是如果需要从Web接收数据,它们仍然有用。
void setup(){ //将您的安装代码放在此处,以运行一次: //将串行端口设置为115200 Serial.begin(115200); //初始化串行 延迟(1000); WiFi.mode(WIFI_STA); ThingSpeak.begin(client); //初始化ThingSpeak // TODO:创建任务以读取针用于得到太阳能电池板的电流和电压并计算瓦特和温度 xTaskCreate( wifi_task,/ *任务函数* /。 “wifi_task”,/ *字符串的名称* / 1024 * 2,/ *堆栈大小(以字节为单位)* / NULL,/ *作为任务的输入传递的参数* / 5,/ *任务的优先级* / NULL); / *任务句柄。 * / Serial.print(“数据读取”。); }
在上面的代码中,ThingSpeak服务器已初始化,并创建了一个任务,该任务将获取与太阳能电池板相关的数据。
在主回路中,通过模拟引脚感测太阳电流和电压,然后取平均值。
float solar_curr_adc_val = 0; 浮动solar_volt_adc_val = 0; for(i = 0; i <NUMSAMPLES; i ++){ curr_samples = AnalogRead(curr_an_pin); volt_samples = AnalogRead(volt_an_pin); temp_samples = AnalogRead(ntc_temp_an_pin); 延迟(10); } //将所有样本平均出 浮点数curr_avg = 0; 浮动volt_avg = 0; float temp_avg = 0; 对于(i = 0; i <NUMSAMPLES; i ++){ curr_avg + = curr_samples; volt_avg + = volt_samples; temp_avg + = temp_samples; } curr_avg / = NUMSAMPLES; volt_avg / = NUMSAMPLES; temp_avg / = NUMSAMPLES; //Serial.print("ADC VALUE =“); //Serial.println(ADC_VALUE); //将adc值转换为电压以获得实际的电流和电压。 浮动solar_curr =(curr_avg * 3.3)/(4095); 浮动solar_volt =(volt_avg * 3.3)/(4095); //通过使用分压器,我们降低了实际电压。 //因此,我们将6与平均电压相乘,得出太阳能电池板的实际电压。 solar_volt * = 6;
通过创建6的分压器将输入电压除以6倍,从而将太阳能电压乘以6来提交。
温度是使用对数形式从热敏电阻产生的。
//将值转换为电阻 temp_avg = 4095 / temp_avg-1; temp_avg = SERIESRESISTOR / temp_avg; //Serial.print(“热敏电阻电阻”); //Serial.println(temp_avg); 浮施泰因哈特 steinhart = temp_avg / THERMISTORNOMINAL; //(R / Ro) steinhart = log(steinhart); // ln(R / Ro) steinhart / = BCOEFFICICIENT; // 1 / B * ln(R / Ro) steinhart + = 1.0 /(TEMPERATURENOMINAL + 273.15); // +(1 / To) steinhart = 1.0 / steinhart; //反转 steinhart-= 273.15; //将绝对温度转换为C
每15秒读取一次数据。
延迟(1000); 数++; Serial.print(“。”); 如果(count> = 15){ count = 0; Serial.println(“ ============================================= ===========================); Serial.print(“ Solar Voltage =”); Serial.println(solar_volt); Serial.print(“ Solar Current =”); Serial.println(solar_curr); 浮动solar_watt = solar_volt * solar_curr; Serial.print(“ Solar Watt =”); Serial.println(solar_watt); Serial.print(“太阳能温度=”); Serial.println(steinhart); Serial.println(“ ============================================= ===========================);
使用函数 Thing.Speak.setField(); 传输各个字段的数据 。 连接WiFi时。
如果(WiFi.status()== WL_CONNECTED){ ThingSpeak.setField(1,solar_volt); ThingSpeak.setField(2,solar_curr); ThingSpeak.setField(3,solar_watt); ThingSpeak.setField(4,steinhart); //写入ThingSpeak通道 int x = ThingSpeak.writeFields(channelID,writeFeedAPIKey); 如果(x == 200){ Serial.println(“通道更新成功。”); } else { Serial.println(“问题更新通道。HTTP错误代码” + String(x)); } } else { Serial.println(“ \ r \ n #################################### ######################“); Serial.println(“无法将数据更新到thingSpeak服务器。”); Serial.println(“ WiFi未连接…”); Serial.println(“ ############################################ ############### \ r \ n“); } Serial.print(“数据读取”。); } }
在以下代码段中创建的Wi-Fi任务-
void wifi_task(void * parameter){ while(1){ if(WiFi.status()!= WL_CONNECTED){ Serial.print(“尝试连接到SSID:”); Serial.println(WLAN_SSID); 而(WiFi.status()!= WL_CONNECTED){ WiFi.begin(WLAN_SSID,WLAN_PASS); //连接到WPA / WPA2网络。如果使用开放式或WEP网络 Serial.print(“。”); 则更改此行 。 延迟(5000); } Serial.println(“ \ nConnected。”); Serial.println(); Serial.println(“ WiFi已连接”); Serial.println(“ IP地址:”); Serial.println(WiFi.localIP()); } vTaskDelay(1000 / portTICK_PERIOD_MS); } vTaskDelete(NULL); }
测试和监控数据
太阳能电池板与电路连接,并放置在阳光下进行测试,如下所示。
下面的视频演示了完整的工作。我们的电路能够从面板上读取输出电压,电流和功率,并通过Thingspeak通道实时更新它,如下所示。
如我们所见,上图中显示了15分钟的数据。由于这是一个户外操作项目,因此需要使用适当的PCB以及一个封闭的盒子。外壳的制作方法应使电路在雨中保持防水。要修改此电路或讨论该项目的其他方面,请使用Circuit Digest的活跃论坛。希望您喜欢本教程并学到了一些有用的东西。