Ik heb een IRsensor en iedere keer als het oog iets ziet moet er relais/led 1 keer aangaan en meteen weer uit een blink in feiten.
en via de switch case topic (viewtopic.php?f=8&t=528) lukte dat aardig omdat ik "delay" statement kon gebruiken alleen hierbij was het probleem dat als het oog het voorwerp blijft zien. blijft de relais/led branden. En gaat daarna pas over op de "delay" statement.
Dus ik was verdergegaan met m'n oude code gebaseerd op "StateChangeDetection" code.
En bij deze code is het probleem dat ik geen "delay" en geen "break;" kan gebruiken.
Nu heb ik wel het 1 en ander op google gevonden over millis(); maar daar kwam ik niet echt uit. en toen
het lukte bleef de relais/led maar aan en uit switchen. terwijl de bedoeling een enkele blink/schakeling moet zijn.
Code:
/*
/*
State change detection (edge detection)
Often, you don't need to know the state of a digital input all the time,
but you just need to know when the input changes from one state to another.
For example, you want to know when a button goes from OFF to ON. This is called
state change detection, or edge detection.
This example shows how to detect when a button or button changes from off to on
and on to off.
The circuit:
* pushbutton attached to pin 2 from +5V
* 10K resistor attached to pin 2 from ground
* LED attached from pin 13 to ground (or use the built-in LED on
most Arduino boards)
created 27 Sep 2005
modified 30 Aug 2011
by Tom Igoe
This example code is in the public domain.
<!-- m --><a class="postlink" href="http://arduino.cc/en/Tutorial/ButtonStateChange">http://arduino.cc/en/Tutorial/ButtonStateChange</a><!-- m -->
*/
// this constant won't change:
const int irPin = 9; // the pin that the pushbutton is attached to
const int relay1Pin = 8; // the pin that the LED is attached to
const int relay2Pin = 7; // the pin that the LED is attached to
// Variables will change:
int irPushCounter = 0; // counter for the number of button presses
int irState = 0; // current state of the button
int lastirState = 0; // previous state of the button
void setup() {
pinMode(relay1Pin, LOW);
pinMode(relay2Pin, LOW);
// initialize the button pin as a input:
pinMode(irPin, INPUT);
// initialize the LED as an output:
// initialize serial communication:
Serial.begin(9600);
}
void loop() {
// read the pushbutton input pin:
irState = digitalRead(irPin);
// compare the buttonState to its previous state
if (irState != lastirState) {
// if the state has changed, increment the counter
if (irState == HIGH) {
// if the current state is HIGH then the button
// wend from off to on:
irPushCounter++;
Serial.println("IRoog ziet Niets");
Serial.print("Aantal keer gezien: ");
Serial.println(irPushCounter);
} else {
// if the current state is LOW then the button
// wend from on to off:
Serial.println("IRoog ziet iets.");
}
}
// save the current state as the last state,
//for next time through the loop
lastirState = irState;
// turns on the LED every four button pushes by
// checking the modulo of the button push counter.
// the modulo function gives you the remainder of
// the division of two numbers:
if (irPushCounter % 2 == 1) {
digitalWrite(relay1Pin, HIGH); // turn the LED on (HIGH is the voltage level)
delay(250);
digitalWrite(relay1Pin, LOW); // turn the LED off by making the voltage LOW
}
if (irPushCounter % 2 == 0) {
digitalWrite(relay2Pin, HIGH); // turn the LED on (HIGH is the voltage level)
delay(250);
digitalWrite(relay2Pin, LOW); // turn the LED off by making the voltage LOW
}
}
In de setup() heb je de pinMode verkeers gebruikt.
Probeer het eens zo:
void setup() {
pinMode(relay1Pin, OUTPUT);
pinMode(relay2Pin, OUTPUT);
// initialize the button pin as a input: N.B. de pushbutton moet naar massa schakelen.
pinMode(irPin, INPUT_PULLUP); // inwendige pullup weerstand van arduino ingeschakeld.
// initialize the LED as an output:
// initialize serial communication:
Serial.begin(9600);
}
En ook moet je de if statements uitbreiden met de voorwaarde dat de irState ongelijk moet zijn aan het vorige moment
if ((irPushCounter % 2 == 1) & (lastirState!=irState)) {
digitalWrite(relay1Pin, HIGH); // turn the LED on (HIGH is the voltage level)
delay(250);
digitalWrite(relay1Pin, LOW); // turn the LED off by making the voltage LOW
}
if ((irPushCounter % 2 == 0) & (lastirState!=irState)) {
digitalWrite(relay2Pin, HIGH); // turn the LED on (HIGH is the voltage level)
delay(250);
digitalWrite(relay2Pin, LOW); // turn the LED off by making the voltage LOW
}
lastirState = irState; // deze regel MOET NA de if statements staan.
als laatste dan de regel lastirState = irState; boven de if statements verplaatsen naar het einde v/h programma.
Ja klopt die fout met INPUT en OUTPUT zag ik vanmiddag die had ik meteen veranderd maar dat hielp niet
maar die code van jou daarintegen.
lastirState = irState; // deze regel MOET NA de if statements staan.
Die activeert de "delay" statement wel!!! TOP!!
Nu gebeurt er alleen het volgende..
Zodra ik m'n hand voor de laser hou gaat relais 1 aan (zoals het hoort)
en zodra ik m'n hand weg haal nummer 2 aan.
En dat mag niet hij zou moeten wachten op de 2e keer dat hij wat ziet.
Nu heb ik geprobeerd met nog een vertraging er in te verwerken na dat de relais wordt uitgeschakeld maar dat werkt niet (logisch) omdat hij alsnog de verandering van de "irState" leest.
Ooke ik heb het opgelost door middel van deze code:
const int buttonPin1 = 9; // the pin that the pushbutton is attached to
const int ledPin = 7; // the pin that the relay channel2+ is attached to
const int ledPin1 = 8; // the pin that the relay channel4- is attached to
// Variables will change:
int buttonPushCounter1 = 0; // counter for the number of button presses. Start at 0 (will loop around first)
bool buttonState;
void setup() {
Serial.begin(9600);
pinMode(buttonPin1, INPUT);
pinMode(ledPin, OUTPUT); // initialize the LED as an output
pinMode(ledPin1, OUTPUT);
buttonState = false;
}
void loop() {
if (digitalRead(buttonPin1) == LOW) // if the current state is LOW (use of pullups) then the button
{ // went from off to on.
if (buttonState == false) { // allows button to be read and will wait until release
//
// increment counter
//
buttonPushCounter1++;
//
// max 3 different possibilities
//
if (buttonPushCounter1 == 4) {
buttonPushCounter1 = 0;
}
//
// button is processed so wait until released
//
buttonState = true;
}
//
// process button counter
//
switch (buttonPushCounter1) {
case 0:
delay(8000);
digitalWrite(ledPin, HIGH);
Serial.println("Relais - Aan");
delay(500);
digitalWrite(ledPin, LOW);
Serial.println("Relais - Uit (6 lagen)");
break;
case 1:
delay(8000);
digitalWrite(ledPin1, HIGH);
Serial.println("Relais + Aan");
delay(500);
digitalWrite(ledPin1, LOW);
Serial.println("Relais + Uit (7 lagen)");
break;
case 2:
delay(8000);
digitalWrite(ledPin, HIGH);
Serial.println("Relais - Aan");
delay(500);
digitalWrite(ledPin, LOW);
Serial.println("Relais - Uit (6 lagen)");
break;
case 3:
delay(8000);
digitalWrite(ledPin1, HIGH);
Serial.println("Relais + Aan");
delay(500);
digitalWrite(ledPin1, LOW);
Serial.println("Relais + Uit (7 lagen)");
break;
}
} else {
//
// button is released
//
buttonState = false;
}
}
Is een hele andere code. maar met een beetje aanpassen werkte hij wel!
hierbij was het probleem dat als ik m'n hand er voor hield dat hij doorging met de relais omstebeurt aan te sturen. Gelukkig was dat makkelijk te verhelpen door een (achtelijk lange) "delay" toe tevoegen.
De "button" codes zijn hier gewoon het zelfde als de "ir" codes in de vorige post
Nu wil ik wel nog steeds graag weten hoe ik het probleem met de vorige code moet oplossen. Dan leer ik er nog wat van.
:-*
Rodneyvld:
Is een hele andere code. maar met een beetje aanpassen werkte hij wel!
hierbij was het probleem dat als ik m'n hand er voor hield dat hij doorging met de relais omstebeurt aan te sturen. Gelukkig was dat makkelijk te verhelpen door een (achtelijk lange) "delay" toe tevoegen.
De "button" codes zijn hier gewoon het zelfde als de "ir" codes in de vorige post
Nu wil ik wel nog steeds graag weten hoe ik het probleem met de vorige code moet oplossen. Dan leer ik er nog wat van.
Heb je geprobeerd om de if statement uit te breiden met een extra voorwaarde? Anders loopt het programma, steeds maar door de if statements en laat je relais een voor een aantrekken Die delay(8000) is daar geen oplossing voor.
if ((irPushCounter % 2 == x) & (lastirState != irState)) twee keer veranderen. (x=0 of x=1)
Ook moet je zorgen dat je geen zwevende input hebt, Er zit dus een relais aan de input, geschakeld door een IR-sluis ?
eventueel moet je een weerstand van ca. 10kohm van de INPUT naar massa of +5 volt verbinden, dat hangt er vanaf hoe die pin is aangesloten. Daarom had ik voorgesteld bij de pinMode INPUT_PULLUP te kiezen, dan heb je zeer zeker nooit last van een zwevende input. Een zwevende input kan hele rare effekten geven.