Zonne intentie meten met BH1750

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Zonne intentie meten met BH1750

Berichtdoor Gompy » 24 Jun 2019, 10:47

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) :shock:

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

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Zonne intentie meten met BH1750

Berichtdoor nicoverduin » 24 Jun 2019, 11:17

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.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Zonne intentie meten met BH1750

Berichtdoor Gompy » 24 Jun 2019, 11:40

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.

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);
}

Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Zonne intentie meten met BH1750

Berichtdoor Gompy » 24 Jun 2019, 12:10

Nog even een snelle vraag wat betreft dat filter, kan je ook folie gebruiken zoals dit ?
https://www.plakfoliewebshop.nl/Zonwerende-folie

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Zonne intentie meten met BH1750

Berichtdoor nicoverduin » 24 Jun 2019, 12:30

[quote="Gompy"]
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.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Zonne intentie meten met BH1750

Berichtdoor Gompy » 24 Jun 2019, 12:46

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 :idea:
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".

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Zonne intentie meten met BH1750

Berichtdoor Koepel » 24 Jun 2019, 12:51

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.

Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Zonne intentie meten met BH1750

Berichtdoor Gompy » 24 Jun 2019, 13:01

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.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Zonne intentie meten met BH1750

Berichtdoor Koepel » 24 Jun 2019, 13:12

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 :mrgreen: 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 ;)

Gebruikers-avatar
Berichten: 256
Geregistreerd: 05 Apr 2018, 00:44
Woonplaats: ALKMAAR

Re: Zonne intentie meten met BH1750

Berichtdoor Gompy » 25 Jun 2019, 16:02

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

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
Zonnepaneel.jpg (45.12 KiB) 6263 keer bekeken

VorigeVolgende

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten