| @@ -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); | |||
| } | |||