[PORADNIK] Arduino IDE

cino111
Posts: 714
Joined: Mon May 07, 2018 8:00 pm

Post

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.
You do not have the required permissions to view the files attached to this post.
Last edited by cino111 on Wed May 15, 2019 11:39 am, edited 1 time in total.
miko1282
Posts: 538
Joined: Wed Dec 06, 2017 10:15 pm
Location: Brodnica

Post

Świetny poradnik, i jak udało się coś z tymi termometrami zrobić ? :D
cino111
Posts: 714
Joined: Mon May 07, 2018 8:00 pm

Post

miko1282 wrote: Thu Jun 28, 2018 5:55 am Świetny poradnik, i jak udało się coś z tymi termometrami zrobić ? :D
Nie mam na razie kiedy do tego usiąść, ale jak znalazł się ktoś zainteresowany :P to postaram się w weekend to ogarnąć.
Swoją drogą jeżeli masz wolne PINy to możesz każdy termometr podłączyć osobno bez kombinowania.
User avatar
pzygmunt
Posts: 18354
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków

Post

cino111 wrote: Thu Jun 28, 2018 6:09 am
miko1282 wrote: Thu Jun 28, 2018 5:55 am Świetny poradnik, i jak udało się coś z tymi termometrami zrobić ? :D
Nie mam na razie kiedy do tego usiąść, ale jak znalazł się ktoś zainteresowany :P to postaram się w weekend to ogarnąć.
Swoją drogą jeżeli masz wolne PINy to możesz każdy termometr podłączyć osobno bez kombinowania.
Termometry podłączasz wszystkie pod ten sam PIN.
Różnica w kodzie to tylko wybór odpowiedniego urządzenia przy odczycie.
User avatar
Duch__
Posts: 1785
Joined: Wed Aug 24, 2016 7:26 pm
Location: Opole

Post

pzygmunt wrote: Thu Jun 28, 2018 8:29 am Termometry podłączasz wszystkie pod ten sam PIN.
Różnica w kodzie to tylko wybór odpowiedniego urządzenia przy odczycie.
Precyzyjniej mówiąc odczyt dokonujesz na podstawie numeru ID czujnika DS18b20.
Image
User avatar
shimano73
Posts: 1976
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze

Post

Witajcie
Przedstawiam sposób odczytu dwóch czujników DS18b20 na jednym gpio :

Code: Select all



// Setup a oneWire instance
OneWire oneWire(24); //  - Pin number

// Pass oneWire reference to Dallas Temperature
DallasTemperature sensors(&oneWire);

// DS18B20 Sensor read implementation
double get_temperature(int channelNumber, double last_val) {

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

    switch (channelNumber)
    {
      case 0:

        t = sensors.getTempCByIndex(0);
        break;
        
      case 1:

        t = sensors.getTempCByIndex(1);
        break;

    };
  };  
  return t;

}
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
User avatar
shimano73
Posts: 1976
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze

Post

Tym razem odczyt dwóch czujników dht na różnych pinach z projektu na esp

Code: Select all

#define DHT_in_PIN 5
#define DHT_out_PIN 2

#define DHTTYPE DHT22
 
// Setup a DHT instance
DHT dht_in(DHT_in_PIN, DHTTYPE);
DHT dht_out(DHT_out_PIN, DHTTYPE);

void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) {
  switch(channelNumber) {
   case 0: {
    *temp = dht_in.readTemperature();
    *humidity = dht_in.readHumidity();
    Serial.print("Temp wew : ");
    Serial.print(*temp);
   
    Serial.print("   Wilgotność wew : ");
    Serial.println(*humidity);

    if ( isnan(*temp) || isnan(*humidity) ) {
      *temp = -275;
      *humidity = -1;
        }
    break;    
    } //end case 1
   case 1: {     
    *temp = dht_out.readTemperature();
    *humidity = dht_out.readHumidity();
    Serial.print("Temp zew : ");
    Serial.print(*temp);
   
    Serial.print("   Wilgotność zew : ");
    Serial.println(*humidity);
    Serial.println("*******************");

    if ( isnan(*temp) || isnan(*humidity) ) {
      *temp = -275;
      *humidity = -1;
      
    }
    break;
   } //end case 2
  } //switch
} //void


W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
User avatar
slawek
Posts: 2466
Joined: Mon Mar 14, 2016 11:48 pm
Location: Biała Podlaska

Post

Jeszcze konfigurator wifi i przesiadam się na Arduino IDE :)
TEORIA jest wtedy gdy wszystko wiemy i nic nie działa
PRAKTYKA jest wtedy gdy wszystko działa a my nie wiemy dlaczego
My łączymy teorię z praktyką czyli nic nie działa i nikt nie wie dlaczego
cino111
Posts: 714
Joined: Mon May 07, 2018 8:00 pm

Post

