Hi I am very new to programming sketches and am having trouble getting my IR sensor to have its own loop after the button loop finishes. Please help me with this code if you can!
Did you miss how to use code tags when you read the 'how to use the forum' sticky?
#include <Servo.h>
Servo servo1;
int buttonPin = 16;
int QRE1113_Pin = 5;
int ledPin3 = 8;
int ledPin2 = 2;
int ledPin5 = 7;
int val = 0;
void setup(){
Serial.begin(9600);
servo1.attach(10);
pinMode(ledPin5, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop(){
int QRE_Value = readQD();
Serial.println(QRE_Value);
}
int readQD(){
//Returns value from the QRE1113
//Lower numbers mean more refleacive
//More than 3000 means nothing was reflected.
pinMode( QRE1113_Pin, OUTPUT );
digitalWrite( QRE1113_Pin, HIGH );
delayMicroseconds(50);
pinMode( QRE1113_Pin, INPUT );
long time = micros();
//time how long the input is HIGH, but quit after 3ms as nothing happens after that
while (digitalRead(QRE1113_Pin) == HIGH && micros() - time < 3000);
int diff = micros() - time;
}
val = digitalRead(buttonPin);
if (val == HIGH) {
servo1.writeMicroseconds(1900);
digitalWrite(ledPin2, HIGH);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin2, HIGH);
}
if (diff < 1500) {
servo1.writeMicroseconds(1030);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin5, HIGH);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin2, LOW);
delay(200);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin5, LOW);
delay(200);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
delay(200);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
}
return diff;
}
It will be nearly impossible to help you unless you comment your code better, or explain yourself better.
"after the button loop finishes" doesn't mean anything, since there is no loop involving the button pin. It is also quite likely that you ACTUALLY have a switch attached, not a button.
readQD() does for more than it's name implies. You would not expect digitalRead() to move your servos and send data to an ethernet client, would you? Why does your function do more than its name implies that it will do?
I copied your code to my IDE (thanks for the code tags, tags make it way easier to cut and paste) and it would not compile. I think the indicated curly bracket is misplaced as it ends the int readQD() function code block and leaves the rest of the code outside of any function (bad).
int readQD()
{
//Returns value from the QRE1113
//Lower numbers mean more refleacive
//More than 3000 means nothing was reflected.
pinMode( QRE1113_Pin, OUTPUT );
digitalWrite( QRE1113_Pin, HIGH );
delayMicroseconds(50);
pinMode( QRE1113_Pin, INPUT );
long time = micros();
//time how long the input is HIGH, but quit after 3ms as nothing happens after that
while (digitalRead(QRE1113_Pin) == HIGH && micros() - time < 3000);
int diff = micros() - time;
//} This curly bracket seems misplaced
val = digitalRead(buttonPin);
if (val == HIGH)
The code compiles with the offending curly commented but does it do what you want?
Putting each curly on its own line will help to see mismatched curlies. Running autoformat (ctrl-t) will also spot mismatched brackets.
Ok, I apologize for not explaining better. These are the sequence of events that I'm trying to make happen:
I press a button that starts the sequence:
-
servos move to unlock a lock (not yet in code)
-
Linear actuator extends to specified length
-
Three LED light strands sequence until the actuators stop
-
The LED lights remain on constant
-
When the IR sensors are triggered the second part of the sequence starts:
-
Linear actuator contracts to original position
-
LED light strands now sequence in opposite direction
-
Once Linear actuator completes movement (I can time it out) LEDs turn off
At that point it is waiting for another button press for the whole sequence to start again.
All help greatly appreciated!!
Have a look at Planning and Implementing a Program.
It seems like your loop() could be as follows
void loop() {
readButtons();
readIR();
checkValidCode();
updateServo();
updateActuator();
}
...R