Arduino Mosfet pir voor Ledstrip

Beste Allemaal..

Nu heb ik eens van iemand gehoord at hij een bizar mooi iets had.
Zere tenen genaamd.
Je stapt het bed uit en onder de bedrand gaat een ledstrip aan.
Naar wc en ledstrip gaat uit.

Ik zou me voor kunnen stellen dat dit voor de pro's hier een makkie is...

Alleen ik ben een BOB de bouwer en geen elektra man.
Zou iemand me op weg kunnen helpen..

Ik heb alles in huis, maar krijg hem echt niet werken.
Mosfet, arduino, ledstrip,pir, voeding weerstand, lichtsensor enz enz .
Een goede sketch zou wonderen doen...
Of een linkje naar waar ik eea zou kunnen leren..
Bijv het aansturen van een ledstrip...[ krijg hem niet aan het branden ]
Want anders kan ik hem via Kaku ook nog maken, in mijn domotica systeem

So please help....

niks tegen bob de bouwer, die man kon ook gewoon elektro :P

verder is het makkelijk om je sketch en je aansluitschema hier even te posten, dan is waarschijnlijk vrij makkelijk te zien waar het mis gaat

het is makkelijk om een systeem op te delen

en standaard code te gebruiken, vanaf hier:
http://arduino.cc/en/Tutorial/HomePage
je lichtsensor bijv met de AnalogReadSerial
een pir test je met DigitalReadSerial
je ledstrip test je met zoiets al blink

als alles werkt ga je de stukken code aan elkaar knutselen

De sketch is niet van mij.
Maar wat ik er uit wil hebben is die led voor aan en uit.
Want als ik eerlijk ben snap ik er niet veel van

Mijn optie.
2 pir sensors, ene kant en andere kant van bed.
Donker in de slaapkamer, voetjes langs het bed, pir aan..
Led aan voor x seconden.

c code:

/*
 * PIR sensor tester
 */
 
#include <EEPROM.h> 
 
int ledPin = 12;                // choose the pin for the LED
int PIRpin = 2;               // choose the input pin (for PIR sensor)
int LDRpin = 2;
int pirState = LOW;             // we start, assuming no motion detected
int val = 0;                    // variable for reading the pin status
int pval = 0;                   // variable for reading the pin status
byte maxbrightness = 15;        // max brightness
byte brightness = 0;            // brightness
int ontime = 15;                // in seconds
int rampdelay = 250;
boolean ledstate = false;       // LEDs are on or off
boolean dark = true;
int maxdark = 100;
unsigned long offtime;


#define DEBUG 0
#define NVALUES 1

static byte settings[NVALUES];   // 0 = red, 1 = green, 2 = blue, 3 = white
static byte slots[256];          // time slots, toggles whenever a bit is set

// which setting affects which I/O pin:
//  bits 0..3 = AIO1 .. AIO4
//  bits 4..7 = DIO1 .. DIO4

//static const byte masks[NVALUES] = {0x20, 0x02, 0x10, 0x01 };
//                                     7654 3210
//                              0x20 = 0010 0000 = DIO2
//                              0x02 = 0000 0010 = AIO2
//                              0x10 = 0001 0000 = DIO1
//                              0x01 = 0000 0001 = AIO1

// 0x10 = bit 4 = DIO1 = Arduino digital 4
static const byte masks[NVALUES] = {0x10};

static void setupIO() {
  for (byte i = 0; i < NVALUES; ++i) {
    PORTD &= ~ (masks[i] & 0xF0);   // turn DIO pin off
    DDRD |= masks[i] & 0xF0;        // make pin an output
  }    
}

static void prepareSlots() {
  #if DEBUG
  Serial.print("settings ");
  for (byte i = 0; i < NVALUES; ++i) {
    Serial.print(' ');
    Serial.print(settings[i], DEC);
  }
  Serial.println();
  #endif    

  // set a few bits, i.e. at the time when we need to toggle the output pin
  memset(slots, 0, sizeof slots);
  // note: a 0 setting toggles the same bit twice, so it won't ever turn on
  for (byte i = 0; i < NVALUES; ++i) {
    byte level = settings[i];   // get the requested PWM level
    byte mask = masks[i];       // map setting to corresponding I/O pin
    slots[0] ^= mask;           // toggle on at the start of the loop
    slots[level] ^= mask;       // toggle off at the proper time
  }
  // Special case: run LED at full brightness for level 255 - this is done
  // by turning the LED on at the start of each scan and never toggling it.
  // This is done in loop() below, but we must prevent toggling in this case.
  slots[0] ^= slots[255];
}

static void loadSettings() {
  for (byte i = 0; i < NVALUES; ++i)
    settings[i] = EEPROM.read(i);
  prepareSlots();
}

static void saveSettings() {
  for (byte i = 0; i < NVALUES; ++i)
    EEPROM.write(i, settings[i]);
  prepareSlots();
}


 
void setup() {

  setupIO();
  settings[0] = 0;
  saveSettings();
  loadSettings();

  pinMode(ledPin, OUTPUT);      // declare LED as output
  pinMode(PIRpin, INPUT);     // declare sensor as input
 
  Serial.begin(9600);
  Serial.println("[BEDLIGHTPIR]");
}
 
int loopdelay = 0;
//int dark=0;

void loop(){

//  Serial.print(millis());
//  Serial.print(" ");
//  Serial.println(brightness,DEC);
//  delay(100);

  
  val = digitalRead(PIRpin);  // read input value

  if (loopdelay % rampdelay == 0)  
  {
    dark = (analogRead(LDRpin) < maxdark);
  }
//  Serial.print(millis());
//  Serial.print(" ");
//  Serial.println(dark?"dark":"light");
//  delay(100);
  

  if (val != pval) 
  {
    
    if (val == HIGH) 
    {
      // motion, so move time for the leds to go
      // off again forward
      offtime = millis() + (ontime * 1000);    
      digitalWrite(ledPin, HIGH);  // turn LED ON     
      if (!ledstate)
      {
        // leds were off, switch them on now
        brightness = 0;        
        ledstate = true;
        loopdelay = 0;
      }
    }
    else 
    {
      // no more motion.
      digitalWrite(ledPin, LOW); // turn LED OFF
    }
    pval=val;
  }
  if(dark)
  {
    if((ledstate) && (millis() > offtime))
    {
      ledstate = false;
      loopdelay = 0;
    }
  
    if ((ledstate) && (brightness < maxbrightness) && (loopdelay % rampdelay == 0))
    {   
      brightness++;
      settings[0] = brightness;
      prepareSlots();    
    }
    
    //if (((!ledstate) && (brightness > 0) || !dark) && (loopdelay % rampdelay == 0))
    if ((!ledstate) && (brightness > 0) && (loopdelay % rampdelay == 0))
    {
      brightness--;
      settings[0] = brightness;
      prepareSlots();    
    }
  }
  else
  {
    if ((brightness > 0) && (loopdelay % rampdelay == 0))
    {
      brightness--;
      settings[0] = brightness;
      prepareSlots();    
    }   
  }
  
  loopdelay++;
  
  // handle the special case: full-on never toggles the LED
  // FIXME: this needs to be refined if not all pins are allocated to LED PWM
  
//PORTC = (PORTC & 0xF0) | (slots[255] & 0x0F);
  PORTD = (PORTC & 0x0F) | (slots[255] & 0xF0);

  // here, the LED state is known: all LEDs with levels < 255 are off
  for (byte i = 0; i < 255; ++i) {
//  PINC = slots[i] & 0x0F; // toggle AIO pins for time slot i
    PIND = slots[i] & 0xF0; // toggle DIO pins for time slot i
    //delayMicroseconds(10);
  }
  
}

Uhm sorry de mosfet is vaia jeelabs.
http://jeelabs.net/projects/hardware/wiki/MOSFET_Plug
Die ik ook totaal niet snap..
En de pinnen van de arduino heb ik allemaal al een keer gehad..

