Skocz do zawartości

Czujnik prędkości wiatru


SOYER

Pomocna odpowiedź

Cześć, nabyłem droga kupna u naszych skośnookich przyjaciół czujnik prędkości wiatru. Coś takiego. Czujniki (dodatkowo deszczu) jeszcze do mnie jadą, ale postanowiłem za wczasu zająć się kodem. Znalazłem taki poradnik:

https://akademia.nettigo.pl/czujnik_wiatru/

No cóż jeszcze bym to może jakoś przyjął na klatę ale jest tam min. taka linijka:

mph = mph * 3.5; // Kalibracja błędu odczytu, wartość należy dobrać we własnym zakresie

co już samo w sobie brzmi podejrzanie. Po co te wszystkie obliczenia skoro na końcu wstawiamy "kalibrację" w.g. swoje widzimisię.

Czy ktoś obeznany odpowie mi czy się niepotrzebnie czepiam, czy można to napisać lepiej?

Edytowano przez SOYER
Link do komentarza
Share on other sites

16 minut temu, SOYER napisał:

czy się niepotrzebnie czepiam

Raczej tak.

Poszczególne egzemplarze urządzenia produkowanego seryjnie siłą rzeczy nie są identyczne - w tym przypadku prędkość obrotów czujnika będzie nieco różna dla różnych egzemplarzy przy tej samej prędkości wiatru. Tak więc obliczenia obliczeniami, a jakaś korekcja musi być. Ten współczynnik trzeba znaleźć posługując się przyrządem wzorcowym.

Tak jest zresztą z każdym przyrządem pomiarowym.

Link do komentarza
Share on other sites

26 minut temu, SOYER napisał:

Czy to średnica po zewnątrz „misek”?

Zastosowany wzór zakłada , że prędkość liniowa miski jest taka sama jak prędkość wiatru . Ja bym przyjął, że jest to odległość pomiędzy środkami misek leżącymi naprzeciwko siebie. Zewnętrzna część miski ma prędkość liniową większą, wewnętrzna mniejszą,  więc środek miski ma wartość średnią.

Oczywiście wzór nie bierze pod uwagę, że miski po drugiej stronie osi będą całość hamować, poruszając się pod wiatr.

I stąd między innymi zachodzi potrzeba stosowania doświadczalnie dobranego współczynnika, którym była mowa na początku.

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

3 godziny temu, SOYER napisał:

Po co te wszystkie obliczenia skoro na końcu wstawiamy "kalibrację" w.g. swoje widzimisię.

Obawiam się, że masz rację. Ja bym traktował wskazania tego przyrządu w kategoriach: bezwietrznie, słaby wiatr, wiatr umiarkowany, wiatr silny itd.

W warunkach amatorskich kalibracja jest raczej mało realna. Poza tym nic nie wiadomo o charakterystyce przetwornika. Z pewnością nie jest liniowa.

Link do komentarza
Share on other sites

Też mi się tak wydaje, kiedyś miałem zrobiony tego typu „wiatraczek” dużych rozmiarów, na łożyskach, metalowe pręty, prawdziwe miski na końcach. Tylko dla zabawy to zrobiłem. Tam był bardzo dobrze widoczny, przy dużych rozmiarach, problem raz bezwładności na początku i oporów przy dużych prędkościach liniowych miski. Tutaj te zjawiska oczywiście nie będą aż tak odczuwalne ale nie znikną.

Czyli traktujemy to jako zabawkę i obliczamy tak jak w przykładzie. Liczyłem na jakieś nowatorskie rozwiązanie programistyczne w stylu kolegi ethanaka;), ale w sumie problem jest dość prosty.

Link do komentarza
Share on other sites

Ok, napisałem na sucho. Na razie nie mam jeszcze sprzętu. Przyjdzie to będę testował.

#include <SuplaDevice.h>
#include <Timers.h>
#include <supla/sensor/DHT.h>
#include <supla/sensor/DS18B20.h>
#include <supla/network/esp_wifi.h>
#include <supla/sensor/general_purpose_measurement.h>
  Supla::ESPWifi wifi("xxx", "xxx");
  
#define dsPin 14 //D5
#define dhtPin 5 //D1
#define windPin 12 //D6
#define rainPin 2  //D4

Timer minuta;

