zondag 14 december 2014

Een testprogramma voor de trap

Voor de aansturing van de trap heb ik een eenvoudig programma (sketch in Arduino-taal) geschreven dat een paar lampen aanstuurt op basis van de PIR-sensoren en de afstandbediening.

In een oneindige loop kijkt het programma welke knop van de afstandbediening wordt ingedrukt (er zijn vier knoppen) en of er iemand in bereik van de PIR-schakelaar loopt.

Afstandbediening met vier knoppen. Midden de ontvanger en rechts de antenne

PIR-sensor in het hekwerk
In rood de uitleg bij het programma.

De sensoren heb ik op analoge pinnen 4 en 5 van de Arduino aangesloten.

  //set up constants for PIR sensors
  const int PIR1 = A4;   // PIR sensor 1
  const int PIR2 = A5;   // PIR sensor 2


De afstandbediening heb ik op analoge pinnen A0 t.m. A3 aangesloten

  // set up constants for remote control
  const int RCA = A2;   // Remote Control button A
  const int RCB = A0;   // Remote Control button B
  const int RCC = A3;   // Remote Control button C
  const int RCD = A1;   // Remote Control button D


Voorlopig stuur ik zes lamprelais aan, aangesloten op de digitale pinnen 8 t.m. 13 

  //set up constants for relais output to lamps
  const int L1 = 13;   // Lamp1
  const int L2 = 12;   // Lamp2
  const int L3 = 11;   // Lamp3
  const int L4 = 10;   // Lamp4
  const int L5 = 9;    // Lamp5
  const int L6 = 8;    // Lamp6

//set up blinkmodes

Ik definieer vier modussen voor het systeem: Alles uit, alles aan, alles knipperen en alleen knipperen bij aanwezigheid van een persoon

  const int BM_AllOff = 0;    // All lights are off
  const int BM_AllOn = 1;    // All lights are on
  const int BM_BlinkAll = 2; // All lights blink
  const int BM_PIR = 3;    // Blink on PIR-sensor reading


We starten in de modus waarin alles uit is.

  int BlinkMode = BM_AllOff; //

De variabele BlinkStatus gebruik ik om tussen Aan en Uit te schakelen. De variabele houdt bij of de lampen aan of uit staan.

  boolean BlinkStatus = false;

// the setup routine runs once when you press reset:

Nu moeten we de pinnen configureren, dus bepalen of ze input-pinnen zijn of output-pinnen.
De Afstandbediening-pinnen zijn input-pinnen

void setup() {
  // set up pins for remote control
  pinMode(RCA, INPUT);
  pinMode(RCB, INPUT);
  pinMode(RCC, INPUT);
  pinMode(RCD, INPUT);

De PIR-pinnen zijn input-pinnen

  // set up pins for PIR sensors
  pinMode(PIR1, INPUT);
  pinMode(PIR2, INPUT);


De Lamp-pinnen zijn output-pinnen

  // set up pins for lamps
  pinMode(L1, OUTPUT);
  //pinMode(L2, OUTPUT);


  // Make the inputs for remote control a pullup resistor
  digitalWrite(RCA,HIGH);
  digitalWrite(RCB,HIGH);
  digitalWrite(RCC,HIGH);
  digitalWrite(RCD,HIGH);

Omdat ik op mijn scherm wil zien wat het systeem doet, configureer ik een communicatiekanaal
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
 

}

De onderstaande procedure zorgt er voor dat de lampen knipperen. De procedure doet één (halve) knipper. De procedure maakt de lamp-pinnen hoog of laag, afhankelijk van wat ze waren en wacht daarna een tussenpoos van 500 milliseconden.

void doBlink(){
    if (BlinkStatus) {
      digitalWrite(L1, HIGH);
      digitalWrite(L2, LOW);
   
    }else{
      digitalWrite(L1, LOW);
      digitalWrite(L2, HIGH);
    }
    delay(500);
    BlinkStatus = !BlinkStatus;
}


// the loop routine runs over and over again forever:

Dit is de loop die eindeloos herhaald wordt

void loop() {

 // read the input pin:

Kijk wat de afstandbediening aangeeft

  int buttonA = digitalRead(RCA);
  int buttonB = digitalRead(RCB);
  int buttonC = digitalRead(RCC);
  int buttonD = digitalRead(RCD);

Schakel de juiste blinkmode in afhankelijk van de ingedrukte knop
en stuur de waarde naar de serial printer zodat ik die op het scherm kan zien.

  // Set blinkmode from remote control
  if (buttonA == 1) {
    BlinkMode = BM_AllOff;
    Serial.print("BlinkMode set to BM_AllOff"); Serial.println();
  }
  if (buttonB == 1) {
    BlinkMode = BM_AllOn;
    Serial.print("BlinkMode set to BM_AllOn"); Serial.println();
  }
  if (buttonC == 1) {
    BlinkMode = BM_BlinkAll;
    Serial.print("BlinkMode set to BM_BlinkAll"); Serial.println();
  }

  if (buttonD == 1) {
    BlinkMode = BM_PIR;
    Serial.print("BlinkMode set to BM_PIR"); Serial.println();
  }

De onderstaande code implementeert de knipper modussen 

//Blinking routine

Alles uit, dus maak de lamp-pinnen laag
  //All lights are off
  if (BlinkMode == BM_AllOff){
    digitalWrite(L1, LOW);
    digitalWrite(L2, LOW);
  }

Alles aan, dus maak de lamp-pinnen hoog
  //All lights are on
  if (BlinkMode == BM_AllOn){
    digitalWrite(L1, HIGH);
    digitalWrite(L2, HIGH);
  }

Alles knipperen, dus wissel de status van de lampen met de knipperroutine
  //All lights blink
  if (BlinkMode == BM_BlinkAll){
  doBlink();
  }

Knipperen bij aanwezigheid, dus knipper wanneer één van de twee PIR-sensoren een spanning afgeeft. N.B: || = OR

// Lights blink on PIR
  if (BlinkMode == BM_PIR){

    if ((digitalRead(PIR1)== HIGH)||(digitalRead(PIR2)== HIGH)) {
    doBlink();
    }

 
  }

delay(5); // delay in between reads for stability
}

Dit programma heb ik getest en het werkt naar behoren. Ik hoop dat het nog steeds werkt wanneer er vijf meter kabel tussen de sensor en de Arduino zit... Maar dat hoor je in een volgende blog.

Geen opmerkingen:

Een reactie posten