LDR schakeling

Arduino specifieke Software
Gebruikers-avatar
Berichten: 48
Geregistreerd: 15 Jan 2019, 16:28

Re: LDR schakeling

Berichtdoor Bosch » 22 Mrt 2019, 21:32

Top, bedankt voor uw moeite, hier kan ik verder mee.

Map had ik inderdaad gevonden en dacht och...… van A naar B of van B naar A..... de afstand is eender :)

Geweldig al die links.

Advertisement

Gebruikers-avatar
Berichten: 48
Geregistreerd: 15 Jan 2019, 16:28

Re: LDR schakeling

Berichtdoor Bosch » 25 Mrt 2019, 15:29

Om de pieken af te vlakken, heb ik deze bedacht:

// Test met gemiddelde licht sterktes

int Totaal = 0;
int Gemiddelde = 0;

void setup() {
Serial.begin(9600);
pinMode(A0, INPUT);
}

void meten() {

for(int Teller = 1; Teller<11; Teller++)
{
int licht = (analogRead(A0));
Serial.println(Teller);
Serial.print("lichtsterkte = ");
Serial.println(licht);
Totaal = Totaal+licht;
Serial.println(Totaal);
delay(1000);
licht = 0;
}
Gemiddelde = Totaal/10;
Serial.print("Gemiddelde is = ");
Serial.println(Gemiddelde);
}

void loop() {
Totaal = 0;
delay(2000);
meten();}


Is dit werkbaar, of kan het anders danwel heel veel beter :)

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

Re: LDR schakeling

Berichtdoor Koepel » 25 Mrt 2019, 16:12

Dat is prima :D

Het kan natuurlijk wel iets beter :geek:
Misschien staat hieronder één of twee ideeën die je kunt doen.


Een "void" is een "niets".
Je zou de functie meten() een integer waarde van het gemiddelde terug kunnen laten geven.
Code: Alles selecteren
int meten()
{
  ...    // hier de samples nemen en al het rekenwerk

  int gemiddelde = Totaal / 10;
  return( gemiddelde);
}



Het afdrukken van de waarde past beter in de loop() en niet in de functie "meten()".


Kijk eens naar het gebruik van de variabelen.
Het is logischer om de "Totaal = 0 ;" vlak voor de regel "for (int Teller..." te doen.
Die variabele heeft niets te zoeken in de loop().


Je kunt meerdere samples nemen, heel snel achter elkaar. Dat vermindert de ruis.
Je kunt ook over een langere tijd samples nemen, en daar het gemiddelde van berekenen. Dan verminder je de ruis en je dempt het iets (dat heb je nu). Maar nu is je sketch er 10 seconden mee bezig.
Je kunt millis() gebruiken om bijvoorbeeld iedere seconde de hoeveelheid licht te meten, en dan steeds het resultaat bijhouden in een globale variabele (die variabele heb je al, dat is "Gemiddelde").


Ik keek nog even in mijn klokje met een Nextion scherm. De achtergrondverlichting van het scherm pas ik aan, aan de hoeveelheid licht.
Ik doe twee keer per seconde een meting, met millis().
Mijn globale variabele is een float en heet "lightAmbient". En ik heb een functie GetLight() die ook een float terug geeft.
Vervolgens heb ik een laagdoorlaatfilter:
Code: Alles selecteren
lightAmbient = 0.9 * lightAmbient + 0.1 * GetLight( pinLDR);

Dat laagdoorlaatfilter pakt goed uit. Door de demping van het laagdoorlaatfilter hoef ik niet meer het gemiddelde te nemen.


Kijk eens naar de documentatie van analogRead(): https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/.
Het is niet gebruikelijk om de pinMode() in setup() te doen, als die pin alleen maar gebruikt wordt voor een analogRead().


Je Teller begint bij 1. In de c++ taal wordt meestal bij 0 begonnen.
Kijk maar eens naar deze Bas On Tech video : https://youtu.be/x-7bDI_3RWY.
Die video is van gisteren, mooi op tijd voor jou ;)


Heb je al nagedacht hoe je de hoeveelheid licht gaat noemen ? Lumen, lux, procenten ? Een LDR is niet erg nauwkeurig, dus in de sketch van mijn klokje heb ik de lichtintensiteit als procenten, van 0 tot en met 100.

Gebruikers-avatar
Berichten: 48
Geregistreerd: 15 Jan 2019, 16:28

Re: LDR schakeling

Berichtdoor Bosch » 25 Mrt 2019, 18:24

Top, bedankt voor de snelle reactie!


lightAmbient = 0.9 * lightAmbient + 0.1 * GetLight( pinLDR); /// Ga ik bestuderen, nu nog te hoog gegrepen vrees ik.

Totaal = 0 //// Is verplaatst.


Bas on Tech /// Wijziging naar Teller = 0 ; <=10; /// Is ingevoerd.


Meten() meet en verwijst naar gelang het gemiddelde naar Openen() of Sluiten()
aan het slot van die functie wordt alles weer op 0 gezet en verwijst met een delay terug naar Meten().