[Bericht gewijzigd door Henry S. op maandag 18 november 2013 19:50:19 (0%)

Dit valt me gelijk op zonder de code te hebben doorgelezen. Dat lijkt me verkeerd, beide op dezelfde pin.

int PIRpin = 2;
int LDRpin = 2;

Je moet dus LDR op bijvoorbeeld pin 3 zetten. LDR is een lichtgevoelige weerstand, PIR sluit je aan op pin 2.

Wil je echt elektronica en programmeren leren of is het voor eenmalig gebruik om dit werkend te krijgen?

Mwhaa.
Programeren...zou graag willen
Ben ik echt te oud voor.
Deze sketch is bedoeld voor mijn zere tenen project ..
Ik wil een ledstrip onder mijn bed werkend krijgen, met 2 pirren.
De ldr enz enz ,mogen eruit, ik schakel hem met domoticz aan en uit.

Heb een mosfet die 12 volt leds aan en uit zet werkend op mijn arduino.[ ik ben trots als een beer mee ... ]

Heb ook een simpele sketch gevonden..
Maar door mijn gebrek krijg ik deze ook niet goed werkend.
https://raw.github.com/jedgarpark/Make_PIR_Sensor/master/MAKE_PIR_Sens…
Hier zou de buzzer ruit mogen.
En als daar tijd in kan stellen, tijd om te plassen en terug ben ik blij..

Ben een eind...
Maar hij doet het net anders om.
Pir actief, lamp uit..
Pir stil lamp aan...

Eigenlijk alleen maar andersom...
Maar dat lukt me niet...?

c code:

// Uses a PIR sensor to detect movement, buzzes a buzzer
// more info here: http://blog.makezine.com/projects/pir-sensor-arduino-alarm/
// email me, John Park, at jp@jpixl.net
// based upon:
// PIR sensor tester by Limor Fried of Adafruit
// tone code by michael@thegrebs.com

 
int ledPin = 12;                // choose the pin for the LED
int inputPin = 2;               // choose the input pin (for PIR sensor)
int pirState = LOW;             // we start, assuming no motion detected
int val = 0;                    // variable for reading the pin status

void setup() {
  pinMode(ledPin, OUTPUT);      // declare LED as output
  pinMode(inputPin, INPUT);     // declare sensor as input

//  Serial.begin(9600);
}

void loop(){
  val = digitalRead(inputPin);  // read input value
  if (val == HIGH) {            // check if the input is HIGH
//    digitalWrite(ledPin, HIGH);  // turn LED ON
      delay(100);      // delay is ophouden

    
    if (pirState == LOW) {
      // we have just turned on
//      Serial.println("Motion detected!");
      // We only want to print on the output change, not state
      pirState = LOW;
    }
  } else {
//      digitalWrite(ledPin, LOW); // turn LED OFF
           delay(100);    
      if (pirState == HIGH){
      // we have just turned of
      Serial.println("Motion ended!");
      // We only want to print on the output change, not state
      pirState = HIGH;
    }
  }
}


Maakt me gek...
So please waar kijk ik verkeerd...
Tekst erachter klopt niet

c code:

// Uses a PIR sensor to detect movement, buzzes a buzzer
// more info here: http://blog.makezine.com/projects/pir-sensor-arduino-alarm/
// email me, John Park, at jp@jpixl.net
// based upon:
// PIR sensor tester by Limor Fried of Adafruit
// tone code by michael@thegrebs.com

 
int ledPin = 12;                // choose the pin for the LED
int inputPin = 2;               // choose the input pin (for PIR sensor)
int pirState = LOW;             // we start, assuming no motion detected
int val = 1;                    // variable for reading the pin status

void setup() {
  pinMode(ledPin, OUTPUT);      // declare LED as output
  pinMode(inputPin, INPUT);     // declare sensor as input

  Serial.begin(9600);
}

void loop(){
  val = digitalRead(inputPin);  // read input value
  if (val == LOW) {            // Zorgt dat hij de goed "richting"op gaat High is de pir anders om
  digitalWrite(ledPin, HIGH);  // turn LED ON
//      delay(10);      
    
    if (pirState == LOW) {      // 
     Serial.println("Motion detected!");      // 
      pirState = LOW;
//      delay(10000);
    }
  } else {     digitalWrite(ledPin, LOW); // 
             
      if (pirState == HIGH){      // we have just turned of
      Serial.println("Motion ended!");      // 
      pirState = HIGH;
//     delay(1000000);  // tijd dat lamp aan is
    }
  }
}


Hij doet wat ik wil...[ ben best trots op mezelf ]
Het enige wat ik er niet in krijg.
Is tijd..
Ongeveer zolang om te plassen en terug te lopen...

Nog een probleempje ontdekt..
Wanneer ik de usb poort eraf haal, en alleen de 12volt voeding erop laat zitten.
Gaan de leds niet uit, maar heel zachtjes branden????
Toch niet zo'n productief middagje gehad...

[Bericht gewijzigd door Henry S. op maandag 18 november 2013 19:51:04 (27%)

Ik heb niet zo veel airduno kennis, maar de maker van deze code heeft een zogenaamde "state machine" willen bouwen. d.w.z. dat je niet alleen schakelt maar ook de schakelmomenten kan gebruiken om bijvoorbeeld een logboek te kunnen vullen. Die heb jij naar mijn mening niet echt nodig..

zoiets als deze code is meer dan genoeg denk ik.

c code:


// Uses a PIR sensor to detect movement, buzzes a buzzer
// more info here: http://blog.makezine.com/projects/pir-sensor-arduino-alarm/
// email me, John Park, at jp@jpixl.net
// based upon:
// PIR sensor tester by Limor Fried of Adafruit
// tone code by michael@thegrebs.com


int ledPin = 12;                // choose the pin for the LED
int inputPin = 2;               // choose the input pin (for PIR sensor)
int val = 0;                    // variable for reading the pin status

void setup() {
	pinMode(ledPin, OUTPUT);      // declare LED as output
	pinMode(inputPin, INPUT);     // declare sensor as input

}

void loop(){  //start de eeuwige loop
	val = digitalRead(inputPin);  //lees de actuele toestand van de PIR
	if (val == HIGH)  
	{            
		//de PIR is "hoog" (beweging gezien), dus inschakelen LED OF
		//de PIR is nog steeds hoog, hoe dan ook ledpin hoog maken of houden.
		digitalWrite(ledPin, HIGH);  // turn LED ON
		delay(100);      //wacht geduldig een tijdje terwijl de ledjes branden.
		//(let op: 100 zou ook msec kunnen zijn, in dat geval flink ophogen)

		//terug naar het begin van de loop (else word dus niet gedaan)
	}
	else 
	{
		//de PIR is weer laag. Leds kunnen uit. 
		digitalWrite(ledPin, HIGH);  // turn LED ON
	}
}

nogmaals, ben geen airduino programmeur, maar het zou zeker werkend moeten zijn te krijgen....

Thanks

Skysoft..
Ik ben BOB de bouwer dus...
Ik ben blij dat je helpt..

Het kan dus nog kleiner..
Maar helaas deze sketch doet niets.

En wat bij mijn oude skecth usb eruit ledjes half aan...
Kan daar misschien aan gedaan worden??

De arduino zul je altijd spanning moeten blijven geven dat kan doormiddel van 9-12V op de zwarte power jack of op de arduino zit een pin dat het "Vin" Dat wil zeggen Voltage input daar kun je direct een spannings bron inprikken van 5V

Verbind de GND ( min ) van je 12v voeding met de GND ( min ) van je arduino dan zal de led uit of aan zijn en niet zwak branden

Voor het programma zal ik straks even na kijken.

@ Sjoerd.
Ik heb de min van de led op gnd van de arduino zitten.

En als je zou willen kijken naar de sketch heel graag...

Ik heb ook nog de originele van Arduino.
Die doet hetzelfde, laat ook de leds half aan bij uit.
En de pir werkt verkeerd om.
Beweging pir, lamp uit...

c code:

/* 
 * //////////////////////////////////////////////////
 * //making sense of the Parallax PIR sensor's output
 * //////////////////////////////////////////////////
 *
 * Switches a LED according to the state of the sensors output pin.
 * Determines the beginning and end of continuous motion sequences.
 *
// * @author: Kristian Gohlke / krigoo (_) gmail (_) com / http://krx.at
 * date:   3. September 2006 
 *
 * kr1 (cleft) 2006 
 * released under a creative commons "Attribution-NonCommercial-ShareAlike 2.0" license
 * http://creativecommons.org/licenses/by-nc-sa/2.0/de/
 *
 *
 * The Parallax PIR Sensor is an easy to use digital infrared motion sensor module. 
 * (http://www.parallax.com/detail.asp?product_id=555-28027)
 *
// * The sensor's output pin goes to HIGH if motion is present.
 * However, even if motion is present it goes to LOW from time to time, 
 * which might give the impression no motion is present. 
 * This program deals with this issue by ignoring LOW-phases shorter than a given time, 
 * assuming continuous motion is present during these phases.
 *  
 */

/////////////////////////////
//VARS
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 20;        

//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 = 1000;  

boolean lockLow = true;
boolean takeLowTime;  

int pirPin = 2;    //the digital pin connected to the PIR sensor's output
int ledPin = 13;


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

  //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(500);
  }

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

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

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

       if(takeLowTime){
        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);
           }
       }
  }

