Odczyt danych temperatury z DHT11 w Ardurino IDE

xzihen
Posty: 17
Rejestracja: sob lis 23, 2019 2:21 pm
Lokalizacja: Łódź

czw maja 21, 2020 8:52 pm

Witajcie, staram się w oparciu o poradnik kolegi @cino111 o programowaniu modułów w Ardurino IDE z biblioteką SuplaDevice dokonać odczytów temperatury z czujnika DHT11, niestety nie wychodzi mi to od dłuższego czasu, czy ktoś tutaj był by mi w stanie pomóc i wyjaśnić dlaczego nie idze... :? Daje poniżej moje "wypociny", dodam również, że z moja przygoda z ardurino nie jest długa, ale liczę na pomoc :)

Staram się dokonać odczytu na płytce Wemos D1 mini. W cloud supla dostaje odczyty -1°C oraz -1% wilgotności, której nawet nie dodałem do kodu.. Do odczytu danych z DHT używam biblioteki DHT.h w wersji 1.3.2, ponieważ z innymi miałem problemy.

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 <DHT.h>

int button1 = 0; //wartosc początkowa dla przycisku 1

WiFiClient client;

#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);


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



// DHT11 odczytywanie wartosci
double get_temperature(int channelNumber, double last_val) { //ta część kodu odpowiada za odczyt temperatury

  // Read temperature as Celsius (the default)
  double t = dht.readTemperature();


    if (isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    
    return t;
  }
  Serial.println(t);
}
  




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

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


  // Replace the falowing GUID
  char GUID[SUPLA_GUID_SIZE] = {0x51,0xAE,0xAA,0x11,0xF0,0x8D,0x86,0xC5,0x77,0x07,0xAF,0x60,0xF5,0x98,0xBB,0xD0}; 
  // 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 dht11
  SuplaDevice.addDHT11();;  //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
                    "svr14.supla.org",  // SUPLA server address   // w miejsca xxxx wprowadzamy dane z clouda
                    ,                 // Location ID 
                    "");               // 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;
}
Pozdrawiam
Awatar użytkownika
klew
Posty: 815
Rejestracja: czw cze 27, 2019 12:16 pm

czw maja 21, 2020 10:15 pm

Spróbuj może na nowej wersji biblioteki ( https://github.com/klew/arduino )
Tam jest przykład z dwoma DHT22 - wystarczy kilka drobnych zmian aby uruchomić jeden DHT11
https://github.com/klew/arduino/blob/ma ... la_DHT.ino
piomar2
Posty: 348
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

pt maja 22, 2020 5:25 am

Witaj.

Przed chwilą sprawdziłem i wysyłam Tobie podstawowy kod do DHT11 wraz z potrzebnymi bibliotekami. Jak widać na fotce wszystko działa bez zarzutu. Wgraj sobie i musi Ci to ruszyć. Jeżeli nie, to Masz coś nie tak ze sprzętem. Jak będzie ok to dopiero dodawaj kolejne urządzenia (przyciski itp.). Życzę powodzenia i ...zaciętości a będą efekty. Pozdrawiam.
dht.jpg
dht.jpg (115.63 KiB) Przejrzano 116 razy

Kod: Zaznacz cały

//arduino 1.8.3, wemos mini
//DHT11 na pinie D1


#include <srpc.h>
#include <log.h>
#include <eh.h>
#include <IEEE754tools.h>
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <lck.h>

#include <WiFiClient.h>
#include <ESP8266WiFi.h>
#include <WiFiServer.h>

#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#include <DHT.h>
#define DHTPIN 5 //pin pod którym jest nasz czujnik DHT11
#define DHTTYPE DHT11
 DHT dht(DHTPIN, DHTTYPE);

WiFiClient client;

const char* ssid     = "xxxx";
const char* password = "xxxx";

//----------------- DHT11 ---------------------------------------
void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) { 
    *temp = dht.readTemperature();
    *humidity = dht.readHumidity();
    if ( isnan(*temp) || isnan(*humidity) ) {
      *temp = -275;
      *humidity = -1;
    }
}
//--------------------------------------------------------
void setup() {
  
  Serial.begin(115200);

  dht.begin();
  delay(10);
  SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
  
 // with GUID that you can retrieve from https://www.supla.org/arduino/get-guid

  // Replace the falowing GUID
 char GUID[SUPLA_GUID_SIZE] = {0xC9,0x76,0x11,0x90,0xDF,0xF7,0x20,0xAF,0x8B,0x55,0x6F,0xA3,0x83,0x5B,0xF4,0x2E};

  // Ethernet MAC address
  uint8_t mac[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  
  // CHANNEL0 - DHT11 
  SuplaDevice.addDHT22();


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

//--------------------------------------------------------
void loop() {
      
  SuplaDevice.iterate();
  
}
//-------------------------------------------------------- 
// 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) {

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
            delay(500);
  }
}

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;
  cb.get_temperature_and_humidity = &get_temperature_and_humidity; 
  cb.get_rgbw_value = NULL;
  cb.set_rgbw_value = NULL;

  return cb;
}
  
Załączniki
Biblie.zip
(66.29 KiB) Pobrany 3 razy
xzihen
Posty: 17
Rejestracja: sob lis 23, 2019 2:21 pm
Lokalizacja: Łódź

pt maja 22, 2020 8:07 am

Bardzo ci dziękuję @piomar2! Bardzo mi pomogłeś, kod się ładnie skompilował i dobrze komunikuje się z suplą, widzę, że całkowicie pogubiłem się w tym co napisałem....

