kstmApp/src/pi_2_dht_read.c
author Heinz Junkes <junkes@fhi-berlin.mpg.de>
Wed, 09 Sep 2015 18:06:59 +0200
changeset 1 7029db7ac3db
parent 0 bd6bb22c6533
permissions -rw-r--r--
Add adcPi device support
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     1
// Copyright (c) 2014 Adafruit Industries
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     2
// Author: Tony DiCola
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     3
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     4
// Permission is hereby granted, free of charge, to any person obtaining a copy
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     5
// of this software and associated documentation files (the "Software"), to deal
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     6
// in the Software without restriction, including without limitation the rights
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     7
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     8
// copies of the Software, and to permit persons to whom the Software is
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     9
// furnished to do so, subject to the following conditions:
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    10
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    11
// The above copyright notice and this permission notice shall be included in all
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    12
// copies or substantial portions of the Software.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    13
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    14
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    15
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    16
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    17
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    18
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    19
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    20
// SOFTWARE.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    21
#include <stdbool.h>
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    22
#include <stdlib.h>
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    23
1
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    24
#include "epicsExit.h"
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    25
#include "epicsThread.h"
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    26
#include "iocsh.h"
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    27
0
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    28
#include "pi_2_dht_read.h"
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    29
#include "pi_2_mmio.h"
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    30
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    31
// This is the only processor specific magic value, the maximum amount of time to
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    32
// spin in a loop before bailing out and considering the read a timeout.  This should
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    33
// be a high value, but if you're running on a much faster platform than a Raspberry
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    34
// Pi or Beaglebone Black then it might need to be increased.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    35
#define DHT_MAXCOUNT 32000
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    36
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    37
// Number of bit pulses to expect from the DHT.  Note that this is 41 because
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    38
// the first pulse is a constant 50 microsecond pulse, with 40 pulses to represent
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    39
// the data afterwards.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    40
#define DHT_PULSES 41
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    41
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    42
int pi_2_dht_read(int type, int pin, float* humidity, float* temperature) {
1
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    43
int i;
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    44
volatile int j;
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    45
unsigned int defPrio;
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    46
epicsThreadId threadIdSelf;
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    47
0
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    48
  // Validate humidity and temperature arguments and set them to zero.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    49
  if (humidity == NULL || temperature == NULL) {
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    50
    return DHT_ERROR_ARGUMENT;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    51
  }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    52
  *temperature = 0.0f;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    53
  *humidity = 0.0f;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    54
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    55
  // Initialize GPIO library.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    56
  if (pi_2_mmio_init() < 0) {
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    57
    return DHT_ERROR_GPIO;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    58
  }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    59
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    60
  // Store the count that each DHT bit pulse is low and high.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    61
  // Make sure array is initialized to start at zero.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    62
  int pulseCounts[DHT_PULSES*2] = {0};
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    63
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    64
  // Set pin to output.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    65
  pi_2_mmio_set_output(pin);
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    66
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    67
  // Bump up process priority and change scheduler to try to try to make process more 'real time'.
1
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    68
  defPrio = epicsThreadGetPrioritySelf();
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    69
  threadIdSelf = epicsThreadGetIdSelf();
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    70
  epicsThreadSetPriority( threadIdSelf , epicsThreadPriorityHigh);
0
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    71
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    72
  // Set pin high for ~500 milliseconds.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    73
  pi_2_mmio_set_high(pin);
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    74
  sleep_milliseconds(500);
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    75
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    76
  // The next calls are timing critical and care should be taken
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    77
  // to ensure no unnecssary work is done below.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    78
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    79
  // Set pin low for ~20 milliseconds.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    80
  pi_2_mmio_set_low(pin);
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    81
  busy_wait_milliseconds(20);
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    82
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    83
  // Set pin at input.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    84
  pi_2_mmio_set_input(pin);
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    85
  // Need a very short delay before reading pins or else value is sometimes still low.
1
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    86
  for (j = 0; j < 50; ++j) { }
0
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    87
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    88
  // Wait for DHT to pull pin low.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    89
  uint32_t count = 0;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    90
  while (pi_2_mmio_input(pin)) {
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    91
    if (++count >= DHT_MAXCOUNT) {
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    92
      // Timeout waiting for response.
1
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    93
      epicsThreadSetPriority( threadIdSelf , defPrio);
0
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    94
      return DHT_ERROR_TIMEOUT;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    95
    }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    96
  }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    97
1
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    98
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
    99
 // Record pulse widths for the expected result bits.
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
   100
  for ( i=0; i < DHT_PULSES*2; i+=2) {
0
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   101
    // Count how long pin is low and store in pulseCounts[i]
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   102
    while (!pi_2_mmio_input(pin)) {
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   103
      if (++pulseCounts[i] >= DHT_MAXCOUNT) {
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   104
        // Timeout waiting for response.
1
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
   105
        epicsThreadSetPriority( threadIdSelf , defPrio);
0
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   106
        return DHT_ERROR_TIMEOUT;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   107
      }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   108
    }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   109
    // Count how long pin is high and store in pulseCounts[i+1]
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   110
    while (pi_2_mmio_input(pin)) {
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   111
      if (++pulseCounts[i+1] >= DHT_MAXCOUNT) {
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   112
        // Timeout waiting for response.
1
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
   113
        epicsThreadSetPriority( threadIdSelf , defPrio);
0
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   114
        return DHT_ERROR_TIMEOUT;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   115
      }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   116
    }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   117
  }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   118
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   119
  // Done with timing critical code, now interpret the results.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   120
  // Drop back to normal priority.
1
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
   121
  // set_default_priority();
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
   122
  epicsThreadSetPriority( threadIdSelf , defPrio);
0
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   123
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   124
  // Compute the average low pulse width to use as a 50 microsecond reference threshold.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   125
  // Ignore the first two readings because they are a constant 80 microsecond pulse.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   126
  uint32_t threshold = 0;
1
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
   127
  for (i=2; i < DHT_PULSES*2; i+=2) {
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
   128
    threshold += pulseCounts[i];
0
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   129
  }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   130
  threshold /= DHT_PULSES-1;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   131
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   132
  // Interpret each high pulse as a 0 or 1 by comparing it to the 50us reference.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   133
  // If the count is less than 50us it must be a ~28us 0 pulse, and if it's higher
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   134
  // then it must be a ~70us 1 pulse.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   135
  uint8_t data[5] = {0};
1
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
   136
  for ( i=3; i < DHT_PULSES*2; i+=2) {
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
   137
    int index = (i-3)/16;
0
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   138
    data[index] <<= 1;
1
7029db7ac3db Add adcPi device support
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents: 0
diff changeset
   139
    if (pulseCounts[i] >= threshold) {
0
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   140
      // One bit for long pulse.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   141
      data[index] |= 1;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   142
    }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   143
    // Else zero bit for short pulse.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   144
  }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   145
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   146
  // Useful debug info:
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   147
  //printf("Data: 0x%x 0x%x 0x%x 0x%x 0x%x\n", data[0], data[1], data[2], data[3], data[4]);
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   148
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   149
  // Verify checksum of received data.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   150
  if (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) {
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   151
    if (type == DHT11) {
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   152
      // Get humidity and temp for DHT11 sensor.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   153
      *humidity = (float)data[0];
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   154
      *temperature = (float)data[2];
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   155
    }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   156
    else if (type == DHT22) {
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   157
      // Calculate humidity and temp for DHT22 sensor.
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   158
      *humidity = (data[0] * 256 + data[1]) / 10.0f;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   159
      *temperature = ((data[2] & 0x7F) * 256 + data[3]) / 10.0f;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   160
      if (data[2] & 0x80) {
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   161
        *temperature *= -1.0f;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   162
      }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   163
    }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   164
    return DHT_SUCCESS;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   165
  }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   166
  else {
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   167
    return DHT_ERROR_CHECKSUM;
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   168
  }
bd6bb22c6533 First import
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   169
}