[PODSTAWY] Pomoc przy analizie programu od podstaw - dla zielonych

matrix0606
Posts: 496
Joined: Tue Nov 08, 2022 9:05 pm

Post

Witam szanowne grono.
Zakładam ten temat z nadzieją, że znajdą się dobre duszyczki chcące trochę potłumaczyć użytkownikom początkującym jak ja, by mogli sobie zespolić oprogramowanie, które łączy moduły ESP8266 z serwerem Supla z własnym kodem Arduino. Dzięki uprzejmości kolegi #nebraska dostałem kod na kilka przekaźników, przycisków, czujnik BME, krańcówki itp. za co mu jeszcze raz z góry dziękuję. To otwiera spore jeśli nie ogromne pole do nauki, ale mam szereg pytań jako zielony w temacie. I może właśnie Wy, bardziej ogarnięci macie odrobinę cierpliwości by to wyjaśnić. Poniżej otrzymany kod.

Code: Select all

#include <Arduino.h>
#include <SuplaDevice.h>
#include <supla/control/relay.h>
#include <supla/network/esp_wifi.h>
#include <ESP8266WiFi.h>
#include <supla/uptime.h>
#include <supla/sensor/therm_hygro_meter.h>
#include <supla/sensor/hygro_meter.h>
#include <supla/storage/eeprom.h>
#include <supla/sensor/bme280.h>
#include <supla/sensor/binary.h>
#define STORAGE_OFFSET 100
Supla::Eeprom eeprom(STORAGE_OFFSET);

Supla::Uptime mojeUptime;

const char* host = "svrX.supla.org";
const char* ssid = "XXXXXXXX";
const char* pass = "XXXXXXXX";


Supla::ESPWifi wifi(ssid, pass);

