Czujnik wiatru i deszczu

SOYER
Posts: 1060
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry

Post

W sprawie bardzo(?) częstego tematu przy różnych stacjach pogodowych. Kilka, myślę ciekawych, uwag w tym temacie można znaleźć w wątku poniżej. To opis mojej implementacji ww. czujników do Supli.

https://forbot.pl/forum/topic/24675-czu ... /#comments

Jakby były pytania, uwagi piszcie śmiało.


EDIT: link do zmienionej wersji softu, pomiary opadów obsługuje KLOP, poprawione wysyłanie pomiarów deszczu na weathercloud:
viewtopic.php?t=16232
Last edited by SOYER on Sun Nov 24, 2024 8:24 am, edited 1 time in total.
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
SOYER
Posts: 1060
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry

Post

Code: Select all

#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);
  
#define dsPin 14 //D5
#define dhtPin 5 //D1
#define windPin 12 //D6
#define rainPin 2  //D4

Timer minuta;
Timer sekund1;
Timer sekund6;

int rai=0;
bool r=0;
float mmM2=0;

volatile int half_revolutions_time = 2; //Utworzenie zmiennej połowa pełnego obrotu (half revolutions)
volatile int rpm = 0;
unsigned long static  last_event = 0;
unsigned long static last_event1 = 0;
int sample = 0;
float moment_kmh;
float temp_kmh;
float correct_moment_kmh;
float average_kmh;

Supla::Sensor::GeneralPurposeMeasurement *moment_wind = nullptr;
Supla::Sensor::GeneralPurposeMeasurement *average_wind = nullptr;
Supla::Sensor::GeneralPurposeMeasurement *rain = nullptr;

void ICACHE_RAM_ATTR rn(){// wektor przerwania deszczomierza
  unsigned long static last_event1 = 0;
  if (millis() - last_event1 < 50) {   //debouncing
    return;
  }
  rai++;
  last_event1 = millis();
}
 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 temporaryRPM(){
    noInterrupts(); 
    if((last_event + 2000) < millis()){    
     rpm=0;
     moment_kmh = 0;
     correct_moment_kmh = 0;
    }
    else{ 
      rpm = (30000 / half_revolutions_time) ;
      moment_kmh = 6.28 * 0.075 * rpm/60.0 * 3.6;// pi x promień czujnika x rpm/60s x ms->km/h
      if(moment_kmh < 10){
        correct_moment_kmh = moment_kmh * 2.8;
      }
      else if((moment_kmh >= 10) && (moment_kmh < 25)){
        correct_moment_kmh = moment_kmh * 2.7;
      }
      else if(moment_kmh >= 25){
        correct_moment_kmh = moment_kmh * 2.8;
      }
    } 
    if(sekund6.available()){
      temp_kmh = temp_kmh + correct_moment_kmh;
      sample++;
      sekund6.restart();
     }
    if(sample==10){
      average_kmh = temp_kmh / 10; 
      temp_kmh = 0;
      sample=0;
      sekund6.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] = {0xBxx9};

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {0xDC,0xD1,xx,0x19};
    new Supla::Sensor::DS18B20(dsPin);
    new Supla::Sensor::DHT(dhtPin, DHT22);
    moment_wind = new Supla::Sensor::GeneralPurposeMeasurement();
    average_wind = new Supla::Sensor::GeneralPurposeMeasurement();
    rain = new Supla::Sensor::GeneralPurposeMeasurement();   
    pinMode(windPin,INPUT_PULLUP);
    pinMode(rainPin,INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(rainPin), rn, RISING); 
    attachInterrupt(digitalPinToInterrupt(windPin), rpm_fan, FALLING);
    minuta.begin(59999);
    sekund6.begin(6000);
    sekund1.begin(1000);
    last_event = millis();
    last_event1 = millis();
       SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    "svx.supla.org",  // SUPLA server address
                    "x@wp.pl",   // Email address used to login to Supla Cloud
                    AUTHKEY);          // Authorization key
}

void loop() {
    SuplaDevice.iterate();
    temporaryRPM();
    sendSupla();
}
void sendSupla(){
    if(sekund1.available()){  
      moment_wind->setValue(correct_moment_kmh);
      sekund1.restart();
    }
    if(minuta.available()){  
      mmM2=rai*0.15; // dwa przerwnia na jedną kolebkę, więc 0.15
      rain->setValue(mmM2);
      average_wind->setValue(average_kmh);
      rai=0;
      minuta.restart();
    }
}
Powyżej kod dla jednego ds18b20(u mnie temperatura w słońcu), jednego dht22(kuchnia), dwa KPOP dla czujnika wiatru i jeden KPOP dla czujnika deszczu.
Last edited by SOYER on Sat Nov 02, 2024 5:01 pm, edited 1 time in total.
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
SOYER
Posts: 1060
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry

Post

.
Last edited by SOYER on Sat Nov 02, 2024 5:01 pm, edited 1 time in total.
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
Pietras81
Posts: 2019
Joined: Sun Feb 17, 2019 6:56 am
Location: Osielsko

