B4R Tutorial DHT11 & DHT22 temperature and humidity sensors ARDUINO UNO Code

Discussion in 'B4R Tutorials' started by inakigarm, Apr 22, 2016.

  1. inakigarm

    inakigarm Well-Known Member Licensed User

    This B4R example/library works with DHT11 and DHT22 temperature and humidity sensors:

    This inexpensive device (DHT11) allows for measure temperature and humidity:
    • Very Low cost
    • 3 to 5V power and I/O
    • 2.5mA max current use during conversion (while requesting data)
    • Good for 20-80% humidity readings with 5% accuracy
    • Good for 0-50°C temperature readings ±2°C accuracy
    • No more than 1 Hz sampling rate (once every second)
    • Body size 15.5mm x 12mm x 5.5mm
    • 4 pins with 0.1" spacing
    This cheap device (DHT22) allows also for measure temperature and humidity:
    • Low cost
    • 3 to 5V power and I/O
    • 2.5mA max current use during conversion (while requesting data)
    • Good for 0-100% humidity readings with 2-5% accuracy
    • Good for -40 to 125°C temperature readings ±0.5°C accuracy
    • No more than 0.5 Hz sampling rate (once every 2 seconds)
    • Body size 15.1mm x 25mm x 7.7mm
    • 4 pins with 0.1" spacing


    DHT11 & DHT22
    [​IMG]

    [​IMG]

    DHT11 & DHT22 DHT11+UNO_bb.jpg

    Attached an example that reads DHT11 sensor (on Arduino pin 4) and DHT22 sensor (on pin 3) at same time
    Code:
    Sub Process_Globals
        
    'These global variables will be declared once when the application starts.
        'Public variables can be accessed from all modules.
        Public Serial1 As Serial
        
    Public DHT11sensor As dht                'DHT11 sensor
        Public DHT22sensor As dht                'DHT22 sensor
        Public Timer1 As Timer                    'Timer for reading DHT11 measures at desired interval
        Public DHT11pin,DHT22pin As Pin            'Arduino Pin connected to DHT11 signal
        Public Interval As Int                    'Interval as seconds


        
    Dim humidity,temperature As Double        'Humidity/Temperature DHT11 readings

    End Sub

    Private Sub AppStart

        Serial1.Initialize(
    115200)
        
    Log("AppStart")

        Interval=
    2                                        '2 sec Timer Interval (for DHT22 measures)                            
        DHT11pin.Initialize(4,DHT11pin.MODE_INPUT)        'Initialize at Arduino Pin 4
        DHT22pin.Initialize(3,DHT22pin.MODE_INPUT)        'Initialize at Arduino Pin 3
        Timer1.Initialize("Timer1_Tick",Interval*1000)    
        Timer1.Enabled=
    True                                'Begin Timer

    End Sub


    Sub Timer1_Tick

        DHT11sensor.Read11(DHT11pin.PinNumber)            
    'Reading the DHT11 measure
        humidity=DHT11sensor.GetHumidity                'Get humidity from readed measure
        temperature=DHT11sensor.GetTemperature            'Get temperature from readed measure
        Log("DHT11 ","Humidity = ",humidity, " %""  Temperature =",temperature, " Cº")

        Delay(
    200)
        DHT22sensor.Read22(DHT22pin.PinNumber)            
    'Reading the DHT22 measure
        humidity=DHT22sensor.GetHumidity                'Get humidity from readed measure
        temperature=DHT22sensor.GetTemperature        'Get temperature from readed measure
        Log("DHT22 ","Humidity = ",NumberFormat(humidity,2,1), " %""  Temperature =",NumberFormat(temperature,2,1), " Cº")

    End Sub
    DHT11-DHT22 logs.jpg


    In attached file (rdht.zip), you'll find the B4R library and the Arduino lib (dhtlib.zip)
    DHT is not a lib included on Arduino Skecth and it seems there're two ways to get working a library not included in the Arduino default libraries:
    1 Option) Download the zip from https://github.com/adafruit/DHT-sensor-library and install on Arduino IDE with Sketch Menu --> Include Library --> Add Zip library or Sketch Menu --> Include Library --> Manage Library and do a Search for it. After, descompress the rDHT.zip on B4R Libraries Folder

    2 Option) Modifying the rDht.h and rDht.xml for search the Arduino library (Dht.h and Dht.h) on B4R folder (it won't work on Arduino IDE) --> See posts #8-#13

    For now, I'm more comfortable with first option as it permits to test the Arduino with several ino programs before to testing on B4R, but the choice it's yours.

    rDhtlib v2.00:
    - Included DHT11 and DHT22 sensors (decompress to B4R Libraries folder)
     

    Attached Files:

    Last edited: Apr 29, 2016
  2. tufanv

    tufanv Expert Licensed User

    Great Thanks.
    BTW isn't -2 +2 too much for a temperature senson =)
     
  3. inakigarm

    inakigarm Well-Known Member Licensed User

    Yes, but it's the one that I have ;) (I've found and known the accuracy when searched for characteristics !)

    If you want to buy a temperature sensor, maybe this comparative would help to choose the right one
     
  4. tufanv

    tufanv Expert Licensed User

    No , I own the same with you and also a lm35 =)
     
  5. ingo.tw

    ingo.tw Member Licensed User

    In file included from D:\B4R\dht\Objects\src\src.ino:1:0:
    sketch\B4RDefines.h:17:17: fatal error: dht.h: No such file or directory
    #include <dht.h>
    ^
    compilation terminated.
    exit status 1
    Error compiling for board Arduino/Genuino Uno.
     
  6. inakigarm

    inakigarm Well-Known Member Licensed User

    I don't have the computer to test it but I think it' could be because you haven't download the dht lib from the Arduino sketch (if this is the error it's my fault for not described at first post- will be modifies)
     
  7. ingo.tw

    ingo.tw Member Licensed User

    I have download the dht lib Is can run,Great Thanks.
     
  8. rwblinn

    rwblinn Well-Known Member Licensed User

    Hi,

    can't get this example to run. Steps taken:
    • Downloaded the example including the dht library
    • Created an additional Libraries Folder C:\Daten\b4\b4r\libraries
    • Created subfolder C:\Daten\b4\b4r\libraries\rDHT
    • Copied rDHT.xml to C:\Daten\b4\b4r\libraries
    • Copied dht.h, dht.cpp, rDHT.h and rDHT.cpp to C:\Daten\b4\b4r\libraries\rDHT
    • Created sample project based on code in post #1
    When compiling received error message below.

    Please advice how to setup additional libraries? What is missing in the steps taken as outlined?

    Compiler Error Message
    Code:
    B4R version: 1.00 BETA 7
    Parsing code.    (
    0.00s)
    Compiling code.    (
    0.02s)
    Building project    (
    0.07s)
    Compiling & deploying Ino project (Arduino/Genuino Mega 
    or Mega 2560 (cpu=atmega2560) - COM3)    Error

    In file included from C:\Daten\b4\b4r\b4rhowto\B4RHowToDHT11\Objects\src\src.ino:1:0:
    sketch\B4RDefines.h:
    17:17: fatal error: dht.h: No such file or directory
    #include <dht.h>
                     ^
    compilation terminated.
    exit status 1
    Error compiling 
    for board Arduino/Genuino Mega or Mega 2560.
     
  9. ingo.tw

    ingo.tw Member Licensed User

    dht.h, dht.cpp must copy to Arduino\libraries
     
  10. Erel

    Erel Administrator Staff Member Licensed User

    It is better to avoid having to copy the files to the arduino folder.
    Just change:

    //~dependson: <dht.h>

    With:

    #include "dht.h"

    And then it will load it from the B4R library folder.
     
    Laurent95 likes this.
  11. rwblinn

    rwblinn Well-Known Member Licensed User

    Based on replies, tested following:
    1) In the Arduino IDE build sample sketch dht11 with an imported DHT library (in folder arduino/sketchbook/libraries/DHT) containg dht.h and dht.cpp. Sketch running OK.
    2) B4R: Changed "depends on" in rDHT.h into "include" in the B4R additional libraries folder C:\Daten\b4\b4r\libraries\rDHT.
    When compiling, receive bunch of error messages. See below ERROR Step 2.
    3) Deleted the Arduino DHT library (see step 1). When compining, received Error Message can not find dht.h --- although in rDHT folder. See ERROR Step 3.
    4) Add back in the Arduino DHT library (see step 1) and deleted from B4R rDHT libraries folder the files dht.h and dhp.cpp, so the rDHT.h and cpp remain.
    The program is running OK:
    Code:
    AppStart
    Humidity = 
    39 %  Temperature =20 Cº
    Humidity = 
    39 %  Temperature =20 Cº
    ISSUE: it seems that there is a conflict when the same libraries (h and cpp files) are installed in the Arduino IDE and in the B4R additional libraries folder.

    Any advice how to resolve?

    ERROR Step 2
    Code:
    B4R version: 1.00 BETA 7
    Parsing code.    (
    0.00s)
    Compiling code.    (
    0.11s)
    Building project    (
    0.07s)
    Compiling & deploying Ino project (Arduino/Genuino Mega 
    or Mega 2560 (cpu=atmega2560) - COM3)    Error

    libraries\DHT\dht.cpp.o: 
    In function `dht::_readSensor(unsigned char, unsigned char, unsigned char)':
    C:\Daten\arduino\sketchbook\libraries\DHT/dht.cpp:104: multiple definition of `dht::_readSensor(unsigned char, unsigned char, unsigned char)'
    sketch\dht.cpp.o:sketch/dht.cpp:104: first defined here
    c:/daten/arduino/ide/hardware/tools/avr/bin/../lib/gcc/avr/
    4.8.1/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions
    libraries\DHT\dht.cpp.o: 
    In function `dht::_readSensor(unsigned char, unsigned char, unsigned char)':
    C:\Daten\arduino\sketchbook\libraries\DHT/dht.cpp:104: multiple definition of `dht::read11(unsigned char)'
    sketch\dht.cpp.o:sketch/dht.cpp:104: first defined here
    libraries\DHT\dht.cpp.o: 
    In function `dht::_readSensor(unsigned char, unsigned char, unsigned char)':
    C:\Daten\arduino\sketchbook\libraries\DHT/dht.cpp:104: multiple definition of `dht::read(unsigned char)'
    sketch\dht.cpp.o:sketch/dht.cpp:104: first defined here
    collect2.exe: error: ld returned 
    1 exit status
    exit status 1
    Error compiling 
    for board Arduino/Genuino Mega or Mega 2560.
    ERROR Step 3
    Code:
    B4R version: 1.00 BETA 7
    Parsing code.    (
    0.00s)
    Compiling code.    (
    0.11s)
    Building project    (
    0.07s)
    Compiling & deploying Ino project (Arduino/Genuino Mega 
    or Mega 2560 (cpu=atmega2560) - COM3)    Error

    In file included from C:\Daten\b4\b4r\b4rhowto\B4RHowToDHT11\Objects\src\src.ino:1:0:
    sketch\B4RDefines.h:
    17:17: fatal error: dht.h: No such file or directory
    #include <dht.h>
                     ^
    compilation terminated.
    exit status 1
    Error compiling 
    for board Arduino/Genuino Mega or Mega 2560.
     
  12. Erel

    Erel Administrator Staff Member Licensed User

    You also need to update the XML file and remove the DependsOn entry (it will be near the end of the file).
     
    Laurent95 and rwblinn like this.
  13. rwblinn

    rwblinn Well-Known Member Licensed User

    Thanks - thats it = been a good learning for building B4R additional libraries, means:

    Creating a B4R additional library usign an external library and do not want a dependency on the Arduino Library Folder, use "#include" and not "depends on".
    Ensure "depends on" is not in the XML file.
    Example for this case:
    Code:
    #pragma once
    #include "B4RDefines.h"
    #include "dht.h"
    namespace B4R {
    ...
    The B4R additional libraries folder has the same structure as the B4R internal libraries folder.
    Example for this case:
    ...\b4r\libraries\rDHT.xml
    ...\b4r\libraries\rDHT\rDHT.h, rDHT.cpp and the external library files dht.h and dht.cpp.
     
    Laurent95 and Erel like this.
  14. janderkan

    janderkan Member Licensed User

    I am so sorry for being so bad to read this thread.

    I have done like @rwblinn described:
    ...\b4r\libraries\rDHT.xml
    ...\b4r\libraries\rDHT\rDHT.h, rDHT.cpp and the external library files dht.h and dht.cpp.
    Changed \b4r\libraries\rDHT\rdht.h file from //~dependson: <dht.h> to #include "dht.h"
    and
    Made sure that I did not have the library included in Arduino

    Done like @Erel described
    Removed from \b4r\libraries\rDHT.xml the second last line <dependsOn><dht.h></dependsOn>

    I created a new projekt and included rDht library.
    Added 1 line:
    Public DHTsensor As dht

    Getting the following error:

    B4R version: 1.00
    Parsing code. (0.00s)
    Compiling code. (0.08s)
    Building project (0.08s)
    Compiling & deploying Ino project (Arduino/Genuino Uno - COM7) Error

    In file included from sketch\B4RDefines.h:20:0,
    from sketch\B4RArduino.cpp:1:
    sketch\rDht.h:10:4: error: 'dht' does not name a type
    dht Dht;
    ^
    exit status 1
    Error compiling for board Arduino/Genuino Uno.
     
  15. rwblinn

    rwblinn Well-Known Member Licensed User

    Hi,

    please find attached a test project including the rDHT library (for several tests used).
    Could you test if this is working?
     

    Attached Files:

    janderkan likes this.
  16. janderkan

    janderkan Member Licensed User

    Hi,

    The test from @rwblinn worked fine, however it is a DHT22 sensor I have.

    So I replaced rDht.xml, rDHT\rDHT.h and rDHT\rDHT.cpp with the files from the first post from @inakigarm

    I replaced the files rDHT\dht.cpp and rDHT\dht.h with files downloaded from Arduino.

    Did not work.

    Found that files from Arduino was named DHT.cpp and DHT.h
    In these files the DHT class is with capital letters, and the files comes from Adafruit

    Renamed DHT.cpp and DHT.h to DHT_ada.cpp and DHT_ada.h
    Found the latest files from Rob Tillaart (v1.21) and copied them to Addlibraries\rDHT

    Did not work.

    Found that both the Ada files and the Rob files was in the \objects\src folder of my B4R project.
    Removed DHT_ada.cpp and DHT_ada.h from Addlibraries\rDHT.

    Wuhuu, It works.

    Attached the files I use
     

    Attached Files:

    rwblinn likes this.
  17. janderkan

    janderkan Member Licensed User

    Now I have tried using the DHT22 with a Wemos Mini.
    I replaced the initialization with this:

    Dht22Pin.Initialize(EspPins.D5,Dht22Pin.MODE_INPUT)

    But when compiling I get this error:

    In file included from sketch\dht.h:19:0,
    from sketch\dht.cpp:41:
    sketch\dht.cpp: In member function 'int8_t dht::_readSensor(uint8_t, uint8_t, uint8_t)':
    C:\Users\LapTop\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/Arduino.h:226:63: error: cannot convert 'volatile uint32_t* {aka volatile unsigned int*}' to 'volatile uint8_t* {aka volatile unsigned char*}' in initialization
    #define portInputRegister(port) ((volatile uint32_t*) &GPI)
    ^
    sketch\dht.cpp:121:29: note: in expansion of macro 'portInputRegister'
    volatile uint8_t *PIR = portInputRegister(port);
    ^
    exit status 1
    Error compiling for board WeMos D1 R2 & mini.
     
  18. Erel

    Erel Administrator Staff Member Licensed User

  19. GanjaKyp

    GanjaKyp Member

    DHT22 not working on ESP8266 (NodeMcu)?
     
  20. rwblinn

    rwblinn Well-Known Member Licensed User

    Below code successfully tested on a NodeMCU 0.9. Attached the rDHT Library v2.

    Code:
    #Region Project Notes
    ' B4R HowTo Project: DHT22 Sensor connected to ESP8266 NodeMCU 0.9
    ' Libraries: rDHT v2.00
    ' Connection (looking at the white sensor from right to left)
    ' DHT22 = NodeMCU (Wirecolor)
    ' GND = GND (black)
    ' NC
    ' Signal = D2 (SDA,DATA) (white)    Note: According DHT22 documentation put a 10K resistor between VCC and the DATA
    ' VCC = 3.3v (red)
    ' Example Output:
    ' humidity = 59.70 %  temperature =21.80 DegC#
    ' humidity = 65.40 %  temperature =22.10 DegC
    #End Region

    Sub Process_Globals
        
    Public Serial1 As Serial
        
    Public DHT22sensor As dht                       
        
    Public Timer1 As Timer                             
        
    Public DHT22pin As Pin                             
        
    Public Interval As Int                                
        
    Dim humidity,temperature As Double         'DHT22 readings
    End Sub

    Private Sub AppStart
        Serial1.Initialize(
    115200)
        Interval=
    5                                            '5 sec Timer Interval                                 
        DHT22pin.Initialize(4,DHT22pin.MODE_INPUT)            'Initialize at NodeMCU Pin D2 (SDA,DATA)
        Timer1.Initialize("Timer1_Tick",Interval*1000)         
        Timer1.Enabled=
    True                                
        
    Log("AppStart NodeMCU DHT22 Experiment")
    End Sub

    Sub Timer1_Tick
        DHT22sensor.Read22(DHT22pin.PinNumber)             
        humidity=DHT22sensor.GetHumidity                    
        temperature=DHT22sensor.GetTemperature                
        
    Log("Humidity = ",NumberFormat(humidity,0,2), " %""  Temperature =",NumberFormat(temperature,0,2), " DegC")
    End Sub
     

    Attached Files:

    Erel and inakigarm like this.
Loading...