Skocz do zawartości

ESP32 - licznik do rowerka treningowego


Pomocna odpowiedź

if (digitalRead(HALL) == HIGH && stan == true) { 
  stan = false; 
  } 
if (digitalRead(HALL) == LOW && stan == false) { 
  czas_s = (millis() - last_time) / 1000.00; 
  float obroty = 3600 / czas_s;
  float predkosc = (obroty * obwod_k) / 1000.00;  
  trasa = trasa + obwod_k; //metry
  stan = true; 
  last_time = millis(); 
  Serial.println(prędkość);
  Serial.println(trasa); 
 }

Obwod_k to obwód w metrach jako float...sprawdź narazie to 

  • Pomogłeś! 1
11 minut temu, ethanak napisał:

Z ciekawości - po co testować stan == true?

Chce liczyć czas obu stanow lacznie i chce żeby obliczenia były wysłane tylko wtedy kiedy zrobi się pełny obrót...więc muszę jakoś "przeskakiwać" jednorazowo z if'a do if'a ( pewnie marnie wytłumaczyłem 🤔)

(edytowany)

Czym sie różni (zakładając, że stan to boolean)

if (stan == true)

Od

if (stan)

Po to są zmienne boolowskie, żeby nie trzeba było robić takich potworków.

Edytowano przez ethanak
  • Lubię! 1
(edytowany)
13 minut temu, ethanak napisał:

Czym sie różni (zakładając, że stan to boolean)

if (stan == true)

Od

if (stan)

Po to są zmienne boolowskie, żeby nie trzeba było robić takich potworków.

Aaaa!! O to Ci chodzi panie😁 a no tak...oczywiście że masz rację, tylko że ja już z przyzwyczajenia tak pisze jak powyżej w sytuacjach jak powyżej, czyli jeśli w dwóch warunkach sprawdzam czy true/false...jest mi tak jakoś łatwiej przeglądać kod😜 

14 minut temu, Santiago napisał:

Kod mi się podoba. Wykorzystam

Można go poprawić bo np. podczas pierwszego pomiaru będzie błąd spowodowany tym że zmienna last_time ma wartość zero...jakoś ładniej raz już to napisałem ale komp umarł więc nie sprawdzę teraz...a na dzień dzisiejszy jestem tak zamulony że nie jestem w stanie nic sensownego napisać prócz migania ledem...😅

Edytowano przez farmaceuta

@farmaceuta ech, cztery obroty korbami i.....

Gdy obracam korbami powoli to jest dobrze, działa. Ale jak pokręcę szybko to Exception wali..

 

#define reed_pin 35

void setup()
{
    Serial.begin(115200);
    pinMode(reed_pin, INPUT);
    //attachInterrupt(digitalPinToInterrupt(reed_pin), counterUp, RISING);
}

bool stan = true;
unsigned long czas_s, last_time;
float trasa;
float obwod_k = 0.74;

void loop()
{

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

 

---- Otwarto port szeregowy COM14 ----
19:18:10:989 -> 0.13
19:18:10:989 -> 0.74
19:18:12:185 -> 2.66
19:18:12:185 -> 1.48
19:18:13:084 -> Guru Meditation Error: Core  1 panic'ed (IntegerDivideByZero). Exception was unhandled.
19:18:13:084 -> 
19:18:13:084 -> Core  1 register dump:
19:18:13:084 -> PC      : 0x400d14a6  PS      : 0x00060630  A0      : 0x800d2b30  A1      : 0x3ffc51e0  
19:18:13:084 -> A2      : 0x3ffc1bc0  A3      : 0x00000000  A4      : 0x3ffc1bc4  A5      : 0x3ffbdb6c  
19:18:13:084 -> A6      : 0x3ffbd2bc  A7      : 0x80000001  A8      : 0x800d14a1  A9      : 0x3ffc51c0  
19:18:13:084 -> A10     : 0x00000e10  A11     : 0x3feb645a  A12     : 0xffffffff  A13     : 0x000003ff  
19:18:13:084 -> A14     : 0x7ff00000  A15     : 0x00000000  SAR     : 0x0000000a  EXCCAUSE: 0x00000006  
19:18:13:106 -> EXCVADDR: 0x00000000  LBEG    : 0x400840d1  LEND    : 0x400840d9  LCOUNT  : 0x00000027  
19:18:13:106 -> 
19:18:13:106 -> 
19:18:13:106 -> Backtrace: 0x400d14a3:0x3ffc51e0 0x400d2b2d:0x3ffc5200
19:18:13:106 -> 
19:18:13:106 -> 
19:18:13:106 -> 
19:18:13:106 -> 
19:18:13:106 -> ELF file SHA256: ae5e130273bb1907
19:18:13:106 -> 
19:18:13:253 -> Rebooting...
19:18:13:280 -> ets Jun  8 2016 00:22:57
19:18:13:280 -> 
19:18:13:280 -> rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
19:18:13:280 -> configsip: 0, SPIWP:0xee
19:18:13:280 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
19:18:13:280 -> mode:DIO, clock div:2
19:18:13:280 -> load:0x3fff0030,len:1184
19:18:13:280 -> load:0x40078000,len:13232
19:18:13:280 -> load:0x40080400,len:3028
19:18:13:280 -> entry 0x400805e4
19:18:13:840 -> Guru Meditation Error: Core  1 panic'ed (IntegerDivideByZero). Exception was unhandled.
19:18:13:840 -> 
19:18:13:840 -> Core  1 register dump:
19:18:13:840 -> PC      : 0x400d14a6  PS      : 0x00060630  A0      : 0x800d2b30  A1      : 0x3ffc51e0  
19:18:13:840 -> A2      : 0x3ffc1bc0  A3      : 0x00000000  A4      : 0x3ffc1bc4  A5      : 0x3ffbdb6c  
19:18:13:840 -> A6      : 0x3ffbd2bc  A7      : 0x80000001  A8      : 0x800d14a1  A9      : 0x3ffc51c0  
19:18:13:840 -> A10     : 0x00000e10  A11     : 0x3fd947ae  A12     : 0xfffffffe  A13     : 0x000003ff  
19:18:13:840 -> A14     : 0x7ff00000  A15     : 0x00000000  SAR     : 0x0000000a  EXCCAUSE: 0x00000006  
19:18:13:861 -> EXCVADDR: 0x00000000  LBEG    : 0x400840d1  LEND    : 0x400840d9  LCOUNT  : 0x00000027  
19:18:13:861 -> 
19:18:13:861 -> 
19:18:13:861 -> Backtrace: 0x400d14a3:0x3ffc51e0 0x400d2b2d:0x3ffc5200

 

(edytowany)

Przerób z millis na micros albo sprawdzaj, czy przypadkiem millis nie równa się last_time

A dzielenie przez zero jest bardzo niezdrowe również na Arduino.

Edytowano przez ethanak

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...