Hello,
i am wondering if there is a good way to get the serial.read() to work inside of a function. I am looking to provide an input to the serial monitor which will then execute a function. then inside that function I would like to be able to send another input through the serial monitor. I am running two stepper motors and would like to set the number of steps per motor.
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
#define IN5 2
#define IN6 3
#define IN7 4
#define IN8 5
int Steps = 0;
void setup()
{
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(IN5, OUTPUT);
pinMode(IN6, OUTPUT);
pinMode(IN7, OUTPUT);
pinMode(IN8, OUTPUT);
delay(1000);
}
void loop() {
while (Serial.available()>0){
if(Serial.read()== '1'){
Serial.println("Left side");
stepperLeft();
}
if(Serial.read()== '2'){
Serial.println("Right side");
stepperRight();
}
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
digitalWrite(IN5, LOW);
digitalWrite(IN6, LOW);
digitalWrite(IN7, LOW);
digitalWrite(IN8, LOW);
}
}
void stepperLeft(){
delay(1000);
while (Serial.available()>0){
float st = Serial.parseInt();
if(Serial.read()=='\n'){
String message = "Milimeters ";
message+=st;
Serial.println(message);
int doSteps = -st*4096;
delay(500);
int xw =abs(doSteps);
for (int x=0;x<xw;x++){
switch(Steps){
case 0:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
break;
case 1:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
break;
case 2:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
break;
case 3:
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
break;
case 4:
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
case 5:
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
case 6:
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
case 7:
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
break;
default:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
}
delay(1);
if(doSteps>=0){ Steps++;}
if(doSteps<0){ Steps--; }
if(Steps>7){Steps=0;}
if(Steps<0){Steps=7; }
}
}
}
Serial.end();
}
void stepperRight(){
Serial.begin(9600);
while (Serial.available()>0){
float st = Serial.parseInt();
if(Serial.read()=='\n'){
String message = "Milimeters ";
message+=st;
Serial.println(message);
int doSteps = -st*4096;
delay(500);
int yz =abs(doSteps);
for (int y=10;y<yz;y++){
switch(Steps){
case 10:
digitalWrite(IN5, LOW);
digitalWrite(IN6, LOW);
digitalWrite(IN7, LOW);
digitalWrite(IN8, HIGH);
break;
case 11:
digitalWrite(IN5, LOW);
digitalWrite(IN6, LOW);
digitalWrite(IN7, HIGH);
digitalWrite(IN8, HIGH);
break;
case 12:
digitalWrite(IN5, LOW);
digitalWrite(IN6, LOW);
digitalWrite(IN7, HIGH);
digitalWrite(IN8, LOW);
break;
case 13:
digitalWrite(IN5, LOW);
digitalWrite(IN6, HIGH);
digitalWrite(IN7, HIGH);
digitalWrite(IN8, LOW);
break;
case 14:
digitalWrite(IN5, LOW);
digitalWrite(IN6, HIGH);
digitalWrite(IN7, LOW);
digitalWrite(IN8, LOW);
break;
case 15:
digitalWrite(IN5, HIGH);
digitalWrite(IN6, HIGH);
digitalWrite(IN7, LOW);
digitalWrite(IN8, LOW);
break;
case 16:
digitalWrite(IN5, HIGH);
digitalWrite(IN6, LOW);
digitalWrite(IN7, LOW);
digitalWrite(IN8, LOW);
break;
case 17:
digitalWrite(IN5, HIGH);
digitalWrite(IN6, LOW);
digitalWrite(IN7, LOW);
digitalWrite(IN8, HIGH);
break;
default:
digitalWrite(IN5, LOW);
digitalWrite(IN6, LOW);
digitalWrite(IN7, LOW);
digitalWrite(IN8, LOW);
break;
}
delay(1);
if(doSteps>=10) { Steps++;}
if(doSteps<10){ Steps--;}
if(Steps>17){Steps=10;}
if(Steps<10){Steps=17;}
}
}
}
Serial.end();
}
I have used switch statements to call the function but I can not get that to start the serial monitor once inside that function. I am currently trying to use the if statements but an not having much luck with that either. i am not sure is i need to call Serial.end() in my loop function and restart it in each individual function. this is on an Arduino Uno board. Any assistance would be amazing. Any questions please about the code or project please ask.
thank you