Skocz do zawartości

ESP32 - licznik do rowerka treningowego


Pomocna odpowiedź

@ethanak to samo, ale nie liczy prędkości. Nie ogarniam, na prawdę... 😞

 

if (digitalRead(reed_pin) == HIGH && stan == true) { 
  stan = false; 
  } 
if (digitalRead(reed_pin) == LOW && stan == false) { 
  czas_s = (micros() - last_time) / 1000000.0; 
  float obroty = 3600 / czas_s;
  float predkosc = (obroty * 0.74) / 1000000.0;  
  trasa = trasa + obwod_k; //metry
  stan = true; 
  last_time = micros(); 
  Serial.println(predkosc);
  Serial.println(trasa); 
 }

 

19:32:27:983 -> 0.00
19:32:27:983 -> 0.74
19:32:29:772 -> 0.00
19:32:29:772 -> 1.48
19:32:31:296 -> 0.00
19:32:31:296 -> 2.22
19:32:32:526 -> 0.00
19:32:32:526 -> 2.96
19:32:33:549 -> 0.00
19:32:33:549 -> 3.70
19:32:34:347 -> Guru Meditation Error: Core  1 panic'ed (IntegerDivideByZero). Exception was unhandled.
19:32:34:347 -> 
19:32:34:347 -> Core  1 register dump:
19:32:34:347 -> PC      : 0x400d14a6  PS      : 0x00060630  A0      : 0x800d2b3c  A1      : 0x3ffc51e0  
19:32:34:347 -> A2      : 0x3ffc1bc0  A3      : 0x00000000  A4      : 0x3ffc1bc4  A5      : 0x3ffbdb6c  
19:32:34:347 -> A6      : 0x3ffbd2bc  A7      : 0x80000001  A8      : 0x800d14a1  A9      : 0x3ffc51c0  
19:32:34:347 -> A10     : 0x00000e10  A11     : 0x3fe8221e  A12     : 0xffffffff  A13     : 0x000003ff  
19:32:34:347 -> A14     : 0x7ff00000  A15     : 0x00000000  SAR     : 0x0000001f  EXCCAUSE: 0x00000006  
19:32:34:368 -> EXCVADDR: 0x00000000  LBEG    : 0x400840d1  LEND    : 0x400840d9  LCOUNT  : 0x00000027  
19:32:34:368 -> 
19:32:34:368 -> 
19:32:34:368 -> Backtrace: 0x400d14a3:0x3ffc51e0 0x400d2b39:0x3ffc5200
19:32:34:368 -> 
19:32:34:368 -> 
19:32:34:368 -> 
19:32:34:368 -> 
19:32:34:368 -> ELF file SHA256: e6c4e841c735c42a
19:32:34:368 -> 
19:32:34:514 -> Rebooting...
19:32:34:540 -> ets Jun  8 2016 00:22:57
19:32:34:540 -> 
19:32:34:540 -> rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
19:32:34:540 -> configsip: 0, SPIWP:0xee
19:32:34:540 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
19:32:34:540 -> mode:DIO, clock div:2
19:32:34:540 -> load:0x3fff0030,len:1184
19:32:34:540 -> load:0x40078000,len:13232
19:32:34:540 -> load:0x40080400,len:3028
19:32:34:540 -> entry 0x400805e4
19:32:34:865 -> Guru Meditation Error: Core  1 panic'ed (IntegerDivideByZero). Exception was unhandled.
19:32:34:865 -> 
19:32:34:865 -> Core  1 register dump:
19:32:34:865 -> PC      : 0x400d14a6  PS      : 0x00060630  A0      : 0x800d2b3c  A1      : 0x3ffc51e0  
19:32:34:865 -> A2      : 0x3ffc1bc0  A3      : 0x00000000  A4      : 0x3ffc1bc4  A5      : 0x3ffbdb6c  
19:32:34:865 -> A6      : 0x3ffbd2bc  A7      : 0x80000001  A8      : 0x800d14a1  A9      : 0x3ffc51c0  
19:32:34:865 -> A10     : 0x00000e10  A11     : 0x3fc46aca  A12     : 0xfffffffd  A13     : 0x000003ff  
19:32:34:865 -> A14     : 0x7ff00000  A15     : 0x00000000  SAR     : 0x0000001f  EXCCAUSE: 0x00000006  
19:32:34:886 -> EXCVADDR: 0x00000000  LBEG    : 0x400840d1  LEND    : 0x400840d9  LCOUNT  : 0x00000027  
19:32:34:886 -> 
19:32:34:886 -> 
19:32:34:886 -> Backtrace: 0x400d14a3:0x3ffc51e0 0x400d2b39:0x3ffc5200

 

  • Lubię! 1

