//Średnica anemometru w calach float diameter = 2.75; float mph; //Utworzenie zmiennej mile/godzinę float kmh; //Utowrzenie zmiennej km/h //Kierunek wiatru int winddir = 0; //Utworzenie zmiennej wnddir (kierunek wiatru) const byte WDIR = A0; // Przypisanie portu A0 jako portu odczytującego kierunek wiatru (jako stała) // Odczyt obrotów (RPM) volatile int half_revolutions = 0; //Utworzenie zmiennej połowa pełnego obrotu (half revolutions) int rpm = 0; //Utworzenie zmiennej RPM (obroty) unsigned long lastmillis = 0; //Utworzenie zmiennej long lastmilis void rpm_fan() { //funkcja rpm_fan unsigned long static last_event = 0; if (millis() - last_event < 5) { //debouncing return; } half_revolutions++; //zwiększ wartość zmiennej half_revolutions } int get_wind_direction() //Funkcja odczytująca kierunek wiatru { unsigned int adc; //Utworzenie zmiennej adc adc = analogRead(WDIR); // Odczyt aktualnej wartości ADC //Jeżeli wartośc będzie się zawierała w podanym zakresie, zostanie zwrócony kierunek wiatru if ((adc > 760) && (adc < 799)) return (0); if ((adc > 450) && (adc < 470)) return (45); if ((adc > 85) && (adc < 100)) return (90); if ((adc > 170) && (adc < 199)) return (135); if ((adc > 270) && (adc < 299)) return (180); if ((adc > 610) && (adc < 640)) return (225); if ((adc > 930) && (adc < 960)) return (270); if ((adc > 870) && (adc < 899)) return (315); return (-1); //Jeśli jest jakiś błąd zostanie zwrócona wartość -1 } void setup() { Serial.begin(9600); // Uruchomienie portu szeregowego z prędkością 9600 pinMode(2, INPUT_PULLUP); // Aktywowanie rezystora podciągającego na pinie 2 attachInterrupt(digitalPinToInterrupt(2), rpm_fan, FALLING); // Przypisanie funkcji rpm_fan przerwania zewnętrznego // Przerwanie zostanie wykonane jeśli stan zmieni się z wysokiego na niski (Falling) } void loop() { if (millis() - lastmillis >= 1000) { //Aktualizuj co sekundę, będzie to równoznaczne z odczytem częstotliwości (Hz) lastmillis = millis(); // Aktualizacja lastmillis noInterrupts(); // W trakcie kalkulacji wyłącz obsługę przerwań rpm = half_revolutions * 30; half_revolutions = 0; // Restart licznika obrotów interrupts() ; //Przywróć przerwania 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 winddir = get_wind_direction(); //Odczyt kierunku wiatru Serial.print("\t KMH=\t"); //Przesłanie odczytanych danych do portu szeregowego Serial.println(kmh); Serial.println(); Serial.print("winddir=\t"); Serial.println(winddir); } }