Hulp gezocht met pir programma

goedemiddag

ben nieuw op dit forum en oudere jongere(66+)

vindt elektronica fascinerend en leuk om te experimenteren

heb in mijn zoldertap led verlichting gemaakt en die wil ik aansturen met 2x pir(beneden en boven de trap)

heb onderstaand programma gemaakt maar krijg het naar(heelveelexperimenteren) niet goed werkend.

Kan/wil iemand helpen wat ik over het hoofd zie.

Bijvoorbaat dank.

// 2x pir voor zolder trap verlichting

// gebruik arduin pro micro board

// 2x pir om trapverl te activeren

int pirPin = 2; // sensor is aangesloten op pin 2

int pirPin1 = 7; // toegevoegd

int ledPin = 15; // led aangesloten op pin 15

int motionStatus = 0; // beweging sensor opslaan (hoog of laag)

int pirState = 0; // status verandering bijhouden

void setup() {

Serial.begin(9600); // initializeer serial monitor

pinMode(pirPin, INPUT); // pir sensor is aangesloten als input

pinMode(pirPin1,INPUT); // toegevoegd

}

void loop() {

motionStatus = digitalRead(pirPin); // lees uitgang pirpin (hoog of laag)

// if the motion status is HIGH

if (motionStatus == HIGH) {

if (pirState == LOW ) {

Serial.println("Motion Detected"); // print resultaat in serial monitor

digitalWrite(ledPin, HIGH); // zet led aan

pirState = HIGH; // status bijwerken naar hoog

}

// if the motion status is HIGH

motionStatus = digitalRead(pirPin1); // toegevoegd

if (motionStatus == HIGH) { // toegevoegd

if (pirState == LOW ) { // toegevoegd

Serial.println("Motion Detected"); // toegevoegd

digitalWrite(ledPin, HIGH); // toegevoegd

pirState = HIGH; // toegevoegd

}

}

//or else if motion status is low

else {

if (pirState == HIGH) {

Serial.println ("Motion Ended"); // print resultaat in serial monitor

digitalWrite(ledPin, LOW); // zet led uit

pirState = LOW; // status bijwerken naar laag

}

delay(100); // lees intervallen van pir sensor vertragen (1 sec)

}

}

}

pinMode(ledPin,OUTPUT);

dank voor antwoord. dat ik dit niet gezien heb.(te lang in vaste gedachte gang)

maar de volgend uitdaging doemd alweer op.

na programma aangepast te hebben, reageert serialmonitor met motion dectectied maar gaat gaat niet uit. de tweede pir1 reageert helemaal niet.

bij compileren krijg ik geen fouten.

Je prints zijn onduidelijk.
Je zegt alleen motion detected, niet waar die motion detected werd.
Gebruik die seriele poort om er achter te komen wat er precies gebeurt, dus alles wat je wil controleren kun je via die poort naar buiten sturen.
Dat kun je er later altijd weer uithalen als het helemaal naar wens draait.
Verder kijk je alleen naar pirPin1 als pirPin HIGH is, ik denk niet dat dat ook de bedoeling is.

Ook herhaal je code, dat schaadt niet per se, maar kan wel een stuk efficiënter.

Kijk naar pirPin en sla het resultaat op in een variabele.
Kijk naar pirPin1 en sla het resultaat op in een andere variabele.
Als hierna 1 van de 2 variabelen veranderd is naar HIGH èn de LED stond niet al aan, zet dan ook de LED aan.
Als de variabelen beide LOW zijn (en waarschijnlijk wil je dan ook nog even wachten), zet dan de LED uit.

Dit is niet hoe jouw sketch nu werkt.

