Arduino - nowa nieoficjalna biblioteka z licznikiem impulsów

User avatar
klew
Posts: 10022
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

[EDIT]
Zamykam temat, bo SuplaImpulseCounter został przepisany w nowej wersji biblioteki. Więcej szczegółów i kontynuacja wątku tutaj: viewtopic.php?f=61&t=7163
[/EDIT]

Hej

Jeśli ktoś ma ochotę, to udostępniam mój wariant biblioteki na Arduino. Jak na razie pracuję tylko na klonie Arduino Mega.
Zmiany względem orginalnej biblioteki:
  • licznik impulsów (dorzuciłem przykład)
  • zmieniłem implementację czujników DHT (można po prostu dodawać kilka czujników bez żadnej dodatkowej implementacji) - niestety na chwilę obecną przez tą zmianę jest zawsze wymagana biblioteka DHT
  • w czujnika DHT dodałem ignorowanie błędnych odczytów (dopiero trzy błędne odczyty spowodują wyświetlenie braku pomiaru) - dzięki temu nie ma dziur w wykresach na cloudzie
  • poprawa błędnego pierwszego odczytu temepratury z DHT zaraz po restarcie urządzenia
  • kilka drobnych optymalizacji w bibliotece, dzięki którym wszystko działa bez problemu przy kilku czujnikach (DHT, Dallas) - wcześniej odczyty działały na maks 2-3 czujnikach
Licznik impulsów nie ma jeszcze zaimplementowanej "status LED" - czyli nie mruga, gdy zliczy impuls. Wyrzuca za to na Serial logi, więc mi to wystarczało do weryfikacji czy impulsy są zliczane.
Licznik zapisuje stan do pamięciu EEPROM (gdzieś na 512 bajcie) raz na 15 min. Robi 3 kopie i dodaje sumę kontrolną, więc powinno to trochę pochodzić zanim pamięć padnie ;).

https://github.com/klew/arduino
Last edited by klew on Wed Oct 23, 2019 8:24 am, edited 1 time in total.
piomar2
Posts: 369
Joined: Fri Apr 26, 2019 5:32 pm
Location: Bukowice

Post

Witaj!

Zasugerowałeś mi zmianę (przy woltomierzy 6 wejść) w SuplaDevice.cpp :
channel_pin[Params.reg_dev.channel_count].time_left = 0;
na:
channel_pin[Params.reg_dev.channel_count].time_left = 1000*Params.reg_dev.channel_count;
W nowej, Twojej bibliotece zamiast sugerowane 1000 jest 100. Sprawdziłem też działa dobrze.
Czy ta różnica jest istotna?

Pozdrawiam
User avatar
klew
Posts: 10022
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

piomar2 wrote: Mon Sep 23, 2019 5:50 am Zasugerowałeś mi zmianę (przy woltomierzy 6 wejść) w SuplaDevice.cpp :
channel_pin[Params.reg_dev.channel_count].time_left = 0;
na:
channel_pin[Params.reg_dev.channel_count].time_left = 1000*Params.reg_dev.channel_count;
W nowej, Twojej bibliotece zamiast sugerowane 1000 jest 100. Sprawdziłem też działa dobrze.
Czy ta różnica jest istotna?
Wcześniej ustawiałem to na 1000. Potem spróbowałem 100 ms i też nie było problemu. Głównie chodzi o to, aby nie wysyłać danych z kilku urządzeń podczas jednej pętli w "iterate", bo wtedy brakowało pamięci i dane nie lądowały na kolejce do wysłania.
Zmniejszyłem z 1000 na 100 ms, bo przy 10 termometrach, pierwszy i ostatni byłby aktualizowany w tym samym czasie.
Zamierzam całe to wysyłanie przepisać, aby ten problem się nie pojawił nawet jak urządzenia będą na raz wysyłać dane.
piomar2
Posts: 369
Joined: Fri Apr 26, 2019 5:32 pm
Location: Bukowice

Post

Dzięki za odpowiedź i wyjaśnienie. Jak "przepiszesz temat" to daj znać. Chętnie przetestuję.

Pozdrawiam
cino111
Posts: 714
Joined: Mon May 07, 2018 8:00 pm

Post

Swietna robota. Nareszcie Arduine Mega zacznie działać. Kupiłem 2sz do piwnicy i garażu i czekam na poprawę biblioteki.

Wielkie dzięki za dobrą robotę.
alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

Za 3 tygodnie wracam do PL to postaram się sprawdzić czy moje 8 dsow ruszy , obecnie po może nie koniecznej zmianie linki na skrętkę było trochę lepiej ale mam nadzieję że to wina biblioteki ;)
User avatar
klew
Posts: 10022
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

