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
Czujnik wiatru i deszczu
-
- Posts: 1060
- Joined: Wed Aug 10, 2022 12:29 pm
- Location: Kryry
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
https://app.weathercloud.net/d4311785603
-
- Posts: 1060
- Joined: Wed Aug 10, 2022 12:29 pm
- Location: Kryry
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();
}
}
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
https://app.weathercloud.net/d4311785603
-
- Posts: 1060
- Joined: Wed Aug 10, 2022 12:29 pm
- Location: Kryry
.
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
https://app.weathercloud.net/d4311785603
-
- Posts: 2019
- Joined: Sun Feb 17, 2019 6:56 am
- Location: Osielsko
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/
-
- Posts: 1060
- Joined: Wed Aug 10, 2022 12:29 pm
- Location: Kryry
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.
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
https://app.weathercloud.net/d4311785603
-
- Posts: 1060
- Joined: Wed Aug 10, 2022 12:29 pm
- Location: Kryry
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
https://app.weathercloud.net/d4311785603
-
- Posts: 1060
- Joined: Wed Aug 10, 2022 12:29 pm
- Location: Kryry
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://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
https://app.weathercloud.net/d4311785603
-
- Posts: 2019
- Joined: Sun Feb 17, 2019 6:56 am
- Location: Osielsko
Podmieniłem bibliotekę, wpisałem swoje dane i czekam na efektSOYER 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;)
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/
-
- Posts: 2019
- Joined: Sun Feb 17, 2019 6:56 am
- Location: Osielsko
Nie wiem czy to za dużo nie powiedziane ale samo wgranie ogarniam lepiej czy gorzej.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?
https://pietras-81.aqi.eco/
-
- Posts: 2019
- Joined: Sun Feb 17, 2019 6:56 am
- Location: Osielsko
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/