Accurate zonnestralingsmeting met Arduino UNO en Ethernet Shield
Onderdelen en benodigdheden
| Arduino UNO | × | 1 |
| Arduino Ethernet Shield 2 | × | 1 |
| Zonnecel (zonnepaneel) | × | 1 |
| Weerstand 10k ohm | × | 1 |
Nodige tools en machines
| Digitale multimeter |
Over dit project
Over
Er zijn veel sensoren beschikbaar voor het meten van allerlei weersomstandigheden zoals temperatuur, vochtigheid, lichtintensiteit, etc., maar er zijn geen makkelijk verkrijgbare sensoren voor het meten van de hoeveelheid zonnestraling. Dit komt omdat zonnestraling moeilijk te meten is, ondanks dat we het elke dag op onze huid voelen.
Zonnestraling (solar irradiance) is de vermogensdichtheid per eenheidsoppervlakte die van de Zon ontvangen wordt in de vorm van elektromagnetische straling in het golflengtebereik van het meetinstrument. De brede golflengterange van de Zon is een andere factor die meting bemoeilijkt.
Het instrument voor het meten van zonnestraling heet een pyranometer. Pyranometers kosten overal van $200 tot $800, zelfs bij Chinese leveranciers, wat ze onbereikbaar maakt voor de gemiddelde hobbyist. Meer informatie: Wikipedia.
Ik keek recent naar het kopen van een zonnepaneel voor mijn huis en wilde weten of het de moeite waard was, dus wilde ik de hoeveelheid beschikbare zonne-energie op mijn locatie schatten. Ik wilde geen pyranometer kopen, dus dacht ik: waarom niet zelf een maken? Goedkoper en leuker!
Zo kwam ik op het idee om mijn eigen coole gadget te bouwen die veel goedkoper is en kan helpen de zonnestraling te schatten. Het gebruikt gemakkelijk verkrijgbare componenten en de Arduino voor de berekeningen. Ik haalde de meeste componenten van Chinavasion, maar er zijn veel andere bronnen aangezien alles algemeen verkrijgbaar is.
Opstelling
- Je zonnecel moet 2 draden hebben: één ground (zwart) en één live (rood). Als je andere kleurcodes hebt of ze niet kunt onderscheiden, meet met je multimeter. Verbind de meetpennen met beide draden. Als de weergegeven spanning positief is, is de draad waar de zwarte pen op zit de ground, de rode is live. Als de spanning negatief is, is het omgekeerd.
- Verbind de ground-draad van je zonnecel met de Arduino ground en de VCC-draad met een analoge pin via de gekozen weerstand. Voor dit project gebruiken we analoge pin A0. De weerstand is cruciaal voor onze berekeningen omdat we verwachten dat deze vele malen groter is dan de interne weerstand van de cel.
Dat is alles wat we nu nodig hebben. Nu de code. Zonnecellen produceren energie door zonnestraling om te zetten in elektrische energie: hoe hoger de energie (straling en lichtenergie) van de Zon, hoe hoger de geproduceerde spanning. We gebruiken deze recht evenredige relatie om de zonnestraling te schatten.
De volgende parameters zijn nodig:
- Arduino Analog Referentie spanning = 5V (kan verschillen per board)
- Maximale uitgangsspanning van je zonnecel (variëert per zonnepaneel, moet je controleren, essentieel voor berekening; gemiddelde rekencel zonnecel is rond 5V)
- Afmetingen van zonnecel. Meet dit met een liniaal (lengte en breedte of parameters voor oppervlakte).
We schatten de zonnestraling door vermogen van de zonnecel te berekenen en te delen door zijn oppervlakte.
- Vermogen = pow(analogRead(A0), 2) / Weerstand
- Oppervlakte = lengte * breedte (aannemend rechthoek)
- Zonnestraling = vermogen / oppervlakte
Hier is de voorbeeldcode:
/*------------------------------------------------------------------------------------------------------------------------*/
#define ANALOG_PIN A0 // Analog pin
#define RESISTANCE 10 // Weerstand in duizenden ohms (10k = 10)
#define PANEL_LENGTH 60 // Lengte zonnecel in mm
#define PANEL_WIDTH 20 // Breedte zonnecel in mm
volatile float Area;
volatile float Power;
volatile float Radiation;
/* Hoofdfunctie Setup */
void setup() {
Serial.begin(9600);
while(!Serial);
delay(100);
}
/* Hoofdfunctie Loop */
void loop() {
Area = PANEL_LENGTH * PANEL_WIDTH / (100*100); // delen door 10000 voor oppervlakte in m²
Power = pow(analogRead(ANALOG_PIN), 2) / RESISTANCE; // Vermogen berekenen
Radiation = Power / Area;
char *msg;
sprintf(msg, " De zonnestraling is %f W/M2 ", Radiation); // Bericht genereren
Serial.println(msg);
delay(1000);
}
/*----------------------------------------------------------------------------------------------------------------------------*/
Gemiddelde bestralingswaarden voor een normale dag lopen van 150 tot 300 W/m². Maar dit varieert sterk per locatie. Op een zonnige dag of nabij de evenaar kan het oplopen tot 900 W/m².
Om internetfunctionaliteit toe te voegen, gebruiken we de Ethernet Shield. Geen extra aansluitingen nodig: monteer de shield op de Arduino en plaats de pinnen op de overeenkomstige posities op de shield (pin 1 op Arduino blijft pin 1 op shield).
Code
Voorbeeldcode voor pyranometer (Arduino)
#define ANALOG_PIN A0
#define RESISTANCE 10
#define PANEL_LENGTH 60
#define PANEL_WIDTH 20
volatile float Area;
volatile float Power;
volatile float Radiation;
void setup() {
Serial.begin(9600);
while(!Serial);
delay(100);
}
void loop() {
Area = PANEL_LENGTH * PANEL_WIDTH / (100*100);
Power = pow(analogRead(ANALOG_PIN), 2) / RESISTANCE;
Radiation = Power / Area;
char *msg;
sprintf(msg, " The Solar Radiation is %f W/M2 ", Radiation);
Serial.println(msg);
delay(1000);
}
Ethernet functie code (Arduino)
#include <SPI.h>
#include <Ethernet.h>
#define ANALOG_PIN A0
#define RESISTANCE 10
#define PANEL_LENGTH 60
#define PANEL_WIDTH 20
volatile float Area;
volatile float Power;
volatile float Radiation;
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 / (100*100);
Power = pow(analogRead(ANALOG_PIN), 2) / RESISTANCE;
Radiation = Power / Area;
char *msg;
sprintf(msg, " The Solar Radiation is %f W/M2 ", Radiation);
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
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");
}
}
Schema
Schema van zonnepaneel, weerstand en aansluitingen.

Productieproces
- Temperatuurmeting op Raspberry Pi met Maxim 1-Wire sensoren en DS2482 I2C-brug
- K30 CO2-sensor: Real-time binnenluchtkwaliteitmonitoring met Arduino
- Communicatie voor doofblinden vergemakkelijken met 1Sheeld en Arduino
- Slimme spaarpot bouwen: Muntenacceptor besturen met Arduino Nano
- Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
- Een DFRobot Capacitieve Vingerafdruksensor integreren met Arduino of ESP8266
- Interactief Nextion HMI-weerstation met Arduino Mega en sensoren
- Arduino-gebaseerde 6-DoF Robotarm Gestoeerd met Wii Nunchuk
- Zonnetracker V2.0 – Geavanceerd DIY Zonnepaneel Volgsysteem
- Een nauwkeurig meetwieltje bouwen met Arduino Nano en draaiencoder
- Compact Arduino Radarsysteem met HC-SR04 Ultrasonische Sensor & 1.8" Display