[PORADNIK] Arduino IDE

Patryk
Posty: 774
Rejestracja: pn sty 07, 2019 7:51 pm

wt lis 05, 2019 1:22 pm

lukfud pisze:
wt lis 05, 2019 9:45 am
Witam,

W jaki sposób można "podpiąć" miganie diody w zależności od statusu rejestracji i który kawałek kodu odpowiada za wysyłanie tej informacji na serial? Chciałbym utworzyć własne sekwencje.
Może to Ci pomoże:
viewtopic.php?p=50913#p50913
lukfud
Posty: 217
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

wt lis 05, 2019 2:12 pm

Patryk pisze:
wt lis 05, 2019 1:22 pm
lukfud pisze:
wt lis 05, 2019 9:45 am
Witam,

W jaki sposób można "podpiąć" miganie diody w zależności od statusu rejestracji i który kawałek kodu odpowiada za wysyłanie tej informacji na serial? Chciałbym utworzyć własne sekwencje.
Może to Ci pomoże:
viewtopic.php?p=50913#p50913
Dziękuję, wydaje mi się, że tego szukam:

Kod: Zaznacz cały

void status_func(int status, const char *msg) {     //    --------------- Status ----------------------
 s=status;                                          //    -- to check if we are registered and ready --
}

void setup() { 

SuplaDevice.setStatusFuncImpl(&status_func);    //   ----------------------------- Status -----------------------------
}
Sprawdzę w najbliższym czasie.

EDIT
tak, tego szukałem. raz jeszcze, dzięki @Patryk
Ostatnio zmieniony śr lis 20, 2019 10:05 am przez lukfud, łącznie zmieniany 1 raz.
.newbie
lukfud
Posty: 217
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

czw lis 14, 2019 7:07 pm

Pomóżcie proszę.

Pierwsze naciśnięcie po uruchomieniu modułu nie zmienia stanu (pokazuje jedynie zmianę na serialu), dopiero następne, tak ma być czy czegoś nie wstawiłem?
Jak w tym przypadku zamienić delay() na millis()?

Kod: Zaznacz cały

void press_button() {

  TSD_SuplaChannelNewValue BUTTON_1;
  BUTTON_1.SenderID = 0;
  BUTTON_1.ChannelNumber = 0;
  BUTTON_1.DurationMS = 0;
  
    if(digitalRead(0) == LOW) {
      lock = 1;
      Serial.println(lock);
      delay(200);
    } else if(digitalRead(0) == HIGH && lock == 1) { 
        BUTTON_1.value[0] = !BUTTON_1.value[0];
        SuplaDevice.channelSetValue(&BUTTON_1);
        lock = 0;
        Serial.println(lock);
      }
}
.newbie
Arek.kandula
Posty: 301
Rejestracja: pn gru 24, 2018 8:52 am

sob lis 16, 2019 7:21 pm

cino111 pisze:
wt cze 19, 2018 9:42 pm
Witam.
Poszukując informacji na temat programowania modułów poprzez Arduino IDE (tylko tu są jakieś przykłady, a od podstaw nie napisze programu) przeczesałem chyba całe forum i straciłem ładnych kilka tygodni. Niestety za dużo informacji nie znalazłem. Gotowe softy *.bin są super, lecz przy większym projekcie zawsze czegoś brakuje. Obsługują tylko 2 przekaźniki, albo tylko jeden termometr itd. Coś bardziej rozbudowanego można zrobić na Arduino Mega i NodeMcu, więc żeby zaoszczędzić czas początkującym opisze co już udało mi się osiągnąć i co jeszcze chciałbym zrobić, a może ktoś, jeszcze dopisze parę fajnych funkcjonalności.
Proponuję wrzucać w tym temacie gotowe programy, lub części kodu z wyjaśnieniem, gdyż podpowiedzi na forum typu sprawdź przez putty, lub musisz to czy tamto nic początkującym, którzy nie są programistami nie mówi. Tak naprawdę jest kilka wariantów z których można złożyć program mając podstawową wiedzę nabytą np. z kursu na forbocie https://forbot.pl/blog/kurs-arduino-pod ... rsu-id5290
ja naliczyłem 5:
1.Przekaźnik
2. Rolety
3. diody LED RGBW + Dimmer
4. sensor otwarcia bramy/drzwi
5. czujnik temperatury/wilgotności - DS18B20, DHT22, DHT11, AM2302