Ik was van plan om het cijfer van het gemiddelde te gebruiken, dus geen lux, procenten of anderzins.
Sta natuurlijk reuze open voor een beter voorstel (Wel een beetje in Jip en Janneke stijl, ben een beginner!):)

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: LDR schakeling

Berichtdoor shooter » 25 Mrt 2019, 19:44

zet er dan twee omslagpunten in bijv 300 en 500 of zo anders staat het constant te draaien.
paul deelen
shooter@home.nl

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

Re: LDR schakeling

Berichtdoor Koepel » 25 Mrt 2019, 20:38

Bij een getal heb ik graag de eenheid er bij.
Bijvoorbeeld bij een lengte van 3, dan is het handig om te weten of dat meters of inches zijn.
Bijvoorbeeld bij een lichtintensiteit van 50, dan is het handig om te weten wat de eenheid is, of anders wat de grenzen zijn.

Je gebruikt het gemiddelde van analogRead(), kun je dan in de sketch er bij schrijven als commentaar dat de waarde van 0 tot 1023 kan zijn.
Dan zijn de waarden van de omslagpunten waar shooter het over heeft ook duidelijk.

Gebruikers-avatar
Berichten: 48
Geregistreerd: 15 Jan 2019, 16:28

Re: LDR schakeling

Berichtdoor Bosch » 25 Mrt 2019, 20:50

Bijvoorbeeld zo?

int licht = (analogRead(A0)); // Uitgelezen waarde is tussen 0 en 1023


int gemiddelde; // bij hoger dan 220 gaat het luik open, lager gaat het luik dicht.

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

Re: LDR schakeling

Berichtdoor Koepel » 25 Mrt 2019, 21:12

Ja, dan is het duidelijk.

Als je één waarde als kantelpunt hebt, dan kan het luik constant open en dicht blijven gaan.

Dus niet bij 220, maar stel de grenzen dan bijvoorbeeld op 200 en 250.
Bij 250 en hoger het luik open.
Bij 200 en lager het luik dicht.
Dat bedoelde shooter.

Dat is een standaard manier om er zo mee om te gaan. Het heet hysterese.

Gebruikers-avatar
Berichten: 48
Geregistreerd: 15 Jan 2019, 16:28

Re: LDR schakeling

Berichtdoor Bosch » 25 Mrt 2019, 21:50

Prachtig, van alles wat nieuw voor mij is had ik reeds gehoord van hysterese.


In mijn huidige "Kippen" sketch staat onderstaande code:

if
(licht >220 && Luikstatus == 1){Serial.println("Luik is open");}
if
(licht >220 && Luikstatus == 0){Serial.println("Luik openen"); openen();}
if
(licht <150 && Luikstatus == 0){Serial.println("Luik is dicht");}
if
(licht <150 && Luikstatus == 1){Serial.println("Luik sluiten"); sluiten();}}


Het moet allemaal met de nieuw verworven kennis in en aan elkaar geplakt worden.
De waardes zullen anders worden, ik heb gekozen voor de versie van Bas on Tech ipv Conrad,
maar dat kan zomaar veranderen :)

/

Gebruikers-avatar
Berichten: 48
Geregistreerd: 15 Jan 2019, 16:28

Re: LDR schakeling

Berichtdoor Bosch » 26 Mrt 2019, 15:53

Alvorens met een luik en motor te gaan slepen de volgende tester gebouwd:




Lichtmeting Test klein2.jpg
Lichtmeting Test klein2.jpg (34.61 KiB) 5860 keer bekeken



// Test met gemiddelde licht sterktes
// Versie 26032019 voor Arduino Nano

int Totaal = 0;

int Teller = 0;
int Gemiddelde = 0;
int ledState5 = 5; // controle led bij daglicht.
int ledState6 = 6; // controle led na de schemering.

void setup() {
Serial.begin(9600);
pinMode(A0, INPUT);
pinMode(ledState5, OUTPUT);
pinMode(ledState6, OUTPUT);
}

void meten() {

for(int Teller = 1; Teller<=10; Teller++)
{
int licht = (analogRead(A0)); //Meet de lichtsterkte waarde tussen 0 en 1024.
Serial.println(Teller);
Serial.print("lichtsterkte = ");
Serial.println(licht);
Totaal = Totaal+licht;
Serial.println(Totaal);
delay(1000);
licht = 0;
}
Gemiddelde = Totaal/10;
Serial.print("Gemiddelde is = ");
Serial.println(Gemiddelde);
if
(Gemiddelde >220){Serial.println("Luik is open"); // Hoger dan 220 zou daglicht moeten zijn.
digitalWrite(ledState5,HIGH);// Groene controle LED is aan.
digitalWrite(ledState6,LOW);
}
if
(Gemiddelde <150){Serial.println("Luik is dicht"); // Lager dan 150 zou na de schemering moeten zijn.
digitalWrite(ledState5,LOW);
digitalWrite(ledState6,HIGH); //Rode controle LED is aan.
}}

void loop() { Totaal = 0;

delay(5000);
meten();}



Ligt nu in de vensterbank, ben benieuwd of de instelling juist is en het naar behoren werkt.

Toevoegingen, op/aanmerkingen zijn reuze welkom.

//

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 21 gasten