Teraz będę starał się dodawać do tego kodu po kolej, funkcje, które mnie interesują.

Pozdrawiam :D
Pozdrawiam
xzihen
Posty: 17
Rejestracja: sob lis 23, 2019 2:21 pm
Lokalizacja: Łódź

pt maja 22, 2020 8:39 am

Prosiłbym jeszcze o jakieś nakierunkowanie do rozwiązań do zagadnień, które chcę u siebie rozwiązać:
- 2x włącznik świateł, dwa przekaźniki + możliwość sterowania nimi fizycznie z przełączników na ścianie bistabilnych(tych zwykłych, nie dzwonkowych),
- czujnik otwarcia drzwi NO,

I teraz proszę o wskazówki, dodanie relay1 dla jednego źródła światła wykonam w taki sposób? Czy muszę jeszcze coś wyczarować, bo niestety ta opcja nie działa :

Kod: Zaznacz cały

  // CHANNEL2 - RELAY
  SuplaDevice.addRelay(13, true); //GPIO13 = D7
W sprawie sensora NO, czy muszę go zrobić na zasadzie pinMode (16, INPUT_PULLUP), jak wykonać callback do supli i informacją o jego stanie ?

Przepraszam jeśli moje pytania są denne i banalne...
Pozdrawiam
piomar2
Posty: 348
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

pt maja 22, 2020 9:47 am

Nie są denne ani banalne...Ważne aby dalej pogłębiać wiedzę i po to jest forum.
w kolejnym kroku dodaj "

Kod: Zaznacz cały

 SuplaDevice.addRelay(12, true); //GPIO12 = D6
  SuplaDevice.addRelay(13, true); //GPIO13 = D7
skompiluj, wgraj i zobacz czy wszystko ok.
xzihen
Posty: 17
Rejestracja: sob lis 23, 2019 2:21 pm
Lokalizacja: Łódź

pt maja 22, 2020 12:27 pm

Niestety przekaźnik się nie przełącza na pinie D6 ani na pinie D7. Jest to dość dziwne w mojej ocenie, bo jakby w kodzie nie ma się zbytnio co popsuć...

Kod: Zaznacz cały

//arduino 1.8.3, wemos mini
//DHT11 na pinie D4 GPIO2


#include <srpc.h>
#include <log.h>
#include <eh.h>
#include <IEEE754tools.h>
#define SUPLADEVICE_CPP
#include <SuplaDevice.h>
#include <lck.h>

#include <WiFiClient.h>
#include <ESP8266WiFi.h>
#include <WiFiServer.h>

#include <Wire.h>

#include <DHT.h>
#define DHTPIN 2 //pin pod którym jest nasz czujnik DHT11
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

WiFiClient client;

const char* ssid     = "ZHN";
const char* password = "";

//----------------- DHT11 ---------------------------------------
void get_temperature_and_humidity(int channelNumber, double *temp, double *humidity) { 
    *temp = dht.readTemperature();
    *humidity = dht.readHumidity();
    if ( isnan(*temp) || isnan(*humidity) ) {
      *temp = -275;
      *humidity = -1;
    }
}
//--------------------------------------------------------
void setup() {
  
  Serial.begin(115200);

  dht.begin();
  delay(10);
  SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
  
 // with GUID that you can retrieve from https://www.supla.org/arduino/get-guid

  // Replace the falowing GUID
 char GUID[SUPLA_GUID_SIZE] = {0x8C,0xB1,0xEF,0x66,0x3B,0xEB,0x50,0x0F,0x9F,0x8F,0xE3,0xF5,0xD8,0x71,0x78,0x6F};

  // Ethernet MAC address
  uint8_t mac[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  
  // CHANNEL0 - DHT11 
  SuplaDevice.addDHT11();

  // CHANNEL1 - Kontraktron 
  SuplaDevice.addSensorNO(4);

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

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


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

//--------------------------------------------------------
void loop() {
      
  SuplaDevice.iterate();
  
}
//-------------------------------------------------------- 
// 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) {

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
            delay(500);
  }
}

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;
  cb.get_temperature_and_humidity = &get_temperature_and_humidity; 
  cb.get_rgbw_value = NULL;
  cb.set_rgbw_value = NULL;

  return cb;
}
  
Pozdrawiam
piomar2
Posty: 348
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

pt maja 22, 2020 1:16 pm

I tu Masz rację. W kodzie nic się nie może popsuć. Ja mam podłączone 2 diody led do D6 i D7 i do +3v3 czyli stan aktywny to "0". Czy Masz takie przekaźniki które uruchamiają się jak podasz "0"? Podłącz diody z rezystorami i sprawdź najpierw. Pewnie to wina przekaźników
xzihen
Posty: 17
Rejestracja: sob lis 23, 2019 2:21 pm
Lokalizacja: Łódź

pt maja 22, 2020 2:45 pm

Przekaźnik, na którym staram się to wykonać jest sterowany stanem niskim. Czy muszą wykonać podciągnięcie pullup do jego pinu sterującego z 3.3V? Tak zrozumiałem z twojego wpisu, czy ja sobie coś pomyliłem ?
Pozdrawiam
piomar2
Posty: 348
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

pt maja 22, 2020 2:49 pm

Do przekaźnika nie dajesz żadnego pullup-a. Rezystory to aby nie spalić diód i wemosa i dajesz je tylko do diód
ODPOWIEDZ