No to zostaw millis i zrób jakis debouncing - najprościej cos w stylu:

if (millis() - last_time > 10) {
  // tu liczysz prędkość

Raczej więcej niż 100 obrotów na sekundę nie osiągniesz...

Chyba znalazłem przyczynę/powód problemów!

Kontaktron, który jest zamontowany oryginalnie NIE DAJE jednego impulsu przy przesunięciu magnesu.

Bez względu jak szybko kręcę korbami zawsze zwiększa o 3.

 

19:40:24:781 -> 1
19:40:28:218 -> 3
19:40:31:436 -> 6
19:40:40:842 -> 9
19:40:43:887 -> 12
19:40:55:473 -> 15

 

  • Lubię! 1
6 minut temu, roz napisał:

Chyba znalazłem przyczynę/powód problemów!

Kontaktron, który jest zamontowany oryginalnie NIE DAJE jednego impulsu przy przesunięciu magnesu.

Bez względu jak szybko kręcę korbami zawsze zwiększa o 3.

 

19:40:24:781 -> 1
19:40:28:218 -> 3
19:40:31:436 -> 6
19:40:40:842 -> 9
19:40:43:887 -> 12
19:40:55:473 -> 15

 

O Panie Boże...wywal to gówno i kup A3144 lub coś podobnego i twoje problemy znikną...kosz groszowy

  • Lubię! 1
(edytowany)

To jest pierwsza rzecz, którą należało sprawdzić. Pisałem o tym na początku. Te millis nie jest problemem bo nie ma opcji żeby czas między impulsami był mniejszy niż jeden. 

Jeśli robisz coś takiego to czas zdecydowanie nie powinien być intem.

czas_s = (micros() - last_time) / 1000000.0;

Z tego wychodzi 0 i potem


float obroty = 3600 / czas_s;

Albo można pozostać przy milisekundach.

Nawiasem mówiąc, kontaktron jest dosyć prostym i raczej niezawodnym elementem. 

Edytowano przez etet100
2 minuty temu, ethanak napisał:

@farmaceuta jesteś pewien że koszt dopisania dwóch linijek programu będxie wyższy?

No ja Wiem...policzyć trzy impulsy w sumie i dopiero zrobić obliczenia...poprostu się wykręcam jak mogę bo mi dziś mózg wysiadł 😜

Czyli wygląda na to , że w sobotę się spotkamy tutaj. Ja prawdopodobnie napiszę i przetestuje układ. Zakres błędu 0.5 km/h . Mam nadzidje , że do tego czasu twój 'tachometr' ruszy.

1 minutę temu, ethanak napisał:

@farmaceuta Dlaczego trzy impulsy? Nie lepiej sprawdzić, czy to nie jest jakiś lewy impuls?

Nok tak zakładam że trzy bo nawet w monitorze @roz pokazał że zawsze jest o trzy...takie dziwne trochę rozwiązanie...no ale to niech się najpierw upewni na sto procent że to nie drgania

1 minutę temu, Santiago napisał:

Zakres błędu 0.5 km/h . 

Zakładając że masz prawidłowy obwód koła w obliczeniach i nic kodu nie blokuje (delay, dłuższe while/for/if'y) to w kodzie powyżej nie powinno być nawet cm błędu na godzinę...

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...