Buzzer uit na 2 seconden

Hoi allen,

Ik ben niet zo bekend met het programmeren in Arduino, dus ik vroeg me af of een van jullie mij misschien kan helpen.
Momenteel probeer ik een programma te schrijven waarbij een lichtsensor en een buzzer aan elkaar hangen. Wanneer er geen licht op de lichtsensor komt gaat de buzzer hard piepen.

Echter stopt de buzzer niet met piepen zo lang er geen licht op de lichtsensor komt. Is het mogelijk om de buzzer naar bijvoorbeeld 2 seconden te laten stoppen zo lang er geen licht meer op komt?

Ik heb al het een en ander geprobeerd met de millis functie, maar daar kom ik niet uit.

Ik hoor graag van jullie

Bedankt

Sketch_with_buzzer.ino (520 Bytes)

Hoi teuntje, welkom !

Omdat jij beloofd had dat je de moeite had genomen met millis aan het werk te zijn, heb ik de moeite genomen je sketch te downloaden en openen.

Ik zou je graag willen vragen ook even de moeite te nemen de gebruiksaanwijzing van het forum (klik !) te lezen, inclusief de verwijzing naar het Engelstalige deel daarvan.
Dat helpt jou het forum optimaal te gebruiken, zodat je ons helpt jou te helpen.
Deze sketch is niet groot, en kan daarom gemakkelijk als code worden ingevoegd in je vraag en hoeft dan niet onnodig gedownload te worden.
Daarom heb ik je code even laten optimaliseren zodat ie er nog iets netter uitziet, en plaats ik hem hier:

int pinLightsensor = 2;
int pinBuzzer = 3;
int sitStatus;
int sittingtolong = LOW;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(pinBuzzer, OUTPUT);
  pinMode(pinLightsensor, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  sitStatus = digitalRead(pinLightsensor);
  Serial.println(sitStatus);
  if (sitStatus == sittingtolong)
  {
    digitalWrite(pinBuzzer, HIGH);
  }
  else
  {
    digitalWrite(pinBuzzer, LOW);
  }
  delay(500);
}

Ik zal je vertellen wat ik lees in deze code:

Je leest een 1 of een 0 van een lichtsensor en je slaat het resultaat op in sitStatus.
Daarna kijk je of deze waarde overeenkomt met LOW, want dat heb je al in sittingtolong gezet.
In dat geval zet je iets aan.
In het andere geval zet je dat uit.
En dan doe je een halve seconde helemaal niets, om daarna weer van voor af aan te beginnen.
En dat was het.

Behalve wachten aan het eind van je handelingen, doe je helemaal niets met tijd.
Ik zie geen 2 seconden of wat dan ook voorbij komen.
Wat ik wel zie is dat je een goede les geleerd hebt uit de blink without delay sketch, maar net niet helemaal zoals bedoeld.
En dat kan ik zien aan de namen die je hebt gegeven aan je variabelen (ook als die helemaal niet variabel zijn).
Ik heb het dan met name over sitStatus en sittingtolong (te vertalen als "zitten in verlangen").
Ik neem even aan dat je eigenlijk bedoelde sittingTooLong (zit al te lang).
Maar de waarde die daar in staat, en wat je er mee doet gaat dan niet goed.

Je zou eens kunnen kijken of de zoemer al 2000 milliseconden aan staat.
In dat geval zet je 'm uit.
Maar dan moet je dus naar de millis kijken.
En je moet niet alleen bijhouden hoe het met de lichtsensor gaat.
Je moet bijvoorbeeld ook bijhouden of je de zoemer aan hebt staan.
En soms moet je ook weer iets op nul zetten, wellicht ook door meer dan 1 oorzaak.

Maak daarom eens een lijstje van dingen die je allemaal in de gaten moet houden.
En zorg er voor dat namen die je aan variabelen geeft, kloppen met waar ze voor staan.

Overigens zijn er best veel mogelijke vormen van variabelen, en dat is niet voor niets.
Voor een kleine sketch als deze is dat niet zo'n probleem en dus kun je dat voor nu wel even laten schieten.
Maar wanneer je sketches straks groter en gecompliceerder worden, heb je echt nodig dat je de juiste vormen kiest.
Dus das ook een aandachtspuntje voor je.

Hoi MAS3,

Bedankt voor je reactie!
Hier kan ik goed mee vooruit.

Zoals je wellicht al had gemerkt ben ik nog niet heel bekend met het programmeren van mijn Arduino, maar je tips helpen me wel om wat verder de goede richting op te kijken.

Mooi zo.

Laat vooral ook even weten waar je uiteindelijk op uit komt met je code, altijd leuk om te zien hoe anderen het uiteindelijk hebben opgelost.

Om iets met millis() te doen begint bij het Blink Without Delay voorbeeld: https://www.arduino.cc/en/tutorial/BlinkWithoutDelay.

Iedere seconde een ledje laten knipperen werkt net even anders dan eenmalig iets doen (single shot timer). Ik heb geprobeerd kleine verschillende voorbeelden te maken: GitHub - Koepel/Fun_with_millis: Small Arduino examples using the millis() function. (de beschrijving begint halverwege die bladzijde). Als je het leuk vindt, dan kun je er een paar proberen.

Als wij zeggen: "Gebruik millis() in plaats van delay()", dan proberen sommigen om de delay() te vervangen door millis(). Maar meestal moet de hele sketch herschreven worden, omdat het anders werkt. Daar zijn mijn kleine voorbeelden voor.

Laat je wel steeds je hele sketch zien ? zodat wij kunnen zien hoe je vordert.