Wrzucam to jako przykład użycia nowej wersji biblioteki SuplaDevice na Arduino IDE. Pokazuje on jak można samemu dołożyć sobie "zdarzenie", które wewnątrz urządzenia tworzy prostą logikę. Docelowo biblioteka będzie miała nieco inny mechanizm do tworzenia takich zależności ale @Xoggo nie mógł się już doczekać, więc zrobiłem taki przykład na szybko.
Jak na razie wymaga biblioteki z mojego githuba: https://github.com/klew/arduino
Kod: Zaznacz cały
#include <SuplaDevice.h>
#include <supla/sensor/HC_SR04.h>
#include <supla/will_trigger.h>
#include <supla/control/relay.h>
#include <supla/sensor/virtual_binary.h>
#include <supla/network/esp_wifi.h>
Supla::ESPWifi wifi("your_wifi_ssid", "your_wifi_password");
char SERVER[] = "svrX.supla.org";
char EMAIL[] = "mail@mail.com";
using namespace Supla;
// Definiujemy nazwy zdarzeń, których będziemy używać
enum {ON_BELOW_THRESHOLD1, ON_ABOVE_THRESHOLD1, ON_BELOW_THRESHOLD2, ON_ABOVE_THRESHOLD2};
// Tworzymy nową klasę, która dziedziczy po sensorze HC SR04 oraz po klasie WillTrigger, która pozwala na
// tworzenie powiązań między różnymi elementami aplikacji
class DistanceWithAlarm : public Sensor::HC_SR04, public WillTrigger {
public:
// Konstruktor - przekazujemy parametry do klasy bazowe HC_SR04 oraz ustawiamy thresholdX na zero.
DistanceWithAlarm(int8_t trigPin, int8_t echoPin) : HC_SR04(trigPin, echoPin), threshold1(0), threshold2(0) {};
// Nadpisujemy metodę "getValue" - zawoła ona metodę getValue z klasy bazowej HC_SR04, po czym sprawdzi warunki
// czy pobrana wartość jest mniejsza lub większa od parametrów threshold 1 i 2 oraz wywoła odpowiednie zdarzenie
double getValue() {
double value = Sensor::HC_SR04::getValue();
if (value > DISTANCE_NOT_AVAILABLE) {
if (value < threshold1) {
runTrigger(ON_BELOW_THRESHOLD1);
}
if (value > threshold1) {
runTrigger(ON_ABOVE_THRESHOLD1);
}
if (value < threshold2) {
runTrigger(ON_BELOW_THRESHOLD2);
}
if (value > threshold2) {
runTrigger(ON_ABOVE_THRESHOLD2);
}
}
return value;
}
double threshold1;
double threshold2;
};
void setup() {
Serial.begin(460800);
// Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
char GUID[SUPLA_GUID_SIZE] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
// Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
// Tworzymy sensor dystansu - ustaw poprawne GPIO
DistanceWithAlarm *distance = new DistanceWithAlarm(4, 5); // (trigger, echo)
// Tworzymy przekaźnik alarmu
Control::Relay *alarmRelay = new Control::Relay(D8);
// Tworzymy wirtualny sensor binarny (on/off, jest/nie ma)
Sensor::VirtualBinary *carInGarage = new Sensor::VirtualBinary();
// Ustawiamy odległości powyżej/poniżej których mają wykonać się akcje
distance->threshold1 = 0.30; // 30 cm
distance->threshold2 = 1.50; // 150 cm
// Czujnik dystansu -> wywoła ( przekaźnik alarmu, gdy wartość będzie poniżej threshold1, włącz przekaźnik)
distance->willTrigger(*alarmRelay, ON_BELOW_THRESHOLD1, TURN_ON);
// Czujnik dystansu -> wywoła ( przekaźnik alarmu, gdy wartość będzie powyżej threshold1, wyłącz przekaźnik)
distance->willTrigger(*alarmRelay, ON_ABOVE_THRESHOLD1, TURN_OFF);
// Czujnik dystansu -> wywoła ( ustaw sensor obecności samochodu, gdy wartość będzie poniżej threshold2)
distance->willTrigger(*carInGarage, ON_BELOW_THRESHOLD2, SET);
// Czujnik dystansu -> wywoła ( wyczyść sensor obecności samochodu, gdy wartość będzie powyżej threshold2)
distance->willTrigger(*carInGarage, ON_ABOVE_THRESHOLD2, CLEAR);
SuplaDevice.setName("CarInGarage");
SuplaDevice.begin(GUID, // Global Unique Identifier
SERVER, // SUPLA server address
EMAIL, // Email address used to login to Supla Cloud
AUTHKEY); // Authorization key
}
void loop() {
SuplaDevice.iterate();
}