[PORADNIK] Arduino IDE

Patryk
Posts: 549
Joined: Mon Jan 07, 2019 7:51 pm

Tue Nov 05, 2019 1:22 pm

lukfud wrote:
Tue Nov 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
Posts: 56
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Tue Nov 05, 2019 2:12 pm

Patryk wrote:
Tue Nov 05, 2019 1:22 pm
lukfud wrote:
Tue Nov 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:

Code: Select all

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
Last edited by lukfud on Wed Nov 20, 2019 10:05 am, edited 1 time in total.
.newbie
lukfud
Posts: 56
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Thu Nov 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()?

Code: Select all

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
Posts: 286
Joined: Mon Dec 24, 2018 8:52 am

Sat Nov 16, 2019 7:21 pm

cino111 wrote:
Tue Jun 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.

Code: Select all

/**
 * 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
User avatar
Robert Błaszczak
Posts: 573
Joined: Sat Dec 22, 2018 8:55 pm
Location: Zielona Góra
Contact:

Wed Nov 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
https://www.blaszczak.pl
lukfud
Posts: 56
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Wed Nov 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

Code: Select all

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 :|

Code: Select all

void loop() {
  SuplaDevice.iterate();
  ledBlinkStatus();
  press_button();
}
.newbie
Post Reply