Skocz do zawartości

Czujnik prędkości wiatru


SOYER

Pomocna odpowiedź

A może zamiast się bawić w przeliczanie mil na kilometry, stóp na funty i cali na furlongi 😉 lepiej będzie znaleźć kawałek prostej drogi, kumpla z samochodem, w miarę bezwietrzny dzień i poprostu to skalibrować powiedzmy do 60-70 km/h co 10 km/h.

  • Lubię! 1
Link do komentarza
Share on other sites

24 minuty temu, mgala napisał:

 lepiej będzie znaleźć kawałek prostej drogi, kumpla z samochodem, w miarę bezwietrzny dzień i poprostu to skalibrować powiedzmy do 60-70 km/h co 10 km/h.

Z pozoru sposób prosty, ale ma sporo wad:

1. Prędkościomierz samochodu nie pokazuje rzeczywistej prędkości. Jeśli jeździsz samochodem, to możesz porównać prędkość pokazywaną przez licznik samochodu z prędkością pokazywaną przez prędkościomierz nawigacji np. Google. Przy 100 km/h prędkościomierz samochodowy będzie pokazywał parę km/h więcej;

2. Jaką masz pewność, że twój anemometr będzie owiewany powietrzem z prędkością z jaką jedzie samochód? Prędkość opływu powietrza wokół bryły samochodu może być inna od prędkości jazdy.

 

Link do komentarza
Share on other sites

21 minut temu, Sylba napisał:

Z pozoru sposób prosty, ale ma sporo wad:

1. Prędkościomierz samochodu nie pokazuje rzeczywistej prędkości. Jeśli jeździsz samochodem, to możesz porównać prędkość pokazywaną przez licznik samochodu z prędkością pokazywaną przez prędkościomierz nawigacji np. Google. Przy 100 km/h prędkościomierz samochodowy będzie pokazywał parę km/h więcej;

2. Jaką masz pewność, że twój anemometr będzie owiewany powietrzem z prędkością z jaką jedzie samochód? Prędkość opływu powietrza wokół bryły samochodu może być inna od prędkości jazdy.

 

Masz lepszy pomysł na kalibrację, bez kupowania sprzętu "profesjonalnego". Sam się zastanawiałem jak to skalibrować, pomysł kolegi @mgala wydał mi się genialny w swej prostocie.

Link do komentarza
Share on other sites

Nie napisałem, że pomysł jest całkiem zły. Jeśli nie masz dostępu do skalibrowanego miernika, z którym możesz porównać  to, może być. Wszystko zależy od tego jak dokładny ma być pomiar i do czego jest potrzebny.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

1 minutę temu, Sylba napisał:

Nie napisałem, że pomysł jest całkiem zły. Jeśli nie masz dostępu do skalibrowanego miernika, z którym możesz porównać  to, może być. Wszystko zależy od tego jak dokładny ma być pomiar i do czego jest potrzebny.

Tak jak pisałem, pomiar potrzebny kompletnie do niczego. Będzie się kręcić na kominie obok czujnika temperatury w słońcu i miernika deszczu, oraz cieszyło oko jako kolejny kafelek w Supli:). Już ustaliliśmy, że do dokładnych pomiarów to się to to nie nadaje;).

Czyli co laptop, nodeMCU i kabelek do auta i będzie kurs.

No to muszę jeszcze napisać szkic do kalibracji. 

Link do komentarza
Share on other sites

Tyle chyba wystarczy do testowania w aucie:

#define windPin 12 //D6
volatile int half_revolutions_time = 0; //Utworzenie zmiennej połowa pełnego obrotu (half revolutions)
int rpm = 0;
unsigned long static last_event = 0;
void rpm_fan() { //funkcja rpm_fan
  if (millis() - last_event < 5) {   //debouncing
    return;
  }
  half_revolutions_time = (millis() - last_event);
  last_event = millis();
}
void setup() {
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(windPin), rpm_fan, FALLING);
  last_event = millis();
}

