- IoT対応の太陽光発電モニターに適したコンポーネントの選択
- IoTベースの太陽光発電モニタリングの回路図
- ThingSpeakの設定
- ESP32を使用した太陽光発電モニタリング用のArduinoコード
- データのテストと監視
再生可能エネルギーの分野では、太陽の力を利用してエネルギーを生産することが再生可能エネルギーの最も簡単で商業的に実行可能な方法であるため、太陽エネルギーが最前線にあります。ソーラーパネルと言えば、パネルから最適な出力を得るためには、ソーラーパネル出力の出力を監視する必要があります。そのため、リアルタイムの監視システムが必要になります。大規模な太陽光発電所では、各パネルからの出力を監視するためにも使用でき、ほこりの蓄積を特定するのに役立ちます。また、動作中の障害状態を防ぎます。以前の記事のいくつかでは、太陽エネルギー携帯電話の充電器や太陽インバーター回路など、いくつかの太陽エネルギー関連のプロジェクトを構築しました。太陽エネルギーに関する他のプロジェクトを探している場合は、それらをチェックできます。
このプロジェクトでは、MPPT (Maximum Power Point Tracker)ベースのバッテリー充電技術を組み込んで、充電時間の短縮と効率の向上に役立つIoTベースの太陽光発電監視システムを作成します。また、回路の安全面を改善するために、パネルの温度、出力電圧、および電流を測定します。最後に、何よりも、ThingSpeakクラウドサービスを使用して、世界中のどこからでも出力データを監視します。このプロジェクトは、以前に構築したMPPTソーラー充電コントローラープロジェクトの続きであることに注意してください。ここでは、ESP32 IoT開発ボードを使用して、パネルの出力電圧、電流、および電力を監視します。
IoT対応の太陽光発電モニターに適したコンポーネントの選択
太陽のモニター、それが監視し、ソーラーシステムの障害を検出することは非常に容易になります。このようなシステムを設計する際に、コンポーネントの選択が非常に重要な部分になるのはこのためです。以下に、使用したパーツのリストを示します。
- ESP32開発ボード
- MPPT回路(任意のソーラー回路にすることができます)
- シャント抵抗(たとえば、1オーム1ワット-最大1Aの電流に適しています)
- リチウム電池(7.4vを推奨)。
- アクティブなWi-Fi接続
- ソーラーパネルの温度センサー
- 分圧回路(説明を参照)
Esp32開発ボード:
IoT対応アプリケーションの場合、アナログピンからのデータを処理し、Wi-Fiやクラウドなどのあらゆる種類の接続プロトコルを介してデータを送信できる適切な種類の開発ボードを選択することが不可欠です。サーバ。豊富な機能を備えた低コストのマイクロコントローラーであるESP32を特に選択しました。また、Wi-Fiラジオを内蔵しているので、インターネットに簡単に接続できます。
ソーラー回路:
ソーラー充電回路は、ソーラーパネルからより高い電圧を取得し、それを充電電圧に変換して、バッテリーを効率的に充電できるようにする回路です。このプロジェクトでは、以前のプロジェクトの1つですでに作成したLT3562ベースのMPPT充電コントローラー回路基板を使用します。ただし、このIoT対応の監視を組み込む場合は、あらゆる種類のソーラー回路を使用できます。このボードを選択したのは、回路に最大電力点追従(MPPT)が装備されているため、低電力ソーラーパネルプロジェクトに役立ちます。これは、ソーラーパネルから小さなリチウム電池を充電する効率的な方法です。
シャント抵抗:
どの抵抗器もオームの法則に従います。つまり、抵抗器に一定量の電流が流れると、一定量の電圧降下が発生します。シャント抵抗も例外ではなく、特に電流の測定に使用されます。ただし、ソーラーパネルを流れる公称電流に応じて、マイクロコントローラーユニットで測定できる適切な量の電圧を生成するシャント抵抗を選択してください。しかし同時に、抵抗器のワット数も重要です。シャント抵抗のワット数の選択も重要です。
電圧降下は、以下の式を使用して計算できます。これはオームの法則として知られています-
V = I x R
Vは、「I」の間に生成される電圧、つまり抵抗器「R」の量を流れる電流の量です。たとえば、1オームの抵抗器には1Aの電流が流れると1Vの電圧降下が発生します。
抵抗器のワット数については、以下の式を使用できます-
P = I 2 R
ここで、Iは最大電流、Rは抵抗値です。1オームの抵抗で1Aの電流の場合、電力損失には1ワットで十分です。ただし、これは小さなソーラーパネルプロジェクトには役立ちますが、ソーラーグリッド関連のアプリケーションにはまったく適していません。このような場合、非侵襲的な電流測定技術を実際に使用する必要があります。このような場合、電流の流れを正確に測定でき、非常に少量の電流と非常に大量の電流を測定できます。
リチウム電池:
リチウム電池の選択は、ソーラーパネルを含むプロジェクトの重要な部分です。常にオンのままでデータを常にチェックして送信するマイクロコントローラユニットは、安定した動作のために少なくとも100ミリアンペアの電流を必要とするためです。
バッテリー容量は、モンスーンのために太陽が輝いていないときに、少なくとも4〜5日間マイクロコントローラーに電力を供給できるものでなければなりません。バッテリの観点からは、充電電流が負荷電流よりも大きくなければならないことも重要です。誰かが100mAの負荷をバッテリーに接続し、それよりも少ない充電電流を提供するのは非常に珍しいことです。安全を期すために、負荷電流の少なくとも5倍の充電電流が必要です。
一方、バッテリ電圧は、マイクロコントローラに必要な通常の電圧レギュレータ入力電圧よりも高くする必要があります。たとえば、7.4Vのリチウム電池を3.3Vと5.0Vの両方のリニア電圧レギュレータに接続できます(リニアレギュレータはLDOとスイッチングよりも高いドロップアウト電圧を必要とするため)。
私たちのプロジェクトでは、定格7.4Vの4000mAHバッテリーを使用しました。ESP32に十分な電流と電圧の出力を提供する5.0Vレギュレーターを使用しました。
分圧器:
分圧器は、ソーラーパネルの電圧測定の重要な部分です。マイクロコントローラのI / O電圧入力に従って電圧を分割する分圧器を選択する必要があります。
分圧器の出力電圧がマイクロコントローラの最大I / O電圧(ESP32の場合は3.3V)を超えないように、上記の抵抗を選択してください。ただし、ポテンショメータを使用することをお勧めします。ポテンショメータを使用すると、ソーラーパネルの定格電圧を高くまたは低く選択できる柔軟性が得られ、マルチメータを使用して電圧を簡単に設定できます。
私たちの場合、分圧器として機能するポテンショメータがMPPTボード回路にあります。分圧器は分圧係数6Vに設定しました。ポットの入力と出力に2つのマルチメータを接続し、ソーラーパネルの公称出力電圧が18Vであるため、入力電圧が18Vの場合に出力が3Vになる値を設定しました。
ソーラーパネルの温度センサー:
ソーラーパネルの出力は、ソーラーパネルの温度と直接関係があります。どうして?なぜなら、ソーラーパネルの温度が上昇し始めると、ソーラーパネルからの出力電流は指数関数的に増加し、電圧出力は直線的に減少し始めるからです。
電力の式によると、ワット数は電圧と電流の積に等しく(W = V x A)、出力電圧を下げると、電流が増加した後でもソーラーパネルの出力電力が減少します。さて、私たちの頭に浮かぶ次の質問は、太陽の温度をどのように測定するかということです。まあ、それは直射日光にさらされているので、そして明白な理由のために、ソーラーパネルは一般に熱環境にさらされているので、それはかなり興味深いです。ソーラーパネルの温度を測定する最良の方法は、平面温度センサーを使用することです。また、ソーラーパネルに直接配置されたKタイプの熱電対を使用することをお勧めします。
このアプリケーションでは、以下に示すサーミスタベースの温度センサーモジュールを使用しました。
IoTベースの太陽光発電モニタリングの回路図
IoT対応の太陽光発電モニターの完全な回路図を以下に示します。回路図は単純です。赤い一点鎖線ボードは、このプロジェクトで使用したMPPTボードです。
ThingSpeakの設定
ThingSpeakでアカウントを作成し、[マイチャンネル]オプションに移動して、[新しいチャンネル]をクリックします。
フィールド名を使用して新しいチャネルを作成します。
フィールドを設定した後、書き込みAPIキーが使用可能なAPIキーフィールドに移動します。このキーは、チャネルIDと同様にコードで提供する必要があります。
ThingSpeakアドレスは同じページにあります。
上記の手順で、ThingSpeakを非常に簡単に設定できます。ThingSpeakとそのセットアッププロセスについて詳しく知りたい場合は、このトピックに関する以前の記事を確認してください。
ESP32を使用した太陽光発電モニタリング用のArduinoコード
完全なESP32太陽光発電監視コードは、このページの下部にあります。コードは、以下に示すように、SSID、パスワード、およびその他のいくつかの定数パラメーターを定義することから始まります。
//アップリンクのWiFiSSIDとPWDを定義します。 #define WLAN_SSID "xxxx" #define WLAN_PASS "xxxxxxxxxx"
// 25℃での抵抗 #defineTHERMISTORNOMINAL 10000 //温度 公称抵抗の場合(ほとんどの場合25 C) #define TEMPERATURENOMINAL 25 //サーミスタのベータ係数(通常は3000-4000) #define BCOEFFICIENT 3950 //「その他」の抵抗の値 #defineSERIESRESISTOR 10000
サーミスタの公称オームは、公称温度で提供されます。サーミスタのデータシートに応じてこの値を設定してください。サーミスタのベータ係数と直列抵抗値を入力します。
//電流と電圧のアナログを定義します constint curr_an_pin = 35; const int volt_an_pin = 34; const int ntc_temp_an_pin = 33;
PINはここで定義されます。
#define thingsSpeakAddress "xxxxxxxxx" #define channelID xxxxx #define writeFeedAPIKey "xxxxxxx" #define readFeedAPIKey "xxxxxxx" #define readFieldAPIKey "xxxxxxxx" #define readStatusAPIKey "xxxxxxx"
thingsSpeakAddress、channelID、Write Feed APIKeyを入力します。残りのことは必須ではありませんが、Webからデータを受信する必要がある場合でも役立ちます。
void setup(){ //セットアップコードをここに配置して、1回実行します 。// シリアルポートを115200に設定します Serial.begin(115200); //シリアル delay(1000);を 初期化し ます。 WiFi.mode(WIFI_STA); ThingSpeak.begin(client); // ThingSpeakを初期化します // todo:電流と電圧を取得するためのピンを読み取り、ソーラーパネルのワットと温度を計算するタスクを作成します xTaskCreate( wifi_task、/ *タスク関数。* / "wifi_task"、/ *名前の文字列タスク。* / 1024 * 2、/ *スタックサイズ(バイト単位)。* / NULL、/ *タスクの入力として渡されるパラメーター* / 5、/ *タスクの優先度。* / NULL); / *タスクハンドル。 * / Serial.print( "Data Reading。"); }
上記のコードでは、ThingSpeakサーバーが初期化され、ソーラーパネルに関連するデータを取得するタスクが作成されます。
メインループでは、太陽電流と電圧がアナログピンを介して検出され、平均化が行われます。
float solar_curr_adc_val = 0; float 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); delay(10); } //すべてのサンプルを平均して floatcurr_avg = 0; float volt_avg = 0; float temp_avg = 0; for(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値を電圧に変換します。 float solar_curr =(curr_avg * 3.3)/(4095); float solar_volt =(volt_avg * 3.3)/(4095); //分圧器を使用して、実際の電圧を下げます。 //そのため、6に平均電圧を掛けて、ソーラーパネルの実際の電圧を取得します。 solar_volt * = 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 / = BCOEFFICIENT; // 1 / B * ln(R / Ro) steinhart + = 1.0 /(TEMPERATURENOMINAL + 273.15); // +(1 / To) steinhart = 1.0 / steinhart; // steinhartを 反転 -= 273.15; //絶対温度をCに変換します
データは15秒ごとに読み取られます。
delay(1000); count ++; Serial.print( "。"); if(count> = 15){ count = 0; Serial.println( "============================================= ============================ "); Serial.print( "ソーラー電圧="); Serial.println(solar_volt); Serial.print( "Solar Current ="); Serial.println(solar_curr); float solar_watt = solar_volt * solar_curr; Serial.print( "ソーラーワット="); Serial.println(solar_watt); Serial.print( "太陽温度="); Serial.println(steinhart); Serial.println( "============================================= ============================ ");
それぞれのフィールドのデータは、関数 Thing.Speak.setField(); を使用して送信され ます。 WiFiが接続されているとき。
if(WiFi.status()== WL_CONNECTED){ ThingSpeak.setField(1、solar_volt); ThingSpeak.setField(2、solar_curr); ThingSpeak.setField(3、solar_watt); ThingSpeak.setField(4、steinhart); // ThingSpeakチャネルに書き込みますintx = ThingSpeak.writeFields(channelID、writeFeedAPIKey); if(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); while(WiFi.status()!= WL_CONNECTED){ WiFi.begin(WLAN_SSID、WLAN_PASS); // WPA / WPA2ネットワークに接続します。オープンネットワークまたはWEPネットワーク Serial.print( "。"); を使用している場合は、この行を変更してください 。 delay(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と同封のボックスを使用する必要があります。エンクロージャーは、回路が雨の中でも防水性を維持するように作成する必要があります。この回路を変更したり、このプロジェクトのさらなる側面について話し合ったりするには、CircuitDigestのアクティブなフォーラムをご利用ください。チュートリアルを楽しんで、何か役立つことを学んだことを願っています。