weer een ldr met hysterese
6 berichten
• Pagina 1 van 1
weer een ldr met hysterese
beste allemaal hier ben ik weer voor de zoveelste maal met de ldr , deze code vond ik op internet hij lijkt mij goed echter heb gaat de uitgang meteen hoog het relais schakelt maar valt niet meer af ik heb een arduino mega een cloon dat wel , ik verdenk dat de analoge input defect is of de code klopt niet , maar hier heb ik mijn vermoeden niet in.
mocht er iemand een lichtje over willen schijnen (welicht gaat hij dan uit ) gr Rob
mocht er iemand een lichtje over willen schijnen (welicht gaat hij dan uit ) gr Rob
- Code: Alles selecteren
Automatisch kippenhok
Het automatisch kippenhok wordt bediend met een LDR (A0). De LDR meet voordurend het omgevingslicht.
Als de lichtwaarde zakt onder een 'threshold' waarde, sluit het kippenhok. Dit wordt aangegeven door
een rode LED op pin 9. Als de lichtwaarde stijgt boven de 'threshold', opent het kippenhok, aangegeven
door een groene LED op pin 8.
De threshold wordt onmiddelijk na het opstarten bepaald. Zodra het schemert start je de Arduino op en is deze
schemerwaarde the threshold waarde voor het kippenhok.
Uitdieping 1:
Om nerveus gedrag rond de threshold te vermijden, bouw je een hysteresis in met een offset van 5:
* lichtsterkte < Threshold - Hysteresis: sluit kippenhok
* lichtsterkte > Threshold + Hysteresis: open kippenhok
Zorg er voor dat dit ook zichtbaar is in de twee LEDs
Uitdieping 2:
Om te voorkomen dat het kippenhok perongeluk opengaat als de boer met zijn zaklamp op de sensor schijnt, moet
de grenswaarde minstens 5 seconden overschreven zijn voordat het kippenhok reageert.
Uitdieping 3:
Voorzie drukknop waarmee je het kippenhok manueel kan bedienen:
* Als het hok open is, sluit het en blijft het gesloten totdat opnieuw op de knop wordt gedrukt.
Zodra het donker wordt werkt het kippenhok terug automatisch.
* Als het hok dicht is, open het en blijft het open totdat op de knop wordt gedrukt.
Zodra het licht wordt werkt het kippenhok terug automatisch.
*/
// CONSTANTEN
const int PIN_LDR = A0;
const int PIN_LED_OPEN = 8;
const int PIN_LED_DICHT = 9;
const int PIN_KNOP = 3;
const int HYSTERESIS = 50; // De offset
const unsigned long WACHTTIJD = 2000; // 5 seconden
// (GLOBALE) VARIABELEN
int threshold = 0;
int ldrWaarde = 0; // analoge waarde van de sensor
int ldrStatus = LOW; // gedigitaliseerde waarde: LOW: donker, HIGH: licht
int ldrVorigeStatus = LOW;
int knopWaarde = LOW; // handmatige bediening
int vorigeKnopWaarde = LOW;
unsigned long loopStartTijd = 0;
unsigned long tijdLdrStatusVerschillend = 0;
bool isDonker = true; // toestand van buiten, is niet noodzakelijk de toestand van het hok
bool isVorigeDonker = true;
bool isGesloten = true; // de toestand van het hok
// VOORBEREIDING
void setup()
{
pinMode(PIN_LED_OPEN, OUTPUT);
pinMode(PIN_LED_DICHT, OUTPUT);
pinMode(PIN_KNOP, INPUT);
threshold = analogRead(PIN_LDR);
// Op het moment dat de threshold wordt bepaald, verwachten we dat het hok sluit
digitalWrite(PIN_LED_DICHT, HIGH);
digitalWrite(PIN_LED_OPEN, LOW);
}
// UITVOERING
void loop()
{
// INVOER
loopStartTijd = millis(); // Eén tijdstip als referentie voor heel de loop
knopWaarde = digitalRead(PIN_KNOP); // De handmatige bediening
ldrWaarde = analogRead(PIN_LDR);
ldrWaarde = 1023 - ldrWaarde; // correctie voor wokwi vs. realiteit
// VERWERKING
// Stap 1: 'Digitaliseer' de ldr waarde van een analoog getal tussen 0 en 1023 naar
// een digitale waarde LOW/HIGH die aangeeft of het donder is of licht.
// Nota: als we in stap 2 toch een bepaalde tijd een stabiele toestand verwachten
// is de hysteresis in princiepe niet meer noodzakelijk.
if (ldrWaarde < threshold - HYSTERESIS){
ldrStatus = LOW;
}
// Openen van het hok
if (ldrWaarde > threshold + HYSTERESIS){
ldrStatus = true;
}
// Stap 2: Een nieuwe toestand moet minstens een bepaalde tijd aangehouden worden voordat we
// beslissen of het licht of donker is. Hiervoor kijken we of de toestand veranderd is of
// niet en houden we bij wanneer de toestand het laatst verander was.
if (ldrStatus != ldrVorigeStatus){
tijdLdrStatusVerschillend = loopStartTijd;
}
if (loopStartTijd > tijdLdrStatusVerschillend + WACHTTIJD){
if (ldrStatus == LOW){
isDonker = true;
}
else{
isDonker = false;
}
}
// Stap 3: Om manueel kunnen in te grijpen, gaan we enkel het hok sluiten of openen op basis van de
// toestand buiten als deze toestand ook veranderd. Dus als het licht of donder WORDT.
if (isDonker == true and isVorigeDonker == false){ // Het WORDT donker
isGesloten = true;
}
if (isDonker == false and isVorigeDonker == true){ // Het WORDT licht
isGesloten = false;
}
// De drukknop voor de handmatige interventie.
if (knopWaarde == HIGH and vorigeKnopWaarde == LOW){
isGesloten = not isGesloten;
}
// UITVOER
if (isGesloten){
digitalWrite(PIN_LED_DICHT, HIGH);
digitalWrite(PIN_LED_OPEN, LOW);
}
else {
digitalWrite(PIN_LED_DICHT, LOW);
digitalWrite(PIN_LED_OPEN, HIGH);
}
delay(100);
// updates
ldrVorigeStatus = ldrStatus;
isVorigeDonker = isDonker;
vorigeKnopWaarde = knopWaarde;
}
Advertisement
Re: weer een ldr met hysterese
Wat mij opvalt is dat je pinmode A0 niet definieert als input.
verder is =not geen geldig statement. je bedoelt waarschijnlijk !=
verder is and geen geldig statement. je bedoelt waarschijnlijk &&
en: waarom
- update je bij elke cycle van de mainloop de variabele loopstarttijd
verder is =not geen geldig statement. je bedoelt waarschijnlijk !=
verder is and geen geldig statement. je bedoelt waarschijnlijk &&
en: waarom
- update je bij elke cycle van de mainloop de variabele loopstarttijd
Re: weer een ldr met hysterese
bedoel je dit ?
- Code: Alles selecteren
// updates
ldrVorigeStatus = ldrStatus;
isVorigeDonker = isDonker;
vorigeKnopWaarde = knopWaarde;
Re: weer een ldr met hysterese
em hoe heb je de LDR aangesloten hopelijk wel ook een werstand naar GND toe want ander zie je niks als hij gestart is.
paul deelen
shooter@home.nl
shooter@home.nl
Re: weer een ldr met hysterese
wappie schreef:bedoel je dit ?
Nee, analogReference() en https://docs.arduino.cc/learn/microcontrollers/analog-input/
6 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten