Czujnik obecności samochodu w garażu z alarmem

Awatar użytkownika
klew
Posty: 829
Rejestracja: czw cze 27, 2019 12:16 pm

sob kwie 25, 2020 9:29 am

Poniżej zamieszczam przykładowy program, który używa czujnika odległośc (HC SR04) do sprawdzania obecności samochodu w garażu, a także sygnalizuje zbyt małą odległość "samochodu" od czujnika.

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();
}
Miłej zabawy ;)
Awatar użytkownika
Xoggo
Posty: 135
Rejestracja: ndz mar 29, 2020 10:03 pm
Lokalizacja: Zbąszynek

sob kwie 25, 2020 10:49 am

Dzięki @klew dzisiaj przetestuję i dam znaka :geek:
Awatar użytkownika
Xoggo
Posty: 135
Rejestracja: ndz mar 29, 2020 10:03 pm
Lokalizacja: Zbąszynek

ndz kwie 26, 2020 9:50 am

@klew
Niestety urządzenie nie chce się zarejestrować w SUPLI pomimo, że sama kompilacja wykonała się poprawnie.
Nie jest to wina ustawień WIFI, GUID, SERVER, EMAIL, AUTHKEY, gdyż na tych samych parametrach (przy innych szkicach) urządzenie rejestruje się. :idea:
Awatar użytkownika
klew
Posty: 829
Rejestracja: czw cze 27, 2019 12:16 pm

ndz kwie 26, 2020 1:14 pm

Xoggo pisze:
ndz kwie 26, 2020 9:50 am
@klew
Niestety urządzenie nie chce się zarejestrować w SUPLI pomimo, że sama kompilacja wykonała się poprawnie.
Nie jest to wina ustawień WIFI, GUID, SERVER, EMAIL, AUTHKEY, gdyż na tych samych parametrach (przy innych szkicach) urządzenie rejestruje się. :idea:
Pokaż logi
Awatar użytkownika
Xoggo
Posty: 135
Rejestracja: ndz mar 29, 2020 10:03 pm
Lokalizacja: Zbąszynek

ndz kwie 26, 2020 6:55 pm

Kod: Zaznacz cały

Szkic używa 360428 bajtów (34%) pamięci programu. Maksimum to 1044464 bajtów.
Zmienne globalne używają 33816 bajtów (41%) pamięci dynamicznej, pozostawiając 48104 bajtów dla zmiennych lokalnych. Maksimum to 81920 bajtów.
esptool.py v2.8
Serial port COM5
Connecting....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 68:c6:3a:ef:07:e2
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 256000
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Erasing flash (this may take a while)...
Chip erase completed successfully in 12.1s
Compressed 364576 bytes to 263646...

Writing at 0x00000000... (5 %)
Writing at 0x00004000... (11 %)
Writing at 0x00008000... (17 %)
Writing at 0x0000c000... (23 %)
Writing at 0x00010000... (29 %)
Writing at 0x00014000... (35 %)
Writing at 0x00018000... (41 %)
Writing at 0x0001c000... (47 %)
Writing at 0x00020000... (52 %)
Writing at 0x00024000... (58 %)
Writing at 0x00028000... (64 %)
Writing at 0x0002c000... (70 %)
Writing at 0x00030000... (76 %)
Writing at 0x00034000... (82 %)
Writing at 0x00038000... (88 %)
Writing at 0x0003c000... (94 %)
Writing at 0x00040000... (100 %)
Wrote 364576 bytes (263646 compressed) at 0x00000000 in 10.8 seconds (effective 270.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
Awatar użytkownika
klew
Posty: 829
Rejestracja: czw cze 27, 2019 12:16 pm

ndz kwie 26, 2020 9:57 pm

Xoggo pisze:
ndz kwie 26, 2020 6:55 pm
Chodziło mi o logi z seriala ;)
Awatar użytkownika
Xoggo
Posty: 135
Rejestracja: ndz mar 29, 2020 10:03 pm
Lokalizacja: Zbąszynek

ndz kwie 26, 2020 10:22 pm

klew pisze:
ndz kwie 26, 2020 9:57 pm
Chodziło mi o logi z seriala ;)
Przechwytywanie.JPG
Przechwytywanie.JPG (76.64 KiB) Przejrzano 649 razy
Tylko tyle "wypluło" podczas wgrywania.
Awatar użytkownika
klew
Posty: 829
Rejestracja: czw cze 27, 2019 12:16 pm

ndz kwie 26, 2020 10:46 pm

Spróbuj linijki z wywołaniem "willTrigger" przenieść na sam koniec setup() - pod SupldaDevice.begin

Dziwne jest też że masz pomiar odległości "0".
Awatar użytkownika
Xoggo
Posty: 135
Rejestracja: ndz mar 29, 2020 10:03 pm
Lokalizacja: Zbąszynek

pn kwie 27, 2020 4:26 pm

To trzeba być łebski żeby czytając takie krzaki wiedzieć, że wywołanie "willTrigger" trzeba umieścić pod SupldaDevice.begin.
Poza tym dorzuciłem tam też "dystanse". I wszystko to co chciałem działa. :arrow:
Powiem więcej, w poprzedniej bibliotece SuplaDevice sensor i przekaźnik były jeszcze jako fizyczne GPIO.
Tu udało się wdrożyć wirtualnego sensora.
Po za tym sam przykład wdrożenia "zdarzenia" (wewnątrz urządzenia) jest rewelacyjny i prosty zarazem.

Dzięki @klew, jak zwykle dobra robota.
Masz u mnie piwo. 8-)
Awatar użytkownika
klew
Posty: 829
Rejestracja: czw cze 27, 2019 12:16 pm

pn kwie 27, 2020 6:37 pm

Xoggo pisze:
pn kwie 27, 2020 4:26 pm
To trzeba być łebski żeby czytając takie krzaki wiedzieć, że wywołanie "willTrigger" trzeba umieścić pod SupldaDevice.begin.
Poza tym dorzuciłem tam też "dystanse". I wszystko to co chciałem działa. :arrow:
Powiem więcej, w poprzedniej bibliotece SuplaDevice sensor i przekaźnik były jeszcze jako fizyczne GPIO.
Tu udało się wdrożyć wirtualnego sensora.
Po za tym sam przykład wdrożenia "zdarzenia" (wewnątrz urządzenia) jest rewelacyjny i prosty zarazem.

Dzięki @klew, jak zwykle dobra robota.
Masz u mnie piwo. 8-)
Z tym przesunięciem "willTrigger" to był taki trochę strzał w ciemno, bo u mnie ten kod działał. Problem jest najprawdopodobniej w tym, że SuplaDevice.begin wywołuje po kolei metody "onInit" na każdy z elementów (na przekaźniku, na wirtualny czujniku, na HC_SR04 itd). W takiej kolejności jak było w programie, najpierw odpala się sensor odległości i od razu wywołuje przez powiązanie "willTrigger" odpowiednie metody na przekaźniku i wirtualnym czujniku. Niestety klasa przekaźnika i czujnika są jeszcze przed inicjalizacją robioną przez "onInit", stąd może coś się czasami wywalić ;).

Problem rozwiążę tak, aby ta kolejność nie miała znaczenia, ale na razie workaround działa ;).
ODPOWIEDZ