In my recent project, I'm working with the motor. I have to drive the motor for the specific time like for 2 minutes, 3 minutes, 4 minutes and 5 minutes. I already created functions for that. And motor drive based on readings taken from the sensor.
My code is below:
#define PIN_OUTPUT 6
const int kPinIN1 = 4;
const int kPinIN2 = 5;
void setup()
{
Serial.begin(9600);
pinMode(kPinIN1, OUTPUT);
pinMode(kPinIN2, OUTPUT);
}
void loop()
{
Serial.println(analogRead(A0));
if(analogRead(A0) > 100 && analogRead(A0) < 200)
{
motorDriveFor2Min();
}
else if(analogRead(A0) > 200 && analogRead(A0) < 300)
{
motorDriveFor3Min();
}
else if(analogRead(A0) > 300 && analogRead(A0) < 400)
{
motorDriveFor4Min();
}
else if(analogRead(A0) > 400 && analogRead(A0) < 500)
{
motorDriveFor5Min();
}
}
void motorDriveFor2Min()
{
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, LOW);
digitalWrite(kPinIN2, HIGH);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, LOW);
digitalWrite(kPinIN2, HIGH);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, LOW);
digitalWrite(kPinIN2, HIGH);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, LOW);
digitalWrite(kPinIN2, HIGH);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(64000);
}
void motorDriveFor3Min()
{
motorDriveFor2Min();
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, LOW);
digitalWrite(kPinIN2, HIGH);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, LOW);
digitalWrite(kPinIN2, HIGH);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(32000);
}
void motorDriveFor4Min()
{
motorDriveFor3Min();
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, LOW);
digitalWrite(kPinIN2, HIGH);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(46000);
}
void motorDriveFor5Min()
{
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(120000);
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, LOW);
digitalWrite(kPinIN2, HIGH);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, LOW);
digitalWrite(kPinIN2, HIGH);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, LOW);
digitalWrite(kPinIN2, HIGH);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, HIGH);
digitalWrite(kPinIN2, LOW);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, LOW);
digitalWrite(kPinIN2, HIGH);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(7000);
digitalWrite(kPinIN1, LOW);
digitalWrite(kPinIN2, HIGH);
analogWrite(PIN_OUTPUT, 255);
verboseDelay(120000);
}
void verboseDelay(unsigned long ms)
{
unsigned long now = millis();
unsigned long start = now;
do
{
now = millis();
}
while (now - start < ms);
}
Here, I have four functions named motorDriveFor2Min()
, motorDriveFor3Min()
, motorDriveFor4Min()
and motorDriveFor5Min()
for my specific time means for 2 minutes, 3 minutes, 4 minutes and 5 minutes respectively.
So, suppose If I want to drive motor for 4 min then I have to call function motorDriveFor4Min()
and for that, I have to set my reading between 300 & 400. But I can't able to do that because when my reading reaches at 100 then it starts executing another function means motorDriveFor2Min()
and then continuously run that functionality. During that time I try to change the reading but nothing happens. After restating Arduino it run according to the reading.
So, I thought maybe delay() function block everything. So I replace inbuilt delay function with custom delay function. But that can't solve my problem. Then I google it out and I found out that analogRead may cause this problem. Any suggestion for this.