Jak po "nowemu" obsłużyć czujnik deszczu

User avatar
shimano73
Posts: 2174
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze
Been thanked: 1 time

Post

Pytanie kolegów od nowej biblioteki arduino, bo nie znalazłem przykładu jak obsłużyć czujnik deszczu który daje na wyjściu impulsy .
Na pocżątku to

Code: Select all


void ICACHE_RAM_ATTR RainCount(); 


void setup() {

  Serial.begin(74880);
 
 pinMode(RainImpuls,INPUT_PULLUP);
 
  attachInterrupt(digitalPinToInterrupt(RainImpuls), RainCount, FALLING);
  
  // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
  char GUID[SUPLA_GUID_SIZE] ={..} ;

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {..};

  
  new Supla::Sensor::Rain();
  
   SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    "svrx.supla.org",  // SUPLA server address
                    "[email protected]",   // Email address used to login to Supla Cloud
                    AUTHKEY);          // Authorization key
    
}

void loop() {
  SuplaDevice.iterate();
}
  



void RainCount() { // z przerwania

 

  rain_fall += rain_gauge_cup_capacity;

}
w jaki sposób podstawić rain_fall do metody getValue
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

A nie wolałabyś tego pod licznik impulsów podpiąć? Byłaby historia, statystyki
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
shimano73
Posts: 2174
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze
Been thanked: 1 time

Post

klew wrote: Wed Nov 18, 2020 5:19 pm A nie wolałabyś tego pod licznik impulsów podpiąć? Byłaby historia, statystyki
OK, czujnik deszczu można by tak ogarnąć , a jak ogarnąć czujnik do pomiaru prędkości wiatru ?
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

shimano73 wrote: Wed Nov 18, 2020 6:00 pm OK, czujnik deszczu można by tak ogarnąć , a jak ogarnąć czujnik do pomiaru prędkości wiatru ?
Nie wiem jak teraz czytasz prędkość wiatru, ale w zasadzie sprawadza się to do kodu w tym stylu:

Code: Select all

#include <supla/sensor/wind.h>

class MyWindSensor : public Supla::Sensor::Wind {
  public:
    MyWindSensor(......) { // podaj potrzebne parametry do uruchomienia czujnika wiatru - np. pin do odczytu danych
    ...;
    }
    
    void onInit() {
      inicjalizacja(); // wstaw wszytko co konfiguruje urządzenie (np ustawienie pinMode, 
      channel.setNewValue(getValue()); 
    }
    
    double getValue() {
      double wind;
      wind = ...; // odczytaj prędkość wiatru
      return wind;
    }
   protected:
     ...; // jakieś zmienne, które są potrzebne -  np nr pinu
 };
 
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
shimano73
Posts: 2174
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze
Been thanked: 1 time

Post

klew wrote: Wed Nov 18, 2020 10:19 pm


Na podstawie twoich podpowiedzi wydziergałem coś takiego

Code: Select all


class Anemometr : public Supla::Sensor::Wind {
  public:
    Anemometr(int _WindImpuls, double _One_rpm_speed) { // podaj potrzebne parametry do uruchomienia czujnika wiatru - np. pin do odczytu danych
    WindImpuls =_WindImpuls;
    One_rpm_speed = _One_rpm_speed;
    }

    
  ICACHE_RAM_ATTR  void  RpmFan() { // 
      unsigned long static last_event = 0;
      if (millis() - last_event < 5) {   //debouncing
        return;
      }
      half_revolution_time = (millis() - last_event);
      last_event = millis();
     
    }
    
    void onInit() {
      // wstaw wszytko co konfiguruje urządzenie (np ustawienie pinMode, 
      pinMode(WindImpuls, INPUT_PULLUP);   
      attachInterrupt(digitalPinToInterrupt(WindImpuls), RpmFan, FALLING);  
      channel.setNewValue(getValue()); 
    }


   

    
    double getValue() {
      double wind;
        noInterrupts();                   
        if (half_revolution_time>0) rpm = (30000 / half_revolution_time) ;      
        interrupts() ; 
        if (rpm>0) {
            wind = One_rpm_speed *(rpm /60);      
        }
      return wind;
    }

