Go Down

Topic: 2 acties naar 2 kanaals relay (Read 272 times) previous topic - next topic

JamesBoelens

Hallo allemaal,
helemaal nieuw met Aruino, dus heb ik even volgende vraag.
Ik wil elk van mijn 2 kanalen op de relay gaan schakelen met een aparte actie.
Actie 1 is het ingeven van een bepaalde 'code' (in dit geval 6
Actie 2 is een pir sensor die de tweede relay aanstuurt.
Apart werken ze allebei, maar als de PIR de ene relay stuurt, en ik druk ook op 6, dan gaat die PIR uit
Ik wil dat ze dus onafhankelijk van elkaar kunnen werken.
Ook nog: hoe zit het met aparte delays? Stel dat ik de PIR 10 sec wil laten schakelen, en de code 5, hoe kan ik de twee apart laten lopen?
Alvast bedankt.
Hier de code:
Code: [Select]
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};


byte rowPins[ROWS] = {5, 4, 3, 2};
byte colPins[COLS] = {8, 7, 6};
int i=0;
int in1 = 11; //de keypad naar relay
int sensor=10;//de PIR ingang
int relay=12;//de PIR naar relay

void setup()
{
  lcd.begin();
  pinMode(sensor,INPUT);
  pinMode(relay,OUTPUT);
  pinMode(in1, OUTPUT);
  digitalWrite(in1, HIGH);
 
}

void loop()
{
  char key = keypad.getKey();
  int value=digitalRead(sensor);
if(value==1)
{
  digitalWrite(relay,LOW);
delay(100);
digitalWrite(relay,HIGH);
}
 
 
if (key != NO_KEY)
{
  if(i==16){lcd.clear();i=0;}
  lcd.setCursor(i,0);lcd.print(key);
  i++;
if(key == '6') 
 {     
  digitalWrite(in1, LOW);
  delay(3000);
  digitalWrite(in1, HIGH);
  delay(100);
  }
  }
}           

MAS3

Hoi JamesBoelens, welkom.

Jouw code doet alles na elkaar, niets door elkaar heen.
Dus eerst kijk je naar wat er getypt word.
Dan haal je de waarde van je PIR sensor binnen, en daar ga je dan meteen mee aan de slag.
Als die sensor een '1' stuurt, dan schakel je een relais, wacht 0.1 seconde, en schakelt dan het relais weer de andere kant op.
Daarna ga je met de ingetypte waarde aan de slag, maar alleen als er ook een waarde werd ingetypt.
Als de juiste waarde werd ingetypt, dan zet je in1 (waarom het dat ding nu ineens niet iets met relay er in ?) om, wacht dan 3 seconden, zet in1 weer terug, en wacht dan weer 0.1 seconden.
Terwijl je wacht, zit je de hele tijd op je horloge (of de Friese staartklok, geen idee) te kijken of de tijd al verlopen is, en verder doe je helemaal niets (ademen nog wel).
Daarom kun je ook niet tegelijk kijken op zowel je horloge als de Friese staartklok, om te zien of er al twee verschillende tijden toevallig tegelijkertijd verlopen zijn.

Natuurlijk werkt het in de werkelijke wereld heel anders als in de programma code.
Maar je programmacode kun je wel aanpassen, zodat je heel veel dichter in de buurt komt van dingen tegelijkertijd doen.
Je moet je er ook bewust van zijn dat je controller ongelofelijk snel door de code heen kan lopen.
Die doet zo'n 16 miljoen stappen code per seconde.
En dan is zo'n Arduino nog maar een ontzettend traag controllertje.

Komt mijn mantra weer:
Bestudeer blink without delay eens uitvoerig, en dan nog een keer.
Daar heb ik ook een onderwerp over gemaakt (klik !), hier in het Nederlandstalige gedeelte.
Als je dat ding snapt met alles wat daaruit te leren is, los je je probleem zo op.

Veel succes !
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

JamesBoelens

Bedankt om mij op de goede weg te helpen.
Ik heb de code inmiddels aangepast, en alles werkt nu zoals het hoort.

Go Up