Zaczynamy przygodę:
1. pobieramy program Arduino IDE np z https://www.arduino.cc/en/Main/Software?
2. pobieramy bibliotekę ArduinoSuplaDevice z https://www.supla.org/download/ArduinoSuplaDevice.zip
3. zaczytujem bibliotekę w Arduino wchodząc w Szkic->Dołącz bibliotekę->Dodaj biblioteke .ZIP
4. instalujemy dodatkowo potrzebne biblioteki takie jak OneWire, czy DallasTemperature potrzebne do obsługi czujnika temperatury DS18B20, czy DHT sensor library do czujnika DHT11/DHT22 poprzez Szkic->Dołącz bibliotekę->Zarządzaj bibliotekami
5. Jeżeli chcecie programować NodeMCU to wchodzimy w menu Plik -> Preferencje i w zakładce ustawienia w polu Dodatkowe adresy URL do menedzera płytek: wpisujemy https://arduino.esp8266.com/stable/pack ... index.json
6. W menu Narzędzia wybieramy Plytka-> Menedzer płytek i instalujemy "esp8266 by ESP8266 Community" (stabilna wersja to 2.3.0. Na wyższych zawsze miałem jakieś błedy).
7. Wchodzimy jeszcze raz w Narzędzia -> Płytka i zaznaczamy np. Arduino/Genuino Mega or Mega 2560 lub NodeMCU 1.0 Pozostałe parametry powinny same się ustawić
8. warto mieć pod ręką mapę PINów – w zał

Jesteśmy gotowi na pisanie programu.
Na początek można wejść w menu Plik->Przykłady->NIEZGODNY->SuplaDevice i wybieramy jeden z gotowców. Najwygodniej jest właśnie zmodyfikować gotowy przykład. Poniżej mój program. 4 przekaźniki, których działanie ustawiamy w cloudzie np. Relay1 otwiera bramę wjazdową, Relay2 załącza światło na 10 min na posesji, Relay3 załącza światło na noc na ogrodzie, Relay4 w harmonogramie uruchamia pompkę w basenie. Dodatkowo termometr DS18B20 do wizualizacji temperatury na dworze. Za kilka dni dodam więcej termometrów i będę chciał zrobić to na jednym PINie z podaniem adresu każdego czujnika, żeby nie zamieniały mi się nazwami (czujnik w basenie jako temperatura na dworze i odwrotnie) ale możne podam to na końcu posta

Poniżej program na NodeMcu - ma więcej bibliotek. Do gotowego przykładu dodałem
#include <OneWire.h>
oraz
#include <DallasTemperature.h>
do obsługi termometru DS18B20
dodałem też zmienną int button1, żeby można było np otwierać bramę, czy zapalać światło z przycisku
Reszta opisu w samym kodzie.

Kod: Zaznacz cały

/**
 * Supla.org NodeMCU WiFi minimal example
 * Author: Programistyk - Kamil Kaminski <kamil@programistyk.pl>
 * 
 * This example shows how to configure SuplaDevice for building for NodeMCU within Arduino IDE
 */


#include <srpc.h>
#include <log.h>
#include <eh.h>
#include <proto.h>
#include <IEEE754tools.h>
// We define our own ethernet layer
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <lck.h>

#include <WiFiClient.h>
#include <ESP8266WiFiType.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiServer.h>
#include <ESP8266WiFiGeneric.h>
#include <WiFiClientSecure.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiSTA.h>
#include <WiFiUdp.h>

#include <OneWire.h>
#include <DallasTemperature.h>
int button1 = 0; //wartosc początkowa dla przycisku 1

WiFiClient client;

OneWire oneWire(4); //  (D2) - Pin number definiujemyna którym pinie będzie podłączony czujnik DS18B20
DallasTemperature sensors(&oneWire);


// Setup Supla connection
const char* ssid     = "xxxxxxx";
const char* password = "xxxxxxx";



