Humidity Sensor with DHT11 and PIC16F676

OP #7632477
Rate this post
• ▲ useful
▼ not useful

Hello Guys

I am trying to develop a humidity sensor with DHT11 for my bathroom. The DHT11 Sensor reads the humidity and sends it to the PIC, if the humidity is over 75% a LED should light up. If its under 75% the LED is off.

But I have two problems.

First of all I am programming the PIC16F676 with a PICKIT3 clone - and when trying to debug my code the following error appears in MPLAB (1) Error when trying to debug: )

But now to my project:

If I upload (2)code without error-search), nothing really happens with the LED, when the humidity rises. Even if I change line 46 to "if ( int_RH > 0 )". This is probably the case because line 46 never happens. Thats because result isn't eaqual to 0.

So i tried to find out, where in the function "uint8_t Read_DHT ( uint8_t *data )" the problem happens.

And after changing the code to (3) Code with error-search) i found out, that the problem is due to the timeout in line 118

1
    uint16_t timeout = 10000;
2
    while ( SENSOR == 1 )
3
    {
4
        if ( --timeout == 0 )
5
        {
6
            return 0x0F;
7
        }
8
    }

Interesting: If I upload the same code to a programming board with the PIC18F45K22 and add the DHT11 Sensor, everything works as it should. Sadly I am not able to use this programming board for my project. Therefore I would like to do it with the PIC16F676.

Have you guys any idea, how i can fix this problem?

If you need to know anything about the circuit, I added the schmetic to the attachment.

  • I am new to the forum therefore I apologise if I forgot to add something you should know.
  1. Error when trying to debug:
1
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
2
make  -f nbproject/Makefile-default.mk dist/default/debug/test.X.debug.elf
3
make[2]: Entering directory 'C:/Users/domin/Desktop/ueK_6/test.X'
4
"C:\Program Files\Microchip\xc8\v2.46\bin\xc8-cc.exe"  -mcpu=16F676 -c  -D__DEBUG=1  -mdebugger=pickit3   -mdfp="C:/Program Files/Microchip/MPLABX/v6.20/packs/Microchip/PIC16Fxxx_DFP/1.6.156/xc8"  -fno-short-double -fno-short-float -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-2 -Wa,-a -DXPRJ_default=default  -msummary=-psect,-class,+mem,-hex,-file  -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits   -std=c99 -gdwarf-3 -mstack=compiled:auto:auto     -o build/default/debug/main.p1 main.c 
5
::: advisory: (2100) using the C99 standard library with the selected device may result in larger code and data usage
6
make[2]: Leaving directory 'C:/Users/domin/Desktop/ueK_6/test.X'
7
make[2]: Entering directory 'C:/Users/domin/Desktop/ueK_6/test.X'
8
"C:\Program Files\Microchip\xc8\v2.46\bin\xc8-cc.exe"  -mcpu=16F676 -c  -D__DEBUG=1  -mdebugger=pickit3   -mdfp="C:/Program Files/Microchip/MPLABX/v6.20/packs/Microchip/PIC16Fxxx_DFP/1.6.156/xc8"  -fno-short-double -fno-short-float -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-2 -Wa,-a -DXPRJ_default=default  -msummary=-psect,-class,+mem,-hex,-file  -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits   -std=c99 -gdwarf-3 -mstack=compiled:auto:auto     -o build/default/debug/configuration_bits.p1 configuration_bits.c 
9
::: advisory: (2100) using the C99 standard library with the selected device may result in larger code and data usage
10
make[2]: Leaving directory 'C:/Users/domin/Desktop/ueK_6/test.X'
11
make[2]: *** [nbproject/Makefile-default.mk:143: dist/default/debug/test.X.debug.elf] Error 1
12
make[1]: *** [nbproject/Makefile-default.mk:85: .build-conf] Error 2
13
make: *** [nbproject/Makefile-impl.mk:39: .build-impl] Error 2
14
make[2]: Entering directory 'C:/Users/domin/Desktop/ueK_6/test.X'
15
"C:\Program Files\Microchip\xc8\v2.46\bin\xc8-cc.exe"  -mcpu=16F676 -Wl,-Map=dist/default/debug/test.X.debug.map  -D__DEBUG=1  -mdebugger=pickit3  -DXPRJ_default=default  -Wl,--defsym=__MPLAB_BUILD=1   -mdfp="C:/Program Files/Microchip/MPLABX/v6.20/packs/Microchip/PIC16Fxxx_DFP/1.6.156/xc8"  -fno-short-double -fno-short-float -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-2 -Wa,-a -msummary=-psect,-class,+mem,-hex,-file  -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits -std=c99 -gdwarf-3 -mstack=compiled:auto:auto         -Wl,--memorysummary,dist/default/debug/memoryfile.xml -o dist/default/debug/test.X.debug.elf  build/default/debug/main.p1 build/default/debug/configuration_bits.p1     
16
::: advisory: (2100) using the C99 standard library with the selected device may result in larger code and data usage
17
main.c:177:: error: (800) undefined symbol "btemp"
18
(908) exit status = 1
19
make[2]: Leaving directory 'C:/Users/domin/Desktop/ueK_6/test.X'
20