Post

Hej, naprowadzisz co robię źle, jak to wszystko uzupełnić żeby zadziałało ??

Code: Select all

C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino:7:23: error: 'xx' was not declared in this scope
    7 |   Supla::ESPWifi wifi(xx);
      |                       ^~
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino:14:1: error: 'Timer' does not name a type; did you mean 'Timers'?
   14 | Timer minuta;
      | ^~~~~
      | Timers
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino:15:1: error: 'Timer' does not name a type; did you mean 'Timers'?
   15 | Timer sekund1;
      | ^~~~~
      | Timers
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino:16:1: error: 'Timer' does not name a type; did you mean 'Timers'?
   16 | Timer sekund6;
      | ^~~~~
      | Timers
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino: In function 'void temporaryRPM()':
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino:71:8: error: 'sekund6' was not declared in this scope
   71 |     if(sekund6.available()){
      |        ^~~~~~~
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino:80:7: error: 'sekund6' was not declared in this scope
   80 |       sekund6.restart();
      |       ^~~~~~~
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino: In function 'void setup()':
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino:87:33: error: unable to find numeric literal operator 'operator""xx9'
   87 |   char GUID[SUPLA_GUID_SIZE] = {0xBxx9};
      |                                 ^~~~~~
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino:90:49: error: 'xx' was not declared in this scope
   90 |   char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {0xDC,0xD1,xx,0x19};
      |                                                 ^~
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino:100:5: error: 'minuta' was not declared in this scope
  100 |     minuta.begin(59999);
      |     ^~~~~~
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino:101:5: error: 'sekund6' was not declared in this scope
  101 |     sekund6.begin(6000);
      |     ^~~~~~~
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino:102:5: error: 'sekund1' was not declared in this scope
  102 |     sekund1.begin(1000);
      |     ^~~~~~~
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino: In function 'void sendSupla()':
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino:117:8: error: 'sekund1' was not declared in this scope
  117 |     if(sekund1.available()){
      |        ^~~~~~~
C:\Users\Piotr\Documents\Arduino\sketch_oct25a\sketch_oct25a.ino:121:8: error: 'minuta' was not declared in this scope
  121 |     if(minuta.available()){
      |        ^~~~~~

exit status 1

Compilation error: 'xx' was not declared in this scope
https://pietras-81.aqi.eco/
SOYER
Posts: 1060
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry

Post

Z tego co widzę na szybko:
masz zainstalowaną bibliotekę Timers do obsługi odliczania czasu?
nie podałeś danych do wifi,
nie podałeś danych do logowania do supli,
nie podałeś właściwego GUID i AUTH.
Last edited by SOYER on Sun Nov 03, 2024 3:21 pm, edited 1 time in total.
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
SOYER
Posts: 1060
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry

Post

Ja w newralgicznych miejscach zastąpiłem moje dane do logowania x-ami. Używałeś już supla device?
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
SOYER
Posts: 1060
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry

Post

Biblioteka Timers:

https://github.com/nettigo/Timers

Używana przez moją skromną osobę na arduino uno, mega, esp 8266, esp32.
Nigdy mnie nie zawiodła, ani nie powodowała cross kłopotów;)
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
Pietras81
Posts: 2019
Joined: Sun Feb 17, 2019 6:56 am
Location: Osielsko

Post

SOYER wrote: Sun Nov 03, 2024 3:29 pm Biblioteka Timers:

https://github.com/nettigo/Timers

Używana przez moją skromną osobę na arduino uno, mega, esp 8266, esp32.
Nigdy mnie nie zawiodła, ani nie powodowała cross kłopotów;)
Podmieniłem bibliotekę, wpisałem swoje dane i czekam na efekt :)
Puki co
UWAGA: biblioteka Timers działa na architekturze(/architekturach) avr, sam, samd i może nie być kompatybilna z obecną płytką która działa na architekturze(/architekturach) esp8266.
https://pietras-81.aqi.eco/
Pietras81
Posts: 2019
Joined: Sun Feb 17, 2019 6:56 am
Location: Osielsko

Post

SOYER wrote: Sun Nov 03, 2024 3:20 pm Ja w newralgicznych miejscach zastąpiłem moje dane do logowania x-ami. Używałeś już supla device?
Nie wiem czy to za dużo nie powiedziane ale samo wgranie ogarniam lepiej czy gorzej.
https://pietras-81.aqi.eco/
Pietras81
Posts: 2019
Joined: Sun Feb 17, 2019 6:56 am
Location: Osielsko

Post

Wgrałem na d1 mini, mam pytanie, cloudzie pojawiły się trzy kanały - coś trzeba tam konfigurować jakieś mnożniki, dzielniki czy tylko ikonki jednostki i cała zabawa ??
https://pietras-81.aqi.eco/

Return to “Projekty użytkowników”