// DS18B20 Sensor read implementation
double get_temperature(int channelNumber, double last_val) { //ta część kodu odpowiada za odczyt temperatury

    double t = -275;
    
    if ( sensors.getDeviceCount() > 0 )
      {
         sensors.requestTemperatures();
         t = sensors.getTempCByIndex(0);
      };

    return t;  
}




void setup() {
  Serial.begin(115200);

  pinMode (16, INPUT_PULLUP); //ustawiamy Pin 16 (D0) na przycisk
   // Init DS18B20 library 
  sensors.begin();
  
    // Set temperature callback
  SuplaDevice.setTemperatureCallback(&get_temperature);
  
  delay(10);

  // Replace the falowing GUID
  char GUID[SUPLA_GUID_SIZE] = {0x26,0x5B,0xB5,0xA3,0x2F,0x}; 
  // pobieramy identyfikator urządzenia ze strony https://www.supla.org/arduino/get-guid i wprowadzamy wiersz wyżej

  // Ethernet MAC address
  uint8_t mac[6] = {0x00, 0x05, 0x04, 0x03, 0x02, 0x01}; // adres mac wpisujemy dowolny

  /*
   * Having your device already registered at cloud.supla.org,
   * you want to change CHANNEL sequence or remove any of them,
   * then you must also remove the device itself from cloud.supla.org.
   * Otherwise you will get "Channel conflict!" error.
   */
    
  // CHANNEL0 - RELAY
  SuplaDevice.addRelay(D5, true);           //definiujemy co chcemy widzieć pod danym kanałem. Tu mamy przekaźnik. true oznacza, ze 
  									//aktywujemy go masą. D5 to GPIO14. mozna wpisywać naprzemiennie

  // CHANNEL1 - RELAY
  SuplaDevice.addRelay(D6, true);            

   // CHANNEL2 - RELAY
  SuplaDevice.addRelay(D7, true);  

   // CHANNEL3 - RELAY
  SuplaDevice.addRelay(D8, true);  

 // CHANNEL4 - Thermometer DS18B20
  SuplaDevice.addDS18B20Thermometer();  //kanał 4 to temomemetr

  
  // CHANNEL - Opening sensor (Normal Open)
  //SuplaDevice.addSensorNO(A0); // A0 - sensor otwarcia drzwi. na razie go nie używam. podłączamy go przez rezystor 10k  
                               // jezeli nie wiesz o czym mowa to zajrzyj tu https://forbot.pl/blog/microswitche-proste-czujniki-przeszkod-id1870


  // CHANNEL5 - Opening sensor (Normal Open)
  //SuplaDevice.addSensorNO(A1); // A1 - Pin number where the sensor is connected




  // CHANNEL6 - DHT22 Sensor // pozostałe możliwe czujniki do wykorzystania 
  // SuplaDevice.addDHT11();
  // SuplaDevice.addAM2302();
  // SuplaDevice.addDHT22();

  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    "svrxxxxx",  // SUPLA server address   // w miejsca xxxx wprowadzamy dane z clouda
                    xxxx,                 // Location ID 
                    "xxxx");               // Location Password

}

void loop() {
  SuplaDevice.iterate();


// ponizej kod umozliwiający włączać i wyłączać przekaźnik 1 z dodatkowego fizycznego przycisku dzwonkowego. W moim przypadku 
// otwieranie/zamykanie bramy

  TSD_SuplaChannelNewValue przycisk1; //ustaw nazwe dla przycisku
  przycisk1.SenderID = 0; // Powiadom clouda, że załączasz recznie. W przypadku siłowników ma być 0
  przycisk1.ChannelNumber = 1; // nr kanału przekaźnika
  przycisk1.DurationMS = 0; //czas wlaczenia

button1 = digitalRead(16); 
if(digitalRead(16)==LOW){ // tu dodajemy jeszcze raz zeby nie pstrykalo samo czyli przerwa i ponowne zapytanie
  delay(100);
if(digitalRead(16)==LOW){   //sprawdzam 2 razy stan na PINie 16 w odstępach 100ms . bez tego było dużo zakłuceń
przycisk1.value[0] = !przycisk1.value[0]; 
SuplaDevice.channelSetValue(&przycisk1);
while(digitalRead(16)==LOW);
delay(20);
}
  
}}

