2 leds aansturen, bijna goed werkend...

Arduino specifieke Software
Berichten: 26
Geregistreerd: 01 Okt 2017, 14:23

2 leds aansturen, bijna goed werkend...

Berichtdoor Dracul » 01 Okt 2017, 20:52

Inmiddels is het gelukt om 2 LEDs aan te sluiten, maar nu de aansturing nog in combinatie met de bewegingssensor.

Ik had een stuk code gedownload, en daarin ben ik aan het aanpassen geweest. En... het werkt... behalve (ja, jullie voelden 'm al aankomen ;) )

Bij de eerste beweging die gedetecteerd wordt, beginnen allebei de LEDs keurig te knipperen.
De LED op pin 12 en 10 stoppen na een aantal knippers (beweging niet meer waargenomen), maar als je dan opnieuw een beweging maakt, dan knippert alleen de LED op pin 12. Na nog een aantal keren proberen, dan knipperen ze uiteindelijk weer samen. Er zit dus kennelijk iets fout met de pauzetijd... of toch iets anders?

Dit is de code (nogmaals, niet zelf geschreven, maar aangepast):
cpp code
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 30;

//the time when the sensor outputs a low impulse
long unsigned int lowIn;

//the amount of milliseconds the sensor has to be low
//before we assume all motion has stopped
long unsigned int pause = 5000;

boolean lockLow = true;
boolean takeLowTime;

int pirPin = 3; //the digital pin connected to the PIR sensor's output
int ledPin = 12;
int ledPin2 = 10;


/////////////////////////////
//SETUP
void setup(){
Serial.begin(9600);
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
digitalWrite(pirPin, LOW);

//give the sensor some time to calibrate
Serial.print("calibrating sensor ");
for(int i = 0; i < calibrationTime; i++){
Serial.print(".");
delay(1000);
}
Serial.println(" done");
Serial.println("SENSOR ACTIVE");
delay(50);
}

////////////////////////////
//LOOP
void loop(){

if(digitalRead(pirPin) == HIGH){
digitalWrite(ledPin, HIGH); //the led visualizes the sensors output pin state
if(lockLow){
//makes sure we wait for a transition to LOW before any further output is made:
lockLow = false;
digitalWrite(ledPin2, HIGH);
Serial.println("---");
Serial.print("motion detected at ");
Serial.print(millis()/1000);
Serial.println(" sec");
delay(50);
}
takeLowTime = true;
}

if(digitalRead(pirPin) == LOW){
digitalWrite(ledPin, LOW); //the led visualizes the sensors output pin state

if(takeLowTime){
digitalWrite(ledPin2, LOW);
lowIn = millis(); //save the time of the transition from high to LOW
takeLowTime = false; //make sure this is only done at the start of a LOW phase
}
//if the sensor is low for more than the given pause,
//we assume that no more motion is going to happen
if(!lockLow && millis() - lowIn > pause){
//makes sure this block of code is only executed again after
//a new motion sequence has been detected
lockLow = true;
Serial.print("motion ended at "); //output
Serial.print((millis() - pause)/1000);
Serial.println(" sec");
delay(50);
}
}
}

Advertisement

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

Re: 2 leds aansturen, bijna goed werkend...

Berichtdoor Koepel » 01 Okt 2017, 23:51

Het zit er wel zo'n beetje in, maar het rammelt nog aan alle kanten.

Je had dit ook kunnen toevoegen aan je vorige onderwerp. Als je een nieuw onderwerp begint, dan weet ik niet meer welk Arduino board je had en welke PIR sensor en wat je wilde bereiken, en dan moet ik eerst het vorige onderwerp door gaan lezen.

Je hebt dus een Arduino Uno.
Ik keek nog even naar de datasheet van die leds, en nico heeft gelijk. Bij 5V gebruiken ze maar 15mA, dus ze kunnen wel rechtstreeks aan een pin verbonden worden. Dat is geluk hebben :D

De sketch maakt onderscheid tussen de leds. Maar ik neem aan dat je wilt dat ze allebei tegelijk aan en uit gaan ?
De constructie met de variabelen 'lockdown' en 'takeLowTime' en 'lowIn', daar zit iets scheef. Dat kan eenvoudiger. De namen vind ik ook iets verwarrend.

Wanneer je bij een bedrijf werkt in nederland, dan wordt altijd Engels gebruikt voor de code, de variabelen, en het commentaar.
Maar voor jezelf als hobby, en hier op het forum mag je gerust de sketch in het Nederlands doen.

Kun je misschien eerst een goede beschrijving maken ?
Wanneer de bewegingssensor wordt geactiveerd, dan blijven de leds een bepaalde tijd aan.
Wat gebeurt er als de leds aan zijn, en de bewegingssensor opnieuw actief wordt ?
De tijd op de PIR sensor kun je instellen. Wil je die tijd gebruiken om de leds aan te zetten, of wil je alleen kijken naar het moment dat de PIR sensor actief wordt en de tijd voor de leds in software regelen ?

Berichten: 26
Geregistreerd: 01 Okt 2017, 14:23

Re: 2 leds aansturen, bijna goed werkend...

Berichtdoor Dracul » 02 Okt 2017, 18:38

Ha Koepel, dank voor het mee denken!

Ik had het in een aparte thread gezet, omdat dit een pure softwarematige vraag was en ik (vanuit ervaringen op andere fora) gewend ben om dit dan apart te doen. Voor het totale volgen van het verhaal is het inderdaad niet handig.

Het gaat dus inderdaad om een Arduino Uno.

Dit zou er moeten gebeuren:

bewegingsensor wordt geactiveerd
beide leds knipperen
zolang er beweging is, blijft hij knipperen
zogauw de beweging niet meer wordt waargenomen, gaan de leds uit.

Momenteel heb ik het dus half voorelkaar. Na gelijktijdig knipperen, gaan ze uit, wordt er weer een beweging waargenomen, dan gaat er één aan (in dit geval pin 12). Na een tijdje (minuut?) gaan bij een herhaalde beweging beide LEDs wel knipperen. Ik vermoed dus dat het ergens in de pauze zit, dat die wel voor de ene LED geldt, en niet voor de andere.
Of... dat een deel van het programma niet doorlopen wordt voor de 2e LED.

Maar zoals gezegd, helemaal nieuw op dit gebied, maar dit is wat ik ervan kan breien met mijn lekenverstand.

Nu heb ik nog knipperLEDs, maar die wil ik tzt vervangen door gewone LEDs... het moet juist als een gek gaan knipperen om het schrikeffect te geven. Deze knipperLEDs knipperen heel rustig. Niet de bedoeling :-)