int rai=0;
bool r=0;
int rain=0;

float diameter = 2.75;
float mph; 
float kmh;
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 rn(){// wektor przerwania deszczomierza
  unsigned long static last_event1 = 0;
  if (millis() - last_event1 < 5) {   //debouncing
    return;
  }
  rai++;
}
void rpm_fan() { //funkcja rpm_fan
  if (millis() - last_event < 5) {   //debouncing
    return;
  }
  half_revolutions_time = (millis() - last_event);
  last_event = millis();
}


Supla::Sensor::GeneralPurposeMeasurement *wiatr = nullptr;
Supla::Sensor::GeneralPurposeMeasurement *deszcz = nullptr;
void setup() {
   // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
  char GUID[SUPLA_GUID_SIZE] = {xx};

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {xx};
    new Supla::Sensor::DS18B20(dsPin);
    new Supla::Sensor::DHT(dhtPin, DHT22);
    wiatr = new Supla::Sensor::GeneralPurposeMeasurement();
    deszcz = new Supla::Sensor::GeneralPurposeMeasurement();   
    pinMode(windPin,INPUT);
    pinMode(rainPin,INPUT);
    attachInterrupt(digitalPinToInterrupt(rainPin), rn, CHANGE); 
    attachInterrupt(digitalPinToInterrupt(windPin), rpm_fan, FALLING);
    minuta.begin(59879);
      last_event = millis();
       SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    "svrxx.supla.org",  // SUPLA server address
                    "xx@wp.pl",   // Email address used to login to Supla Cloud
                    AUTHKEY);          // Authorization key
}

void loop() {
    SuplaDevice.iterate();
    if(minuta.available()){
      noInterrupts();   
      rain=rai*0.2794;
      deszcz->setValue(rain);
      rai=0;
      rpm = (30000 / half_revolutions_time) ;
      half_revolutions_time = 0;           // Restart licznika obrotów
      mph = diameter / 12 * 3.14 * rpm * 60 / 5280;//Odczyt prędkości wiatru w milach/godzinę
      mph = mph * 3.5; // Kalibracja błędu odczytu, wartość należy dobrać we własnym zakresie
      kmh = mph * 1.609;// Zamiana mil/godzinę na km/h
      wiatr->setValue(kmh);
      minuta.restart();
     interrupts() ; //Przywróć przerwania
    }
}

 

Link do komentarza
Share on other sites

Po co Ci podwójne przeliczenie mph---kph zrób od razu na m/s i kmh a resztę ewentualnie już na stronie gdzie te pomiary będą udostępnione, przydałoby się jeszcze mieć odczyt porywów wiatru 

Edytowano przez _LM_
Link do komentarza
Share on other sites

(edytowany)

Poprawiłem, bo przedtem nie miało prawo działać mierzenie wiatru. Teraz wyświetlam średnią z 10 odczytów robionych co 5s.