// Supla.org ethernet layer
    int supla_arduino_tcp_read(void *buf, int count) {
        _supla_int_t size = client.available();
       
        if ( size > 0 ) {
            if ( size > count ) size = count;
            return client.read((uint8_t *)buf, size);
        };
    
        return -1;
    };
    
    int supla_arduino_tcp_write(void *buf, int count) {
        return client.write((const uint8_t *)buf, count);
    };
    
    bool supla_arduino_svr_connect(const char *server, int port) {
          return client.connect(server, 2015);
    }
    
    bool supla_arduino_svr_connected(void) {
          return client.connected();
    }
    
    void supla_arduino_svr_disconnect(void) {
         client.stop();
    }
    
    void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {

       // Serial.println("WiFi init");
        WiFi.begin(ssid, password);

        while (WiFi.status() != WL_CONNECTED) {
            delay(500);
        //    Serial.print(".");
        }

        //Serial.print("\nlocalIP: ");
        //Serial.println(WiFi.localIP());
        //Serial.print("subnetMask: ");
        //Serial.println(WiFi.subnetMask());
        //Serial.print("gatewayIP: ");
        //Serial.println(WiFi.gatewayIP());
    }

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
          SuplaDeviceCallbacks cb;
          
          cb.tcp_read = &supla_arduino_tcp_read;
          cb.tcp_write = &supla_arduino_tcp_write;
          cb.eth_setup = &supla_arduino_eth_setup;
          cb.svr_connected = &supla_arduino_svr_connected;
          cb.svr_connect = &supla_arduino_svr_connect;
          cb.svr_disconnect = &supla_arduino_svr_disconnect;
          cb.get_temperature = NULL; //&get_temperature;
          cb.get_temperature_and_humidity = NULL;
          cb.get_rgbw_value = NULL;
          cb.set_rgbw_value = NULL;
          
          return cb;
}

to co jeszcze będę chciał dodać to:
1. kilka termometrów na jednym pinie wg adresu odczytanego z czujnika - chyba wiem jak to zrobić ;)
2. ściemniacz/Dimmer do białych diod - na razie nie wiem czy jest coś takiego, czy muszę jednak wkleić kod z RGBW i wykorzystać tylko W


Zapraszam do dodawania swoich programów.
W miarę rozwoju kodu będę edytował post lub dopisywał kolejne części, ewentualnie całe programy.
Czarna magia te Arduino
Awatar użytkownika
Robert Błaszczak
Posty: 1102
Rejestracja: sob gru 22, 2018 8:55 pm
Lokalizacja: Zielona Góra
Kontaktowanie:

śr lis 20, 2019 9:38 am

Tu masz darmowy kurs: https://forbot.pl/blog/kurs-arduino-pod ... rsu-id5290

Kup sobie najtańszą płytkę Arduino i zacznij się bawić.
Pozdrawiam
Robert Błaszczak

Strona prywatna: https://www.blaszczak.pl
Jakość powietrza: https://robert.aqi.eco
lukfud
Posty: 217
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

śr lis 20, 2019 10:42 am

Ustawiając własną kombinację migania diody "statusu" zauważyłem anomalię migania, kiedy sieć jest podłączona, ale brak połączenia z serwerem. Działanie przycisku też zaczęło szwankować.
Winne są próby ponownego podłączenia do serwera, wstrzymując loop na około 1,5-2s. Na szybko zwiększyłem wait_for_iterate z 2 do 10 sekund w klasie iterate() w pliku suplaDevice.cpp

Kod: Zaznacz cały

if ( !Params.cb.svr_connect(Params.reg_dev.ServerName, 2015) ) {
			
		    	supla_log(LOG_DEBUG, "Connection fail. Server: %s", Params.reg_dev.ServerName);
		    	Params.cb.svr_disconnect();

                wait_for_iterate = millis() + 10000; //default 2000
				return;
}
Doradźcie proszę jak z tego wybrnąć, bo moje rozwiązanie chyba do najlepszych nie należy :|

Kod: Zaznacz cały

void loop() {
  SuplaDevice.iterate();
  ledBlinkStatus();
  press_button();
}
.newbie
Awatar użytkownika
Xoggo
Posty: 106
Rejestracja: ndz mar 29, 2020 10:03 pm
Lokalizacja: Zbąszynek

