All and all my code works for well, except for the stepper won't move in this while loop. Once I drop out of this loop the step motor finishes its command from before the loop which its calculates in the void printDigitalPot() at the bottom of the code. Any help would be greatly appreciated
void loop()
{
digitalRead(reset);
while (digitalRead(reset) == LOW)
{
stepper.moveTo(0);
if (distanceToGo = 0) <-------------------------testing here
{digitalWrite(MOTOROFF, HIGH);
digitalWrite(heartbeatLED, LOW);
};
clutch_value = analogRead(CLUTCH_IN_PIN);
int temp = map( clutch_value, 1027, 0, 127, 0);
temp = constrain(temp, 0, 127); //stay within the 0-127 range
digitalPot = temp;
ds3502.setWiper(digitalPot);
if (resetflag == tensioning) {
Serial.println("reset");
resetflag = resetting;
}
digitalRead(reset);
}
#include <Adafruit_DS3502.h>
Adafruit_DS3502 ds3502 = Adafruit_DS3502();
#include <AccelStepper.h>
#define MotorInterfaceType 1
byte directionPin = 2; //New Stepper control
byte stepPin = 3;
byte stepstop = 4;
AccelStepper stepper = AccelStepper(MotorInterfaceType, 3, 2); // Check for free pins
unsigned long curMillis;
unsigned long prevStepMillis = 0;
unsigned long millisBetweenStepsup = 1; // milliseconds
unsigned long millisBetweenStepsdown = 2; // milliseconds
int stepdelay =10; //testing
int clutchadvance =10; //testing
int brakespeed =5; //testing
#include "MultiMap.h" //Multimap
int mappedValue; //
int in[] = {0 , 31, 63, 95, 127}; //
int out[] = {0, 95, 115, 125, 127}; //
#define magnetDetected HIGH
#define noMagnet LOW
#define weAreTiming true
#define weAreNotTiming false
#define notfull false
#define full true
#define resetting true
#define tensioning false
#define brakeon true
#define brakeoff false
#define clutchon true
#define clutchoff false
const byte BRAKE_IN_PIN = A0;
const byte PRESSURE = A1; // Pot on Analog Pin 1
const byte POTH = A2; // Pot on Analog Pin 2
const byte CLUTCH_IN_PIN =A3;
const byte MOTOROFF =7;
bool timerRunningFlag = weAreNotTiming;
bool fullthrottle = notfull;
bool resetflag = tensioning;
bool brakeflag = brakeoff;
bool clutchflag = clutchoff;
const byte sensor = 5;
const byte heartbeatLED = 13;
int reset = 12;
byte lastWheelState = noMagnet;
int digitalPot ;
int brake_value = 0;
int clutch_value = 0;
int clutch_temp = 0;
int lowspeed = 0; // Low speed set
int highspeed = 0; // High Speed set
int lowrpm = 0; // Low RPM kick in
int highrpm = 0; // High RPM kick in
int highValue = 0;
int stepsLeft = 0;
int force = 0;
int stepmath = 0;
int tension = 0;
int stepstaken = 0;
int fullsqueeze = 0;
int distanceToGo = 0; //testing here <--------------------
int totaltension =10000;
int lowValue = 800; //low speed setting
const int highLow = 600; //reading 0
const int highHigh = 200; //reading 1023
//timing stuff
unsigned long startTime;
unsigned long endTime;
unsigned long duration;
unsigned long timerMillis;
unsigned long heartbeatMillis;
unsigned long wheelMillis;
//*********************************************************************
void setup()
{
//analogReference(A0);
ds3502.setWiper(0);
pinMode (sensor, INPUT_PULLUP);
pinMode(reset, INPUT_PULLUP);
pinMode (heartbeatLED, OUTPUT);
pinMode(MOTOROFF, OUTPUT);
Serial.begin(115200);
while (!Serial)
{
delay(1);
}
Serial.println("Adafruit DS3502 Test");
if (!ds3502.begin()) // <-----<<<<<
{ // <-----<<<<<
Serial.println("Couldn't find DS3502 chip"); // <-----<<<<<
while (1); // <-----<<<<<
} // <-----<<<<<
Serial.println("Found DS3502 chip");
// Set the maximum steps per second:
stepper.setMaxSpeed(7000);
// Set the maximum acceleration in steps per second^2:
stepper.setAcceleration(5000);
fullthrottle = notfull;
}
//*********************************************************************
void loop()
{
digitalRead(reset);
while (digitalRead(reset) == LOW)
{
stepper.moveTo(0);
if (distanceToGo = 0) <-------------------------testing here
{digitalWrite(MOTOROFF, HIGH);
digitalWrite(heartbeatLED, LOW);
};
clutch_value = analogRead(CLUTCH_IN_PIN);
int temp = map( clutch_value, 1027, 0, 127, 0);
temp = constrain(temp, 0, 127); //stay within the 0-127 range
digitalPot = temp;
ds3502.setWiper(digitalPot);
if (resetflag == tensioning) {
Serial.println("reset");
resetflag = resetting;
}
digitalRead(reset);
}
resetflag = tensioning;
digitalWrite(MOTOROFF, LOW);
if(millis() - heartbeatMillis >= 500)
{ heartbeatMillis = millis();
digitalWrite(heartbeatLED, !digitalRead(heartbeatLED));
}
//***********************
//time to check the wheel sensor ?
if (millis() - wheelMillis >= 10)
{
//restart the TIMER
wheelMillis = millis();
checkWheelSensor();
}
if (timerRunningFlag == weAreTiming && millis() - timerMillis >= lowValue) //timeout
{
timerRunningFlag = weAreNotTiming;
duration = lowValue;
printDigitalPot();
//timerRunningFlag = weAreTiming; //testing
//start this TIMER
// startTime = millis();
//start this TIMER
// timerMillis = millis(); //too here
}
//***********************
//Other non-blocking code goes here
//***********************
stepper.run();
brake_value = analogRead(BRAKE_IN_PIN);
clutch_value = analogRead(CLUTCH_IN_PIN);
digitalRead(reset);
curMillis = millis();
while (brake_value < 500) { // used to be 920
ds3502.setWiper(127);
if (brakeflag == brakeoff) {
Serial.print("Brake on ");
Serial.println(brake_value);
brakeflag = brakeon;
}
curMillis = millis();
brake_value = analogRead(BRAKE_IN_PIN);
}
brakeflag = brakeoff;
while (clutch_value < 900 && brake_value > 920) {
clutch_temp = map(clutch_value, 800, 80, digitalPot, 127);
clutch_temp = constrain(clutch_temp, 0, 127);
ds3502.setWiper(clutch_temp);
if (clutchflag == clutchoff) {
Serial.print("Clutch on ");
Serial.print(clutch_value);
Serial.print(" Digitalpot value: ");
Serial.println(clutch_temp);
clutchflag = clutchon;
}
curMillis = millis();
brake_value = analogRead(BRAKE_IN_PIN);
clutch_value = analogRead(CLUTCH_IN_PIN);
}
clutchflag = clutchoff;
} //END of loop()
//*********************************************************************
void checkWheelSensor()
{
byte thisState = digitalRead(sensor);
//***********************
//was there a change in state ?
if (lastWheelState != thisState)
{
//update to the new state
lastWheelState = thisState;
//***********************
//if we are 'not' timing has the sensor detected the magnet ?
if (timerRunningFlag == weAreNotTiming && thisState == magnetDetected)
{
//enable timing
timerRunningFlag = weAreTiming;
//start this TIMER
startTime = millis();
//start this TIMER
timerMillis = millis();
}
//***********************
if (timerRunningFlag == weAreTiming && thisState == noMagnet)
{
//disable the timing
timerRunningFlag = weAreNotTiming;
endTime = millis();
duration = endTime - startTime;
printDigitalPot();
}
} //END of if(lastWheelState != thisState)
} //END of checkWheelSensor()
//*********************************************************************
void printDigitalPot()
{
highspeed = analogRead(POTH); //0 to 1023
highValue = map(highspeed, 0, 1000, highLow, highHigh);
lowValue = (highValue + 400);
int temp = map( duration, highValue, lowValue, 0, 127);
temp = constrain(temp, 0, 127); //stay within the 0-127 range
digitalPot=multiMap(temp, in, out, 5);
ds3502.setWiper(digitalPot);
force = analogRead(PRESSURE);
force = map(force,0,1023,0,totaltension);
stepmath = map(temp,0,127,force,0); //temp might become "digitalPot" again
if (temp > 0) //less than full throttle
{
fullthrottle = notfull;
tension = stepmath;
}
if (fullthrottle == full)
{
fullsqueeze = 10; //stepmath/300; //300 may need to change depending on required full throttle pressure
tension = tension+fullsqueeze;
}
if (fullthrottle == notfull && temp == 0)
{fullthrottle = full;
tension = stepmath;
}
stepper.moveTo(tension);
Serial.print("B: ");
Serial.print(brake_value);
Serial.print("C: ");
Serial.print(clutch_value);
Serial.print(" ");
Serial.print(lowValue);
Serial.print(" ");
Serial.print("Timer spread ");
Serial.print(highValue);
Serial.print (" Time in millis = ");
Serial.print (duration);
Serial.print(" ");
Serial.print(temp);
Serial.print(" Digital pot set to: ");
Serial.print(digitalPot);
Serial.print("\t");
Serial.print("Savage level: ");
Serial.print(force);
Serial.print(" ");
Serial.print(stepmath);
Serial.print(" -Stepmath Stepsdue- ");
Serial.print(stepstaken);
Serial.print(" Needed tension: ");
Serial.println(tension);
Serial.println("");
} //END of printDigitalPot()