Ok. Obiecałem, że w weekend ogarnę czujniki temperatury DS18B20, więc zaczynamy.
W pierwszej kolejności musimy odczytać adresy czujników, żeby odczyty na apce pokazywały się do odpowiedniego kanału. Bez tego temperatura na dworze może się pokazywać przy kanale temperatura wewnętrzna i odwrotnie.
Do odczytania czujnika wykorzystamy gotowy program: Plik -> Przykłady -> OneWire -> DS18x20
W programie przy OneWire ds(10); wprowadzamy GPIO pod który mamy podpięty termometr. Po załadowaniu programu i uruchomieniu portu szeregowego pokazuje nam się adres.
Ja mam np. takie:
Device 0 Address: 28FFBC0AC21701FD
Device 0 Address: 28FF08BFC1170159
Device 0 Address: 28FF3299C11702FB
Device 0 Address: 28FFEA16C21701DE
Odczytany adres wpisujemy w postaci { 0x28, 0xFF, 0xBC, 0xA, 0xC2, 0x17, 0x1, 0xFD };
No to piszemy program:

Code: Select all

/*
Copyright (C) AC SOFTWARE SP. Z O.O.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SuplaDevice.h>

/*
 * This example requires Dallas Temperature Control library installed. 
 * https://github.com/milesburton/Arduino-Temperature-Control-Library
 */

 
// Setup a oneWire instance
OneWire oneWire(24); // 24 - Pin number

// Pass oneWire reference to Dallas Temperature
DallasTemperature sensors(&oneWire);

DeviceAddress piec = { 0x28, 0xFF, 0xBC, 0xA, 0xC2, 0x17, 0x1, 0xFD };       // odczytany adres 28FFBC0AC21701FD  
DeviceAddress bojler = { 0x28, 0xFF, 0x8, 0xBF, 0xC1, 0x17, 0x1, 0x59 };     //Odczytany adres 28FF08BFC1170159 
DeviceAddress temp_wew = { 0x28, 0xFF, 0x32, 0x99, 0xC1, 0x17, 0x2, 0xFB };   // odczytany adres 28FF3299C11702FB
DeviceAddress tempNaDworze = { 0x28, 0xFF, 0xEA, 0x16, 0xC2, 0x17, 0x1, 0xDE };    // odczytany adres 28FFEA16C21701DE


// DS18B20 Sensor read implementation
double get_temperature(int channelNumber, double last_val) {

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

          {
            case 0:
                   
                    t = sensors.getTempC(piec);
                    break;
            case 1:
                    t = sensors.getTempC(bojler);
                    break;
            case 2:
                    t = sensors.getTempC(temp_wew);
                    break;
            case 3:
                    t = sensors.getTempC(tempNaDworze);
                    break;
              
          
             };
      };

    return t;  



}


void setup() {

  Serial.begin(9600);

  // Init DS18B20 library 
  sensors.begin();

  
  
  // Set temperature callback
  SuplaDevice.setTemperatureCallback(&get_temperature);
 
  // Replace the falowing GUID
  char GUID[SUPLA_GUID_SIZE] = {0x2F,0xF9,0xF2,0x22,};
  // with GUID that you can retrieve from https://www.supla.org/arduino/get-guid


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

  /*
   * 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 - Thermometer DS18B20
  SuplaDevice.addDS18B20Thermometer();

  // CHANNEL1 - Thermometer DS18B20
  SuplaDevice.addDS18B20Thermometer();

  // CHANNEL2 - Thermometer DS18B20
  SuplaDevice.addDS18B20Thermometer();

  // CHANNEL3 - Thermometer DS18B20
  SuplaDevice.addDS18B20Thermometer();
  
  
  
  // CHANNEL4 - RELAY
  SuplaDevice.addRelay(44, true);           // 44 - Pin number where the relay is connected      
                                      // Call SuplaDevice.addRelay(44, true) with an extra "true" parameter 
                                      // to enable "port value inversion"
                                      // where HIGH == LOW, and LOW == HIGH   

  // CHANNEL5 - RELAY
  SuplaDevice.addRelay(45, true);           // 45 - Pin number where the relay is connected   

  // CHANNEL6 - RELAY 
  SuplaDevice.addRelay(46, true);           // 46 - Pin number where the relay is connected  

  // CHANNEL7 - Opening sensor (Normal Open)
  SuplaDevice.addSensorNO(A0); // A0 - Pin number where the sensor is connected
                               // Call SuplaDevice.addSensorNO(A0, true) with an extra "true" parameter
                               // to enable the internal pull-up resistor


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


  


  /*
   * SuplaDevice Initialization.
   * Server address, LocationID and LocationPassword are available at https://cloud.supla.org 
   * If you do not have an account, you can create it at https://cloud.supla.org/account/create
   * SUPLA and SUPLA CLOUD are free of charge
   * 
   */

  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    "svr.supla.org",  // SUPLA server address
                    xxxx,                 // Location ID 
                    "xxxx ");               // Location Password
    
}

void loop() {
  SuplaDevice.iterate();
  

}



Program się kompiluje i powinien działać. Można testować, ja na razie nie mam kiedy.
Last edited by cino111 on Mon Jul 02, 2018 12:16 pm, edited 1 time in total.
User avatar
slawek
Posts: 2466
Joined: Mon Mar 14, 2016 11:48 pm
Location: Biała Podlaska

Post

Wyrzuć dane swego serwera... zrobiłem to za ciebie... RODO ;)
TEORIA jest wtedy gdy wszystko wiemy i nic nie działa
PRAKTYKA jest wtedy gdy wszystko działa a my nie wiemy dlaczego
My łączymy teorię z praktyką czyli nic nie działa i nikt nie wie dlaczego

Return to “FAQ / Jak to zrobić”