alankedzior wrote: Wed Nov 06, 2019 11:51 am Za 3 tygodnie wracam do PL to postaram się sprawdzić czy moje 8 dsow ruszy , obecnie po może nie koniecznej zmianie linki na skrętkę było trochę lepiej ale mam nadzieję że to wina biblioteki ;)
Biblioteka powodowała, że aktualizował się stan tylko 1-2 czujników. Reszta bardzo sporadycznie. Jeśli takie coś obserwowałeś, to ostatnie aktualizacje powinny pomóc
alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

Ogólnie wyświetlało mi później po zmianie linki na skrętkę nawet 6 czujnikow, lecz wskazania się niekiedy zawieszały i stały w miejscu.
alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

klew wrote: Wed Nov 06, 2019 11:55 am

Biblioteka powodowała, że aktualizował się stan tylko 1-2 czujników. Reszta bardzo sporadycznie. Jeśli takie coś obserwowałeś, to ostatnie aktualizacje powinny pomóc

Teraz wszystkie termometry są na jednym kanale w twojej bibliotece tak ?
i jak to teraz jest w twojej bibliotece z definiowaniem przycisków pod dany kanał ? aby zmieniał się stan także w aplikacji.
Dotychczas używałem

Code: Select all

typedef struct {
  int pin;
  int relay_pin;
  int channel;
  char last_val;
  unsigned long last_time;
} _btn_t;

_btn_t btn[BTN_COUNT];

void supla_timer() {
  char v;
  unsigned long now = millis();
  
  
  for(int a=0;a<BTN_COUNT;a++)
    if (btn[a].pin > 0) {
        v = digitalRead(btn[a].pin);
        if (v != btn[a].last_val && now - btn[a].last_time ) {
           btn[a].last_val = v;
           btn[a].last_time = now;
           if (v==0)
             {
                 if ( digitalRead(btn[a].relay_pin) > 0 ) {
                  SuplaDevice.relayOff(btn[a].channel);
                 } else {
                  SuplaDevice.relayOn(btn[a].channel, 0);
                 }        
             }
        }
  
    }
}

void supla_btn_init() {
  for(int a=0;a<BTN_COUNT;a++)
    if (btn[a].pin > 0) {
        pinMode(btn[a].pin, INPUT_PULLUP); 
        btn[a].last_val = digitalRead(btn[a].pin);
        btn[a].last_time = millis();
    }
}



void setup() {

  Serial.begin(9600);
  

  // Init DS18B20 library 
  sensors.begin();
  
  
  SuplaDevice.addRelay(2);                                     // kanal 8    lampa front k12 
SuplaDevice.addRelay(3);                                     // kanal 9    lampa taras  k11 
SuplaDevice.addRelay(4);                                     // kanal  10   lampa kotłownia k14
SuplaDevice.addRelay(5);                                      // kanal 11    kinkiety salon k15
SuplaDevice.addRelay(6);                                      // kanal 12    lampa piwnica k16
SuplaDevice.addRelay(7,true);                                      // kanal 13   lampa płot k01
SuplaDevice.addRelay(8);                                      // kanal 14    kuchnia Led k17
SuplaDevice.addRelay(21);                                      // kanal 15    salon led k21
SuplaDevice.addRelay(11,true);                                      // kanal 16   girlanda k02
SuplaDevice.addRelay(12);                                      // kanal 17    brama wjazd otworz kdc11
SuplaDevice.addRelay(13);                                      // kanal 18    brama wjazd zamknij  kdc12 
SuplaDevice.addRelay(14);                                      // kanal 19    akwarium k22
SuplaDevice.addRelay(15);                                    // kanal 20    brama wjazd 2 otworz 
SuplaDevice.addRelay(16);                                     // kanal 21    brama wjazd 2 zamknij kdc14
SuplaDevice.addRelay(17);                                      // kanal 22   gniazdo salon 1 (lampa)
SuplaDevice.addRelay(18);                                      // kanal 23   gniazdo salon 2 (choinka ) k24
SuplaDevice.addRelay(42);                                      // kanal 24   taras led k25
SuplaDevice.addRelay(28);                                      // kanal 25   brama garaz kdc22
SuplaDevice.addRelay(39);                                      // kanal 26   furtka kdc21
SuplaDevice.addRelay(40,true);        
 SuplaDevice.begin
 
 
 
 (GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    "svr10.supla.org",  // SUPLA server address
                    xxx,                // Location ID 
                    "xxx");           // Location Password 


  
  memset(btn, 19, sizeof(btn));
  
  btn[0].pin = 20;                       // przycisk front s2
  btn[0].relay_pin = 2;                 // przekaznik front k12   
  btn[0].channel = 8;                    // numer kanału

  btn[1].pin = 19;                       // przycisk lampa taras  s1
  btn[1].relay_pin = 3;                 // przekaznik lampa taras  k11  
  btn[1].channel = 9;                    // numer kanału

  btn[2].pin = 43 ;                       // przycisk lampa kotłownia s18
  btn[2].relay_pin = 4;                 // przekaznik lampa kotłownia k14  
  btn[2].channel = 10;                    // numer kanału

   btn[3].pin = 22 ;                       // przycisk kinkiety salon s7
  btn[3].relay_pin = 5;                 // przekaznik kinkiety salon k15  
  btn[3].channel = 11;                    // numer kanału

 btn[4].pin = 44 ;                       // przycisk piwnica s17
  btn[4].relay_pin = 6;                 // przekaznik lampa piwnica k16  
  btn[4].channel = 12;                    // numer kanału

  btn[5].pin =9  ;                       // przycisk lampa płot s4
  btn[5].relay_pin = 7;                 // przekaznik lampa plot k01  
  btn[5].channel = 13;                    // numer kanału

    btn[6].pin =23  ;                       // przycisk kuchnia led s8
  btn[6].relay_pin = 8;                 // przekaznik kuchnia led k17  
  btn[6].channel = 14;                    // numer kanału

btn[7].pin =24  ;                       // przycisk salon led s9
  btn[7].relay_pin = 21;                 // przekaznik salon led  k21 
  btn[7].channel = 15;                    // numer kanału

  btn[8].pin =46  ;                       // przycisk girlanda s6
  btn[8].relay_pin = 11;                 // przekaznik girlanda k02
  btn[8].channel = 16;                    // numer kanału


   btn[9].pin =0  ;                       // przycisk brama 
  btn[9].relay_pin = 0;                 // przekaznik brama wirtualny
  btn[9].channel =17 ;                    // numer kanału


  btn[10].pin =0  ;                       // przycisk brama
  btn[10].relay_pin = 0;                 // przekaznik brama wirtualny
  btn[10].channel = 18;                    // numer kanału

btn[11].pin =29  ;                       // przycisk akwarium s11
  btn[11].relay_pin =14 ;                 // przekaznik akwarium k22
  btn[11].channel = 19;                    // numer kanału

   btn[12].pin =0  ;                       // przycisk brama 
  btn[12].relay_pin = 0;                 // przekaznik brama wirtualny
  btn[12].channel =20 ;                    // numer kanału


  btn[13].pin =0  ;                       // przycisk brama
  btn[13].relay_pin = 0;                 // przekaznik brama wirtualny
  btn[13].channel = 21;                    // numer kanału

   btn[14].pin =48  ;                       // przycisk gniazdo salon 1 (lampa)s12
  btn[14].relay_pin = 17;                 // przekaznik gniazdo salon 1(lampa) k23
  btn[14].channel = 22;                    // numer kanału

  btn[15].pin =47  ;                       // przycisk gniazdo salon 2 (choinka )s13
  btn[15].relay_pin = 18;                 // przekaznik gniazdo salon 2( choinka) k24
  btn[15].channel = 23;                    // numer kanału

    btn[16].pin =49  ;                       // przycisk taras led s14
  btn[16].relay_pin = 42;                 // przekaznik taras led k25
  btn[16].channel = 24;                    // numer kanału

  
    btn[17].pin =0  ;                       // przycisk brama garaz wirtualny
  btn[17].relay_pin = 0;                 // przekaznik brama garaz wirtualny
  btn[17].channel = 25;                    // numer kanału

btn[18].pin =45  ;                       // przycisk furtki 
  btn[18].relay_pin = 39;                 // przekaznik furtka kdc21
  btn[18].channel = 26;                    // numer kanału

  
btn[19].pin =25  ;                       // przycisk lampy zewnatrz s10 
  btn[19].relay_pin = 40;                 // przekaznik lampy zewnetrzne k03
  btn[19].channel = 27;                    // numer kanału


  
 
  



  
  
  SuplaDevice.setTimerFuncImpl(&supla_timer);
        supla_btn_init();
  
 
    
}

void loop() {
  SuplaDevice.iterate();
  

}

User avatar
klew
Posts: 10022
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

alankedzior wrote: Thu Dec 26, 2019 11:02 pm
klew wrote: Wed Nov 06, 2019 11:55 am

Biblioteka powodowała, że aktualizował się stan tylko 1-2 czujników. Reszta bardzo sporadycznie. Jeśli takie coś obserwowałeś, to ostatnie aktualizacje powinny pomóc

Teraz wszystkie termometry są na jednym kanale w twojej bibliotece tak ?
i jak to teraz jest w twojej bibliotece z definiowaniem przycisków pod dany kanał ? aby zmieniał się stan także w aplikacji.
Dotychczas używałem
Każdy termometr ma swój osobny kanał.
Ogólnie nie kontynuowałbym tego wątku, bo rozwój biblioteki idzie powoli do przodu i ta biblioteka już jest mocno zmieniona.

Obsługi przycisków jeszcze nie dodałem. Jest to w planach, ale na razie siedzę nad obsługą czujników oraz kanału dla licznika prądu

Return to “Arduino IDE”