[Bericht gewijzigd door Henry S. op maandag 18 november 2013 20:13:39 (0%)

Ik ben geen programmeur maar ik weet wel dat je met het uitroepteken kunt inverteren dus als jou programma werkt zo als jij wilt zou je kunnen proberen er ergens een " ! " voor te zetten

Volgens mij kan Bob beter: 12V PIR IR Pyroelectric Infrared Module Adjust Relay Output kopen voor $7.55 incl verzenden. Dat is kant en klaar en een stuk goedkoper dan die Arduino.

eBay item number:121214771347

Adjustable delay time: 10 seconds - 350 seconds.

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Bob ..

Heeft hem bijna...
Alleen nog steeds een ledstrip niet niet helemaal uit gaat, als de usb eruit is..[ usb erin werkt hij perfect.. ]
Dus er blijft een beetje spanning op de ledstrip...
Misschien daar iemand een oplossing voor?

Worden de LED strips door de arduino van spanning voorzien? Zo nee, zou je met een weerstandje de gate van de mosfet(degene die naar je arduino gaat) naar de gnd van de schakeling kunnen trekken.

Dit is mijn aansluit schema..
https://dlnmh9ip6v2uc.cloudfront.net/assets/a/f/5/0/9/52433cdc757b7f6c…
.

[Bericht gewijzigd door dylantje op zaterdag 23 november 2013 21:14:29 (26%)

Welke mosfet gebruik je? Waarschijnlijk kan de 10K weerstand weg en de gate direct aan de IO van de arduino. Dan kun je vervolgens een weerstand van de gate naar de 0V aanbrengen om zo de mosfet uit te schakelen als de arduino uit staat.

Uhm dus eigenlijk is de vraag ..
waar en hoe en hoe zwaar moet dat weerstandje zijn.

Mijn mosfet http://www.conrad.nl/ce/nl/product/162873/?insert=89&insertNoDeeplink&…

En mijn tweede PIR weigert..

code:

// Twee pirren onder het bed...
// Pir A en Pir B 
//Pir B werkt niet...
 
int ledPin = 12;                // choose the pin for the LED
int inputPin = 2;               // choose the input pin (for PIR sensor)
int inputPinB = 3;               // PIRB
int pirState = LOW;             // we start, assuming no motion detected
int pirStateB = LOW;             // PIR B
int val = 1;                    // variable for reading the pin status
int valB = 1;                    // PIR B
void setup() {
  pinMode(ledPin, OUTPUT);      // declare LED as output
  pinMode(inputPin, INPUT);     // declare sensor as input
  pinMode(inputPinB, INPUT);     // PIr B
  Serial.begin(9600);
}
//////////////// PIR A
void loop(){
  val = digitalRead(inputPin);  // read input value
   if (val == LOW) {            // Zorgt dat hij de goed "richting"op gaat High is de pir anders om
   digitalWrite(ledPin, HIGH);  // turn LED ON
     delay(100);        // uitlezen van ?
 ////////////////   
    if (pirState == HIGH) {      // 
     Serial.println("Motion detected!");      // 
      pirState = LOW;
      delay(100); // weet niet maar zal iets met uitlezen zijn.
 ///////////////////////////
      }
  } else {     digitalWrite(ledPin, LOW); // 
             
    if (pirState == LOW){      // we have just turned of
    Serial.println("Motion ended!");      // 
    pirState = HIGH;
     delay(10000);  // Tijd lamp aan is
    }
  }
} 
/////////////////////

//}
////////////////PIR B
void loopB(){
  valB = digitalRead(inputPinB);  // read input value
   if (valB == LOW) {            // Zorgt dat hij de goed "richting"op gaat High is de pir anders om
   digitalWrite(ledPin, HIGH);  // turn LED ON
     delay(100);        // uitlezen van ?
 ////////////////   
    if (pirStateB == HIGH) {      // 
     Serial.println("Motion detected!");      // 
      pirStateB = LOW;
      delay(100); // weet niet maar zal iets met uitlezen zijn.
 ///////////////////////////
      }
  } else {     digitalWrite(ledPin, LOW); // 
             
    if (pirStateB == LOW){      // we have just turned of
    Serial.println("Motion ended!");      // 
    pirStateB = HIGH;
     delay(10000);  // Tijd lamp aan is
    }
  }
} 

Dacht dat ie goed zat, met voidloopB dacht twee verschillende werkend te krijgen...
Maar B werkt niet..

[Bericht gewijzigd door dylantje op zaterdag 23 november 2013 21:31:28 (80%)

Ik zou een weerstand tussen de 1KΩ en de 10KΩ nemen en deze moet geplaatst worden zoals de 4K7Ω weerstand(de 460Ω) weerstand kun je weglaten.
http://pinball.pixelmagic.nl/IRLZ34-2.jpg
(plaatje is geleend van iemand anders)

Zonder het datablad van de FET bekeken te hebben denk ik dat de weerstand verlagen (weglaten vind ik niet echt gepast) niet echt gaat helpen: de meeste FETs zijn gewoon nog niet lekker open bij 5 Volt op de gate.

Een speciale FET voor digitale signalen (een zogenaamde Logic Level FET) of een extra stuurtrapje zou wonderen kunnen doen.

EDIT: die FET is dus een Logic Level Fet... Apart dat Conrad dat niet duidelijk vermeld.

[Bericht gewijzigd door weardguy op zondag 24 november 2013 11:19:03 (13%)

http://www.m-voorloop.nl --- Ik? Welnee! Ik zit nog lang niet achter de germaniums.

@ Weardguy

Kun je me een type geven??
Of wat een stuurtrapje is??

Hij zal werken??

En iemand een tip voor de 2de pir???

De MOSFET die je hebt is prima (logic level), die hoef je niet te wisselen. De weerstanden zoals r3dnax die heeft in zijn schema zou ik er wel tussen zetten, dit zorgt ervoor dat je LEDs goed uit gaan als de Arduino uit is.

Wat betreft de 2e PIR:

De void loop die er staat is code die de Arduino automatisch blijft doorlopen, als je zelf een loopB maakt doet hij dat niet zomaar.
Wat daarnaast overzichtelijker is om te doen is in 1 loop zowel pir A als pir B te controleren, en de code om je licht aan te doen te doorlopen als een van beide iets heeft gesignaleerd.

Als het goed is moet de code hieronder werken. Als hij omgekeerd werkt (dat wil zeggen: het licht gaat pas uit als je tegelijk beweegt voor allebei de PIRs) moet je dit:

c code:

if (valA == HIGH || valB == HIGH){  // heeft een van beide iets gezien?

aanpassen naar dit:

c code:

if (valA == LOW|| valB == LOW){  // heeft een van beide iets gezien?

Ik heb de code ook even opgeschoond en verduidelijkt, dit is de gehele code die zou moeten werken:

c code:

// Twee pirren onder het bed...
// Pir A en Pir B 
// het licht gaat aan als een van beide iets heeft gezien
 
int ledPin = 12;                 // MOSFET hangt aan deze pin
int inputPinA = 2;               // PIR A hangt aan deze pin
int inputPinB = 3;               // PIR B hangt aan deze pin
boolean valA = false;            // PIR A wordt hierin ingelezen
boolean valB = false;            // PIR B wordt hierin ingelezen

long secondsDelay = 10;           // vul hier in hoeveel seconden je licht aan moet blijven

void setup() {
  pinMode(ledPin, OUTPUT);       // LED is een uitgang
  pinMode(inputPinA, INPUT);     // Pir A is een ingang
  pinMode(inputPinB, INPUT);     // Pir B is een ingang
  Serial.begin(9600);
}

//de loop hieronder wordt eindeloos doorgelopen
void loop(){
  valA = digitalRead(inputPinA);       // lees pir A
  valB = digitalRead(inputPinB);       // lees pir B
   if (valA == HIGH || valB == HIGH){  // heeft een van beide iets gezien?
     digitalWrite(ledPin, HIGH);       // LED aan
     delay(secondsDelay * 1000);       // licht aan laten voor "secondsDelay" seconden
  } 
  else {     
     digitalWrite(ledPin, LOW);        // licht uit!
     delay(250);                       // wacht een kwart seconde tot de volgende keer uitlezen
  }
} 
Lambiek

Special Member

Op 24 november 2013 10:32:15 schreef marbu:
De MOSFET die je hebt is prima (logic level), die hoef je niet te wisselen.

Die fet zou het inderdaad moeten doen.

De weerstanden zoals r3dnax die heeft in zijn schema zou ik er wel tussen zetten, dit zorgt ervoor dat je LEDs goed uit gaan als de Arduino uit is.

Ja, maar dan wel met een andere waarde, de gate weerstand kan je kiezen tussen de 10 en 100E (ik zou voor bijv 47E gaan), en de pull down weerstand op 10K houden.

@ TS,
Heb je al geprobeerd om je uitgang te inverteren?, dan zou het goed moeten werken.

Als je haar maar goed zit, GROETEN LAMBIEK.

Op 24 november 2013 10:32:15 schreef marbu:
De MOSFET die je hebt is prima (logic level), die hoef je niet te wisselen.

Kijk. Ik heb dus niets gezegd! :D Ik zal m'n bericht even aanpassen.

http://www.m-voorloop.nl --- Ik? Welnee! Ik zit nog lang niet achter de germaniums.
Lambiek

Special Member

Op 23 november 2013 22:58:21 schreef weardguy:
Een speciale FET voor digitale signalen (een zogenaamde Logic Level FET) of een extra stuurtrapje zou wonderen kunnen doen.

Daar heb je gewoon gelijk in.

Maar zelfs met een logic level fet gaat het niet altijd, het ligt er helemaal aan wat er geschakeld gaat/moet worden. Maar in dit geval zal het wel lukken, het is maar een led strip.

EDIT: die FET is dus een Logic Level Fet... Apart dat Conrad dat niet duidelijk vermeld.

Het staat toch echt in de datasheet, in de eerste de beste regel. :)

Als je haar maar goed zit, GROETEN LAMBIEK.

@ Marbu..

Heel erg bedankt..!!!!
Vooral voor je simpele code, en de uitleg erachter...
Alleen doet deze het nog niet helemaal.

Tijd instellen werkt, 2 pirren werken ook.

Het wisselen van HIGH / LOW, geeft niet het gewenste effect...
De led is aan. pir ziet iets, led [ bijna uit ]uit.

Dan zou ik niet goed weten waar ik de nieuwe weerstand moet zetten.
Bij de ingang van de pir in de arduino.
Of bij de mosfet, waar er al 1 zit?
Ik krijg de leds dus niet uit.

En wat betekent:
// licht aan laten voor "secondsDelay" seconden

Ik kon de tijd toch al instellen?

Je kon de tijd inderdaad al instellen.
Alleen is het gebruikelijk om alle instellingen bovenaan, centraal te doen en dit dan later in je code op te roepen (zeker handig wanneer je hetzelfde getal vaker nodig hebt maar dat is nu nog niet van toepassing).
Daarnaast werkt de functie in milliseconden dus dan moet je zelf een onhandig lang getal invullen. Nu kun je bovenaan (regel 12) in je code blijven en gewoon seconden invullen.

Je zegt dat het nog niet werkt. Moet je bij allebei de PIRs bewegen voordat de LEDs (vrijwel) uitgaan of maar bij 1? En blijven ze dan 10 seconden uit voor ze weer aan gaan?
Als de LEDs niet helemaal uitgaan terwijl je Arduino wel aanstaat is er ergens iets fout qua aansluitingen (of je MOSFET is misschien niet 100% goed meer maar daar hebben andere users meer verstand van).
Wil je dubbelchecken hoe je alles aangesloten hebt, vooral de aansturing van je MOSFET? Zit de weerstand op de goede manier, zit de MOSFET goed aangesloten?