void loop() {
  rpm = (30000 / half_revolutions_time) ;
  Serial.print("czas p/obrotu:  ");
  Serial.println(half_revolutions_time);
  Serial.print("rpm/min:  ");
  Serial.println(rpm);
}

 

Link do komentarza
Share on other sites

 

12 godzin temu, mgala napisał:

zamiast się bawić w przeliczanie mil na kilometry, stóp na funty i cali na furlongi 😉 lepiej będzie znaleźć kawałek prostej drogi, kumpla z samochodem, w miarę bezwietrzny dzień i poprostu to skalibrować

Niestety bez tego się nie da. Kalibracja to jedno, a przetwarzanie jednej wielkości na inną to drugie. Albo zrobisz to stosując formułę przeliczającą, albo tworząc mapę.

Link do komentarza
Share on other sites

Pytanie...

taki szkic do prób z czujnikiem wiatru:

#define windPin 12 //D6
volatile int half_revolutions_time = 0; //Utworzenie zmiennej połowa pełnego obrotu (half revolutions)
volatile int rpm = 0;
unsigned long static  last_event = 0;
 void ICACHE_RAM_ATTR rpm_fan() { //funkcja rpm_fan
  if (millis() - last_event < 5) {   //debouncing
    return;
  }
  half_revolutions_time = (millis() - last_event);
  last_event = millis();
}
void setup() {
  Serial.begin(9600);
  pinMode(windPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(windPin), rpm_fan, FALLING);
 last_event = millis();
}

void loop() {
  rpm = 30000/half_revolutions_time;
  Serial.print("czas p/obrotu:  ");
  Serial.println(half_revolutions_time);
  Serial.print("rpm:  ");
  Serial.println(rpm);

}

kompiluje i wgrywa, ale wywala wyjątki:

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Exception (6):
epc1=0x402010a2 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffe60 end: 3fffffd0 offset: 0150
3fffffb0:  3fffdad0 00000000 3ffee588 402019ac  
3fffffc0:  feefeffe feefeffe 3fffdab0 40100dd5  
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------
H!⸮⸮⸮⸮⸮)9;⸮⸮9i$⸮⸮
--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Exception (6):
epc1=0x402010a2 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffe60 end: 3fffffd0 offset: 0150
3fffffb0:  3fffdad0 00000000 3ffee588 402019ac  
3fffffc0:  feefeffe feefeffe 3fffdab0 40100dd5  
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

jednak po:

albo zakomentowaniu całej linijki w loop:

rpm = 30000/half_revolutions_time;

albo po prostu wywaleniu zmiennej half_revolutions_time i zastąpieniu jej np. cyfrą 2, wszystko działa ok...

WHY?

Link do komentarza
Share on other sites

Nie chce mi się całego kodu analizować, ale odkąd pamiętam dzielenie przez zero zawsze fatalnie wychodziło.

Poza tym w 8266 możesz skorzystać z post mortem (kiedyś to mi życie uratowało). Nie napiszę nic więcej bo to naprawdę było lata temu...

  • Pomogłeś! 1
Link do komentarza
Share on other sites

(edytowany)
22 minuty temu, ethanak napisał:

Nie chce mi się całego kodu analizować, ale odkąd pamiętam dzielenie przez zero zawsze fatalnie wychodziło.

Poza tym w 8266 możesz skorzystać z post mortem (kiedyś to mi życie uratowało). Nie napiszę nic więcej bo to naprawdę było lata temu...

Przyjacielu złoty, oczywiście, wystarczyło zmienić wartość inicjującą z zera na np. 2 i pięknie działa.

czas p/obrotu:  482
rpm:  62
czas p/obrotu:  482
rpm:  62
czas p/obrotu:  553
rpm:  62
czas p/obrotu:  553
rpm:  54
czas p/obrotu:  553
rpm:  54
czas p/obrotu:  553
rpm:  54

Dziękuję.

Edytowano przez SOYER
Link do komentarza
Share on other sites

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.