unsigned long times;
//----------------------------------------------------------
//globalne uruchomienie kabnalow SUPLA
auto r1 = new Supla::Control::Relay(12, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.
auto r2 = new Supla::Control::Relay(13, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.
auto r3 = new Supla::Control::Relay(4, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.
auto r4 = new Supla::Control::Relay(5, true); // Jesli chcemy zmienic stan przekażnika załączenie. Stan Niski- false, Stan Wysoki true.

//------------------- Deklaracja czujnika BME280 Supla --------------------------------------------------------------------------------------------------------------

class BME280 : public Supla::Sensor::ThermHygroPressMeter {
  public:
    BME280(int8_t address = 0x76, float altitude = NAN) : address(address), sensorStatus(false), altitude(altitude) {
    }

    double getTemp() {
      float value = TEMPERATURE_NOT_AVAILABLE;
      bool retryDone = false;
      do {
        if (!sensorStatus || isnan(value)) {
          sensorStatus = bme.begin(address);
          retryDone = true;
        }
        value = TEMPERATURE_NOT_AVAILABLE;
        if (sensorStatus) {
          value = bme.readTemperature();
        }
      } while (isnan(value) && !retryDone);
      return value;
    }

    double getHumi() {
      float value = HUMIDITY_NOT_AVAILABLE;
      bool retryDone = false;
      do {
        if (!sensorStatus || isnan(value)) {
          sensorStatus = bme.begin(address);
          retryDone = true;
        }
        value = HUMIDITY_NOT_AVAILABLE;
        if (sensorStatus) {
          value = bme.readHumidity();
        }
      } while (isnan(value) && !retryDone);
      return value;
    }

    double getPressure() {
      float value = PRESSURE_NOT_AVAILABLE;
      bool retryDone = false;
      do {
        if (!sensorStatus || isnan(value)) {
          sensorStatus = bme.begin(address);
          retryDone = true;
        }
        value = PRESSURE_NOT_AVAILABLE;
        if (sensorStatus) {
          value = bme.readPressure() / 100.0;
        }
      } while (isnan(value) && !retryDone);
      if (!isnan(altitude)) {
        value = bme.seaLevelForAltitude(altitude, value);
      }
      return value;
    }

    void onInit() {
      sensorStatus = bme.begin(address);

      pressureChannel.setNewValue(getPressure());
      channel.setNewValue(getTemp(), getHumi());
    }

    void setAltitude(float newAltitude) {
      altitude = newAltitude;
    }

  protected:
    int8_t address;
    bool sensorStatus;
    float altitude;
    Adafruit_BME280 bme;  // I2C
};
BME280*bm;

void setup() {

  Serial.begin(115200);

  // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
  char GUID[SUPLA_GUID_SIZE] = {                                                                           };

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {                                                                            };

  bm = new BME280; // Deklaracja BME280 Supla.
  new Supla::Sensor::Binary(14, true); //kontaktron bramy wjazdowej -brama zamknięta
                                      // false-zalaczenie sensora nastepuje podczas zwarcia (3v3 poprzez 4,7k + D1 ) z GND lub (5V poprzez 10k + D1 ) z GND

  SuplaDevice.begin(GUID,  // Global Unique Identifier
                    host,  // SUPLA server address
                    "YOUR EMAIL",   // Email address used to login to Supla Cloud
                    AUTHKEY);                        // Authorization key

}
void loop() {
  SuplaDevice.iterate(); // Jednorazowe Wywołanie Supli

}
Żeby u mnie w VSC mógł się skompilować, musiałem dodać kilka bibliotek, ale jakoś poszło. Teraz zaczną się pytania, ponieważ przetestować nie mogę z racji, że czekam na NodeMCU bo nie mam w domu.
1.

Code: Select all

Supla::Uptime mojeUptime;
wiadomo że tu występuje NameSpace, klasa i bodajże nazwa klasy czyli mojeUptime, tylko po co to "mojeUptime" skoro nigdzie dalej w kodzie tego nie ma? Do czego to się odnosi?

2.

Code: Select all

if (!sensorStatus || isnan(value))
Przyzwyczajony do pisania w Bascomie i raczkujący w Arduino zawsze najpierw tworzyłem jakąś zmienną i do niej wpisywałem wartość czegoś tam. Czy dobrze rozumiem, że w powyższym warunek sprawdza czy zanegowana wartość zmiennej sensorStatus lub zmienna isnan z wartością value przyjmują wartość TRUE i wówczas spełniony jest warunek i wykonywane to co w warunku? Czyli takie mega skrócenie kodu.

3.

Code: Select all

char GUID[SUPLA_GUID_SIZE] = {};
Co ma na celu powyższy zapis z GUIID oraz AUTHKEY? Czy one są już na stałe przypisane do mnie? Przecież klikając w link za każdym razem otrzymujemy inną wartość.

4.

Code: Select all

void loop()
{
  SuplaDevice.iterate(); // Jednorazowe Wywołanie Supli
}
Czemu tu napisano, że następuje jednorazowe wywołanie Supli skoro ten kod znajduje się w pętli głównej? Przecież to nie będzie wywoływane tylko raz. I czemu mimo, że wszystko znajduje się przed pętlą to i tak przyjmijmy, że działa poprawnie?

5.

Code: Select all

new Supla::Sensor::Binary(14, true); // kontaktron bramy wjazdowej
Jak mam zareagować na działanie kontaktronów i przekaźników? Jak to "przejąć" od Supli?

Jeżeli w poniższym zapisie mam kontaktron na pinie 14 i informacja ta jest przekazywana do Supli to czy mogę równorzędnie napisać w pętli głównej

Code: Select all

bool krancowka = (digitalRead, 14);
bez wpływu na działanie całego programu? Po dodaniu tej linijki do kodu właśnie w pętli głównej, program nie wyrzuca błędu więc wnioskuję, że nawet nie muszę tego pinu deklarować jako wejście bo już jest zadeklarowany.

6.

Code: Select all

auto r1 = new Supla::Control::Relay(12, false);
Jeśli w myśl powyższego, przekaźnik mam na pinie 12, to jak przejąć jego działanie, żeby nie wykonało się to co klikam w aplikacji na smartfonie, ale z własnym warunkiem? Dokładniej, skoro przekaźnik jest na pinie 12 to naciśnięcie rozkazu dla tego przekaźnika w aplikacji na smartfonie wywoła mi od razu reakcję tegoż wyjścia. Jak zrobić by to przejąć, owarunkować i jeśli spełnia moje warunki to dopiero wystawi stan aktywny na ów pin 12.

To dopiero początek pytań.
Vivo V21 5G 8G RAM + 4G SWAP - Funtouch OS 12 Global
MOBO - MSI B350 Tomahawk || GPU - XFX Radeon RX 6600 Speedster
CPU - Ryzen5 1400 3,2G || PSU - SPC Vero | L2 500W 80 Plus Bronze
RAM - HyperX 2x8GB 3200MHz CL16 Predator RGB
User avatar
klew
Posts: 13911
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 136 times
Been thanked: 137 times

Post

matrix0606 wrote: Fri May 05, 2023 9:27 am 1.

Code: Select all

Supla::Uptime mojeUptime;
wiadomo że tu występuje NameSpace, klasa i bodajże nazwa klasy czyli mojeUptime, tylko po co to "mojeUptime" skoro nigdzie dalej w kodzie tego nie ma? Do czego to się odnosi?
Nie jest to tutaj do niczego potrzebne. Możesz usunąć. Klasa SuplaDevice sama sobie tworzy instancję "uptime". Ktoś pewnie kiedyś w tym kodzie używał wartości pobrane z uptime do czegoś, a potem to tak zostało gdzieś pomiędzy kopiuj-wklej :P
matrix0606 wrote: Fri May 05, 2023 9:27 am 2.

Code: Select all

if (!sensorStatus || isnan(value))
Przyzwyczajony do pisania w Bascomie i raczkujący w Arduino zawsze najpierw tworzyłem jakąś zmienną i do niej wpisywałem wartość czegoś tam. Czy dobrze rozumiem, że w powyższym warunek sprawdza czy zanegowana wartość zmiennej sensorStatus lub zmienna isnan z wartością value przyjmują wartość TRUE i wówczas spełniony jest warunek i wykonywane to co w warunku? Czyli takie mega skrócenie kodu.
"W Arduino" - to nie "Arduino" tylko C++.
sensorStatus to zmienna należąca do klasy "BME". Każda metoda tej klasy może używać zmiennej zadeklarowanej w klasie.
isnan() to metoda, a nie zmienna. isnan() zwraca czy zmienna typu float/double podana w argumentcie jest "NaN" (not-a-number) (np. w wyniku dzielenia przez zero, albo jawnego przypisanani NAN do zmiennej). Biblioteka od BME używa wartości NaN, aby zgłosić problem z odczytem.
BTW. ta klasa BME w tym kodzie nie jest potrzebna. W supla-device jest już od dawna wsparcie dla BME280 i możesz użyć klasy z biblioteki, zamiast ją pisać (wklejać) od nowa.
matrix0606 wrote: Fri May 05, 2023 9:27 am 3.

Code: Select all

char GUID[SUPLA_GUID_SIZE] = {};
Co ma na celu powyższy zapis z GUIID oraz AUTHKEY? Czy one są już na stałe przypisane do mnie? Przecież klikając w link za każdym razem otrzymujemy inną wartość.
GUID i AUTHKEY to dwa parametry, po których urządzenie jest identyfikowane w serwerze Supli. Każde urządzenie powinno mieć unikalny GUID oraz AUTHKEY.
Jeśli używasz jawnej deklaracji GUID i AUTHKEY to, aby wgrać ten sam program na dwa urządzenia, musisz wygenerować GUID i AUTHKEY osobno dla obu urządzeń i osobno przekompilować źródła.
W bibliotece jest przykład "WebInterface", który temat GUID i AUTHKEY ogarnia samodzielnie i nie trzeba tego ręcznie wprowadzać (podobnie jak dane do Wi-Fi i logowania do serwera).
matrix0606 wrote: Fri May 05, 2023 9:27 am 4.

Code: Select all

void loop()
{
  SuplaDevice.iterate(); // Jednorazowe Wywołanie Supli
}
Czemu tu napisano, że następuje jednorazowe wywołanie Supli skoro ten kod znajduje się w pętli głównej? Przecież to nie będzie wywoływane tylko raz. I czemu mimo, że wszystko znajduje się przed pętlą to i tak przyjmijmy, że działa poprawnie?
To wykonuje sie wielokrotnie. Metoda loop() jest odpalana w nieskończonej pętli.
Także ktoś źle napisał komentarz.
Nie rozumiem reszty pytania.
matrix0606 wrote: Fri May 05, 2023 9:27 am 5.

Code: Select all

new Supla::Sensor::Binary(14, true); // kontaktron bramy wjazdowej
Jak mam zareagować na działanie kontaktronów i przekaźników? Jak to "przejąć" od Supli?

Jeżeli w poniższym zapisie mam kontaktron na pinie 14 i informacja ta jest przekazywana do Supli to czy mogę równorzędnie napisać w pętli głównej

Code: Select all

bool krancowka = (digitalRead, 14);
bez wpływu na działanie całego programu? Po dodaniu tej linijki do kodu właśnie w pętli głównej, program nie wyrzuca błędu więc wnioskuję, że nawet nie muszę tego pinu deklarować jako wejście bo już jest zadeklarowany.
Możesz użyć bezpośrednio digitalRead(14), ale nie jest to "eleganckie" rozwiązanie. W ogólności taki sensor binarny można ustawić np. na ekspanderze GPIO, albo może mieć dowolne inne źródło "stanu". Do tego akurat digitalRead jest niegroźne i nie zaburzy pracy programu, ale już swobodne użycie digitalWrite może namieszać.
Jeśli chcesz odczytać stan ze sprzętu, to możesz użyć:

Code: Select all

// gdzieś przed setup()
Supla::Sensor::Binary *mojKontaktron = nullptr;

// w setup()
mojKontaktron = new Supla::Sensor::Binary(14, true);

// w loop() albo w setup() ale po wykonaniu SuplaDevice.begin()
bool wartosc = mojKontaktron->getValue();
Alternatywnie możesz odczytać "stan sensora" używając:

Code: Select all

// w loop() albo w setup() ale po wykonaniu SuplaDevice.begin()
bool wartosc = mojKontaktron->getChannel()->getValueBool();
Ten drugi wariant, odczyta ostatnio ustawiony stan sensora w pamięci, bez sprwadzania GPIO.
matrix0606 wrote: Fri May 05, 2023 9:27 am 6.

Code: Select all

auto r1 = new Supla::Control::Relay(12, false);
Jeśli w myśl powyższego, przekaźnik mam na pinie 12, to jak przejąć jego działanie, żeby nie wykonało się to co klikam w aplikacji na smartfonie, ale z własnym warunkiem? Dokładniej, skoro przekaźnik jest na pinie 12 to naciśnięcie rozkazu dla tego przekaźnika w aplikacji na smartfonie wywoła mi od razu reakcję tegoż wyjścia. Jak zrobić by to przejąć, owarunkować i jeśli spełnia moje warunki to dopiero wystawi stan aktywny na ów pin 12.
Należy zrobić własną implementację klasy, która dziedziczy po Relay i nadpisać metodę turnOn() (o ile mnie pamięć nie myli).
Natomiast Twoje pytania są na bardzo podstawowym poziomie, więc temat klas i dziedziczenia jednak bym zostawił na kiedy indziej.
Napisz może co tam chesz zrobić, to może znajdziemy łatwiejsze obejście tego problemu.
matrix0606 wrote: Fri May 05, 2023 9:27 am To dopiero początek pytań.
Nie strasz :P
Najlepsze suple dla Twojego domu :mrgreen:
matrix0606
Posts: 496
Joined: Tue Nov 08, 2022 9:05 pm

Post

klew wrote: Fri May 05, 2023 10:29 am(...) Twoje pytania są na bardzo podstawowym poziomie, więc temat klas i dziedziczenia jednak bym zostawił na kiedy indziej.
Jak pisałem w temacie i w treści posta. Zaczynałem od basica na Commodore C64, później łatwo było z Bascomem bo to taki ulepszony basic. Chciałem nauczyć się czegoś bardziej pro. Wiele osób mówiło że C dla up jest pro, ale mimo kilkukrotnego podejścia do czystego C nie jestem w stanie go zrozumieć. Nawet napisanie prostego migania diodą w C graniczy u mnie z cudem.
Więc zainteresowałem się Arduino. Potrafię z niego korzystać, implementować biblioteki i pisać własne warunki, ich wykonywanie i realizację zamierzonych celów. Do tej pory w Arduino (tak wiem - C++) nie stanęło mi na drodze nic na tyle poważnego, bym nie dał sobie z tym rady, ale już jak sam zauważyłeś, temat klas i dziedziczenia to dla mnie raczej wyższa szkoła jazdy więc jak sugerujesz, zostawiam na kiedy indziej.
klew wrote: Fri May 05, 2023 10:29 am
matrix0606 wrote: Fri May 05, 2023 9:27 am To dopiero początek pytań.
Nie strasz :P
Nie straszę. Jak pisałem, jestem raczkujący więc będziecie mieli ze mną wiele problemów, ale jeśli znajdzie się cierpliwy nauczyciel(e), to będziecie mieli satysfakcję, że nauczyliście nooba czegoś nowego.
klew wrote: Fri May 05, 2023 10:29 am Napisz może co tam chesz zrobić, to może znajdziemy łatwiejsze obejście tego problemu.
Dla mnie w Supli najważniejsze jest to by oprócz tego że oprogramowanie (GG) dajmy na to z Wemosa czy z NodeMCU dane do serwera Supli wysyła, to dodatkowo albo chciałbym móc te dane przynajmniej odebrać i zareagować na poziomie tego NodeMCU, by móc uruchomić lokalne urządzenia wykonawcze, albo przechwycić i sam zdecydować jaki ma być wynik i to drugie rozwiązanie pasuje mi bardziej.
Jednym słowem chciałbym się nauczyć wgrać taki kod do dajmy na to tego NodeMCU by to ESP zostało przyjęte do rodziny Supli czyli widoczne na moim serwerze Supli, a jednocześnie móc do tego ESP wpisać własne dyrektywy, polecenia czy warunki by to co wrzucę na stworzoną przez siebie płytkę mogło reagować na polecenia z aplikacji smartfonowej.
Przerzucając to na schemat blokowy albo na funkcje widzę to tak:

Code: Select all

#include  //moje lub raczej niezbędne biblioteki
void setup(){
//moje wszelkie ustawienia + ustawienia dla Supli by wejść na jej serwer
}
void loop(){
//wszelkie moje zabawy z kodem do wykonania + ewentualne potrzebne dla Supli
}

void FunkcjaSuplaConnect(){
//wszystko co potrzebne mi do połączenia się z serwerem Supla
}
To co powyżej to takie mocno uproszczone.
Spodziewałem się że cały kod można podzielić na bloki jak wykonywanie funckji. Jest funkcja która mnie z czymś łączy (tu z serwerem Supla), inna która sprawdza mi np. stan wejść, i kolejna która reaguje na to co odczytałem z wszelkich wejść i szyn danych.

A upraszczając jeszcze bardziej. Przyjmijmy, że mamy to "nieszczęsne" otwieranie bramy za pomocą aplikacji ze smartfona.
Jeśli ja kliknę w aplikacji smartfonowej "OTWÓRZ" to chciałbym móc "przechwycić" to polecenie by sam zdecydować co ma się z nim stać, może dodać do niego warunek i dopiero wykonać, albo nie wykonać wcale, albo wykonać od razu.
Tak to działa jeśli na płytkę oprócz Wemosa z wgranym GG dorzucę Arduino. Jeśli z wemosa wyjście przekaźnika otwierającego bramę połącze z wejściem Arduino to jestem w stanie ten rozkaz przechwycić, "przekonwertować" i sam zdecydować co ma się z nim stać.

Ja mogę sobie poradzić z tym na dwa sposoby.
1. Uda mi się zrozumieć co mi tłumaczycie a wy będziecie mieli duuuużo cierpliwości - bardziej eleganckie pod kątem budowy zaprojektowanej płytki ponieważ wykorzystuję tylko jeden moduł z ESP8266 na pokładzie nie dorzucając Arduino.
2. Zapominamy o tym co napsisałem a ja wrzucam na zaprojektowaną płytkę wemosa do którego wrzucę sobie GG i dorzucam Arduino (powiedzmy Nano), gdzie napiszę sobie co będę chciał a ono mi wykona to co założyłem - wersja mniej elegancka bo wykorzystuje 2 moduły ale Was nie obarcza z Waszego punktu widzenia podstawowymi pytaniami.
Last edited by matrix0606 on Fri May 05, 2023 12:54 pm, edited 1 time in total.
Vivo V21 5G 8G RAM + 4G SWAP - Funtouch OS 12 Global
MOBO - MSI B350 Tomahawk || GPU - XFX Radeon RX 6600 Speedster
CPU - Ryzen5 1400 3,2G || PSU - SPC Vero | L2 500W 80 Plus Bronze
RAM - HyperX 2x8GB 3200MHz CL16 Predator RGB
User avatar
klew
Posts: 13911
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 136 times
Been thanked: 137 times

Post

Większość rzeczy programuje się na Arduino Mega/Nano, czy na ESP8266, ESP32 itd. w prawie identyczny sposób.
Są oczywiste różnice i ograniczenia (jak ilość pamięci RAM, dostępnie GPIO/piny itd).

Programowanie w Arduino większość ludzi robi bardziej w stylu C niż C++, a z racji małej ilości dostępnej pamięci i ograniczonej implemnetacji narzędzie w bibliotekach standardowych, często nawet ten C++ jest bardziej w stylu C :). Operacje na wskaźnikach, bezpośrednie zarządzanie pamięcią, to chleb powszedni, czy to na płytkach Arduino czy ESP.
Samo ESP ma nawet bogatszy zestaw standardowych bibliotek C++ - chociażby array, map itd. tam działa, a na Arduino nie.

Wracając do Twojego posta:
1. w setup robi się inicjalizację i ustawia wszystko
2. w loop są rzeczy, które odpalają się wielkrotnie

To takie luźne rozróżnienie, bo kod można zorganizować w dowolny sposób. Można sobie wyobrazić, że Arduino IDE (jako środowisko programistyczne, a nie jako płytka) ma gdzieś zaszyty taki kod:

Code: Select all

int main() { 
 setup();
 while (1) loop();
}
Sama Supla w metodzie SuplaDevice.iterate() nawiązuje połączenie z Wi-Fi, serwerem, oraz nimi zarządza (resetuje, ustawia od nowa itd.)

Polecam też przeczytać: https://github.com/SUPLA/supla-device#readme
Najlepsze suple dla Twojego domu :mrgreen:
matrix0606
Posts: 496
Joined: Tue Nov 08, 2022 9:05 pm

Post

Żeby było jeszcze łatwiej zrozumieć co staram się przekazać to podam fragment kodu z mojego programu w Arduino

Code: Select all

  boolean WejscieBzWemosa = digitalRead(OpenBwemos); // wejście arduino nano połączone z wyjściem z wemos d1 mini
  boolean WejscieB = digitalRead(OpenBin);           //odczyt sygnału aplikacji Supla na smartfonie
  if (WejscieBzWemosa == 0)					//jeśli odbiorę rządanie otwarcia bramy z wemosa wydane prze aplikację Supla na smartfonie to:
  {
    digitalWrite(OpenBout, 1);					//przekazuję to do przekaźnika wyjściowego, który reaguje z automatyką do bramy 
  }
  else
  {
    digitalWrite(OpenBout, 0);					//albo nie raguję wcale
  }
Ale wystarczyło by napisać:

Code: Select all

  boolean WejscieBzWemosa = digitalRead(OpenBwemos); // wejście arduino nano połączone z wyjściem z wemos d1 mini
  boolean WejscieB = digitalRead(OpenBin);           //odczyt sygnału aplikacji Supla na smartfonie
  if (WejscieBzWemosa == 0)					//jeśli odbiorę rządanie otwarcia bramy z wemosa wydane prze aplikację Supla na smartfonie to:
  {
    digitalWrite(OpenBout, 1);					//przekazuję to do przekaźnika wyjściowego, który reaguje z automatyką do bramy 
    digitalWrite(Lampa1, 1);						//włączam lampę
    digitalWrite(LampaSygnalizacyjna, 1)			//włączam też lampę sygnalizacyjną
  }
  else
  {
    digitalWrite(OpenBout, 0);					//albo nie raguję wcale
  }
I o to michodzi. By na konkretny sygnał z aplikacji smartfonowej Supa samemu decydować co się wydarzy.
Vivo V21 5G 8G RAM + 4G SWAP - Funtouch OS 12 Global
MOBO - MSI B350 Tomahawk || GPU - XFX Radeon RX 6600 Speedster
CPU - Ryzen5 1400 3,2G || PSU - SPC Vero | L2 500W 80 Plus Bronze
RAM - HyperX 2x8GB 3200MHz CL16 Predator RGB
User avatar
SOYER
Posts: 1623
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry
Been thanked: 2 times

Post

Odnosząc się do ostatniego postu matrix. Nie bardzo rozumiem dlaczego pisałeś tak jak w pierwszym przykładzie skoro chciałeś jak w drugim. Co stało na przeszkodzie?
https://youtube.com/@tomaszhamer8134?si=_J1cT_QWsXxgt1Fm
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
https://github.com/Soyer79
User avatar
klew
Posts: 13911
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 136 times
Been thanked: 137 times

Post

Bez problemu taką prostą logikę można robić na gotowych mechanizmach z supla-device - w większości wystarczy użyć addAction w odpowiedni sposób.

Czy nie wolałabyś mieć tych 3 wyjść widocznych osobno w aplikacji na telefonie?
Najlepsze suple dla Twojego domu :mrgreen:
matrix0606
Posts: 496
Joined: Tue Nov 08, 2022 9:05 pm

Post

SOYER wrote: Fri May 05, 2023 3:17 pm Odnosząc się do ostatniego postu matrix. Nie bardzo rozumiem dlaczego pisałeś tak jak w pierwszym przykładzie skoro chciałeś jak w drugim. Co stało na przeszkodzie?
To był tylko przykład.
Chodzi o to, że wprost z aplikacji smartfonowej Supla nie mogę wykonać z dodatkowymi warunkami typu czy widno, czy ciemno, określony czas itp. tego co na drugim przykładzie, pisząc wprost na arduino.
Kurza melodia. Stwórzmy jakiś kanał na discordzie do pogaduszek bo pisząć strasznie ciężko to wyjaśnić.
klew wrote: Fri May 05, 2023 3:21 pm Bez problemu taką prostą logikę można robić na gotowych mechanizmach z supla-device - w większości wystarczy użyć addAction w odpowiedni sposób.
Tylko nie wiem czy da się to dodatkowo owarunkować jak napisałem wyżej.
Weźmy pod uwagę mój projekt gdzie mamy wemosa i ardu na jednej płytce sprzęgnięte razem.
Jeżeli kliknę "OTWÓRZ BRAMĘ" to pisząc to w ardu mogę dodatkowo to owarunkować lub dodać cokolwiek, np. jeśli zażądano otwarcia bramy a dodatkowo jest ciemno, to mogę włączyć lampę na określony czas. Bez ardu, w samej Supli tak się da?
Albo np. jeśli zażądano otwarcia bramy, ale ktoś naruszył krańcówkę bezpieczeństwa która jest zainstalowana w skrzynce automatyki, czyli najzwyczajniej otworzył skrzynkę automatyki, to sprzęgając ardu z wemosem mogę wyłączyć wszystko, łącznie z zasilaniem czegokolwiek. W samym GG czyli tylko z apki Supla tak się da?
klew wrote: Fri May 05, 2023 3:21 pmCzy nie wolałabyś mieć tych 3 wyjść widocznych osobno w aplikacji na telefonie?
I tak i nie. Chciałbym mieć możliwość włączenia tak jak piszesz, czyli z osobna, ale wolałbym też by działało to w automatyce jak opisałem wyżej.
Vivo V21 5G 8G RAM + 4G SWAP - Funtouch OS 12 Global
MOBO - MSI B350 Tomahawk || GPU - XFX Radeon RX 6600 Speedster
CPU - Ryzen5 1400 3,2G || PSU - SPC Vero | L2 500W 80 Plus Bronze
RAM - HyperX 2x8GB 3200MHz CL16 Predator RGB
User avatar
SOYER
Posts: 1623
Joined: Wed Aug 10, 2022 12:29 pm
Location: Kryry
Been thanked: 2 times

Post

matrix, niestety dalej mam wrażenie, że dalej nie rozumiesz , że to wszystko co masz na arduino nano, to wpisujesz do tego Twojego wemosa, dodatkowo kod obsługujący suplę i działa na jednym urządzeniu. Tak po prostu!
Możesz wpisywać te digitalRead i inne tak jak piszesz na nano i będzie działać.
Owszem potem możesz to jeszcze uprościć jak pisał klew i korzystać z odczytów bibliotek supli, ale na początek możesz np.:
- do supli wstawić kod obsługujący ds18 i niech sobie wysyła do aplikacji, a Ty dodatkowo sam czytasz te czujniki i robisz z odczytami co chcesz,
- aplikacją sterujesz przekaźnikami, ale sam możesz czytać stan tych przekaźników przez digitalRead odpowiedniego pinu i robić tym co zechcesz, będzie działać,
- itd.
https://youtube.com/@tomaszhamer8134?si=_J1cT_QWsXxgt1Fm
https://kryry01.aqi.eco/pl
https://app.weathercloud.net/d4311785603
https://github.com/Soyer79
matrix0606
Posts: 496
Joined: Tue Nov 08, 2022 9:05 pm

Post

SOYER wrote: Fri May 05, 2023 7:08 pm matrix, niestety dalej mam wrażenie, że dalej nie rozumiesz , że to wszystko co masz na arduino nano, to wpisujesz do tego Twojego wemosa, dodatkowo kod obsługujący suplę i działa na jednym urządzeniu. Tak po prostu!
Możesz wpisywać te digitalRead i inne tak jak piszesz na nano i będzie działać.
Owszem potem możesz to jeszcze uprościć jak pisał klew i korzystać z odczytów bibliotek supli, ale na początek możesz np.:
- do supli wstawić kod obsługujący ds18 i niech sobie wysyła do aplikacji, a Ty dodatkowo sam czytasz te czujniki i robisz z odczytami co chcesz,
- aplikacją sterujesz przekaźnikami, ale sam możesz czytać stan tych przekaźników przez digitalRead odpowiedniego pinu i robić tym co zechcesz, będzie działać,
- itd.
Ale ja to wszystko rozumiem tylko odnoszę wrażenie, że ja nie jestem rozumiany. Może źle tłumaczę?
To jeszcze z innej beczki.
Jak na tym śmiesznym obrazku. Jest Wemos z wgranym GG plus powiedzmy, że nauczyłem się wstawiać swoje wstawki. Do wemosa do pinu D5 podłączony przekaźnik jak na śmiesznym obrazku.
Z apki na fonie wydaję rozkaz otwarcia bramy, który to rozkaz ląduje na pinie D5 Wemosa i w myśl tego podłączenia od razu otwiera mi bramę. Ale ja nie chcę by na przykład od razu otworzył bramę. Chcę by najpierw jeśli spełniony warunek, że ciemno to żeby zapalił lampę, odczytał temperaturę i wilgotność i jeśli temperatura mi odpowiada a wilgotność jest w założonym przedziale to dopiero żeby otworzył bramę. I jak to ma zrobić skoro przekaźnik który zwiera styki otwarcia bramy w centrali od automatyki działa bezpośrednio z wyjścia D5 Wemosa i już dostał rozkaz otwarcia bramy?
Oczywiście powyżej nawymyślałem zdrowo, ale chcę pokazać o co mi chodzi.
Chodzi mi o to, że ja chcę przejąć ten rozkaz i sam zdecydować co z nim chcę zrobić.
You do not have the required permissions to view the files attached to this post.
Vivo V21 5G 8G RAM + 4G SWAP - Funtouch OS 12 Global
MOBO - MSI B350 Tomahawk || GPU - XFX Radeon RX 6600 Speedster
CPU - Ryzen5 1400 3,2G || PSU - SPC Vero | L2 500W 80 Plus Bronze
RAM - HyperX 2x8GB 3200MHz CL16 Predator RGB

Return to “Pomoc”