Ian Molesworth / SHT75

Dependents:   temp xj-Nucleo-F303K8-SHT75-TEST

Committer:
nimbusgb
Date:
Wed Oct 27 15:27:38 2010 +0000
Revision:
0:f401474a3e96
0.8

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nimbusgb 0:f401474a3e96 1 //
nimbusgb 0:f401474a3e96 2 // Ian Molesworth October 2010
nimbusgb 0:f401474a3e96 3 // SHT 75 class
nimbusgb 0:f401474a3e96 4 //
nimbusgb 0:f401474a3e96 5 //
nimbusgb 0:f401474a3e96 6 // To do:
nimbusgb 0:f401474a3e96 7 //
nimbusgb 0:f401474a3e96 8 //
nimbusgb 0:f401474a3e96 9
nimbusgb 0:f401474a3e96 10 #include "sht75.h"
nimbusgb 0:f401474a3e96 11
nimbusgb 0:f401474a3e96 12 void SHT75::reset()
nimbusgb 0:f401474a3e96 13 {
nimbusgb 0:f401474a3e96 14 _data.output();
nimbusgb 0:f401474a3e96 15 _data = 1; // data bus high
nimbusgb 0:f401474a3e96 16 for (int i=0;i<12;i++)
nimbusgb 0:f401474a3e96 17 {
nimbusgb 0:f401474a3e96 18 _clock = 1; // clock high
nimbusgb 0:f401474a3e96 19 wait_us(1);
nimbusgb 0:f401474a3e96 20 _clock = 0; // clock lo
nimbusgb 0:f401474a3e96 21 wait_us(1);
nimbusgb 0:f401474a3e96 22 }
nimbusgb 0:f401474a3e96 23 _clock = 1; // clock high
nimbusgb 0:f401474a3e96 24 wait_us(1);
nimbusgb 0:f401474a3e96 25 _data = 0;
nimbusgb 0:f401474a3e96 26 wait_us(1);
nimbusgb 0:f401474a3e96 27 _clock = 0; // clock lo
nimbusgb 0:f401474a3e96 28 wait_us(1);
nimbusgb 0:f401474a3e96 29 _clock = 1;
nimbusgb 0:f401474a3e96 30 wait_us(1);
nimbusgb 0:f401474a3e96 31 _data = 1;
nimbusgb 0:f401474a3e96 32 wait_us(1);
nimbusgb 0:f401474a3e96 33 _clock = 0;
nimbusgb 0:f401474a3e96 34 wait_us(1);
nimbusgb 0:f401474a3e96 35 }
nimbusgb 0:f401474a3e96 36
nimbusgb 0:f401474a3e96 37 void SHT75::softReset(void)
nimbusgb 0:f401474a3e96 38 {
nimbusgb 0:f401474a3e96 39 _data.output();
nimbusgb 0:f401474a3e96 40 start();
nimbusgb 0:f401474a3e96 41 write(0x1E);
nimbusgb 0:f401474a3e96 42 wait_ms(12);
nimbusgb 0:f401474a3e96 43 }
nimbusgb 0:f401474a3e96 44
nimbusgb 0:f401474a3e96 45 void SHT75::start(void)
nimbusgb 0:f401474a3e96 46 {
nimbusgb 0:f401474a3e96 47 _data.output();
nimbusgb 0:f401474a3e96 48 _clock = 1;
nimbusgb 0:f401474a3e96 49 wait_us(1);
nimbusgb 0:f401474a3e96 50 _data = 0;
nimbusgb 0:f401474a3e96 51 wait_us(1);
nimbusgb 0:f401474a3e96 52 _clock = 0;
nimbusgb 0:f401474a3e96 53 wait_us(1);
nimbusgb 0:f401474a3e96 54 _clock = 1;
nimbusgb 0:f401474a3e96 55 wait_us(1);
nimbusgb 0:f401474a3e96 56 _data = 1;
nimbusgb 0:f401474a3e96 57 wait_us(1);
nimbusgb 0:f401474a3e96 58 _clock = 0;
nimbusgb 0:f401474a3e96 59 }
nimbusgb 0:f401474a3e96 60
nimbusgb 0:f401474a3e96 61 int SHT75::readStatus(void)
nimbusgb 0:f401474a3e96 62 {
nimbusgb 0:f401474a3e96 63 int status;
nimbusgb 0:f401474a3e96 64 status = -1;
nimbusgb 0:f401474a3e96 65 start();
nimbusgb 0:f401474a3e96 66 if (write(0x06) == 0)
nimbusgb 0:f401474a3e96 67 status = read(1); // read with a wait for ack
nimbusgb 0:f401474a3e96 68 read(0); // read without the wait
nimbusgb 0:f401474a3e96 69 return status;
nimbusgb 0:f401474a3e96 70 }
nimbusgb 0:f401474a3e96 71
nimbusgb 0:f401474a3e96 72 bool SHT75::write(char d)
nimbusgb 0:f401474a3e96 73 {
nimbusgb 0:f401474a3e96 74 auto int i;
nimbusgb 0:f401474a3e96 75 _data.output(); // bus output
nimbusgb 0:f401474a3e96 76 // Writes char and returns -1 if no ACK was sent from remote
nimbusgb 0:f401474a3e96 77 for (i=0;i<8;i++)
nimbusgb 0:f401474a3e96 78 {
nimbusgb 0:f401474a3e96 79 if (d & 0x80)
nimbusgb 0:f401474a3e96 80 _data = 1; // data high
nimbusgb 0:f401474a3e96 81 else
nimbusgb 0:f401474a3e96 82 _data = 0; // data lo
nimbusgb 0:f401474a3e96 83 // shift the data
nimbusgb 0:f401474a3e96 84 d <<= 1;
nimbusgb 0:f401474a3e96 85 wait_us(1);
nimbusgb 0:f401474a3e96 86 _clock = 1; // clock high
nimbusgb 0:f401474a3e96 87 wait_us(1);
nimbusgb 0:f401474a3e96 88 _clock = 0; // clock lo
nimbusgb 0:f401474a3e96 89 }
nimbusgb 0:f401474a3e96 90 _data.input(); // float the bus
nimbusgb 0:f401474a3e96 91 wait_us(1);
nimbusgb 0:f401474a3e96 92 _clock = 1; // clock high
nimbusgb 0:f401474a3e96 93 wait_us(1);
nimbusgb 0:f401474a3e96 94 i = _data;
nimbusgb 0:f401474a3e96 95 _clock = 0; // clock lo
nimbusgb 0:f401474a3e96 96 return i; // leave the bus in input mode and return the status of the ack bit read.
nimbusgb 0:f401474a3e96 97 }
nimbusgb 0:f401474a3e96 98
nimbusgb 0:f401474a3e96 99 int SHT75::read(char ack)
nimbusgb 0:f401474a3e96 100 {
nimbusgb 0:f401474a3e96 101 auto int i,s;
nimbusgb 0:f401474a3e96 102 auto char c;
nimbusgb 0:f401474a3e96 103 s = 0;
nimbusgb 0:f401474a3e96 104 _data.input(); // bus to input
nimbusgb 0:f401474a3e96 105
nimbusgb 0:f401474a3e96 106 for (i=0;i<8;i++)
nimbusgb 0:f401474a3e96 107 {
nimbusgb 0:f401474a3e96 108 s <<= 1;
nimbusgb 0:f401474a3e96 109 wait_us(1);
nimbusgb 0:f401474a3e96 110 _clock = 1; // clock high
nimbusgb 0:f401474a3e96 111 wait_us(1);
nimbusgb 0:f401474a3e96 112 c = _data; // get the data bit
nimbusgb 0:f401474a3e96 113 _clock = 0; // clock lo
nimbusgb 0:f401474a3e96 114 if ( c )
nimbusgb 0:f401474a3e96 115 s |= 1;
nimbusgb 0:f401474a3e96 116 }
nimbusgb 0:f401474a3e96 117
nimbusgb 0:f401474a3e96 118 if (ack == 1)
nimbusgb 0:f401474a3e96 119 _data = 0; // data lo
nimbusgb 0:f401474a3e96 120 else
nimbusgb 0:f401474a3e96 121 _data = 1; // data hi
nimbusgb 0:f401474a3e96 122 _data.output();
nimbusgb 0:f401474a3e96 123 _clock = 1; // clock lo
nimbusgb 0:f401474a3e96 124 wait_us(1);
nimbusgb 0:f401474a3e96 125 _clock = 0; // clock lo
nimbusgb 0:f401474a3e96 126 _data = 1; // data hi
nimbusgb 0:f401474a3e96 127 _data.input();
nimbusgb 0:f401474a3e96 128 return s;
nimbusgb 0:f401474a3e96 129 }
nimbusgb 0:f401474a3e96 130
nimbusgb 0:f401474a3e96 131
nimbusgb 0:f401474a3e96 132 // Put the current temperature into passed variable
nimbusgb 0:f401474a3e96 133 bool SHT75::readTempTicks(int* temp)
nimbusgb 0:f401474a3e96 134 {
nimbusgb 0:f401474a3e96 135 int v, value;
nimbusgb 0:f401474a3e96 136 start(); // Start a tx ( leaves data as input )
nimbusgb 0:f401474a3e96 137 if (write(0x03) == 0) // send the read command and get an ack
nimbusgb 0:f401474a3e96 138 {
nimbusgb 0:f401474a3e96 139 for (v=0; v<50; v ++) // wait for ready up to 500 ms
nimbusgb 0:f401474a3e96 140 {
nimbusgb 0:f401474a3e96 141 wait_ms(10); // 10 ms pause
nimbusgb 0:f401474a3e96 142 if ( _data == 0 ) //
nimbusgb 0:f401474a3e96 143 {
nimbusgb 0:f401474a3e96 144 value = read(1); // read a byte
nimbusgb 0:f401474a3e96 145 value <<= 8; // shift it in
nimbusgb 0:f401474a3e96 146 value |= read(1); // read another byte
nimbusgb 0:f401474a3e96 147 read(0);
nimbusgb 0:f401474a3e96 148 // transfer the value
nimbusgb 0:f401474a3e96 149 *temp = value;
nimbusgb 0:f401474a3e96 150 reset();
nimbusgb 0:f401474a3e96 151 return true;
nimbusgb 0:f401474a3e96 152 }
nimbusgb 0:f401474a3e96 153 }
nimbusgb 0:f401474a3e96 154 }
nimbusgb 0:f401474a3e96 155 return false;
nimbusgb 0:f401474a3e96 156 }
nimbusgb 0:f401474a3e96 157
nimbusgb 0:f401474a3e96 158 bool SHT75::readHumidityTicks(int* humi)
nimbusgb 0:f401474a3e96 159 {
nimbusgb 0:f401474a3e96 160 start();
nimbusgb 0:f401474a3e96 161 if (write(0x05) == 0)
nimbusgb 0:f401474a3e96 162 {
nimbusgb 0:f401474a3e96 163 for (int value=0; value<50; value ++) // wait for ready up to 500 ms
nimbusgb 0:f401474a3e96 164 {
nimbusgb 0:f401474a3e96 165 wait_ms(10); //
nimbusgb 0:f401474a3e96 166 if ( _data == 0 ) //
nimbusgb 0:f401474a3e96 167 {
nimbusgb 0:f401474a3e96 168 value = read(1);
nimbusgb 0:f401474a3e96 169 value <<= 8;
nimbusgb 0:f401474a3e96 170 value |= read(1);
nimbusgb 0:f401474a3e96 171 read(0);
nimbusgb 0:f401474a3e96 172 *humi = value; // transfer the value
nimbusgb 0:f401474a3e96 173 reset();
nimbusgb 0:f401474a3e96 174 return true;
nimbusgb 0:f401474a3e96 175 }
nimbusgb 0:f401474a3e96 176 }
nimbusgb 0:f401474a3e96 177 }
nimbusgb 0:f401474a3e96 178
nimbusgb 0:f401474a3e96 179 return false;
nimbusgb 0:f401474a3e96 180 }