Dank voor het meedenken!

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

Re: 2 leds aansturen, bijna goed werkend...

Berichtdoor nicoverduin » 02 Okt 2017, 20:25

Let je wel op het soort leds wat je dan aansluit... Deze leds kunnen met gemak 5V aan. Normale Leds kunnen max 2.2V en 20mA aan. Dan moet er dus een weerstand per led bij komen. Dat je het ff weet
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 10
Geregistreerd: 30 Nov 2016, 14:27

Re: 2 leds aansturen, bijna goed werkend...

Berichtdoor Josh » 02 Okt 2017, 22:31

Moet er dan geen weerstand op ter bescherming van de pin?
Voedingsspanning: 3.5 V/DC , 14 V/DC
Voedingsstroom: 44 mA

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

Re: 2 leds aansturen, bijna goed werkend...

Berichtdoor Koepel » 03 Okt 2017, 00:35

Een normale led (dus alleen de lichtgevende halfgeleider) heeft een weerstand nodig.
Jouw knipperled heeft al een (soort van) weerstand ingebouwd en ook nog een chipje om het te laten knipperen. Hij gebruikt 15mA bij 5V (kijk maar naar de grafiek in de datasheet).

Ik zou bijna zeggen dat je een "klassieke" PIR sensor sketch wilt.
Dat is een PIR sensor, dan een StateChangeDetection, dan een software timer met millis. Die software timer herstart als de PIR weer aktief wordt.
Dit is de StateChangeDetection: https://www.arduino.cc/en/Tutorial/StateChangeDetection.
Ben je bereid om je sketch weg te doen en opnieuw te beginnen ?

