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:
dht22.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 * (C) The University of Kent and Simon Cooksey 2015.
Antulius 0:a935d23434d9 3 */
Antulius 0:a935d23434d9 4
Antulius 0:a935d23434d9 5 #include "mbed.h"
Antulius 0:a935d23434d9 6 #include <inttypes.h>
Antulius 0:a935d23434d9 7
Antulius 0:a935d23434d9 8 #include "dht22.h"
Antulius 0:a935d23434d9 9
Antulius 0:a935d23434d9 10 /*
Antulius 0:a935d23434d9 11 * The DHT22 uses a 1 wire interface, sending 1's and 0s by varying the length
Antulius 0:a935d23434d9 12 * of the HIGH time on the signal pin.
Antulius 0:a935d23434d9 13 */
Antulius 0:a935d23434d9 14
Antulius 0:a935d23434d9 15 /*
Antulius 0:a935d23434d9 16 * Wait for a rising or falling edge on the sense pin.
Antulius 0:a935d23434d9 17 *
Antulius 0:a935d23434d9 18 * Returns: the number of uS elapsed before the transition
Antulius 0:a935d23434d9 19 */
Antulius 0:a935d23434d9 20 int DHT22::wait_for_edge(edge_type_t type)
Antulius 0:a935d23434d9 21 {
Antulius 0:a935d23434d9 22 dht22_s.input();
Antulius 0:a935d23434d9 23
Antulius 0:a935d23434d9 24 // Timing is done by increasing this number, as the Timer class appears to
Antulius 0:a935d23434d9 25 // be super slow.
Antulius 0:a935d23434d9 26 int time = 0;
Antulius 0:a935d23434d9 27 do {
Antulius 0:a935d23434d9 28 wait_us(2);
Antulius 0:a935d23434d9 29 time+=2;
Antulius 0:a935d23434d9 30 } while(dht22_s != (int)type);
Antulius 0:a935d23434d9 31
Antulius 0:a935d23434d9 32 // wait for the edge to transition properly
Antulius 0:a935d23434d9 33 wait_us(2);
Antulius 0:a935d23434d9 34 return time;
Antulius 0:a935d23434d9 35 }
Antulius 0:a935d23434d9 36
Antulius 0:a935d23434d9 37 /*
Antulius 0:a935d23434d9 38 * Send a start bit to the DHT22
Antulius 0:a935d23434d9 39 */
Antulius 0:a935d23434d9 40 void DHT22::send_start()
Antulius 0:a935d23434d9 41 {
Antulius 0:a935d23434d9 42 dht22_s.output();
Antulius 0:a935d23434d9 43 dht22_s = 0;
Antulius 0:a935d23434d9 44 wait_us(DHT22_START_BIT_TIME);
Antulius 0:a935d23434d9 45 dht22_s = 1;
Antulius 0:a935d23434d9 46 dht22_s.input();
Antulius 0:a935d23434d9 47 }
Antulius 0:a935d23434d9 48
Antulius 0:a935d23434d9 49 /*
Antulius 0:a935d23434d9 50 * Wait for the DHT22 to send the start bit ACK, after this we can read data.
Antulius 0:a935d23434d9 51 */
Antulius 0:a935d23434d9 52 void DHT22::await_start_response()
Antulius 0:a935d23434d9 53 {
Antulius 0:a935d23434d9 54 dht22_s.input();
Antulius 0:a935d23434d9 55 wait_for_edge(EDGE_TYPE_FALLING); // 20-40 uS
Antulius 0:a935d23434d9 56 wait_for_edge(EDGE_TYPE_RISING); // 80 uS
Antulius 0:a935d23434d9 57 wait_for_edge(EDGE_TYPE_FALLING); // 80 uS
Antulius 0:a935d23434d9 58 }
Antulius 0:a935d23434d9 59
Antulius 0:a935d23434d9 60 /*
Antulius 0:a935d23434d9 61 * Reads 16 bits of data from the DHT22
Antulius 0:a935d23434d9 62 *
Antulius 0:a935d23434d9 63 * Returns: the signed value read. dht22_t.
Antulius 0:a935d23434d9 64 * NB. the DHT22 uses a sign bit to do -ve and positive, but this is
Antulius 0:a935d23434d9 65 * incompatible with signed numbers in C, so the conversion is done here.
Antulius 0:a935d23434d9 66 */
Antulius 0:a935d23434d9 67 int16_t DHT22::read_word()
Antulius 0:a935d23434d9 68 {
Antulius 0:a935d23434d9 69 dht22_s.input();
Antulius 0:a935d23434d9 70 int32_t duration;
Antulius 0:a935d23434d9 71 int16_t word = 0x00;
Antulius 0:a935d23434d9 72 for(char bit = 0; bit < 16; bit++)
Antulius 0:a935d23434d9 73 {
Antulius 0:a935d23434d9 74 /* /-----------\
Antulius 0:a935d23434d9 75 * / duration \ 50us
Antulius 0:a935d23434d9 76 * ----/ \-------
Antulius 0:a935d23434d9 77 */
Antulius 0:a935d23434d9 78 wait_for_edge(EDGE_TYPE_RISING);
Antulius 0:a935d23434d9 79 duration = wait_for_edge(EDGE_TYPE_FALLING);
Antulius 0:a935d23434d9 80
Antulius 0:a935d23434d9 81 if(duration > DHT22_SIGNAL_HIGH_LOW_BOUNDARY)
Antulius 0:a935d23434d9 82 {
Antulius 0:a935d23434d9 83 word |= (1 << 15-bit);
Antulius 0:a935d23434d9 84 }
Antulius 0:a935d23434d9 85 else
Antulius 0:a935d23434d9 86 {
Antulius 0:a935d23434d9 87 word |= (0 << 15-bit);
Antulius 0:a935d23434d9 88 }
Antulius 0:a935d23434d9 89 }
Antulius 0:a935d23434d9 90 if(word & 0x8000)
Antulius 0:a935d23434d9 91 return 1 - (word ^ 0x8000);
Antulius 0:a935d23434d9 92 return word;
Antulius 0:a935d23434d9 93 }
Antulius 0:a935d23434d9 94
Antulius 0:a935d23434d9 95 /*
Antulius 0:a935d23434d9 96 * Reads 8 bits of data from the DHT22
Antulius 0:a935d23434d9 97 *
Antulius 0:a935d23434d9 98 * Returns: the unsigned checksum value read. dht22_t.
Antulius 0:a935d23434d9 99 */
Antulius 0:a935d23434d9 100 uint8_t DHT22::read_checksum()
Antulius 0:a935d23434d9 101 {
Antulius 0:a935d23434d9 102 dht22_s.input();
Antulius 0:a935d23434d9 103 uint32_t duration;
Antulius 0:a935d23434d9 104 uint8_t word;
Antulius 0:a935d23434d9 105 for(char bit = 0; bit < sizeof(uint8_t)*8; bit++)
Antulius 0:a935d23434d9 106 {
Antulius 0:a935d23434d9 107 /* /-----------\
Antulius 0:a935d23434d9 108 * / duration \ 50us
Antulius 0:a935d23434d9 109 * ----/ \-------
Antulius 0:a935d23434d9 110 */
Antulius 0:a935d23434d9 111 wait_for_edge(EDGE_TYPE_RISING);
Antulius 0:a935d23434d9 112 duration = wait_for_edge(EDGE_TYPE_FALLING);
Antulius 0:a935d23434d9 113
Antulius 0:a935d23434d9 114 if(duration > DHT22_SIGNAL_HIGH_LOW_BOUNDARY)
Antulius 0:a935d23434d9 115 {
Antulius 0:a935d23434d9 116 word |= (1 << 7-bit);
Antulius 0:a935d23434d9 117 }
Antulius 0:a935d23434d9 118 else
Antulius 0:a935d23434d9 119 {
Antulius 0:a935d23434d9 120 word |= (0 << 7-bit);
Antulius 0:a935d23434d9 121 }
Antulius 0:a935d23434d9 122 }
Antulius 0:a935d23434d9 123 return word;
Antulius 0:a935d23434d9 124 }
Antulius 0:a935d23434d9 125
Antulius 0:a935d23434d9 126 /*
Antulius 0:a935d23434d9 127 * Reads a packet of DHT22 data.
Antulius 0:a935d23434d9 128 *
Antulius 0:a935d23434d9 129 * Param data: the packet to fill.
Antulius 0:a935d23434d9 130 */
Antulius 0:a935d23434d9 131 void DHT22::read(DHT22_data_t * data)
Antulius 0:a935d23434d9 132 {
Antulius 0:a935d23434d9 133 // Send start bits
Antulius 0:a935d23434d9 134 send_start();
Antulius 0:a935d23434d9 135
Antulius 0:a935d23434d9 136 // Wait for device to respond
Antulius 0:a935d23434d9 137 await_start_response();
Antulius 0:a935d23434d9 138
Antulius 0:a935d23434d9 139 // Read data bits (16+16)
Antulius 0:a935d23434d9 140 int16_t humidity = read_word();
Antulius 0:a935d23434d9 141 int16_t temp = read_word();
Antulius 0:a935d23434d9 142
Antulius 0:a935d23434d9 143 // Read checksum (8)
Antulius 0:a935d23434d9 144 uint8_t checksum = read_checksum();
Antulius 0:a935d23434d9 145
Antulius 0:a935d23434d9 146 data->humidity = (humidity);
Antulius 0:a935d23434d9 147 data->temp = (temp);
Antulius 0:a935d23434d9 148 data->checksum = checksum;
Antulius 0:a935d23434d9 149 }