pn kwie 06, 2020 10:54 pm

cino111 pisze:
śr lut 27, 2019 4:01 pm
Masz tu gotowca dla Arduino .........
Dzięki cino111 za wskazówki. :D
Dzięki Tobie mam już ogarnięte 80% konfiguracji swojego nowego Wemosa D1 mini Pro (przekaźniki i czujniki temperatur - nuda).
Te 20% pozostałych wolnych zasobów, planuje spożytkować (jako deser) na np. licznik energii i czujnik obecności auta. 8-)
miko1282
Posty: 429
Rejestracja: śr gru 06, 2017 10:15 pm
Lokalizacja: Brodnica

śr kwie 15, 2020 8:19 am

Dzień dobry wszystkim, czy pomógł by mi ktoś z kodem w arduino ide ?
Chciałbym napisać kod do CW-01 lecz z przyciskiem bistabilnym (tak wiem mam monostabilny w kodzie, chciałbym taki normalny albo off albo on, sterowany do gnd ), sterowanym z portu gpio 1 albo 3 , urządzenie nie chce mi się połączyć z cludem, fajnie jakby był konfigurator wifi i serwera supli, ale nie jest to jakiś priorytet, korzystając z pierwszego postu zmodziłem takie coś, przekaźniki zostawiłem 3 w razie gdybym kod chciał wgrać gdzieś na inne urządzenie, :lol: kod wgrywa się poprawnie, lecz nie łączy do serwera :(

Kod: Zaznacz cały

/**
 * Supla.org NodeMCU WiFi minimal example
 * Author: Programistyk - Kamil Kaminski <kamil@programistyk.pl>
 * 
 * This example shows how to configure SuplaDevice for building for NodeMCU within Arduino IDE
 */


#include <srpc.h>
#include <log.h>
#include <eh.h>
#include <proto.h>
#include <IEEE754tools.h>
// We define our own ethernet layer
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <lck.h>

#include <WiFiClient.h>
#include <ESP8266WiFiType.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiServer.h>
#include <ESP8266WiFiGeneric.h>
#include <WiFiClientSecure.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiSTA.h>
#include <WiFiUdp.h>

#include <OneWire.h>
#include <DallasTemperature.h>
int button1 = 0; //wartosc początkowa dla przycisku 1

WiFiClient client;

OneWire oneWire(4); //  (D2) - Pin number definiujemyna którym pinie będzie podłączony czujnik DS18B20
DallasTemperature sensors(&oneWire);


// Setup Supla connection
const char* ssid     = "nazwa";
const char* password = "haslo";



// DS18B20 Sensor read implementation
double get_temperature(int channelNumber, double last_val) { //ta część kodu odpowiada za odczyt temperatury

    double t = -275;
    
    if ( sensors.getDeviceCount() > 0 )
      {
         sensors.requestTemperatures();
         t = sensors.getTempCByIndex(0);
      };

    return t;  
}




void setup() {
  Serial.begin(115200);

  pinMode (1, INPUT_PULLUP); //ustawiamy Pin 1 (D10) na przycisk
   // Init DS18B20 library 
  sensors.begin();
  
    // Set temperature callback
  SuplaDevice.setTemperatureCallback(&get_temperature);
  
  delay(10);

  // Replace the falowing GUID
  char GUID[SUPLA_GUID_SIZE] = {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}; 
  // pobieramy identyfikator urządzenia ze strony https://www.supla.org/arduino/get-guid i wprowadzamy wiersz wyżej

  // Ethernet MAC address
  uint8_t mac[6] = {0x00, 0x05, 0x04, 0x03, 0x02, 0x01}; // adres mac wpisujemy dowolny

  /*
   * Having your device already registered at cloud.supla.org,
   * you want to change CHANNEL sequence or remove any of them,
   * then you must also remove the device itself from cloud.supla.org.
   * Otherwise you will get "Channel conflict!" error.
   */
    
//   CHANNEL0 - RELAY
  SuplaDevice.addRelay(12, true);           //definiujemy co chcemy widzieć pod danym kanałem. Tu mamy przekaźnik. true oznacza, ze 
                    //aktywujemy go masą. D5 to GPIO14. mozna wpisywać naprzemiennie

//   CHANNEL1 - RELAY
  SuplaDevice.addRelay(5, true);            

  // CHANNEL2 - RELAY
  SuplaDevice.addRelay(4, true);  

 
  //CHANNEL3 - Thermometer DS18B20
  SuplaDevice.addDS18B20Thermometer();  //kanał 4 to temomemetr

  
  //CHANNEL - Opening sensor (Normal Open)
 //SuplaDevice.addSensorNO(A0); // A0 - sensor otwarcia drzwi. na razie go nie używam. podłączamy go przez rezystor 10k  
                               // jezeli nie wiesz o czym mowa to zajrzyj tu https://forbot.pl/blog/microswitche-proste-czujniki-przeszkod-id1870


//   CHANNEL4 - Opening sensor (Normal Open)
  SuplaDevice.addSensorNO(14); // A1 - Pin number where the sensor is connected




  // CHANNEL5 - DHT22 Sensor // pozostałe możliwe czujniki do wykorzystania 
  // SuplaDevice.addDHT11();
  // SuplaDevice.addAM2302();
  // SuplaDevice.addDHT22();

  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    "svrsupla.org",  // SUPLA server address   // w miejsca xxxx wprowadzamy dane z clouda
                    numerek,                 // Location ID 
                    "pas");               // Location Password

}

