ESC stuff
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

esp.ino 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include <Servo.h>
  2. #include <SSD1306Ascii.h>
  3. #include <SSD1306AsciiAvrI2c.h>
  4. #define PIN_POT A0
  5. #define PIN_ESC 5
  6. #define PIN_THERM A7
  7. #define PIN_BAT A2
  8. #define MIN_SPEED 900
  9. #define MAX_SPEED 1700
  10. #define ZERO_SPEED 900
  11. #define POT_MIN 183
  12. #define POT_MAX 717
  13. #define STEP 10
  14. #define DISPLAY_I2C 0x3C
  15. #define DISPLAY_CHARS 11
  16. #define THERM_RESISTOR 10000
  17. #define THRESHOLD 5
  18. #define DELAY 50
  19. //#define USE_DISPLAY
  20. Servo esc;
  21. #ifdef USE_DISPLAY
  22. SSD1306AsciiAvrI2c display;
  23. #endif
  24. void setup() {
  25. Serial.begin(115200);
  26. Serial.println("Hello");
  27. #ifdef USE_DISPLAY
  28. Serial.println("Looking for i3c 0x"+String(DISPLAY_I2C, 16)+"...");
  29. display.begin(&Adafruit128x32, DISPLAY_I2C);
  30. display.setFont(Adafruit5x7);
  31. display.clear();
  32. display.set2X();
  33. display.print("Hello");
  34. #endif
  35. pinMode(PIN_POT, INPUT);
  36. pinMode(PIN_THERM, INPUT);
  37. pinMode(PIN_BAT, INPUT);
  38. esc.attach(PIN_ESC);
  39. esc.writeMicroseconds(ZERO_SPEED);
  40. delay(4000);
  41. Serial.println("ready");
  42. }
  43. int prev = -1;
  44. float measureTemp() {
  45. int val = analogRead(PIN_THERM);
  46. float r2 = (THERM_RESISTOR / 10.0) / (1023.0 / (float)val - 1.0);
  47. float logR2 = log(r2);
  48. float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;
  49. float t = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
  50. float celsius = t - 273.15;
  51. return celsius;
  52. }
  53. int measureBat() {
  54. int val = analogRead(PIN_BAT);
  55. float volt = val * (5.0 / 1023.0);
  56. Serial.println(volt);
  57. return 50;
  58. }
  59. void printTwo(String s1, String s2) {
  60. #ifdef USE_DISPLAY
  61. int nspaces = DISPLAY_CHARS - (s1.length() + s2.length());
  62. char spaces[DISPLAY_CHARS + 1];
  63. memset(spaces, ' ', DISPLAY_CHARS);
  64. spaces[nspaces] = '\0';
  65. display.println(s1+String(spaces)+s2);
  66. #endif
  67. }
  68. void showStats(int actualSpeed, int potmeterVal) {
  69. int throttle = ((double)(actualSpeed - MIN_SPEED) / (double)(MAX_SPEED - MIN_SPEED)) * 100;
  70. #ifdef USE_DISPLAY
  71. display.setCursor(0, 0);
  72. display.set2X();
  73. #endif
  74. String pot = String(potmeterVal);
  75. String thr = String(throttle)+"%";
  76. String spd = String(actualSpeed);
  77. String tmp = String(round(measureTemp()))+"C";
  78. String bat = String(measureBat())+"%";
  79. printTwo(thr, pot+" ");
  80. printTwo(tmp, bat+" ");
  81. }
  82. void loop() {
  83. int pressed = 0;
  84. int reachedMax = 0;
  85. pressed = 1;
  86. int pot = analogRead(PIN_POT);
  87. int speed = map(pot, POT_MIN, POT_MAX, 0, MAX_SPEED - MIN_SPEED);
  88. speed = speed / STEP;
  89. speed = speed * STEP;
  90. int actualSpeed = speed + MIN_SPEED;
  91. if (abs(actualSpeed - ZERO_SPEED) < THRESHOLD)
  92. actualSpeed = ZERO_SPEED;
  93. else if (actualSpeed > MAX_SPEED)
  94. actualSpeed = MAX_SPEED;
  95. else if (actualSpeed < MIN_SPEED)
  96. actualSpeed = MIN_SPEED;
  97. if (actualSpeed != prev) {
  98. esc.writeMicroseconds(actualSpeed);
  99. prev = actualSpeed;
  100. }
  101. showStats(actualSpeed, pot);
  102. delay(DELAY);
  103. }