FRDM-KL46Z_Pasos Es un programa que permite controlar un Motor a Pasos en sus diferntes modos de operación y tampbien permite controlar un Motor de CD en Modo ON-OFF Adelante y Atrás

Dependencies:   mbed Debounced tsi_sensor TSI TextLCD MMA8451Q USBDevice

Committer:
Antulius
Date:
Fri Jun 28 17:52:12 2019 +0000
Revision:
1:e7f73d96ddde
Parent:
Mbed_DHT.cpp@0:a935d23434d9
FRDM-KL46Z_Pasos

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Antulius 0:a935d23434d9 1 /*
Antulius 0:a935d23434d9 2 * DHT Library for Digital-output Humidity and Temperature sensors
Antulius 0:a935d23434d9 3 *
Antulius 0:a935d23434d9 4 * Works with DHT11, DHT22
Antulius 0:a935d23434d9 5 * SEN11301P, Grove - Temperature&Humidity Sensor (Seeed Studio)
Antulius 0:a935d23434d9 6 * SEN51035P, Grove - Temperature&Humidity Sensor Pro (Seeed Studio)
Antulius 0:a935d23434d9 7 * AM2302 , temperature-humidity sensor
Antulius 0:a935d23434d9 8 * HM2303 , Digital-output humidity and temperature sensor
Antulius 0:a935d23434d9 9 *
Antulius 0:a935d23434d9 10 * Copyright (C) Wim De Roeve
Antulius 0:a935d23434d9 11 * based on DHT22 sensor library by HO WING KIT
Antulius 0:a935d23434d9 12 * Arduino DHT11 library
Antulius 0:a935d23434d9 13 *
Antulius 0:a935d23434d9 14 * Permission is hereby granted, free of charge, to any person obtaining a copy
Antulius 0:a935d23434d9 15 * of this software and associated documnetation files (the "Software"), to deal
Antulius 0:a935d23434d9 16 * in the Software without restriction, including without limitation the rights
Antulius 0:a935d23434d9 17 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Antulius 0:a935d23434d9 18 * copies of the Software, and to permit persons to whom the Software is
Antulius 0:a935d23434d9 19 * furished to do so, subject to the following conditions:
Antulius 0:a935d23434d9 20 *
Antulius 0:a935d23434d9 21 * The above copyright notice and this permission notice shall be included in
Antulius 0:a935d23434d9 22 * all copies or substantial portions of the Software.
Antulius 0:a935d23434d9 23 *
Antulius 0:a935d23434d9 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Antulius 0:a935d23434d9 25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Antulius 0:a935d23434d9 26 * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Antulius 0:a935d23434d9 27 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Antulius 0:a935d23434d9 28 * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Antulius 0:a935d23434d9 29 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Antulius 0:a935d23434d9 30 * THE SOFTWARE.
Antulius 0:a935d23434d9 31 */
Antulius 0:a935d23434d9 32
Antulius 0:a935d23434d9 33 #include "Mbed_DHT.h"
Antulius 0:a935d23434d9 34
Antulius 0:a935d23434d9 35 #define DHT_DATA_BIT_COUNT 40
Antulius 0:a935d23434d9 36
Antulius 0:a935d23434d9 37 DHT::DHT(PinName pin, eType DHTtype)
Antulius 0:a935d23434d9 38 {
Antulius 0:a935d23434d9 39 _pin = pin;
Antulius 0:a935d23434d9 40 _DHTtype = DHTtype;
Antulius 0:a935d23434d9 41 _firsttime = true;
Antulius 0:a935d23434d9 42 }
Antulius 0:a935d23434d9 43
Antulius 0:a935d23434d9 44 DHT::~DHT()
Antulius 0:a935d23434d9 45 {
Antulius 0:a935d23434d9 46
Antulius 0:a935d23434d9 47 }
Antulius 0:a935d23434d9 48
Antulius 0:a935d23434d9 49 eError DHT::stall(DigitalInOut &io, int const level, int const max_time)
Antulius 0:a935d23434d9 50 {
Antulius 0:a935d23434d9 51 int cnt = 0;
Antulius 0:a935d23434d9 52 while (level == io) {
Antulius 0:a935d23434d9 53 if (cnt > max_time) {
Antulius 0:a935d23434d9 54 return ERROR_NO_PATIENCE;
Antulius 0:a935d23434d9 55 }
Antulius 0:a935d23434d9 56 cnt++;
Antulius 0:a935d23434d9 57 wait_us(1);
Antulius 0:a935d23434d9 58 }
Antulius 0:a935d23434d9 59 return ERROR_NONE;
Antulius 0:a935d23434d9 60 }
Antulius 0:a935d23434d9 61
Antulius 0:a935d23434d9 62 eError DHT::readData()
Antulius 0:a935d23434d9 63 {
Antulius 0:a935d23434d9 64 uint8_t i = 0, j = 0, b = 0, data_valid = 0;
Antulius 0:a935d23434d9 65 uint32_t bit_value[DHT_DATA_BIT_COUNT] = {0};
Antulius 0:a935d23434d9 66
Antulius 0:a935d23434d9 67 eError err = ERROR_NONE;
Antulius 0:a935d23434d9 68 time_t currentTime = time(NULL);
Antulius 0:a935d23434d9 69
Antulius 0:a935d23434d9 70 DigitalInOut DHT_io(_pin);
Antulius 0:a935d23434d9 71
Antulius 0:a935d23434d9 72 // IO must be in hi state to start
Antulius 0:a935d23434d9 73 if (ERROR_NONE != stall(DHT_io, 0, 250)) {
Antulius 0:a935d23434d9 74 return BUS_BUSY;
Antulius 0:a935d23434d9 75 }
Antulius 0:a935d23434d9 76
Antulius 0:a935d23434d9 77 // start the transfer
Antulius 0:a935d23434d9 78 DHT_io.output();
Antulius 0:a935d23434d9 79 DHT_io = 0;
Antulius 0:a935d23434d9 80 wait_ms(18);
Antulius 0:a935d23434d9 81 DHT_io = 1;
Antulius 0:a935d23434d9 82 wait_us(30);
Antulius 0:a935d23434d9 83 DHT_io.input();
Antulius 0:a935d23434d9 84 // wait till the sensor grabs the bus
Antulius 0:a935d23434d9 85 if (ERROR_NONE != stall(DHT_io, 1, 100)) {
Antulius 0:a935d23434d9 86 return ERROR_NOT_PRESENT;
Antulius 0:a935d23434d9 87 }
Antulius 0:a935d23434d9 88 // sensor should signal low 80us and then hi 80us
Antulius 0:a935d23434d9 89 if (ERROR_NONE != stall(DHT_io, 0, 100)) {
Antulius 0:a935d23434d9 90 return ERROR_SYNC_TIMEOUT;
Antulius 0:a935d23434d9 91 }
Antulius 0:a935d23434d9 92 if (ERROR_NONE != stall(DHT_io, 1, 100)) {
Antulius 0:a935d23434d9 93 return ERROR_NO_PATIENCE;
Antulius 0:a935d23434d9 94 }
Antulius 0:a935d23434d9 95 // capture the data
Antulius 0:a935d23434d9 96 for (i = 0; i < 5; i++) {
Antulius 0:a935d23434d9 97 for (j = 0; j < 8; j++) {
Antulius 0:a935d23434d9 98 if (ERROR_NONE != stall(DHT_io, 0, 75)) {
Antulius 0:a935d23434d9 99 return ERROR_DATA_TIMEOUT;
Antulius 0:a935d23434d9 100 }
Antulius 0:a935d23434d9 101 // logic 0 is 28us max, 1 is 70us
Antulius 0:a935d23434d9 102 wait_us(40);
Antulius 0:a935d23434d9 103 bit_value[i*8+j] = DHT_io;
Antulius 0:a935d23434d9 104 if (ERROR_NONE != stall(DHT_io, 1, 50)) {
Antulius 0:a935d23434d9 105 return ERROR_DATA_TIMEOUT;
Antulius 0:a935d23434d9 106 }
Antulius 0:a935d23434d9 107 }
Antulius 0:a935d23434d9 108 }
Antulius 0:a935d23434d9 109 // store the data
Antulius 0:a935d23434d9 110 for (i = 0; i < 5; i++) {
Antulius 0:a935d23434d9 111 b=0;
Antulius 0:a935d23434d9 112 for (j=0; j<8; j++) {
Antulius 0:a935d23434d9 113 if (bit_value[i*8+j] == 1) {
Antulius 0:a935d23434d9 114 b |= (1 << (7-j));
Antulius 0:a935d23434d9 115 }
Antulius 0:a935d23434d9 116 }
Antulius 0:a935d23434d9 117 DHT_data[i]=b;
Antulius 0:a935d23434d9 118 }
Antulius 0:a935d23434d9 119
Antulius 0:a935d23434d9 120 // uncomment to see the checksum error if it exists
Antulius 0:a935d23434d9 121 //printf(" 0x%02x + 0x%02x + 0x%02x + 0x%02x = 0x%02x \n", DHT_data[0], DHT_data[1], DHT_data[2], DHT_data[3], DHT_data[4]);
Antulius 0:a935d23434d9 122 data_valid = DHT_data[0] + DHT_data[1] + DHT_data[2] + DHT_data[3];
Antulius 0:a935d23434d9 123 if (DHT_data[4] == data_valid) {
Antulius 0:a935d23434d9 124 _lastReadTime = currentTime;
Antulius 0:a935d23434d9 125 _lastTemperature = CalcTemperature();
Antulius 0:a935d23434d9 126 _lastHumidity = CalcHumidity();
Antulius 0:a935d23434d9 127
Antulius 0:a935d23434d9 128 } else {
Antulius 0:a935d23434d9 129 err = ERROR_CHECKSUM;
Antulius 0:a935d23434d9 130 }
Antulius 0:a935d23434d9 131
Antulius 0:a935d23434d9 132 return err;
Antulius 0:a935d23434d9 133
Antulius 0:a935d23434d9 134 }
Antulius 0:a935d23434d9 135
Antulius 0:a935d23434d9 136 float DHT::CalcTemperature()
Antulius 0:a935d23434d9 137 {
Antulius 0:a935d23434d9 138 int v;
Antulius 0:a935d23434d9 139
Antulius 0:a935d23434d9 140 switch (_DHTtype) {
Antulius 0:a935d23434d9 141 case DHT11:
Antulius 0:a935d23434d9 142 v = DHT_data[2];
Antulius 0:a935d23434d9 143 return float(v);
Antulius 0:a935d23434d9 144 case DHT22:
Antulius 0:a935d23434d9 145 v = DHT_data[2] & 0x7F;
Antulius 0:a935d23434d9 146 v *= 256;
Antulius 0:a935d23434d9 147 v += DHT_data[3];
Antulius 0:a935d23434d9 148 v /= 10;
Antulius 0:a935d23434d9 149 if (DHT_data[2] & 0x80)
Antulius 0:a935d23434d9 150 v *= -1;
Antulius 0:a935d23434d9 151 return float(v);
Antulius 0:a935d23434d9 152 }
Antulius 0:a935d23434d9 153 return 0;
Antulius 0:a935d23434d9 154 }
Antulius 0:a935d23434d9 155
Antulius 0:a935d23434d9 156 float DHT::ReadHumidity()
Antulius 0:a935d23434d9 157 {
Antulius 0:a935d23434d9 158 return _lastHumidity;
Antulius 0:a935d23434d9 159 }
Antulius 0:a935d23434d9 160
Antulius 0:a935d23434d9 161 float DHT::ConvertCelciustoFarenheit(float const celsius)
Antulius 0:a935d23434d9 162 {
Antulius 0:a935d23434d9 163 return celsius * 9 / 5 + 32;
Antulius 0:a935d23434d9 164 }
Antulius 0:a935d23434d9 165
Antulius 0:a935d23434d9 166 float DHT::ConvertCelciustoKelvin(float const celsius)
Antulius 0:a935d23434d9 167 {
Antulius 0:a935d23434d9 168 return celsius + 273.15f;
Antulius 0:a935d23434d9 169 }
Antulius 0:a935d23434d9 170
Antulius 0:a935d23434d9 171 // dewPoint function NOAA
Antulius 0:a935d23434d9 172 // reference: http://wahiduddin.net/calc/density_algorithms.htm
Antulius 0:a935d23434d9 173 float DHT::CalcdewPoint(float const celsius, float const humidity)
Antulius 0:a935d23434d9 174 {
Antulius 0:a935d23434d9 175 float A0= 373.15f/(273.15f + celsius);
Antulius 0:a935d23434d9 176 float SUM = -7.90298 * (A0-1);
Antulius 0:a935d23434d9 177 SUM += 5.02808f * log10(A0);
Antulius 0:a935d23434d9 178 SUM += -1.3816e-7 * (pow(10, (11.344f*(1-1/A0)))-1) ;
Antulius 0:a935d23434d9 179 SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
Antulius 0:a935d23434d9 180 SUM += log10(1013.246);
Antulius 0:a935d23434d9 181 float VP = pow(10, SUM-3) * humidity;
Antulius 0:a935d23434d9 182 float T = log(VP/0.61078f); // temp var
Antulius 0:a935d23434d9 183 return (241.88f * T) / (17.558f-T);
Antulius 0:a935d23434d9 184 }
Antulius 0:a935d23434d9 185
Antulius 0:a935d23434d9 186 // delta max = 0.6544 wrt dewPoint()
Antulius 0:a935d23434d9 187 // 5x faster than dewPoint()
Antulius 0:a935d23434d9 188 // reference: http://en.wikipedia.org/wiki/Dew_point
Antulius 0:a935d23434d9 189 float DHT::CalcdewPointFast(float const celsius, float const humidity)
Antulius 0:a935d23434d9 190 {
Antulius 0:a935d23434d9 191 float a = 17.271;
Antulius 0:a935d23434d9 192 float b = 237.7;
Antulius 0:a935d23434d9 193 float temp = (a * celsius) / (b + celsius) + log(humidity/100);
Antulius 0:a935d23434d9 194 float Td = (b * temp) / (a - temp);
Antulius 0:a935d23434d9 195 return Td;
Antulius 0:a935d23434d9 196 }
Antulius 0:a935d23434d9 197
Antulius 0:a935d23434d9 198 float DHT::ReadTemperature(eScale Scale)
Antulius 0:a935d23434d9 199 {
Antulius 0:a935d23434d9 200 if (Scale == FARENHEIT)
Antulius 0:a935d23434d9 201 return ConvertCelciustoFarenheit(_lastTemperature);
Antulius 0:a935d23434d9 202 else if (Scale == KELVIN)
Antulius 0:a935d23434d9 203 return ConvertCelciustoKelvin(_lastTemperature);
Antulius 0:a935d23434d9 204 else
Antulius 0:a935d23434d9 205 return _lastTemperature;
Antulius 0:a935d23434d9 206 }
Antulius 0:a935d23434d9 207
Antulius 0:a935d23434d9 208 float DHT::CalcHumidity()
Antulius 0:a935d23434d9 209 {
Antulius 0:a935d23434d9 210 int v;
Antulius 0:a935d23434d9 211
Antulius 0:a935d23434d9 212 switch (_DHTtype) {
Antulius 0:a935d23434d9 213 case DHT11:
Antulius 0:a935d23434d9 214 v = DHT_data[0];
Antulius 0:a935d23434d9 215 return float(v);
Antulius 0:a935d23434d9 216 case DHT22:
Antulius 0:a935d23434d9 217 v = DHT_data[0];
Antulius 0:a935d23434d9 218 v *= 256;
Antulius 0:a935d23434d9 219 v += DHT_data[1];
Antulius 0:a935d23434d9 220 v /= 10;
Antulius 0:a935d23434d9 221 return float(v);
Antulius 0:a935d23434d9 222 }
Antulius 0:a935d23434d9 223 return 0;
Antulius 0:a935d23434d9 224 }