|
|
@@ -7,13 +7,17 @@ |
|
|
|
#define PIN_THERM A7 |
|
|
|
#define PIN_BAT A2 |
|
|
|
|
|
|
|
#define MIN_SPEED 1000 |
|
|
|
#define MIN_SPEED 1100 |
|
|
|
#define MAX_SPEED 1700 |
|
|
|
#define ZERO_SPEED 900 |
|
|
|
#define ZERO_SPEED 1000 |
|
|
|
//#define MIN_SPEED 90 |
|
|
|
//#define MAX_SPEED 180 |
|
|
|
//#define ZERO_SPEED 90 |
|
|
|
#define ACCEL 10 |
|
|
|
#define POT_MIN 220 |
|
|
|
#define POT_MAX 1023 |
|
|
|
|
|
|
|
#define STEP 10 |
|
|
|
#define STEP 5 |
|
|
|
#define DISPLAY_I2C 0x3C |
|
|
|
#define DISPLAY_CHARS 11 |
|
|
|
#define BAT_MAX 4.2 |
|
|
@@ -52,7 +56,7 @@ void setup() { |
|
|
|
pinMode(PIN_BAT, INPUT); |
|
|
|
|
|
|
|
esc.attach(PIN_ESC); |
|
|
|
esc.writeMicroseconds(ZERO_SPEED); |
|
|
|
esc.writeMicroseconds(MIN_SPEED); |
|
|
|
delay(4000); |
|
|
|
Serial.println("ready"); |
|
|
|
} |
|
|
@@ -69,6 +73,8 @@ float measureTemp() { |
|
|
|
return celsius; |
|
|
|
} |
|
|
|
|
|
|
|
int batteryOk = 1; |
|
|
|
float voltLim = ((float)BAT_MIN * (float)BAT_CELLS) / (float)BAT_MULT; |
|
|
|
int measureBat() { |
|
|
|
int val = analogRead(PIN_BAT); |
|
|
|
float volt = val * (5.0 / 1023.0); |
|
|
@@ -76,6 +82,9 @@ int measureBat() { |
|
|
|
float minV = BAT_MIN * BAT_CELLS; |
|
|
|
float maxV = BAT_MAX * BAT_CELLS; |
|
|
|
|
|
|
|
if (volt <= voltLim) |
|
|
|
batteryOk = 0; |
|
|
|
|
|
|
|
if (currV < minV) |
|
|
|
currV = minV; |
|
|
|
if (currV > maxV) |
|
|
@@ -103,7 +112,7 @@ void showStats(int actualSpeed, int potmeterVal) { |
|
|
|
return; |
|
|
|
statsCount = STATS_TIMER + 1; |
|
|
|
|
|
|
|
int throttle = ((double)(actualSpeed - MIN_SPEED) / (double)(MAX_SPEED - MIN_SPEED)) * 100; |
|
|
|
int throttle = ((double)(actualSpeed - ZERO_SPEED) / (double)(MAX_SPEED - ZERO_SPEED)) * 100; |
|
|
|
|
|
|
|
#ifdef USE_DISPLAY |
|
|
|
display.setCursor(0, 0); |
|
|
@@ -116,34 +125,47 @@ void showStats(int actualSpeed, int potmeterVal) { |
|
|
|
String tmp = String(round(measureTemp()))+"C"; |
|
|
|
String bat = String(measureBat())+"%"; |
|
|
|
|
|
|
|
printTwo(thr, pot+" "); |
|
|
|
if (batteryOk) { |
|
|
|
//printTwo(thr, pot+" "); |
|
|
|
printTwo(thr, spd+" "); |
|
|
|
} else { |
|
|
|
printTwo("Battery", ":( "); |
|
|
|
} |
|
|
|
printTwo(tmp, bat+" "); |
|
|
|
} |
|
|
|
|
|
|
|
int currentSpeed = ZERO_SPEED; |
|
|
|
void loop() { |
|
|
|
int pressed = 0; |
|
|
|
int reachedMax = 0; |
|
|
|
|
|
|
|
pressed = 1; |
|
|
|
int pot = analogRead(PIN_POT); |
|
|
|
int speed = map(pot, POT_MIN, POT_MAX, 0, MAX_SPEED - MIN_SPEED); |
|
|
|
int speed = map(pot, POT_MIN, POT_MAX, 0, MAX_SPEED - ZERO_SPEED); |
|
|
|
speed = speed / STEP; |
|
|
|
speed = speed * STEP; |
|
|
|
|
|
|
|
int actualSpeed = speed + MIN_SPEED; |
|
|
|
int actualSpeed = speed + ZERO_SPEED; |
|
|
|
if (actualSpeed > currentSpeed) { |
|
|
|
if (currentSpeed < MIN_SPEED) |
|
|
|
currentSpeed = MIN_SPEED; |
|
|
|
else |
|
|
|
currentSpeed += ACCEL; |
|
|
|
} else { |
|
|
|
currentSpeed -= ACCEL; |
|
|
|
} |
|
|
|
|
|
|
|
if (abs(actualSpeed - ZERO_SPEED) < THRESHOLD) |
|
|
|
actualSpeed = ZERO_SPEED; |
|
|
|
else if (actualSpeed > MAX_SPEED) |
|
|
|
actualSpeed = MAX_SPEED; |
|
|
|
else if (actualSpeed < MIN_SPEED) |
|
|
|
actualSpeed = MIN_SPEED; |
|
|
|
if (currentSpeed > MAX_SPEED) |
|
|
|
currentSpeed = MAX_SPEED; |
|
|
|
else if (currentSpeed < ZERO_SPEED) |
|
|
|
currentSpeed = ZERO_SPEED; |
|
|
|
|
|
|
|
if (actualSpeed != prev) { |
|
|
|
esc.writeMicroseconds(actualSpeed); |
|
|
|
prev = actualSpeed; |
|
|
|
} |
|
|
|
//if (currentSpeed != prev) { |
|
|
|
esc.writeMicroseconds(currentSpeed); |
|
|
|
//esc.write(currentSpeed); |
|
|
|
prev = currentSpeed; |
|
|
|
//} |
|
|
|
|
|
|
|
showStats(actualSpeed, pot); |
|
|
|
showStats(currentSpeed, pot); |
|
|
|
delay(DELAY); |
|
|
|
} |