#include <SuplaDevice.h>
#include <Timers.h>
#include <supla/sensor/DHT.h>
#include <supla/sensor/DS18B20.h>
#include <supla/network/esp_wifi.h>
#include <supla/sensor/general_purpose_measurement.h>
  Supla::ESPWifi wifi("xx", "xxx);
  
#define dsPin 14 //D5
#define dhtPin 5 //D1
#define windPin 12 //D6
#define rainPin 2  //D4

Timer minuta;
Timer sekund5;

int rai=0;
bool r=0;
int rain=0;

float tempRpm = 0;
float averageRpm = 0;
int sample = 0;
float diameter = 2.75;
float mph; 
float kmh;
volatile int half_revolutions_time = 0; //Utworzenie zmiennej połowa pełnego obrotu (half revolutions)
int rpm = 0;
unsigned long static last_event = 0;

Supla::Sensor::GeneralPurposeMeasurement *wiatr = nullptr;
Supla::Sensor::GeneralPurposeMeasurement *deszcz = nullptr;

void rn(){// wektor przerwania deszczomierza
  unsigned long static last_event1 = 0;
  if (millis() - last_event1 < 5) {   //debouncing
    return;
  }
  rai++;
}
void rpm_fan() { //funkcja rpm_fan
  if (millis() - last_event < 5) {   //debouncing
    return;
  }
  half_revolutions_time = (millis() - last_event);
  last_event = millis();
}
void temporaryRPM(){
    noInterrupts(); 
    if(half_revolutions_time > 2000){// jeśli jest powyżej 2s między pólobrotem to stoi
     rpm=0;
    }
    else{ 
      rpm = (30000 / half_revolutions_time) ;
      half_revolutions_time = 0;   
    } 
    if(sekund5.available()){
      tempRpm = tempRpm + rpm;
      sample++;
      sekund5.restart();
     }
    if(sample==10){
      averageRpm = tempRpm / 10;
      mph = diameter / 12 * 3.14 * averageRpm * 60 / 5280;//Odczyt prędkości wiatru w milach/godzinę
      mph = mph * 3.5; // Kalibracja błędu odczytu, wartość należy dobrać we własnym zakresie
      kmh = mph * 1.609;// Zamiana mil/godzinę na km/h
      wiatr->setValue(kmh);
      tempRpm = 0;
      sample=0;
      sekund5.restart();
    }
   interrupts() ; //Przywróć przerwania
}


void setup() {
   // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
  char GUID[SUPLA_GUID_SIZE] = {0x};

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {xx};
    new Supla::Sensor::DS18B20(dsPin);
    new Supla::Sensor::DHT(dhtPin, DHT22);
    wiatr = new Supla::Sensor::GeneralPurposeMeasurement();
    deszcz = new Supla::Sensor::GeneralPurposeMeasurement();   
    pinMode(windPin,INPUT);
    pinMode(rainPin,INPUT);
    attachInterrupt(digitalPinToInterrupt(rainPin), rn, CHANGE); 
    attachInterrupt(digitalPinToInterrupt(windPin), rpm_fan, FALLING);
    minuta.begin(59879);
    sekund5.begin(4999);
    last_event = millis();
       SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    "svrx.supla.org",  // SUPLA server address
                    "xx@wp.pl",   // Email address used to login to Supla Cloud
                    AUTHKEY);          // Authorization key
}

void loop() {
    SuplaDevice.iterate();
    temporaryRPM();
    if(minuta.available()){  
      rain=rai*0.2794;
      deszcz->setValue(rain);
      rai=0;
      minuta.restart();
    }
}

 

Edytowano przez SOYER
Link do komentarza
Share on other sites

20 minut temu, _LM_ napisał:

Po co Ci podwójne przeliczenie mph---kph zrób od razu na m/s i kmh a resztę ewentualnie już na stronie gdzie te pomiary będą udostępnione, przydałoby się jeszcze mieć odczyt porywów wiatru 

Szczerze nie mam pojęcia co siedzi w tej linijce:

mph = diameter / 12 * 3.14 * averageRpm * 60 / 5280;//Odczyt prędkości wiatru w milach/godzinę

skąd ten diameter? to średnica od środków przeciwległych miseczek? czemu dzielimy przez 12? ta linijka to w ogóle policzy poprawnie bez okrągłych nawiasów?

Link do komentarza
Share on other sites

Radzę poobserwować zachowanie wiatru spoglądając na dym z komina. Można wtedy zobaczyć, że jego szybkość i kierunki są zmienne we wszystkich płaszczyznach. Występują większe lub mniejsze podmuchy i zawirowania. Wszelkie wskazania czujników będą bardziej lub mniej uśrednieniem prędkości. Dawniejsze wiatromierze były budowane w postaci prostokątnej płytki (zwykle stalowej lub z innego metalu bądź stopu) umieszczonej na poziomym zawiasie skierowanym prostopadle do kierunku wiatru i ciągle w ten sposób ustawianej. Jeśli wiatru nie było to ten metalowy prostokąt zwisał swobodnie, pionowo w dół. Jeśli zaczął wiać wiatr to naciskając na jego powierzchnię, odchylał go od pionu tym bardziej im silniejszy był wiatr. Przy wietrze huraganowym płytka odchylana była prawie do poziomu. Taki wiatromierz nazywany jest w. Wilde'a i wyglądał tak:

Zrzut ekranu 2024-10-26 o 20.33.45.png

Na lotniskach można zobaczyć tzw. rękawy i one wskazują kierunki i siłę wiatru. Jest to bardzo niedokładny przyrząd ale dla lotników zupełnie wystarczający.

