- IoT 지원 태양 광 발전 모니터에 적합한 구성 요소 선택
- IoT 기반 태양 광 발전 모니터링을위한 회로도
- ThingSpeak 설정
- ESP32를 사용한 태양 광 발전 모니터링을위한 Arduino 코드
- 데이터 테스트 및 모니터링
재생 에너지 분야에서 태양 에너지는 태양 에너지를 사용하여 에너지를 생산하는 것이 가장 쉽고 상업적으로 실행 가능한 재생 가능 에너지이기 때문에 최전선에 있습니다. 태양 광 패널에 대해 말하자면, 태양 광 패널 출력의 출력 전력은 패널에서 최적의 전력 출력을 얻기 위해 모니터링되어야합니다. 이것이 실시간 모니터링 시스템이 필요한 이유입니다. 대형 태양 광 발전소에서는 먼지 축적을 식별하는 데 도움이되는 각 패널의 전력 출력을 모니터링하는데도 사용할 수 있습니다. 또한 작동 중 오류 상태를 방지합니다. 이전 기사 중 일부에서는 태양열 휴대 전화 충전기 및 태양 광 인버터 회로 등과 같은 몇 가지 태양 에너지 관련 프로젝트를 구축했습니다. 태양 광 발전에 대한 더 많은 프로젝트를 찾고 있다면 확인할 수 있습니다.
이번 프로젝트에서는 MPPT (Maximum Power Point Tracker) 기반 배터리 충전 기술 을 접목하여 IoT 기반 태양 광 모니터링 시스템 을 만들어 충전 시간을 단축하고 효율성을 높일 예정입니다. 또한 패널 온도, 출력 전압 및 전류를 측정하여 회로의 안전 측면을 개선 할 것입니다. 마지막으로, 무엇보다도 ThingSpeak 클라우드 서비스를 사용하여 전 세계 어디에서나 출력 데이터를 모니터링 할 것입니다. 이 프로젝트는 이전에 구축 한 MPPT 태양 광 충전 컨트롤러 프로젝트의 연속입니다. 여기서는 ESP32 IoT 개발 보드를 사용하여 패널의 출력 전압, 전류 및 전력을 모니터링합니다.
IoT 지원 태양 광 발전 모니터에 적합한 구성 요소 선택
태양 광 모니터를 사용하면 모든 태양 광 시스템의 오류를 모니터링하고 감지하기가 매우 쉽습니다. 이것이 바로 그러한 시스템을 설계 할 때 구성 요소 선택이 매우 중요한 부분이되는 이유입니다. 아래에 우리가 사용한 부품 목록이 있습니다.
- ESP32 개발 보드
- MPPT 회로 (어떤 태양열 회로도 가능)
- 션트 저항기 (예: 1 Ohm 1 와트-최대 1A 전류에 적합)
- 리튬 배터리 (7.4v 권장).
- 활성 Wi-Fi 연결
- 태양 광 패널 용 온도 센서
- 전압 분배기 회로 (설명 참조)
Esp32 개발 보드:
IoT 지원 애플리케이션의 경우 아날로그 핀의 데이터를 처리하고 Wi-Fi 또는 클라우드와 같은 모든 종류의 연결 프로토콜을 통해 데이터를 전송할 수있는 올바른 유형의 개발 기판을 선택하는 것이 중요합니다. 섬기는 사람. 우리는 ESP32가 수많은 기능을 갖춘 저비용 마이크로 컨트롤러이기 때문에 특별히 선택했습니다. 또한 Wi-Fi 라디오가 내장되어있어 인터넷에 매우 쉽게 연결할 수 있습니다.
태양 광 회로:
태양 광 충전 회로는 태양 광 패널에서 더 높은 전압을 받아 배터리를 효율적으로 충전 할 수 있도록 충전 전압으로 변환하는 회로입니다. 이 프로젝트에서는 이전 프로젝트 중 하나에서 이미 만든 LT3562 기반 MPPT 충전 컨트롤러 회로 기판을 사용합니다. 그러나이 IoT 활성화 모니터링을 내장하려면 모든 종류의 태양 광 회로를 사용할 수 있습니다. 회로에 저전력 태양 광 패널 프로젝트에 유용한 MPPT (Maximum Power Point Tracking)가 장착되어 있기 때문에이 보드를 선택했습니다. 태양 전지판에서 소형 리튬 배터리를 충전하는 효율적인 방법입니다.
션트 저항기:
모든 저항은 저항을 통해 일정량의 전류가 흐르면 일정량의 전압 강하가 나타나는 옴의 법칙을 따릅니다. 션트 저항기는 예외가 아니며 특히 전류 흐름을 측정하는 데 사용됩니다. 그러나 태양 전지판을 통과하는 공칭 전류 흐름에 따라 마이크로 컨트롤러 장치로 측정 할 수있는 적절한 양의 전압을 생성하는 션트 저항기를 선택하십시오. 그러나 동시에 저항의 와트도 중요합니다. 션트 저항 와트 수를 선택하는 것도 중요합니다.
전압 강하는 아래의 공식을 사용하여 계산할 수 있습니다. 이것은 옴의 법칙으로 알려져 있습니다.
V = 나 x R
V는 'I'동안 생성되는 전압, 즉 저항 'R'의 양을 통해 흐르는 전류의 양입니다. 예를 들어 1 옴 저항은 1A의 전류가 흐르면 1V의 전압 강하를 생성합니다.
저항기의 전력량은 아래 공식을 사용할 수 있습니다.
P = I 2 R
여기서 I는 최대 전류 흐름이고 R은 저항 값입니다. 1 Ohms 저항을 사용하는 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의 분할 계수로 전압 분배기를 설정했습니다. 우리는 두 개의 멀티 미터, 하나는 입력에, 다른 하나는 포트의 출력에 연결하고 입력 전압이 18V 일 때 태양 전지판의 공칭 출력 전압이 18V이므로 출력이 3V가되는 값을 설정했습니다.
태양 전지판 용 온도 센서:
태양 전지판 전력 출력은 태양 전지판의 온도와 직접 연결됩니다. 왜? 태양 전지판의 온도가 증가하기 시작하면 태양 전지판의 출력 전류가 기하 급수적으로 증가하고 전압 출력은 선형 적으로 감소하기 시작하기 때문입니다.
전력 공식에 따라 와트는 전압 곱하기 전류 (W = V x A)와 같으며, 출력 전압을 낮추면 전류 흐름이 증가한 후에도 태양 광 패널 출력 전력이 감소합니다. 이제 우리 마음에 떠오르는 다음 질문은 태양 온도를 측정하는 방법입니다. 음, 태양 전지판은 일반적으로 직사광선에 노출되고 명백한 이유로 열 환경에 노출되기 때문에 다소 흥미 롭습니다. 태양 전지판 온도를 측정하는 가장 좋은 방법은 평평한 표면 온도 센서를 사용하는 것입니다. 또한 태양 전지판에 직접 배치 된 K 유형 열전대를 사용하는 것이 좋습니다.
우리의 응용 분야에서는 아래에 표시된 서미스터 기반 온도 센서 모듈을 사용했습니다.
IoT 기반 태양 광 발전 모니터링을위한 회로도
IoT 지원 태양 광 발전 모니터 의 전체 회로도 가 아래에 나와 있습니다. 회로도는 간단합니다. 빨간색 점선 보드는이 프로젝트에 사용한 MPPT 보드입니다.
ThingSpeak 설정
ThingSpeak 계정을 만들고 "내 채널" 옵션으로 이동 한 다음 새 채널 을 클릭합니다.
필드 이름으로 새 채널을 만듭니다.
이제 필드를 설정 한 후 Write API Key를 사용할 수 있는 API Keys 필드로 이동합니다. 이 키는 코드와 채널 ID에 제공되어야합니다.
ThingSpeak 주소는 같은 페이지에서 찾을 수 있습니다.
위의 단계를 통해 ThingSpeak를 매우 쉽게 설정할 수 있습니다. ThingSpeak 및 설정 프로세스에 대해 자세히 알아 보려면 해당 주제에 대한 이전 기사를 확인하십시오.
ESP32를 사용한 태양 광 발전 모니터링을위한 Arduino 코드
전체 ESP32 태양 광 발전 모니터링 코드는이 페이지 하단에서 찾을 수 있습니다. 코드는 아래와 같이 SSID, 비밀번호 및 기타 몇 가지 상수 매개 변수를 정의하는 것으로 시작됩니다.
// 업 링크 용 WiFi SSID 및 PWD를 정의합니다. #define WLAN_SSID "xxxx" #define WLAN_PASS "xxxxxxxxxx"
// 25 ° C에서의 저항 #define THERMISTORNOMINAL 10000 // 온도. 공칭 저항 (거의 항상 25C ) #define TEMPERATURENOMINAL 25 // 서미스터의 베타 계수 (일반적으로 3000-4000) #define BCOEFFICIENT 3950 // '기타'저항의 값 #define SERIESRESISTOR 10000
서미스터 공칭 옴은 공칭 온도에서 제공됩니다. 서미스터의 데이터 시트에 따라이 값을 설정하십시오. 서미스터의 베타 계수와 직렬 저항 값을 입력합니다.
// 전류 및 전압에 대한 아날로그 정의 const int curr_an_pin = 35; const int volt_an_pin = 34; const int ntc_temp_an_pin = 33;
PIN은 여기에 정의되어 있습니다.
#define thingSpeakAddress "xxxxxxxxx" #define channelID xxxxx #define writeFeedAPIKey "xxxxxxx" #define readFeedAPIKey "xxxxxxx" #define readFieldAPIKey "xxxxxxxx" #define readStatusAPIKey "xxxxxxx"
thingSpeakAddress, channelID, Write Feed API 키를 입력합니다. 나머지는 필수 사항은 아니지만 웹에서 데이터를 수신해야하는 경우 여전히 유용합니다.
void setup () { // 여기에 설정 코드를 입력하여 한 번 실행합니다. // 직렬 포트를 115200으로 설정 Serial.begin (115200); // 직렬 지연 초기화 (1000); WiFi.mode (WIFI_STA); ThingSpeak.begin (클라이언트); // ThingSpeak 초기화 // todo: 전류 및 전압을 얻기 위해 핀을 읽고 태양 전지판의 와트 및 온도를 계산하는 작업을 만듭니다. xTaskCreate ( wifi_task, / * 작업 함수. * / "wifi_task", / * 이름이있는 문자열 태스크 * / 1024 * 2, / * 스택 크기 (바이트) * / NULL, / * 태스크 입력으로 전달 된 매개 변수 * / 5, / * 태스크 우선 순위 * / NULL); / * 작업 핸들. * / Serial.print ("데이터 읽기."); }
위 코드에서 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); 지연 (10); } // 모든 샘플의 평균을냅니다. float curr_avg = 0; 부동 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; 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 초마다 읽습니다.
지연 (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 채널에 쓰기 int x = 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 ("."); 지연 (5000); } Serial.println ("\ n 연결됨."); Serial.println (); Serial.println ("WiFi 연결됨"); Serial.println ("IP 주소:"); Serial.println (WiFi.localIP ()); } vTaskDelay (1000 / portTICK_PERIOD_MS); } vTaskDelete (NULL); }
데이터 테스트 및 모니터링
태양 전지판은 회로와 연결되어 아래 그림과 같이 테스트를 위해 햇빛에 배치됩니다.
전체 작업은 아래 비디오에 나와 있습니다. 우리 회로는 패널의 출력 전압, 전류 및 전력을 읽고 아래와 같이 thingspeak 채널에서 실시간으로 업데이트 할 수있었습니다.
보시다시피 위 그래프에는 15 분 데이터가 나와 있습니다. 실외 운영 프로젝트이므로 동봉 된 상자와 함께 적절한 PCB를 사용해야합니다. 인클로저는 회로가 우천시 방수 상태를 유지하도록 만들어야합니다. 이 회로를 수정하거나이 프로젝트의 추가 측면을 논의하려면 회로 다이제스트의 활성 포럼을 사용하십시오. 튜토리얼을 즐겁게 읽고 유용한 것을 배웠기를 바랍니다.