21
BUILD FAILED (exit value 2, total time: 1s)
  1. Code without error-search:
1
// -- INCLUDES ----------------------------------------------------------------
2
#include <xc.h>        // Compiler-Include (Port-Defines)
3
#include <stdbool.h>  // Include for data type 'bool' and keywords 'true' and 'false'
4
#include <stdint.h>   // Include for defines the standard integer types per ISO/IEC 9899:1999
5

6
// -- DEFINES -----------------------------------------------------------------
7
#define _XTAL_FREQ 10000000 // Crystal oscillator frequencies of 10Mhz
8
#define LOOP_DELAY 1000  // Loop-Delay in ms 
9

10
#define WARN_LED PORTCbits.RC2
11

12
#define SENSOR PORTAbits.RA2
13
#define SENSOR_TRIS TRISAbits.TRISA2
14

15
// -- FUNCTIONS-PROTOTYPE ----------------------------------------------------
16
uint8_t Read_DHT ( uint8_t *data );
17

18
// -- SETUP -------------------------------------------------------------------
19

20
void setup ( void )
21
{
22
    ANSEL = 0x00;
23
    TRISC = 0x00;
24

25
    SENSOR_TRIS = 1;
26
}
27

28
// -- LOOP ---------------------------------------------------------
29

30
void loop ( void )
31
{
32

33

34
    static uint8_t data[5] = { 0 };
35

36
    uint8_t result = Read_DHT( data );
37
    
38
    if ( result == 0 )
39
    {
40
        uint8_t int_RH = data[0];
41
        uint8_t dec_RH = data[1];
42
        uint8_t int_T = data[2];
43
        uint8_t dec_T = data[3];
44

45

46
        if ( int_RH > 75 )
47
        {
48
            WARN_LED = 1;
49
        }
50
        else
51
        {
52
            WARN_LED = 0;
53
        }
54
    }
55
}
56

57
// -- main -----------------------------------------------------------
58

59
void main ( void )
60
{
61
    setup( );
62

63
    // (Loop)
64
    while ( 1 )
65
    {
66
        loop( );
67
        __delay_ms( LOOP_DELAY );
68
    }
69
}
70

71
// -- FUNCTIONS --------------------------------------------------------------
72

73
uint8_t Read_DHT ( uint8_t *data )
74
{
75

76

77
    // SENSOR as OUTPUT
78
    SENSOR_TRIS = 0;
79
    SENSOR = 0;
80
    //wait 18ms
81

82
    __delay_ms( 18 );
83

84
    SENSOR = 1;
85

86

87
    __delay_us( 40 );
88

89
    // SENSOR as INPUT    
90
    SENSOR = 0;
91

92
    SENSOR_TRIS = 1;
93

94
    uint16_t timeout = 10000;
95
    while ( SENSOR == 1 )
96
    {
97
        if ( --timeout == 0 )
98
        {
99
            return 0x0F;
100
        }
101
    }
102

103
    timeout = 10000;
104
    while ( SENSOR == 0 )
105
    {
106
        if ( --timeout == 0 )
107
        {
108
            return 0xFF;
109
        }
110
    }
111

112
    timeout = 10000;
113
    while ( SENSOR == 1 )
114
    {
115
        if ( --timeout == 0 )
116
        {
117
            return 0xFF;
118
        }
119
    }
120

121
    for ( uint8_t i = 0; i < 5; i++ )
122
    {
123
        for ( int8_t j = 7; j >= 0; j-- )
124
        {
125

126
            timeout = 10000;
127
            while ( SENSOR == 0 )
128
            {
129
                if ( --timeout == 0 )
130
                {
131
                    return 0xFF;
132
                }
133
            }
134
            uint8_t signal_counter = 0;
135
            timeout = 10000;
136
            while ( SENSOR == 1 )
137
            {
138
                signal_counter++;
139
                __delay_us( 1 );
140
                if ( signal_counter > 100 )
141
                {
142
                    return 0xFE;
143
                }
144
            }
145

146

147

148
            if ( signal_counter > 30 )
149
            {
150
                data[i] |= (1 << j);
151
            }
152
        }
153

154
    }
155
    if ( ( uint8_t ) (data[0] + data[1] + data[2] + data[3]) != data[4] )
156
    {
157
        return 0xFF;
158
    }
159

160
    return 0;
161

162

163
}
  1. Code with error-search
1
// -- INCLUDES ----------------------------------------------------------------
2
#include <xc.h>        // Compiler-Include (Port-Defines)
3
#include <stdbool.h>  // Include for data type 'bool' and keywords 'true' and 'false'
4
#include <stdint.h>   // Include for defines the standard integer types per ISO/IEC 9899:1999
5