void loop() {
  SuplaDevice.iterate();


// ponizej kod umozliwiający włączać i wyłączać przekaźnik 1 z dodatkowego fizycznego przycisku dzwonkowego. W moim przypadku 
// otwieranie/zamykanie bramy

  TSD_SuplaChannelNewValue przycisk1; //ustaw nazwe dla przycisku
  przycisk1.SenderID = 0; // Powiadom clouda, że załączasz recznie. W przypadku siłowników ma być 0
  przycisk1.ChannelNumber = 1; // nr kanału przekaźnika
  przycisk1.DurationMS = 0; //czas wlaczenia

button1 = digitalRead(3); 
if(digitalRead(3)==LOW){ // tu dodajemy jeszcze raz zeby nie pstrykalo samo czyli przerwa i ponowne zapytanie
  delay(100);
if(digitalRead(3)==LOW){   //sprawdzam 2 razy stan na PINie 3 w odstępach 100ms . bez tego było dużo zakłuceń
przycisk1.value[0] = !przycisk1.value[0]; 
SuplaDevice.channelSetValue(&przycisk1);
while(digitalRead(3)==LOW);
delay(20);
}
  
}}

// Supla.org ethernet layer
    int supla_arduino_tcp_read(void *buf, int count) {
        _supla_int_t size = client.available();
       
        if ( size > 0 ) {
            if ( size > count ) size = count;
            return client.read((uint8_t *)buf, size);
        };
    
        return -1;
    };
    
    int supla_arduino_tcp_write(void *buf, int count) {
        return client.write((const uint8_t *)buf, count);
    };
    
    bool supla_arduino_svr_connect(const char *server, int port) {
          return client.connect(server, 2015);
    }
    
    bool supla_arduino_svr_connected(void) {
          return client.connected();
    }
    
    void supla_arduino_svr_disconnect(void) {
         client.stop();
    }
    
    void supla_arduino_eth_setup(uint8_t mac[6], IPAddress *ip) {

       // Serial.println("WiFi init");
        WiFi.begin(ssid, password);

        while (WiFi.status() != WL_CONNECTED) {
            delay(500);
        //    Serial.print(".");
        }

        //Serial.print("\nlocalIP: ");
        //Serial.println(WiFi.localIP());
        //Serial.print("subnetMask: ");
        //Serial.println(WiFi.subnetMask());
        //Serial.print("gatewayIP: ");
        //Serial.println(WiFi.gatewayIP());
    }

