Gordons Projects

--> Projects Top-Level GIT

9fa5702bfa319991da3bc6a23bf6e1affc490f4c
[wiringPi] / wiringPi / rht03.c
1 /*
2  * rht03.c:
3  *      Extend wiringPi with the rht03 Maxdetect 1-Wire sensor.
4  *      Copyright (c) 2016-2017 Gordon Henderson
5  ***********************************************************************
6  * This file is part of wiringPi:
7  *      https://projects.drogon.net/raspberry-pi/wiringpi/
8  *
9  *    wiringPi is free software: you can redistribute it and/or modify
10  *    it under the terms of the GNU Lesser General Public License as
11  *    published by the Free Software Foundation, either version 3 of the
12  *    License, or (at your option) any later version.
13  *
14  *    wiringPi is distributed in the hope that it will be useful,
15  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *    GNU Lesser General Public License for more details.
18  *
19  *    You should have received a copy of the GNU Lesser General Public
20  *    License along with wiringPi.
21  *    If not, see <http://www.gnu.org/licenses/>.
22  ***********************************************************************
23  */
24
25 //#include <sys/types.h>
26 //#include <sys/stat.h>
27 //#include <fcntl.h>
28
29 //#include <unistd.h>
30 //#include <stdint.h>
31 #include <stdio.h>
32 //#include <string.h>
33 #include <time.h>
34 //#include <ctype.h>
35
36 #include "wiringPi.h"
37 #include "../devLib/maxdetect.h"
38
39 #include "rht03.h"
40
41
42 /*
43  * myReadRHT03:
44  *      Read the Temperature & Humidity from an RHT03 sensor
45  *      Values returned are *10, so 123 is 12.3.
46  *********************************************************************************
47  */
48
49 static int myReadRHT03 (const int pin, int *temp, int *rh)
50 {
51   int result ;
52   unsigned char buffer [4] ;
53
54 // Read ...
55   
56   result = maxDetectRead (pin, buffer) ;
57
58   if (!result)
59     return FALSE ;
60
61   *rh   = (buffer [0] * 256 + buffer [1]) ;
62   *temp = (buffer [2] * 256 + buffer [3]) ;
63
64   if ((*temp & 0x8000) != 0)    // Negative
65   {
66     *temp &= 0x7FFF ;
67     *temp = -*temp ;
68   }
69
70 // Discard obviously bogus readings - the checksum can't detect a 2-bit error
71 //      (which does seem to happen - no realtime here)
72
73   if ((*rh > 999) || (*temp > 800) || (*temp < -400))
74     return FALSE ;
75
76   return TRUE ;
77 }
78
79 /*
80  * myAnalogRead:
81  *********************************************************************************
82  */
83
84 static int myAnalogRead (struct wiringPiNodeStruct *node, int pin)
85 {
86   int piPin = node->fd ;
87   int chan  = pin - node->pinBase ;
88   int temp  = -9997 ;
89   int rh    = -9997 ;
90   int try ;
91
92   if (chan > 1)
93     return -9999 ;      // Bad parameters
94
95   for (try = 0 ; try < 10 ; ++try)
96   {
97     if (myReadRHT03 (piPin, &temp, &rh))
98       return chan == 0 ? temp : rh ;
99   }
100
101   return -9998 ;
102 }
103
104
105 /*
106  * rht03Setup:
107  *      Create a new instance of an RHT03 temperature sensor.
108  *********************************************************************************
109  */
110
111 int rht03Setup (const int pinBase, const int piPin)
112 {
113   struct wiringPiNodeStruct *node ;
114
115   if ((piPin & PI_GPIO_MASK) != 0)      // Must be an on-board pin
116     return FALSE ;
117   
118 // 2 pins - temperature and humidity
119
120   node = wiringPiNewNode (pinBase, 2) ;
121
122   node->fd         = piPin ;
123   node->analogRead = myAnalogRead ;
124
125   return TRUE ;
126 }