Berichten: 26
Geregistreerd: 01 Okt 2017, 14:23

Re: 2 leds aansturen, bijna goed werkend...

Berichtdoor Dracul » 03 Okt 2017, 18:42

@Nico: dank voor de waarschuwing! Ik wist het wel, maar zou het zo vergeten zijn! Dank!
@Koepel: ik zit nergens aan vast, het is een 'avontuur' om hiermee te experimenteren en te leren. :-) Ik zit momenteel druk schriften na te kijken, maar ga van de week naar jouw statechangedetection kijken... Kijken of ik eruit kom! Dank!!!

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

Re: 2 leds aansturen, bijna goed werkend...

Berichtdoor Koepel » 03 Okt 2017, 21:03

Ik zie het al, je hebt misschien dit gevonden: https://playground.arduino.cc/Code/PIRsense.
Dat is van 2006, en het zit niet lekker in elkaar.

Ik hou me liever aan de StateChangeDetection: https://www.arduino.cc/en/Tutorial/StateChangeDetection.

Hieronder de "klassieke" PIR sketch.

cpp code
// De "klassieke" PIR sketch.
//
// Hij werkt beter als de tijdinstelling op de PIR sensor zelf heel laag staat.
// Wanneer de tijd op de PIR sensor langer is dan de 'ledOnTime' in deze
// sketch, dan gaan de leds steeds tussendoor uit.


const int pirPin = 3;
const int ledPin1 = 12;
const int ledPin2 = 10;

int lastPirState;

unsigned long previousMillis;
boolean ledsAreOn;
unsigned long ledOnTime = 10000UL; // the time that the leds stay on, in ms. UL = unsigned long.

void setup()
{
Serial.begin( 9600);
Serial.println( "Started.");

pinMode( pirPin, INPUT);
pinMode( ledPin1, OUTPUT);
pinMode( ledPin2, OUTPUT);

// The PIR sensor could have its output already high.
// Read that pin from the PIR sensor to detect the first
// low to high transition after it turns low.
lastPirState = digitalRead( pirPin);
}


void loop()
{
// ----------------------------------------
// First part, StateChangeDetection
// ----------------------------------------

int pirState = digitalRead( pirPin);

if( pirState != lastPirState) // something changed ?
{
if( pirState == HIGH)
{
// The PIR sensor has just changed from LOW to HIGH
// Start (or restart) the timer.
Serial.print( "Beweging gedetecteerd. ");
if( ledsAreOn)
{
Serial.println( "Software timer wordt verlengd.");
}
else
{
Serial.println( "Software timer wordt gestart.");
}
previousMillis = millis(); // remember this moment (timestamp this moment)
ledsOn(); // turn leds on
ledsAreOn = true; // set flag, the software timer is active.
}
lastPirState = pirState; // remember the new state.
}

// ----------------------------------------
// Second part, a software timer with millis
// ----------------------------------------
if( ledsAreOn) // check flag if software timer is active.
{
if( millis() - previousMillis >= ledOnTime)
{
Serial.println( "Software timer eindigt.");
ledsOff(); // turn leds off
ledsAreOn = false; // stop this software timer
}
}
}


void ledsOn()
{
digitalWrite( ledPin1, HIGH);
digitalWrite( ledPin2, HIGH);
}

void ledsOff()
{
digitalWrite( ledPin1, LOW);
digitalWrite( ledPin2, LOW);
}

Berichten: 26
Geregistreerd: 01 Okt 2017, 14:23

Re: 2 leds aansturen, bijna goed werkend...

Berichtdoor Dracul » 05 Okt 2017, 13:30

Dank Koepel!
Volgens mij was dat inderdaad de versie die ik als 'basis' heb gebruikt. Ik zal eens gaan experimenteren met de versie die jij plaatste. Nogmaals dank voor het meedenken!!!

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 24 gasten