Aktualizacja SuplaDevice

User avatar
QLQ
Posts: 2352
Joined: Sun Sep 03, 2017 9:13 am
Location: Koszalin

Post

Z tymi kilkoma p(i)riwami coś jest na rzeczy... :D

A ja tu z innym zapytaniem @klew. Czy jest juz zdefiniowany kanał ogólnego przeznaczenia w SuplaDev?
jak coś nie działa to włącz zasilanie.....
User avatar
klew
Posts: 10459
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

QLQ wrote: Sat Mar 07, 2020 7:09 pm Z tymi kilkoma p(i)riwami coś jest na rzeczy... :D

A ja tu z innym zapytaniem @klew. Czy jest juz zdefiniowany kanał ogólnego przeznaczenia w SuplaDev?
Pytanie co tu definiować? ;)
Klasę bazową do kanału ogólnego przeznaczenia mogę wrzucić, ale tam w zasadzie będzie kilka linijek kodu.
Bardziej to ma sens, gdy zaczniemy dodawać jakieś konkretne kanały używające ten typ kanału.
daniel
Posts: 34
Joined: Thu Feb 15, 2018 7:29 am

Post

Aktualnie się nie kompiluje :|

Code: Select all

/home/daniel/Arduino/libraries/SuplaDevice/src/SuplaDevice.cpp:217: undefined reference to `Supla::initTimers()'
@klew jak będziesz miał chwilkę zerknij proszę ;)
User avatar
klew
Posts: 10459
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

daniel wrote: Wed Mar 18, 2020 9:22 pm Aktualnie się nie kompiluje :|

Code: Select all

/home/daniel/Arduino/libraries/SuplaDevice/src/SuplaDevice.cpp:217: undefined reference to `Supla::initTimers()'
@klew jak będziesz miał chwilkę zerknij proszę ;)
Zabrakło wczoraj wieczorem jednego "git push".
Zaktualizuj bibliotekę, teraz powinno być ok.
daniel
Posts: 34
Joined: Thu Feb 15, 2018 7:29 am

Post

klew wrote: Wed Mar 18, 2020 11:19 pm Zabrakło wczoraj wieczorem jednego "git push".
Zaktualizuj bibliotekę, teraz powinno być ok.
Dzięki, działa.
Przy okazji zapytam jak wykorzystać metodę:

Code: Select all

  // method called on timer interupt
  // Include all actions that have to be executed periodically regardless of
  // other SuplaDevice activities
  virtual void onTimer();
próbowałem podobnie do:

Code: Select all

void iterateAlways();
ale nie zadziałało.
User avatar
klew
Posts: 10459
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

daniel wrote: Thu Mar 19, 2020 5:48 am
klew wrote: Wed Mar 18, 2020 11:19 pm Zabrakło wczoraj wieczorem jednego "git push".
Zaktualizuj bibliotekę, teraz powinno być ok.
Dzięki, działa.
Przy okazji zapytam jak wykorzystać metodę:

Code: Select all

  // method called on timer interupt
  // Include all actions that have to be executed periodically regardless of
  // other SuplaDevice activities
  virtual void onTimer();
próbowałem podobnie do:

Code: Select all

void iterateAlways();
ale nie zadziałało.
onTimer jest wywoływane z tego co pamiętam co 100 ms.
iterateAlways jest wywoływane przy każdej pętli w Arduino.

Pytanie do czego chcesz to wykorzystać?
daniel
Posts: 34
Joined: Thu Feb 15, 2018 7:29 am

Post

klew wrote: Thu Mar 19, 2020 5:19 pm onTimer jest wywoływane z tego co pamiętam co 100 ms.
iterateAlways jest wywoływane przy każdej pętli w Arduino.

Pytanie do czego chcesz to wykorzystać?
Napisałem klasę dziedziczącą po Supla::Sensor::ThermHygroMeter która pobiera dane z radiowego czujnika i temperatury i wilgotności 433Mhz.
Chciałem w metodzie onTimer() odbierać dane a w iterateAlways() odświeżać w chmurze.
Wygląda że u mnie nie działa, nie wypluwa nic na terminal:

Code: Select all

void onTimer() {
      rfThermHygroReceive();
      Serial.print(".");
    }
Ale działa (przekazuje temperaturę i wilgotność do chmury) jeśli umieszczę funkcję odczytującą dane radiowe w:

Code: Select all

void iterateAlways() {
     rfThermHygroReceive();
     if (lastReadTime + 10000 < millis()) {
        lastReadTime = millis();
        channel.setNewValue(getTemp(), getHumi());
      }
    }
Może co 100ms zbyt rzadko do odbioru danych radiowych, ale dlaczego nie ma śladu w terminalu?
User avatar
klew
Posts: 10459
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

daniel wrote: Thu Mar 19, 2020 5:54 pm
Masz działający kod odbierający te dane bez Supli?
daniel
Posts: 34
Joined: Thu Feb 15, 2018 7:29 am

Post

Tak:

Code: Select all

#include <RFControl.h>

#define RF_RECEIVER_PIN      D6
#define RF_ZERO_PULSE        1700
#define RF_ONE_PULSE         3800
#define RF_AVG_PULSE         (RF_ZERO_PULSE + RF_ONE_PULSE) / 2
#define RF_RAW_LENGTH        92
int rf_bin[RF_RAW_LENGTH / 2];

void setup() {
  Serial.begin(9600);
  RFControl::startReceiving(RF_RECEIVER_PIN);
}

void loop() {
  if (RFControl::hasData()) {
    unsigned int *timings;
    unsigned int timings_size;
    unsigned int pulse_length_divider = RFControl::getPulseLengthDivider();
    RFControl::getRaw(&timings, &timings_size);
    int i = 0;
    Serial.println("          1         2         3         4         5");
    Serial.println("012345678901234567890123456789012345678901234567890");
    if (timings_size == RF_RAW_LENGTH) {
      for (int x = 1; x < timings_size; x += 2) {
        unsigned long timing = timings[x] * pulse_length_divider;
        if (timing > RF_AVG_PULSE) {
          rf_bin[i++] = 1;
          Serial.print(1);
        } else {
          rf_bin[i++] = 0;
          Serial.print(0);
        }
      }
      Serial.println();
    }
  }
}
W swoim szkicu wyciągam z danych binarnych kanał rf, temperaturę wilgotność do zmiennej globalnej z której metody getTemp(), getHumi() je pobierają. I wszystko działa gdy funkcję pobierającą dane umieszczę w iterateAlways(), podczas gdy z onTimer() i onFastTimer() nie działa nawet Serial.print(".").
... w sumie skoro działa w iterateAlways() to może szkoda czasu na drążenie tematu...
EDIT:
Myślę że może to być konflikt z którąś bibliotek bo używam kilku egzotycznych ;) :

https://github.com/dandroz?tab=repositories
User avatar
klew
Posts: 10459
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Hm. Timery są startowane gdy jest dodana jakaś roleta lub licznik impulsów. Pewnie dlatego Ci nie działa ;). Zmienię aby chodziły zawsze
Możesz testowo dorzucić jakiś licznik impulsów i zobaczyć czy ruszy

Return to “Arduino IDE”