6
// -- DEFINES -----------------------------------------------------------------
7
#define _XTAL_FREQ 10000000 // Crystal oscillator frequencies of 10Mhz
8
#define LOOP_DELAY 1000  // Loop-Delay in ms 
9

10
#define WARN_LED PORTCbits.RC2
11

12
#define SENSOR PORTAbits.RA2
13
#define SENSOR_TRIS TRISAbits.TRISA2
14

15
// -- FUNCTIONS-PROTOTYPE ----------------------------------------------------
16
uint8_t Read_DHT ( uint8_t *data );
17

18
// -- SETUP -------------------------------------------------------------------
19

20
void setup ( void )
21
{
22
    ANSEL = 0x00;
23
    TRISC = 0x00;
24

25
    SENSOR_TRIS = 1;
26
}
27

28
// --- loop ---------------------------------------------------------
29

30
void loop ( void )
31
{
32

33

34
    static uint8_t data[5] = { 0 };
35

36
    uint8_t result = Read_DHT( data );
37
    // Error 1
38
        if ( result == 0xFF )
39
        {
40
            while ( 1 )
41
            {
42
                    WARN_LED = 1;
43
                    __delay_ms( 2000 );
44
                    WARN_LED = 0;
45
                    __delay_ms( 2000 );
46
            }
47
        }
48
    
49
    // Error 2
50
        if ( result == 0x0F )
51
        {
52
            while ( 1 )
53
            {
54
                    WARN_LED = 1;
55
                    __delay_ms( 200 );
56
                    WARN_LED = 0;
57
                    __delay_ms( 200 );
58
            }
59
        }
60

61
    if ( result == 0 )
62
    {
63
        uint8_t int_RH = data[0];
64
        uint8_t dec_RH = data[1];
65
        uint8_t int_T = data[2];
66
        uint8_t dec_T = data[3];
67

68

69
        if ( int_RH > 75 )
70
        {
71
            WARN_LED = 1;
72
        }
73
        else
74
        {
75
            WARN_LED = 0;
76
        }
77
    }
78
}
79

80
// -- main -----------------------------------------------------------
81

82
void main ( void )
83
{
84
    setup( );
85

86
    // (Loop)
87
    while ( 1 )
88
    {
89
        loop( );
90
        __delay_ms( LOOP_DELAY );
91
    }
92
}
93

94
// -- FUNCTIONS --------------------------------------------------------------
95

96
uint8_t Read_DHT ( uint8_t *data )
97
{
98

99

100
    // SENSOR as OUTPUT
101
    SENSOR_TRIS = 0;
102
    SENSOR = 0;
103
    //wait 18ms
104

105
    __delay_ms( 18 );
106

107
    SENSOR = 1;
108

109

110
    __delay_us( 40 );
111

112
    // SENSOR as INPUT    
113
    SENSOR = 0;
114

115
    SENSOR_TRIS = 1;
116

117
    uint16_t timeout = 10000;
118
    while ( SENSOR == 1 )
119
    {
120
        if ( --timeout == 0 )
121
        {
122
            return 0x0F;
123
        }
124
    }
125

126
    timeout = 10000;
127
    while ( SENSOR == 0 )
128
    {
129
        if ( --timeout == 0 )
130
        {
131
            return 0xFF;
132
        }
133
    }
134

135
    timeout = 10000;
136
    while ( SENSOR == 1 )
137
    {
138
        if ( --timeout == 0 )
139
        {
140
            return 0xFF;
141
        }
142
    }
143

144
    for ( uint8_t i = 0; i < 5; i++ )
145
    {
146
        for ( int8_t j = 7; j >= 0; j-- )
147
        {
148

149
            timeout = 10000;
150
            while ( SENSOR == 0 )
151
            {
152
                if ( --timeout == 0 )
153
                {
154
                    return 0xFF;
155
                }
156
            }
157
            uint8_t signal_counter = 0;
158
            timeout = 10000;
159
            while ( SENSOR == 1 )
160
            {
161
                signal_counter++;
162
                __delay_us( 1 );
163
                if ( signal_counter > 100 )
164
                {
165
                    return 0xFE;
166
                }
167
            }
168

169

170

171
            if ( signal_counter > 30 )
172
            {
173
                data[i] |= (1 << j);
174
            }
175
        }
176

177
    }
178
    if ( ( uint8_t ) (data[0] + data[1] + data[2] + data[3]) != data[4] )
179
    {
180
        return 0xFF;
181
    }
182

183
    return 0;
184

185

186
}

Reply

Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.

Formatting
  • [c]C-Code[/c]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]
  • [[Title]] – link to an article
  • Link to another post: right-click its post ID (#8078628), copy the address, paste it into the text

More about formatting

Post long source code as an attachment, not in the text.

Already registered? Log in

Not shown to anyone. We send you a link; your post appears once you confirm it there.

By submitting you create a free account and accept the terms of use.