A tak wygląda przykładowy wykres prędkości wiatru. czarny - chwilowy, niebieski - uśredniony:

 

 

1.jpg

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

(edytowany)

Typ czujnika o którym piszesz jest używany w najnowocześniejszych kombajnach zbożowych. Dwa takie czujniki zamontowane na ogonie kombajnu mierzą siłę  i kierunek  wiatru po to, by odpowiednio ustawić przysłony na wentylatorach rozrzucających słomę/plewy, po to by było to równomiernie rozłożone na polu nawet przy silnym poprzecznym wietrze.

Na tym filmie widać to znakomicie:

 

 

IMG_1329.jpg

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

Czujnik chcę zastosować hobbystycznie, do „pomiaru” porywów i kierunku używam flagi na 9m maszcie;)

Tutaj moje ulubione zdjęcie pod tytułem „Polska w ruinie”😂😂😂

448D8A09-58EC-48D6-9AB4-1E6942DF0CAF.JPG

Link do komentarza
Share on other sites

18 godzin temu, SOYER napisał:
mph = diameter / 12 * 3.14 * averageRpm * 60 / 5280;//Odczyt prędkości wiatru w milach/godzinę

skąd ten diameter? to średnica od środków przeciwległych miseczek? czemu dzielimy przez 12? ta linijka to w ogóle policzy poprawnie bez okrągłych nawiasów?

To wszystko to kinematyka i przeliczanie jednostek.
Zauważcie, że średnica wirnika jest podana w calach, prędkość wiatru w milach na godzinę.  1 mph = 5280 feet/h (stóp na godzinę), a jedna stopa to 12 cali.

Dlatego diameter/12 => przeliczenie cali na stopy, a 1/5280 to przeliczenie  mili na stopy.
3,14 to ludolfina czyli pi. 60 to przelicznik prędkości obrotowej 1/minutę na prędkość obrotowa w obrotach na godzinę.

Ogólnie wzór wynika z kinematyki prędkości liniowej obracającej się bryły V=w*R = pi*n *R/30

1736739464_Predkoobrotowa.thumb.png.e8171ceb6fcfcf2b965eff16a9e29869.png

gdzie:

w (omega) to prędkość kątowa = pi * n/30
n  to prędkość obrotowa 1/minutę) - jeden obrót to 2*pi
R to promień wirnika w metrach (jeśli inne jednostki np cale,  mm lub cm to trzeba je przeliczyć na mile lub metry jak kto chce)

 

Dnia 24.10.2024 o 17:11, SOYER napisał:
mph = mph * 3.5; // Kalibracja błędu odczytu, wartość należy dobrać we własnym zakresie

co już samo w sobie brzmi podejrzanie. Po co te wszystkie obliczenia skoro na końcu wstawiamy "kalibrację" w.g. swoje widzimisię.

Obliczenia opisane wzorem powyżej są słuszne przy założeniu, że prędkość liniowa elementu wirnika jest równa prędkości wiatru. Ale tak nie jest. Zauważ, że nie przez cały obrót wiatr wieje prosto na "miseczkę". Wiatr wieje także na pozostałe miseczki. Kształt miseczek sprawia, że opór jaki stawiają wiatrowi jest mniejszy gdy wypukłością są zwrócone do wiatru niż gdy wiatr wieje od strony wklęsłej. Można więc sądzić, że założenie iż prędkość liniowa miseczki jest równa prędkości wiatru jest błędne. Jest mniejsza stąd konieczność skorygowania - np. współczynnik 3,5. Tak naprawdę trzeba ten współczynnik wyznaczyć doświadczalnie mierząc prędkość obrotową przy znanej prędkości wiatru.

Na koniec, tego rodzaju turbiny są mało dokładne, a ich prędkość obrotowa oscyluje (to wpływ konstrukcji) nawet przy tej samej prędkości wiatru. Dlatego w przyrządach do pomiaru prędkości czy przepływu są stosowane turbiny osiowe (śmigłowe).

Zaletą takich wiatromierzy jest to, że działają niezależnie od kierunku wiatru podczas gdy turbinowe pokazują poprawnie gdy tacza turbiny jest ustawiona prostopadle do kierunku wiatru.

Edytowano przez Sylba
  • Pomogłeś! 1
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.