weer een ldr met hysterese

algemene C code
Berichten: 33
Geregistreerd: 29 Dec 2020, 12:35

weer een ldr met hysterese

Berichtdoor wappie » 29 Jul 2024, 00:33

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



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

Berichten: 195
Geregistreerd: 26 Aug 2015, 11:57

Re: weer een ldr met hysterese

Berichtdoor Frits1956 » 29 Jul 2024, 10:18

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

Berichten: 33
Geregistreerd: 29 Dec 2020, 12:35

Re: weer een ldr met hysterese

Berichtdoor wappie » 02 Aug 2024, 17:12

dankje ik ga eens kijken

Berichten: 33
Geregistreerd: 29 Dec 2020, 12:35

Re: weer een ldr met hysterese

Berichtdoor wappie » 03 Aug 2024, 09:49

bedoel je dit ?


Code: Alles selecteren
 // updates
  ldrVorigeStatus  = ldrStatus;
  isVorigeDonker   = isDonker;
  vorigeKnopWaarde = knopWaarde;

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

Re: weer een ldr met hysterese

Berichtdoor shooter » 03 Aug 2024, 13:19

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

Berichten: 195
Geregistreerd: 26 Aug 2015, 11:57

Re: weer een ldr met hysterese

Berichtdoor Frits1956 » 03 Aug 2024, 14:52

wappie schreef:bedoel je dit ?

Nee, analogReference() en https://docs.arduino.cc/learn/microcontrollers/analog-input/

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten