Akcje warunkowe w Arduino IDE

User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

klew wrote: Thu Mar 25, 2021 8:08 am
Nie ma w Twoim przykładzie błędu? Leci wyjątek przy wykonaniu zdarzenia.

Code: Select all

#include <supla/action_handler.h>

#define MOJA_AKCJA_1 1;
#define MOJA_AKCJA_2 2;

class MojaAkcja : public Supla::ActionHandler {
  public:
    void handleAction(int event, int action) {
      if (action == MOJA_AKCJA_1) {
        // zadania dla akcji 1
      } else if (action == MOJA_AKCJA_2) {
       // zadania dla akcji 2
      }  
    }
};

// setup:
MojaAkcja egzekutor;
button->addAction(MOJA_AKCJA_1, egzekutor, ON_PRESS);
Nie powinno być:

Code: Select all

public: MojaAkcja (){};
a w setup:

Code: Select all

MojaAkcja *egzekutor = new MojaAkcja;
https://www.facebook.com/groups/supladiy/
andrew01
Posts: 162
Joined: Fri May 24, 2019 6:49 am

Post

U mnie nie wyrzuca błędu przy zadziałaniu warunku, jedyne co zmieniłem to egzekutora dałem przed setupem, jako obiekt globalny.
SOYER
Posts: 841
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry

Post

Cześć, co źle napisałem w środkowej linijce:
auto r1 = new Supla::Control::Relay(D2, false);
auto termometr = new Supla::Sensor::Thermometer(A0);
termometr.addAction(Supla::TURN_ON, r1, OnGreater(250));
Chcę zrobić przekaźnik warunkowany odczytem z analoga.
Dzięki.
User avatar
klew
Posts: 8763
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

SOYER wrote: Fri Sep 16, 2022 9:36 am Cześć, co źle napisałem w środkowej linijce:
auto r1 = new Supla::Control::Relay(D2, false);
auto termometr = new Supla::Sensor::Thermometer(A0);
termometr.addAction(Supla::TURN_ON, r1, OnGreater(250));
Chcę zrobić przekaźnik warunkowany odczytem z analoga.
Dzięki.
Klasa Supla::Sensor::Thermometer nie ma konstruktura przyjmującego parametr. Nie ma też implementacji na odczyt wartości analogowych.
Ogólnie w samej bibliotece nie obsługi czytania analogowych czujników - musiałbyś to sam dopisać.
Czyli zrobić klasę, która dziedziczy po Supla::Sensor:Thermometer i napisać metody onInit oraz getValue. Może też inne - zależnie od tego co będzie potrzebne.
Widzimy się na Supla Offline Party vol. 2 :!:
SOYER
Posts: 841
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry

Post

To może zapytam z innej strony tego tematu. Dlaczego jeśli autorskim kodem zmienię stan fizycznego pinu sterującego przekaźnikiem to supla tego nie widzi/bądź widzi ale tego nie pokazuje. Oczywiście tym samym pinem umiem sterować z poziomu apk i wtedy supla wszystkie zmiany pokazuje. Jednak kiedy robię to linijkami niezależnymi od supli to fizycznie stan na pinie/przekaźniku się zmienia, ale supla uparcie twierdzi, że nic się nie wydarzyło.
Da się to obejść/zmienić?
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

SOYER wrote: Fri Sep 16, 2022 10:54 am To może zapytam z innej strony tego tematu. Dlaczego jeśli autorskim kodem zmienię stan fizycznego pinu sterującego przekaźnikiem to supla tego nie widzi/bądź widzi ale tego nie pokazuje. Oczywiście tym samym pinem umiem sterować z poziomu apk i wtedy supla wszystkie zmiany pokazuje. Jednak kiedy robię to linijkami niezależnymi od supli to fizycznie stan na pinie/przekaźniku się zmienia, ale supla uparcie twierdzi, że nic się nie wydarzyło.
Da się to obejść/zmienić?
używaj metod turnOn() i turnOff() na przekaźniku, wtedy zmiana będzie widoczna.

Code: Select all

twójPrzekaźnik->turnOn();
twójPrzekaźnik->turnOff();
https://www.facebook.com/groups/supladiy/
SOYER
Posts: 841
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry

Post

Mam w nagłówku:
#define r1 D2;
pod loop() ma zrobioną funkcję:
void ustaw(){
sus = analogRead(analogInPin);
if(sus > 200){
r1->turnOff();
}
}
a w loop() mam:
ustaw();
Co robię źle?
User avatar
klew
Posts: 8763
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

SOYER wrote: Fri Sep 16, 2022 11:41 am Mam w nagłówku:
#define r1 D2;
pod loop() ma zrobioną funkcję:
void ustaw(){
sus = analogRead(analogInPin);
if(sus > 200){
r1->turnOff();
}
}
a w loop() mam:
ustaw();
Co robię źle?
"r1" powinno być instancją klasy Supla::Control::Relay, a nie define'm na "D2".
Widzimy się na Supla Offline Party vol. 2 :!:
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

SOYER wrote: Fri Sep 16, 2022 11:41 am Mam w nagłówku:
#define r1 D2;
pod loop() ma zrobioną funkcję:
void ustaw(){
sus = analogRead(analogInPin);
if(sus > 200){
r1->turnOff();
}
}
a w loop() mam:
ustaw();
Co robię źle?
r1 powinien być elementem, przekaźnikiem a nie pinem / to co napisał wyżej @klew

Code: Select all

#include <SuplaDevice.h>
#include <supla/control/relay.h>
Supla::Control::Relay *r1 = nullptr;

#define r1_pin D2;
#define analogInPin A0;

void ustaw() {
  auto sus = analogRead(analogInPin);
  if(sus > 200){
    r1->turnOff();  
  }
}

void setup() {
  r1 = new Supla::Control::Relay(r1_pin, true);

void loop() {
  SuplaDevice.iterate();
  ustaw();
}
https://www.facebook.com/groups/supladiy/
User avatar
klew
Posts: 8763
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

SOYER, jeśli potrzebujesz dalej pomocy z tym kodem, to załóż proszę osobny temat, aby nie robić off-topa w wątku o akcjach warunkowych.
Widzimy się na Supla Offline Party vol. 2 :!:

Return to “Arduino IDE”