#include <EEPROM.h>
#include <GyverOLED.h>
volatile uint8_t SC = 1;
volatile uint64_t m = 0;
volatile uint64_t tt;
volatile uint64_t stat = 0;
uint64_t proshl = 0;
volatile uint64_t stata = 0;
float odometr;
float odom_tek;
uint8_t sped;
float spd;
uint16_t m1;
uint8_t spead;
uint16_t seg;
uint32_t vseg;
GyverOLED<SSD1306_128x64, OLED_BUFFER> oled;
void setup() {
//Serial.begin( 9600 );
oled.init();
oled.clear();
pinMode(3, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP);
EEPROM.begin();
EEPROM.get (0, stat);
attachInterrupt(0, shelk, FALLING);
attachInterrupt(1, clic, FALLING);
}
void loop() {
if (SC > 3) {
SC = 1;
}
odometr = stat * 4.19;
odom_tek = stata * 4.19;
sped = stata - proshl;
spd = ((sped * 4.19)/500) * 1000;
//Serial.println( String ( odometr ) + "cm" + " " + String ( odom_tek ) + "cm" + " " + String ( spd ) + "cm/s" );
proshl = stata;
switch (SC) {
case 1:
spead = round((spd / 100) * 3.6);
oled.home();
oled.clear();
oled.setScale(4);
if (spead < 10) oled.setCursor(56, 1);
if (spead > 9) oled.setCursor(44, 1);
oled.print(spead);
oled.setScale(2);
oled.setCursor(43, 6);
oled.print("км/ч");
oled.update();
m = 0;
break;
case 2:
m1 = round((m * 4.19) / 100);
oled.home();
oled.clear();
oled.setScale(4);
if (m1 < 10) oled.setCursor(56, 1);
if (m1 > 9 && m1 < 100) oled.setCursor(44, 1);
if (m1 > 99 && m1 < 1000) oled.setCursor(32, 1);
if (m1 > 999) oled.setCursor(22, 1);
oled.print(m1);
oled.setScale(2);
oled.setCursor(61, 6);
oled.print("м");
oled.update();
break;
case 3:
seg = round( odom_tek / 100000);
vseg = round( odometr / 100000);
oled.home();
oled.clear();
oled.setScale(2);
oled.setCursor(0, 1);
oled.print(seg);
oled.setCursor(74, 1);
oled.print("км с.");
oled.setCursor(0, 4);
oled.print(vseg);
oled.setCursor(74, 4);
oled.print("км в.");
oled.update();
break;
}
delay(500);
}
void shelk() {
stat++ ;
stata++ ;
m++;
EEPROM.put(0, stat);
}
void clic(){
if(millis() - tt > 500){
SC++;
tt = millis();
}
}
Код спидометра, делался на костылях, библиях гайвера.