SuplaDeviceCallbacks supla_arduino_get_callbacks(void) {
          SuplaDeviceCallbacks cb;
          
          cb.tcp_read = &supla_arduino_tcp_read;
          cb.tcp_write = &supla_arduino_tcp_write;
          cb.eth_setup = &supla_arduino_eth_setup;
          cb.svr_connected = &supla_arduino_svr_connected;
          cb.svr_connect = &supla_arduino_svr_connect;
          cb.svr_disconnect = &supla_arduino_svr_disconnect;
          cb.get_temperature = NULL; //&get_temperature;
          cb.get_temperature_and_humidity = NULL;
          cb.get_rgbw_value = NULL;
          cb.set_rgbw_value = NULL;
          
          return cb;
}
Awatar użytkownika
klew
Posty: 815
Rejestracja: czw cze 27, 2019 12:16 pm

śr kwie 15, 2020 9:50 am

miko1282 pisze:
śr kwie 15, 2020 8:19 am
Dzień dobry wszystkim, czy pomógł by mi ktoś z kodem w arduino ide ?
Chciałbym napisać kod do CW-01 lecz z przyciskiem bistabilnym (tak wiem mam monostabilny w kodzie, chciałbym taki normalny albo off albo on, sterowany do gnd ), sterowanym z portu gpio 1 albo 3 , urządzenie nie chce mi się połączyć z cludem, fajnie jakby był konfigurator wifi i serwera supli, ale nie jest to jakiś priorytet, korzystając z pierwszego postu zmodziłem takie coś, przekaźniki zostawiłem 3 w razie gdybym kod chciał wgrać gdzieś na inne urządzenie, :lol: kod wgrywa się poprawnie, lecz nie łączy do serwera :(
Kod nie działa, bo blokujesz wykonanie pętli w loop(). Proponuję przeskoczyć na nową wersję biblioteki - tam już są przyciski dodane. Pobierz sobie z https://github.com/klew/arduino

Tutaj przykład (pisany "na kolanie" - nie kompilowałem tego)

Kod: Zaznacz cały

#include <SuplaDevice.h>
#include <supla/sensor/DS18B20.h>
#include <supla/sensro/binary.h>
#include <supla/control/relay.h>
#include <supla/control/button.h>
#include <supla/network/esp_wifi.h>

Supla::ESPWifi wifi("your_wifi_ssid", "your_wifi_password");

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] = {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};

//   CHANNEL0 - RELAY  
  Supla::Control::Relay *relayCh0 = new Supla::Control::Relay(12);

//   CHANNEL1 - RELAY
  Supla::Control::Relay *relayCh0 = new Supla::Control::Relay(5);

  // CHANNEL2 - RELAY
  Supla::Control::Relay *relayCh0 = new Supla::Control::Relay(6);

  Supla::Control::Button *button1 = new Supla::Control::Button(3, true, true);
  
  button1->willTrigger(*relayCh0, Supla::Control::Button::ON_PRESS, Supla::Control::Relay::TURN_ON);
  button1->willTrigger(*relayCh0, Supla::Control::Button::ON_RELEASE, Supla::Control::Relay::TURN_OFF);
 
  //CHANNEL3 - Thermometer DS18B20
  new Supla::Sensor::DS18B20(4);

  //   CHANNEL4 - Opening sensor (Normal Open)
 new Supla::Sensor::Binary(14); // jesli pullup jest potrzebny, to trzeba dodać jeszcze parametr: (14, true)

  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    "svrsupla.org",  // SUPLA server address   // w miejsca xxxx wprowadzamy dane z clouda
                    "email@email.com",                 // Location ID 
                    AUTHKEY);               // Location Password

}

void loop() {
  SuplaDevice.iterate();
}
  
Nie ma tutaj żadnego GUI do konfiguracji urządzenia.
Nie wiem też jakie chcesz zachowanie przycisku. Tak jak zrobiłem w przykładzie, będzie włączać przekaźnik, gdy wciśniemy przycisk i wyłączać, gdy wyłączymy przycisk. Natomiast jeśli włączysz przekaźnik z cloud, to włączenie przyciskiem nic nie zrobi, dopiero wyłączenie przyciskiem zmieni stan.
Ewentualnie może bardziej logiczne byłoby wołanie TOGGLE w obu przypadkach zamiast TURN_ON/OFF (możesz podmienić)
I sprawdź GPIO, bo w załączonym przez Ciebie przykładzie był bałagan (np. przekaźnik na tym samym GPIO co termometr).
ODPOWIEDZ