Czujnik obecności samochodu w garażu z alarmem

User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

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

Code: Select all

#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[] = "[email protected]";

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 ;)
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
Xoggo
Posts: 182
Joined: Sun Mar 29, 2020 10:03 pm
Location: Zbąszynek

Post

Dzięki @klew dzisiaj przetestuję i dam znaka :geek:
User avatar
Xoggo
Posts: 182
Joined: Sun Mar 29, 2020 10:03 pm
Location: Zbąszynek

Post

@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:
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Xoggo wrote: Sun Apr 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
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
Xoggo
Posts: 182
Joined: Sun Mar 29, 2020 10:03 pm
Location: Zbąszynek

Post

Code: Select all

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...
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Xoggo wrote: Sun Apr 26, 2020 6:55 pm
Chodziło mi o logi z seriala ;)
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
Xoggo
Posts: 182
Joined: Sun Mar 29, 2020 10:03 pm
Location: Zbąszynek

Post

klew wrote: Sun Apr 26, 2020 9:57 pm Chodziło mi o logi z seriala ;)
Przechwytywanie.JPG
Tylko tyle "wypluło" podczas wgrywania.
You do not have the required permissions to view the files attached to this post.
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

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".
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
Xoggo
Posts: 182
Joined: Sun Mar 29, 2020 10:03 pm
Location: Zbąszynek

Post

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-)
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Xoggo wrote: Mon Apr 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 ;).
Najlepsze suple dla Twojego domu :mrgreen:

Return to “Projekty użytkowników”