아두이노 우노와 이더넷 실드로 정확한 태양광 복사량 측정하기
부품 및 소모품
| 아두이노 우노 (Arduino UNO) |
× |
1 |
| 아두이노 이더넷 실드 2 |
× |
1 |
| 태양전지 (솔라 셀) |
× |
1 |
| 10kΩ 저항 |
× |
1 |
필수 도구
프로젝트 소개
배경
온도, 습도, 조도 센서는 흔하지만 태양 복사량(일사량)을 측정하는 저렴한 센서는 없습니다. 정식 계측기인 피라노미터(Pyranometer)는 200~800달러로 취미용으론 부담됩니다. 집 옥상에 태양광 패널 설치 전, 우리 동네 일사량을 직접 측정해 보고 싶어 직접 만들었습니다. 흔한 부품과 아두이노로 저렴하게 구현 가능합니다.
세팅
- 태양전지 선 2가닥(검정=그라운드, 빨강=VCC) 확인. 멀티미터로 극성 확인: 검정 프로브 연결 시 전압이 양수면 그 배선이 그라운드.
- 그라운드 → 아두이노 GND, VCC → 10kΩ 저항 → 아날로그 핀 A0. 저항은 셀 내부 저항보다 훨씬 커야 계산이 정확합니다.
태양전지는 입사 에너지에 비례해 전압을 생성합니다. 이 관계를 이용해 일사량(W/m²)을 추정합니다.
필요 파라미터:
- 아두이노 아날로그 기준 전압 = 5V (보드별 확인)
- 태양전지 최대 출력 전압 (일반 계산기용 셀 약 5V)
- 태양전지 크기 (자, 길이×너비로 면적 구함)
계산 공식:
- 전력 = (analogRead(A0)²) / 저항값
- 면적 = 길이 × 너비 (직사각형 가정, m² 단위)
- 일사량 = 전력 / 면적
샘플 코드 (시리얼 출력)
#define ANALOG_PIN A0
#define RESISTANCE 10 // kΩ 단위
#define PANEL_LENGTH 60 // mm
#define PANEL_WIDTH 20 // mm
volatile float Area, Power, Radiation;
void setup() {
Serial.begin(9600);
while(!Serial);
delay(100);
}
void loop() {
Area = PANEL_LENGTH * PANEL_WIDTH / 10000.0; // m²
Power = pow(analogRead(ANALOG_PIN), 2) / RESISTANCE;
Radiation = Power / Area;
char msg[64];
sprintf(msg, " The Solar Radiation is %f W/M2 ", Radiation);
Serial.println(msg);
delay(1000);
}
평균 일사량: 맑은 날 150~300 W/m², 적도/한여름엔 900 W/m²까지.
이더넷 실드 추가로 웹 모니터링
이더넷 실드를 아두이노 위에 꽂고 핀 매핑만 유지하면 됩니다. 웹 서버로 5초마다 갱신되는 페이지에 일사량 표시.
#include <SPI.h>
#include <Ethernet.h>
// ... (위와 같은 정의 및 변수)
byte mac[] = {0xDE,0x0D,0x8E,0xEF,0xFE,0xED};
IPAddress ip(192,168,1,177);
EthernetServer server(80);
void setup() {
Serial.begin(9600);
while(!Serial);
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
void loop() {
Area = PANEL_LENGTH * PANEL_WIDTH / 10000.0;
Power = pow(analogRead(ANALOG_PIN), 2) / RESISTANCE;
Radiation = Power / Area;
char msg[64];
sprintf(msg, " The Solar Radiation is %f W/M2 ", Radiation);
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println("Refresh: 5");
client.println();
client.println("");
client.println("");
client.print(msg);
client.println("
");
client.println("");
break;
}
if (c == '\n') currentLineIsBlank = true;
else if (c != '\r') currentLineIsBlank = false;
}
}
delay(1);
client.stop();
Serial.println("client disconnected");
}
}
회로도
태양전지, 저항, 아두이노 연결 회로도