Wel fijn dat de anderen je programma kunnen lezen, maar voor mij is het toch noodzakelijk dat je je originele post met het programma aan past, of je nieuwste versie post, op een wat duidelijkere manier.

  • Auto format je sketch dmv Ctrl-t zodat alle indents correct zijn.
  • op een verse regel in je post, click op 'code' en kopieer je programma tussen de 2 regels met '''

Dan ziet het geheel er ongeveer zo uit.

void setup() {
  Serial.begin(9600); // initializeer serial monitor
  pinMode(pirPin, INPUT); // pir sensor is aangesloten als input
  pinMode(pirPin1,INPUT); // toegevoegd
}

en is het voor de meeste mensen een stuk duidelijker leesbaar.

dank voor reactie.

ben niet zo bedreven in programmeren dus ik heb een variable maken moet ik mij daar in verdiepen

Dank voor reactie.

ben niet zo bedreven met arduino, maar vindt gewoon leuk om er mee bezig te zijn.

er liggen nog wel wat uitdagingen op mijn pad.

voor dit programma heb eerst programma gemaakt met 1 pir, dit werkt goed.

mijn volgende stap dus nu 2 pirs te gebruiken.

hier lig nu de uit daging voor mij.

Ok nou, je kunt je eigen sketch er op nazien.
Want daar heb je al de variabelen voor pirPin, ledPin en motionStatus gemaakt.
Ik wil je daar later nog wel iets over voorstellen hoe je daar iets slimmer mee om kunt gaan dan je nu gedaan hebt, maar voor nu is het OK en kun je daar eens naar kijken.

Doe het rustig aan en stapje voor stapje, dus neem niet teveel hooi op je vork want dan blijft het leuk en overzichtelijk.
En lees heel goed wat er in de antwoorden die je hier krijgt precies staat, want in mijn vorige antwoord staat meer dan je in de eerste keer lezen zou denken.

Wederom dank voor reactie.

Mijn basis programma is met 1 pir.(dat ovengins goed werkt)

Dus mijn uitdaging is nu 2 pirs.

Bij het maken van dit programma had al iets van dit kan anders.

Dit stond al in je eerste mail.( Ook herhaal je code, dat schaadt niet per se, maar kan wel een stuk efficiënter)

Dus hier ligt voor mij uitdaging.

Snap het nu helemaal niet meer.

Heb programma opnieuw geschreven maar krijg het niet gecompileerd.

Bij regel 24 gaat het fout.

Wil nu weten of ik tot aan de loop alles goed heb.

int pinPir1 = 2;

int pinPir2 = 7;

int led = 15;

int motionStatus = 0;

int pirState = 0;

void setup() {

Serial.begin(9600);

pinMode(pinPir1, INPUT);

pinMode(pinPir2, INPUT);

pinMode(led, OUTPUT);

}

void loop() {

// ga van beneden naar boven(pinPir1)

motionStatus=digitalRead(pinPir1);

if (motionStatus == HIGH)

if (pirState == LOW)

Serial.println("beweging gedecteerd");

  digitalWrite(led, HIGH);

  pirState = HIGH;

}

} // regel 24

else{

  if (pirState == HIGH){

    Serial.println("einde beweging");

    digitalWrite(led, LOW);

    pirState = LOW;

    delay(1000);

  }

}

// van boven naar beneden(pinPin2)

motionStatus=digitalRead(pinPir2);  

if (motionStatus == HIGH)

if (pirState == LOW)

Serial.println("beweging gedecteerd");

  digitalWrite(led, HIGH);

  pirState = HIGH;

  }

}

else{

  if (pirState == HIGH){

    Serial.println("einde beweging");

    digitalWrite(led, LOW);

    pirState = LOW;

    delay(1000);

  }

}  

}

Je programmeert in de arduino ide?
als je dan de toetscombinatie [ctrl] [t] gebruikt, wordt de code netjes onder elkaar gezet en dan blijkt dat je wat loopt te stoeien met afsluitende accolades.

int pinPir1 = 2;
int pinPir2 = 7;
int led = 15;
int motionStatus = 0;
int pirState = 0;
void setup()
{ Serial.begin(9600);
  pinMode(pinPir1, INPUT);
  pinMode(pinPir2, INPUT);
  pinMode(led, OUTPUT);
}

void loop()
{ // ga van beneden naar boven(pinPir1)
  motionStatus = digitalRead(pinPir1);
  if (motionStatus == HIGH)
    if (pirState == LOW)
      Serial.println("beweging gedecteerd");
  digitalWrite(led, HIGH);
  pirState = HIGH;
}
} // regel 24
else {
  if (pirState == HIGH)
  { Serial.println("einde beweging");
    digitalWrite(led, LOW);
    pirState = LOW;
    delay(1000);
  }
}
// van boven naar beneden(pinPin2)
motionStatus = digitalRead(pinPir2);
if (motionStatus == HIGH)
  if (pirState == LOW)
    Serial.println("beweging gedecteerd");
digitalWrite(led, HIGH);
pirState = HIGH;
}
}
else {
  if (pirState == HIGH) {
    Serial.println("einde beweging");
    digitalWrite(led, LOW);
    pirState = LOW;
    delay(1000);
  }
}
}

Dank voor reactie.

Er valt mij nu wat op in mijn programma.

Als je kijkt naar digitalWrite(led,LOW); / pirState = HIGH en motionStatus == HIGH, blijft LOW en HIGH zwart gekleurd ipv rood

Ik vermoed dat dat komt doordat je die variabelen (boven setup) als integers hebt gedefinieerd.
Een integer kan niet HIGH of LOW zijn (alhoewel een LOW 0 is, en een HIGH alles anders dan 0).
Wat als je die als bool definieert ?

komt vermoedelijk omdat de loop stopt na “pirState = HIGH;”
daarna komen er 2 sluitende accolades dus else en wat erna komt staat al helemaal niet meer in de loop.

Ergens heb ik het vermoeden dat hier een openende accolade ontbreeekt.

  if (pirState == LOW)  { // hier
    Serial.println("beweging gedecteerd");

en hier ook.

Het is waarschijnlijk het verstandigst om met jezelf af te spreken waar je de openende (en sluitende) accolades zet.

Of op de regel van de voorwaarde of declaratie van de functie, of op de regel daarna.

Ik gebruik voor mezelf het eerste, maar vooral ook dit, dat ik nooit nog direct wat achter een accolade zet op dezelfde regel (muv een ; als het }; aan het eind van een functie prototype of class betreft)

Door dit soort regels voor jezelf kan je beter overzicht bewaren.

Deva, dit is niet mijn programma. Het enige wat ik heb gedaan is de code van hobby-bob gekopieerd en in de ide gezet en toen met ctrl + t automatische indent toegepast. Daaruit blijkt dat er veel te veel afsluitende accolades zijn waardoor het overgrote deel niet in de loop zit zodat hobby-bob deze vergissingen kan verhelpen.

Ja sorry, ik zag te laat dat ik een antwoord schreef aan jouw, dat was niet de bedoeling, het had een antwoord op het topic moeten zijn. Ik kon dat toen echter niet meer wijzigen.

Programma is aangepast en kan het nu compileren kunnen.
Wat mij nu opvalt (volgende uitdaging) is dat ik in serial monitor zie, dat de pirs continu beweging deceteren terwijl deze zijn afgeschermd.
int pinPir1 = 2;
int pinPir2 = 7;
int led = 15;
int motionStatus = 0;
int pirState = 0;

void setup() {
Serial.begin(9600);
pinMode(pinPir1, INPUT);
pinMode(pinPir2, INPUT);
pinMode(led, OUTPUT);
}

void loop() {
// ga van beneden naar boven(pinPir1)
motionStatus = digitalRead(pinPir1);
if (motionStatus == HIGH)
if (pirState == LOW) { // hier
Serial.println("beweging gedecteerd");
digitalWrite(led, HIGH);
pirState = HIGH;
}
//}
else {
if (pirState == HIGH)
Serial.println("einde beweging");
digitalWrite(led, LOW);
pirState = LOW;
delay(1000);
}
//}
// van boven naar beneden(pinPin2)
motionStatus = digitalRead(pinPir2);
if (motionStatus == HIGH)
if (pirState == LOW) { // hier
Serial.println("beweging gedecteerd");
digitalWrite(led, HIGH);
pirState = HIGH;
}
//}
else {
if (pirState == HIGH) {
Serial.println("einde beweging");
digitalWrite(led, LOW);
pirState = LOW;
delay(1000);
}
}
}

???

zoals je nu zelf hebt gezien (denk ik) zijn alle bij elkaar horende stukken code nu netjes tussen openende en sluitende accolades.

De compiler zal inderdaad geen foutmelding geven en netjes compileren.

ik zelf kies meestal om een inputpin met een (interne) weerstand omhoog te trekken en te reageren op een omlaag trekken. Geen idee of dat jouw methode vaak valse meldingen geeft.