Zonne intentie meten met BH1750
24 berichten
• Pagina 2 van 3 • 1, 2, 3
Re: Zonne intentie meten met BH1750
Zal even in het kort uitleggen wat de bedoeling is.
Zonnepanelen leveren tegenwoordig ~320Wp (de dure) op bij een afmeting van 165 x 99 cm. bij volle zon en het paneel ideaal uitgericht.
Ik heb een testopstelling in de tuin staan welke zich de gehele dag "ideaal" op de zon richt.
Nu ben ik benieuwd wat ik had kunnen opwekken tov wat het paneel in werkelijkheid geeft.
Nu geeft de ene website LUX / 683 en de andere LUX x 0,0079, of te wel 1/683 of 1x0,0079......verschil 0,00146 of 0,0079 W/m2 per LUX
Dat is ook waarom ik begin te twijfelen aan beide waarden, er zit een factor ~6 verschil in (bij ~550nm)
Ik heb hier nog een filtertje van een IP-bewakingscamera liggen, deze filtert de IR van de LED's welke 's nachts aan zijn zodat je nightvision hebt.
Is maar een glaasje van 0,5x05cm maar dat lijkt me genoeg voor de sensor op de BH1750 cq GY-302.
Met de float ben ik er nog steeds niet uit, ik krijg dan vreemde waarde op de display.....zelfs zonder lichtinval
De W/m^2 blijft op 519 staan terwijl de Lux 0 is ??
Nu moet ik toegeven dat ik nog nooit met float gewerkt heb en het me uit de uitleg nog niet geheel duidelijk is waarom te gebruiken.
Zonnepanelen leveren tegenwoordig ~320Wp (de dure) op bij een afmeting van 165 x 99 cm. bij volle zon en het paneel ideaal uitgericht.
Ik heb een testopstelling in de tuin staan welke zich de gehele dag "ideaal" op de zon richt.
Nu ben ik benieuwd wat ik had kunnen opwekken tov wat het paneel in werkelijkheid geeft.
Nu geeft de ene website LUX / 683 en de andere LUX x 0,0079, of te wel 1/683 of 1x0,0079......verschil 0,00146 of 0,0079 W/m2 per LUX
Dat is ook waarom ik begin te twijfelen aan beide waarden, er zit een factor ~6 verschil in (bij ~550nm)
Ik heb hier nog een filtertje van een IP-bewakingscamera liggen, deze filtert de IR van de LED's welke 's nachts aan zijn zodat je nightvision hebt.
Is maar een glaasje van 0,5x05cm maar dat lijkt me genoeg voor de sensor op de BH1750 cq GY-302.
Met de float ben ik er nog steeds niet uit, ik krijg dan vreemde waarde op de display.....zelfs zonder lichtinval
De W/m^2 blijft op 519 staan terwijl de Lux 0 is ??
Nu moet ik toegeven dat ik nog nooit met float gewerkt heb en het me uit de uitleg nog niet geheel duidelijk is waarom te gebruiken.
- Code: Alles selecteren
/*Solarpanel Lightmeter*/
#include <LiquidCrystal_I2C.h>
#include <BH1750.h>
#include <Wire.h>; //BH1750 IIC Mode
LiquidCrystal_I2C lcd(0x27,16,2); // ADDRESS LCD BLUE
int BH1750_Device = 0x23; // I2C address for light sensor
// unsigned int Lux; //
float Wattsm2, Lux; //
void setup() {
Wire.begin();
Serial.begin(9600);
lcd.setBacklight (HIGH);
lcd.begin (16,2);
Wire.beginTransmission(BH1750_Device);
Wire.write(0x10); // Set resolution to 1 Lux
// Wire.write(0x11); // Set resolution to 2 Lux
// Wire.write(0x13); // Set resolution to 4 Lux
Wire.endTransmission();
delay(200);
lcd.clear();
}
void loop() {
/*
* Values are without dome to protect sensor for direct sunlight !
*/
int i;
Lux = BH1750_Read();
Wattsm2 = Lux*0.0079; // = 1 Watt/m^2 sunlight
/*debug*/
Serial.println();
Serial.print(Lux,DEC);
Serial.println("[lx]");
Serial.print(Wattsm2,2);
Serial.println("[Watt/m^2]");
delay(1000);
lcd.setCursor (0,0);
lcd.print ( "LUX :" );
lcd.setCursor (10,0);
char temp1[40]; // enough space value
snprintf(temp1,7,"%6u",Lux); // %6u = 6 digits, right aligned
lcd.print (temp1);
lcd.setCursor (0,1);
lcd.print ( "W/m^2:" );
lcd.setCursor (12,1);
char temp2[40]; // enough space value
snprintf(temp2,7,"%6u",Wattsm2); // %6u = 6 digits, right aligned
lcd.print (temp2);
}
float BH1750_Read() {
unsigned int i=0;
Wire.requestFrom(BH1750_Device, 2);
while(Wire.available()) //
{
i <<=8;
i|= Wire.read();
}
float lux = float( i) / 1.2; // Convert to Lux, default 1.2 correction factor
return( lux);
}
Advertisement
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Zonne intentie meten met BH1750
Floats (en doubles) behoren tot de verzameling reële getallen (R). Dus alle getallen met of zonder een decimaal. Theoretisch is het bereik van een float tussen de 1.999999^99 en 1.999999^-99.
Unsigned integers behoren tot de verzameling van gehele getallen vanaf 0 tot oneindig (N).
Signed integers behoren tot de verzameling van gehele getalen tussen de -oneindig en + oneindig.
Tegelijkertijd zitten er op de Arduino een aantal beperkingen mbt. de nauwkeurigheid. En zeker met tussenresultaten.
Een float heeft een nauwkeurigheid van 6-7 cijfers. Een double haalt het dubbele. Echter op de Arduino wordt een double ook vertaald naar een float.
Daarnaast is een float nooit helemaal exact. Bijv. 3.0 kan als float genoteerd worden als 2.99999. Als je ook nog eens een formule gaat toepassen met tussenresultaten en je komt uit ergens in de 0.000199 bijv dan wordt het resultaat nog onnauwkeuriger
Je verliest bij een steeds kleiner getal steeds meer nauwkeurigheid.
Bij de ints heb je eveneens beperkingen omdat de byte lengte het maximale bereik vastlegt.
Je moet dus altijd bij het ontwerp van code (en dan met name de formules) of je niet teveel nauwkeurigheid verlies in de tussenberekeningen omdat dan de rest ook niet meer klopt.
Overigens is dit niet nieuw. in de 70-er jaren hadden hier al mee te maken als je bijvoorbeeld de gemiddelde prijs per metric ton crude oil bij een olie maatschappij. Dan werden de tussen resultaten ook wat groter:) terwijl een IBM mainframe een beperking had van 15 cijfers maximaal. Klinkt veel maar was het niet.
Unsigned integers behoren tot de verzameling van gehele getallen vanaf 0 tot oneindig (N).
Signed integers behoren tot de verzameling van gehele getalen tussen de -oneindig en + oneindig.
Tegelijkertijd zitten er op de Arduino een aantal beperkingen mbt. de nauwkeurigheid. En zeker met tussenresultaten.
Een float heeft een nauwkeurigheid van 6-7 cijfers. Een double haalt het dubbele. Echter op de Arduino wordt een double ook vertaald naar een float.
Daarnaast is een float nooit helemaal exact. Bijv. 3.0 kan als float genoteerd worden als 2.99999. Als je ook nog eens een formule gaat toepassen met tussenresultaten en je komt uit ergens in de 0.000199 bijv dan wordt het resultaat nog onnauwkeuriger
Je verliest bij een steeds kleiner getal steeds meer nauwkeurigheid.
Bij de ints heb je eveneens beperkingen omdat de byte lengte het maximale bereik vastlegt.
Je moet dus altijd bij het ontwerp van code (en dan met name de formules) of je niet teveel nauwkeurigheid verlies in de tussenberekeningen omdat dan de rest ook niet meer klopt.
Overigens is dit niet nieuw. in de 70-er jaren hadden hier al mee te maken als je bijvoorbeeld de gemiddelde prijs per metric ton crude oil bij een olie maatschappij. Dan werden de tussen resultaten ook wat groter:) terwijl een IBM mainframe een beperking had van 15 cijfers maximaal. Klinkt veel maar was het niet.
Re: Zonne intentie meten met BH1750
Duidelijk uitleg en ik begin het te snappen.
Wat ik kan concluderen is dat het bij mij eigenlijk niets uitmaakt want of ik nu 1 Watt heb of 0,912345 heb maakt niets uit, evenzo met LUX.
Als ik dus onderstaande gebruik is het nauwkeurig genoeg (?) wat betreft de rest van de sketch.
Maar dan de aanpassing welke ik hier onder heb gedaan, wat is daar dan de rede dat er float gebruikt wordt ?
De gehele code welke ik nu gebruik, maar waar de twijfel nog is met de LUX naar Watt/m2 berekening.
Wat ik kan concluderen is dat het bij mij eigenlijk niets uitmaakt want of ik nu 1 Watt heb of 0,912345 heb maakt niets uit, evenzo met LUX.
Als ik dus onderstaande gebruik is het nauwkeurig genoeg (?) wat betreft de rest van de sketch.
- Code: Alles selecteren
int BH1750_Device = 0x23; // I2C address for light sensor
unsigned int Lux, Wattsm2;
Maar dan de aanpassing welke ik hier onder heb gedaan, wat is daar dan de rede dat er float gebruikt wordt ?
- Code: Alles selecteren
float BH1750_Read() {
unsigned int i=0;
Wire.requestFrom(BH1750_Device, 2);
while(Wire.available()) //
{
i <<=8;
i|= Wire.read();
}
float lux = float( i) / 1.2; // Convert to Lux, default 1.2 correction factor
return( lux);
}
De gehele code welke ik nu gebruik, maar waar de twijfel nog is met de LUX naar Watt/m2 berekening.
- Code: Alles selecteren
/*Solarpanel Lightmeter*/
#include <LiquidCrystal_I2C.h>
#include <BH1750.h>
#include <Wire.h>; //BH1750 IIC Mode
LiquidCrystal_I2C lcd(0x27,16,2); // ADDRESS LCD BLUE
int BH1750_Device = 0x23; // I2C address for light sensor
unsigned int Lux, Wattsm2;
void setup() {
Wire.begin();
Serial.begin(9600);
lcd.setBacklight (HIGH);
lcd.begin (16,2);
Wire.beginTransmission(BH1750_Device);
Wire.write(0x10); // Set resolution to 1 Lux
// Wire.write(0x11); // Set resolution to 2 Lux
// Wire.write(0x13); // Set resolution to 4 Lux
Wire.endTransmission();
delay(200);
}
void loop() {
/*
* Values are without dome for direct sunsihe !!
*/
int i;
Lux = BH1750_Read();
Wattsm2 = Lux/683; // = W/m^2 sunlight but /683 or *0.0079 ?
/*debug*/
Serial.println();
Serial.print(Lux,DEC);
Serial.println("[lx]");
Serial.print(Wattsm2,2);
Serial.println("[Watt/m^2]");
Serial.println();
delay(1000);
lcd.setCursor (0,0);
lcd.print ( "LUX :" );
lcd.setCursor (10,0);
char temp1[20]; // enough room for 9 numbers
snprintf(temp1,7,"%6u",Lux); // %6d = 6 digits, right aligned
lcd.print (temp1);
lcd.setCursor (0,1);
lcd.print ( "W/m^2:" );
lcd.setCursor (15,1);
lcd.print (Wattsm2);
}
float BH1750_Read() {
unsigned int i=0;
Wire.requestFrom(BH1750_Device, 2);
while(Wire.available()) //
{
i <<=8;
i|= Wire.read();
}
float lux = float( i) / 1.2; // Convert to Lux, default 1.2 correction factor
return( lux);
}
Re: Zonne intentie meten met BH1750
Nog even een snelle vraag wat betreft dat filter, kan je ook folie gebruiken zoals dit ?
https://www.plakfoliewebshop.nl/Zonwerende-folie
https://www.plakfoliewebshop.nl/Zonwerende-folie
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Zonne intentie meten met BH1750
[quote="Gompy"]
Maar dan de aanpassing welke ik hier onder heb gedaan, wat is daar dan de rede dat er float gebruikt wordt ?
Je krijgt een 16 bits integer waarde terug van de BH1750. Die wordt in de formule omgezet in een float (float (i)) omdat je een deling uitvoert door 1.2. Als je dat niet zou doen dan ziet de compiler het als een integer deling en had je dezelfde waarde eruit gekregen.
TIP: Als je nu iets niet weet/begrijpt, wat houd je tegen om het dan uit te proberen? Dan had je dit zelf kunnen beantwoorden en ga je daadwerkelijk leren.
Maar dan de aanpassing welke ik hier onder heb gedaan, wat is daar dan de rede dat er float gebruikt wordt ?
- Code: Alles selecteren
float BH1750_Read() {
unsigned int i=0;
Wire.requestFrom(BH1750_Device, 2);
while(Wire.available()) //
{
i <<=8;
i|= Wire.read();
}
float lux = float( i) / 1.2; // Convert to Lux, default 1.2 correction factor
return( lux);
}
Je krijgt een 16 bits integer waarde terug van de BH1750. Die wordt in de formule omgezet in een float (float (i)) omdat je een deling uitvoert door 1.2. Als je dat niet zou doen dan ziet de compiler het als een integer deling en had je dezelfde waarde eruit gekregen.
TIP: Als je nu iets niet weet/begrijpt, wat houd je tegen om het dan uit te proberen? Dan had je dit zelf kunnen beantwoorden en ga je daadwerkelijk leren.
Re: Zonne intentie meten met BH1750
Ik ben juist heel veel aan het proberen en te begrijpen, maar resulteert niet altijd in het gewenste resultaat.
Zo ook heb ik de beide variaties geprobeerd...en het word mij steeds duidelijker.....dus ik leer
Dit is pas mijn tweede "echte" project en heb echt de hulp nodig van de cracks om het te laten slagen.
Mijn vader zei altijd "door vragen wordt men wijzer, aan kloten is voor prutsers".
Zo ook heb ik de beide variaties geprobeerd...en het word mij steeds duidelijker.....dus ik leer
Dit is pas mijn tweede "echte" project en heb echt de hulp nodig van de cracks om het te laten slagen.
Mijn vader zei altijd "door vragen wordt men wijzer, aan kloten is voor prutsers".
Re: Zonne intentie meten met BH1750
De BH1750 kan 0.11 lux meten. Stel dat je een grijsfilter hebt en dat een andere gevoeligheid van de sensor nodig is, dan zou het handig kunnen zijn om met float te werken. Je hebt nu een paar keer de 'int' en 'float' heen en weer verwisseld. Ik zou alles met 'float' doen, en dan even opletten hoe je dat op het display wilt zetten.
Een integer met 0.0079 vermenigvuldigen zie ik niet zitten.
Een grijsfilter hoeft niet duur te zijn: https://www.aliexpress.com/item/Free-Shipping-Full-ND4-Grey-Filter-for-Cokin-P-Series/32297151095.html.
Welke BH1750 library gebruik je ? Ik heb trouwens ook nog niet nagekeken of het schrijven van 0x10 correct is.
Een integer met 0.0079 vermenigvuldigen zie ik niet zitten.
Een grijsfilter hoeft niet duur te zijn: https://www.aliexpress.com/item/Free-Shipping-Full-ND4-Grey-Filter-for-Cokin-P-Series/32297151095.html.
Welke BH1750 library gebruik je ? Ik heb trouwens ook nog niet nagekeken of het schrijven van 0x10 correct is.
Re: Zonne intentie meten met BH1750
Ik gebruik deze https://github.com/claws/BH1750
Ik heb een proefstukje van deze folie besteld https://www.plakfoliewebshop.nl/Zonwerende-folie om (voorlopig te testen.
Dan komt natuurlijk het volgende probleem inderdaad, lichtdoorlaat 31% en hoe ga ik dat dan weer verwerken in de code om toch weer op een goede waarde terug te komen ?
De 0,0079 heb ik maar laten varen en gebruik Lux/683 want zo te lezen komt die waarde telkens weer terug.
Hoe ik de float in de gehele sketch moet gebruiken is me nog niet duidelijk.
Ik heb een proefstukje van deze folie besteld https://www.plakfoliewebshop.nl/Zonwerende-folie om (voorlopig te testen.
Dan komt natuurlijk het volgende probleem inderdaad, lichtdoorlaat 31% en hoe ga ik dat dan weer verwerken in de code om toch weer op een goede waarde terug te komen ?
De 0,0079 heb ik maar laten varen en gebruik Lux/683 want zo te lezen komt die waarde telkens weer terug.
Hoe ik de float in de gehele sketch moet gebruiken is me nog niet duidelijk.
Re: Zonne intentie meten met BH1750
De 0.0079 is voor zonlicht, niet alleen het zichtbare deel, maar alles (UV, IR, alles).
De 683 is voor het zichtbare deel. Dus wat voor ons oog het zichtbare deel van het spectrum is.
De BH1750 meet voornamelijk zichtbaar licht. Dus de lux van zichtbaar licht en niet de lux van zonlicht.
Dus ik ben om de 683 lijkt de juiste in deze situatie.
Dan kun je dus ook een fotografisch grijsfilter gebruiken die bedoeld is voor zichtbaar licht, en dan klopt het nog steeds.
Die library lijkt okay. De auteur heeft zelfs op mijn verzoek er een foutje uitgehaald (https://github.com/claws/BH1750/issues/10).
Die heeft een functie readLightLevel(), en die geeft natuurlijk een 'float' terug
De 683 is voor het zichtbare deel. Dus wat voor ons oog het zichtbare deel van het spectrum is.
De BH1750 meet voornamelijk zichtbaar licht. Dus de lux van zichtbaar licht en niet de lux van zonlicht.
Dus ik ben om de 683 lijkt de juiste in deze situatie.
Dan kun je dus ook een fotografisch grijsfilter gebruiken die bedoeld is voor zichtbaar licht, en dan klopt het nog steeds.
Die library lijkt okay. De auteur heeft zelfs op mijn verzoek er een foutje uitgehaald (https://github.com/claws/BH1750/issues/10).
Die heeft een functie readLightLevel(), en die geeft natuurlijk een 'float' terug
Re: Zonne intentie meten met BH1750
Grijsfilter gemonteerd van deze website https://www.plakfoliewebshop.nl/Zonwerende-folie
SPECS:
Eigenschappen:
Lichtdoorlatendheid =31%
UV reductie = 87%
Warmte reductie = 89%
Ik heb dus 69% minder licht en nu komen mijn waarde niet meer overeen.
Ik lees nu 16.000 LUX uit met het filter in de volle zon.
De Watt/m^2 is na omrekening van het verlies (69%) ~77 Watt/m^2
205 komt voort uit 31% van 683.
Wat mij bevreemd is dat mijn eigen zonnepaneel 80x80 cm (=0,64 m^2) is en 100 Wp is op dit moment.
Dus volgens mij kloppen de verhoudingen niet tov mijn paneel met 0,64m^2 en 1 m^2.
Hoe kom ik aan de juiste instellingen want ik zie iets over het hoofd......maar wat(t) ?
SPECS:
Eigenschappen:
Lichtdoorlatendheid =31%
UV reductie = 87%
Warmte reductie = 89%
Ik heb dus 69% minder licht en nu komen mijn waarde niet meer overeen.
Ik lees nu 16.000 LUX uit met het filter in de volle zon.
De Watt/m^2 is na omrekening van het verlies (69%) ~77 Watt/m^2
- Code: Alles selecteren
Lux = BH1750_Read();
Wattsm2 = Lux/205; // 683 without filter = W/m^2 sunlight
205 komt voort uit 31% van 683.
Wat mij bevreemd is dat mijn eigen zonnepaneel 80x80 cm (=0,64 m^2) is en 100 Wp is op dit moment.
Dus volgens mij kloppen de verhoudingen niet tov mijn paneel met 0,64m^2 en 1 m^2.
Hoe kom ik aan de juiste instellingen want ik zie iets over het hoofd......maar wat(t) ?
- Bijlagen
-
- Zonnepaneel.jpg (45.12 KiB) 6332 keer bekeken
24 berichten
• Pagina 2 van 3 • 1, 2, 3
Terug naar Gezamenlijke projecten
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 11 gasten