    void iterateAlways() {
        if (lastReadTime + 1000 < millis()) {
          lastReadTime = millis();
          channel.setNewValue(getValue());
        }
      }

    
   protected:

   
    int   WindImpuls; // jakieś zmienne, które są potrzebne -  np nr pinu
    int half_revolution_time = 0;
    double One_rpm_speed;
    double rpm = 0;
 };
 
Niestety jest błąd podczas kompilacji

Code: Select all

Arduino:1.8.13 (Windows 7), Płytka:"LOLIN(WEMOS) D1 R2 & mini, 80 MHz, Flash, Legacy (new can return nullptr), Basic SSL ciphers (lower ROM use), 4MB (FS:3MB OTA:~512KB), v2 Lower Memory, Serial, None, All Flash Contents, 115200"

C:\Users\Supla\Documents\Arduino\Wind_new_lib_v1\Wind_new_lib_v1.ino: In member function 'virtual void Anemometr::onInit()':

Wind_new_lib_v1:84:73: error: cannot convert 'Anemometr::RpmFan' from type 'void (Anemometr::)()' to type 'void (*)()'

       attachInterrupt(digitalPinToInterrupt(WindImpuls), RpmFan, FALLING);  

                                                                         ^

exit status 1

cannot convert 'Anemometr::RpmFan' from type 'void (Anemometr::)()' to type 'void (*)()'


jak temu zaradzić ?
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Przerwania przyjmują pointer na funkcję bez parametrów. Natomaist każda metoda w klasie posiada jeden niejawny parametr, w którym jest przekazany pointer na instancję klasy "this".
Z tego powodu zwykłych metod nie da się tak podłączać.
Najprościej byłoby zrobienie zwykłej "globalnej" metody i wyjście z tym poza klasę. Minusy:
- odchodzimy od obiektów
- tracimy enkapsulację
- tylko jedna instancja klasy będzie działać w takim podejściu i chcąc dodać drugą, trzeba będzie pisać drugą metodę podłączaną pod drugie przerwanie
Plusy:
- prosta zmiana
- będzie działać ;)
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
shimano73
Posts: 2174
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze
Been thanked: 1 time

Post

klew wrote: Thu Nov 19, 2020 1:06 pm Przerwania przyjmują pointer na funkcję bez parametrów. Natomaist każda metoda w klasie posiada jeden niejawny parametr, w którym jest przekazany pointer na instancję klasy "this".
Z tego powodu zwykłych metod nie da się tak podłączać.
Najprościej byłoby zrobienie zwykłej "globalnej" metody i wyjście z tym poza klasę. Minusy:
- odchodzimy od obiektów
- tracimy enkapsulację
- tylko jedna instancja klasy będzie działać w takim podejściu i chcąc dodać drugą, trzeba będzie pisać drugą metodę podłączaną pod drugie przerwanie
Plusy:
- prosta zmiana
- będzie działać ;)
No niestety , to przekracza moje możliwości zrozumienia , może jak byś mógł mi podać przykład jak kilka postów wyżej , z pomocą którego udało mi się zrobić obsługę czujnika MH-z14A, bh1750, HX711


edit: udało się , więcej tu viewtopic.php?f=24&t=7560
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
User avatar
shimano73
Posts: 2174
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze
Been thanked: 1 time

Post

Wracając do czujnika deszczu, aby wykorzystać do tego celu licznik impulsów trzeba by go przerobić ponieważ w clodzie nie można wpisać w miejscu wartości przelicznika liczby poniżej 1 np 0.2345
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

shimano73 wrote: Sun Nov 29, 2020 9:04 pm Wracając do czujnika deszczu, aby wykorzystać do tego celu licznik impulsów trzeba by go przerobić ponieważ w clodzie nie można wpisać w miejscu wartości przelicznika liczby poniżej 1 np 0.2345
W Cloud wpisujesz ile impulsów jest na jednostkę pomiarową. 0,2345 oznaczałoby, że 0,2345 impulsu oznacza np 1 litr, czyli 1 impuls, to ponad 4 litry.

Jaki masz przelicznik w tym czujniku deszczu? Rzeczywiście cloud akceptuje tylko liczby całkowite, ale możesz zawsze przeskalować w stronie softu i zamiast inkrementowania o 1, to inkrementować o 10 - i w ten sposób dodać dodatkową precyzję w przeliczeniach na Cloud
Najlepsze suple dla Twojego domu :mrgreen:

Return to “Pomoc”