Changed hts221 into Class.

Dependents:   WeatherSensor-Joe PAG-CourseWork-NicksEdits SOFT253_Assignment SOFT253_Assignment_V2 ... more

Fork of hts221 by Kyle Rodgers

Committer:
gillwei7
Date:
Fri Jan 30 08:49:01 2015 +0000
Revision:
0:030da9425166
Child:
1:da79e74eadd1
HTS221_library_Delta_Version1.0_20150130

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gillwei7 0:030da9425166 1 /* Copyright (c) 2009 Nordic Semiconductor. All Rights Reserved.
gillwei7 0:030da9425166 2 *
gillwei7 0:030da9425166 3 * The information contained herein is property of Nordic Semiconductor ASA.
gillwei7 0:030da9425166 4 * Terms and conditions of usage are described in detail in NORDIC
gillwei7 0:030da9425166 5 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
gillwei7 0:030da9425166 6 *
gillwei7 0:030da9425166 7 * Licensees are granted free, non-transferable use of the information. NO
gillwei7 0:030da9425166 8 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
gillwei7 0:030da9425166 9 * the file.
gillwei7 0:030da9425166 10 *df
gillwei7 0:030da9425166 11 */
gillwei7 0:030da9425166 12
gillwei7 0:030da9425166 13 #include <stdbool.h>
gillwei7 0:030da9425166 14 #include <stdint.h>
gillwei7 0:030da9425166 15
gillwei7 0:030da9425166 16 #include <mbed.h>
gillwei7 0:030da9425166 17 #include "hts221.h"
gillwei7 0:030da9425166 18
gillwei7 0:030da9425166 19 I2C i2c(p22, p20); //SDA, SCL
gillwei7 0:030da9425166 20
gillwei7 0:030da9425166 21
gillwei7 0:030da9425166 22 /*lint ++flb "Enter library region" */
gillwei7 0:030da9425166 23
gillwei7 0:030da9425166 24 // Gill
gillwei7 0:030da9425166 25
gillwei7 0:030da9425166 26
gillwei7 0:030da9425166 27 //
gillwei7 0:030da9425166 28
gillwei7 0:030da9425166 29 static const char expected_who_am_i = 0xBCU; //!< Expected value to get from WHO_AM_I register.
gillwei7 0:030da9425166 30
gillwei7 0:030da9425166 31 uint8_t H0_rH_x2;
gillwei7 0:030da9425166 32 uint8_t H1_rH_x2;
gillwei7 0:030da9425166 33 uint16_t T0_degC_x8;
gillwei7 0:030da9425166 34 uint16_t T1_degC_x8;
gillwei7 0:030da9425166 35
gillwei7 0:030da9425166 36 int16_t H0_T0_OUT;
gillwei7 0:030da9425166 37 int16_t H1_T0_OUT;
gillwei7 0:030da9425166 38 int16_t T0_OUT;
gillwei7 0:030da9425166 39 int16_t T1_OUT;
gillwei7 0:030da9425166 40
gillwei7 0:030da9425166 41 float T0_DegC_cal;
gillwei7 0:030da9425166 42 float T1_DegC_cal;
gillwei7 0:030da9425166 43 float H0_RH_cal;
gillwei7 0:030da9425166 44 float H1_RH_cal;
gillwei7 0:030da9425166 45
gillwei7 0:030da9425166 46 bool hts221_init(void)
gillwei7 0:030da9425166 47 {
gillwei7 0:030da9425166 48 bool transfer_succeeded = true;
gillwei7 0:030da9425166 49
gillwei7 0:030da9425166 50 i2c.frequency(400000);
gillwei7 0:030da9425166 51 hts221_register_write(0x10 , TRes_4 << 3 | HRes_5);
gillwei7 0:030da9425166 52 hts221_register_write(0x20 , PD_On | BDU_On | ODR_1Hz); // Control register 1
gillwei7 0:030da9425166 53 hts221_register_write(0x21 , NoBoot | HeaterOff | No_OS); // Control register 2
gillwei7 0:030da9425166 54 hts221_register_write(0x22 , DRDY_H | PP_OD_PP | DRDY_NON); // Control register 3
gillwei7 0:030da9425166 55
gillwei7 0:030da9425166 56 // Read and verify product ID
gillwei7 0:030da9425166 57 transfer_succeeded &= hts221_verify_product_id();
gillwei7 0:030da9425166 58
gillwei7 0:030da9425166 59 return transfer_succeeded;
gillwei7 0:030da9425166 60 }
gillwei7 0:030da9425166 61
gillwei7 0:030da9425166 62 bool hts221_verify_product_id(void)
gillwei7 0:030da9425166 63 {
gillwei7 0:030da9425166 64 char who_am_i[1];
gillwei7 0:030da9425166 65 hts221_register_read(ADDRESS_WHO_AM_I, &who_am_i[0], 1);
gillwei7 0:030da9425166 66 if (who_am_i[0] != expected_who_am_i) return false;
gillwei7 0:030da9425166 67 else return true;
gillwei7 0:030da9425166 68 }
gillwei7 0:030da9425166 69
gillwei7 0:030da9425166 70 void hts221_register_write(uint8_t register_address, uint8_t value)
gillwei7 0:030da9425166 71 {
gillwei7 0:030da9425166 72 char w2_data[2];
gillwei7 0:030da9425166 73
gillwei7 0:030da9425166 74 w2_data[0] = register_address;
gillwei7 0:030da9425166 75 w2_data[1] = value;
gillwei7 0:030da9425166 76 i2c.write(HTS221_WriteADDE, w2_data, 2);
gillwei7 0:030da9425166 77
gillwei7 0:030da9425166 78 }
gillwei7 0:030da9425166 79
gillwei7 0:030da9425166 80 void hts221_register_read(char register_address, char *destination, uint8_t number_of_bytes)
gillwei7 0:030da9425166 81 {
gillwei7 0:030da9425166 82 i2c.write(HTS221_WriteADDE, &register_address, 1, 1);
gillwei7 0:030da9425166 83 i2c.read(HTS221_WriteADDE, destination, number_of_bytes); //Note by Tsungta, API may have a bug
gillwei7 0:030da9425166 84
gillwei7 0:030da9425166 85 //runaboud read function added by Tsungta
gillwei7 0:030da9425166 86 /* if (number_of_bytes == 1) {
gillwei7 0:030da9425166 87 i2c.write(HTS221_WriteADDE, &register_address, 1, 1);
gillwei7 0:030da9425166 88 i2c.write(HTS221_ReadADDE);
gillwei7 0:030da9425166 89 *destination = i2c.read(0);
gillwei7 0:030da9425166 90 i2c.stop();
gillwei7 0:030da9425166 91 } else {
gillwei7 0:030da9425166 92 register_address |= 0x80;
gillwei7 0:030da9425166 93 i2c.write(HTS221_WriteADDE, &register_address, 1, 1);
gillwei7 0:030da9425166 94 i2c.write(HTS221_ReadADDE);
gillwei7 0:030da9425166 95 while (number_of_bytes-- > 0)
gillwei7 0:030da9425166 96 *destination++ = i2c.read(0);
gillwei7 0:030da9425166 97 i2c.stop();
gillwei7 0:030da9425166 98 }*/
gillwei7 0:030da9425166 99 }
gillwei7 0:030da9425166 100
gillwei7 0:030da9425166 101 void HTS221_Calib(void)
gillwei7 0:030da9425166 102 {
gillwei7 0:030da9425166 103 char cal_data[16];
gillwei7 0:030da9425166 104
gillwei7 0:030da9425166 105 hts221_register_read(0xB0, cal_data, 16);
gillwei7 0:030da9425166 106
gillwei7 0:030da9425166 107 H0_rH_x2 = cal_data[0];
gillwei7 0:030da9425166 108 H1_rH_x2 = cal_data[1];
gillwei7 0:030da9425166 109 T0_degC_x8 = ((cal_data[5] & 0x03) << 8) + cal_data[2]; //MSB + LSB in
gillwei7 0:030da9425166 110 T1_degC_x8 = ((cal_data[5] & 0x0C) << 6) + cal_data[3]; // MSB
gillwei7 0:030da9425166 111
gillwei7 0:030da9425166 112 H0_T0_OUT = (cal_data[7] << 8) + cal_data[6];
gillwei7 0:030da9425166 113 H1_T0_OUT = (cal_data[11] << 8) + cal_data[10];
gillwei7 0:030da9425166 114 T0_OUT = (cal_data[13] << 8) + cal_data[12];
gillwei7 0:030da9425166 115 T1_OUT = (cal_data[15] << 8) + cal_data[14];
gillwei7 0:030da9425166 116
gillwei7 0:030da9425166 117 // convert negative 2's complement values to native negative value
gillwei7 0:030da9425166 118 if (H0_T0_OUT&0x8000) H0_T0_OUT = -(0x8000-(0x7fff&H0_T0_OUT));
gillwei7 0:030da9425166 119 if (H1_T0_OUT&0x8000) H1_T0_OUT = -(0x8000-(0x7fff&H1_T0_OUT)); //((~H1_T0_OUT)+1);//
gillwei7 0:030da9425166 120 if (T0_OUT&0x8000) T0_OUT = -(0x8000-(0x7fff&T0_OUT));
gillwei7 0:030da9425166 121 if (T1_OUT&0x8000) T1_OUT = -(0x8000-(0x7fff&T1_OUT));
gillwei7 0:030da9425166 122
gillwei7 0:030da9425166 123 T0_DegC_cal = (float) T0_degC_x8/8;
gillwei7 0:030da9425166 124 T1_DegC_cal = (float) T1_degC_x8/8;
gillwei7 0:030da9425166 125 H0_RH_cal = (float) H0_rH_x2/2;
gillwei7 0:030da9425166 126 H1_RH_cal = (float) H1_rH_x2/2;
gillwei7 0:030da9425166 127
gillwei7 0:030da9425166 128 }
gillwei7 0:030da9425166 129
gillwei7 0:030da9425166 130 void HTS221_ReadTempHumi( float *pTemp , float *pHumi)
gillwei7 0:030da9425166 131 {
gillwei7 0:030da9425166 132 char sensor_data[4];
gillwei7 0:030da9425166 133 int16_t H_OUT;
gillwei7 0:030da9425166 134 int16_t T_OUT;
gillwei7 0:030da9425166 135
gillwei7 0:030da9425166 136 hts221_register_read(0xA8, sensor_data, 4);
gillwei7 0:030da9425166 137
gillwei7 0:030da9425166 138 H_OUT = (sensor_data[1] << 8) + sensor_data[0];
gillwei7 0:030da9425166 139 T_OUT = (sensor_data[3] << 8) + sensor_data[2];
gillwei7 0:030da9425166 140
gillwei7 0:030da9425166 141 // convert negative 2's complement values to native negative value
gillwei7 0:030da9425166 142 if (H_OUT&0x8000) H_OUT = -(0x8000-(0x7fff&H_OUT)); //((~H_OUT)+1);;
gillwei7 0:030da9425166 143 if (T_OUT&0x8000) T_OUT = -(0x8000-(0x7fff&T_OUT));
gillwei7 0:030da9425166 144
gillwei7 0:030da9425166 145 *pTemp = linear_interpolation(T0_OUT, T0_DegC_cal, T1_OUT, T1_DegC_cal, T_OUT);
gillwei7 0:030da9425166 146 *pHumi = linear_interpolation(H0_T0_OUT, H0_RH_cal, H1_T0_OUT, H1_RH_cal, H_OUT);
gillwei7 0:030da9425166 147 // Constraint for measurement after calibration
gillwei7 0:030da9425166 148 if ((int)*pHumi>MaxHumi-1 | (int)*pHumi==-72) *pHumi = MaxHumi;
gillwei7 0:030da9425166 149 if ((int)*pHumi<MinHumi ) *pHumi = MinHumi;
gillwei7 0:030da9425166 150 if ((int)*pTemp>MaxTemp-1) *pHumi = MaxTemp;
gillwei7 0:030da9425166 151 if ((int)*pHumi<MinTemp ) *pHumi = MinTemp ;
gillwei7 0:030da9425166 152 }
gillwei7 0:030da9425166 153
gillwei7 0:030da9425166 154 float linear_interpolation(int16_t x0, float y0, int16_t x1, float y1, float mes)
gillwei7 0:030da9425166 155 {
gillwei7 0:030da9425166 156 float a = (float) ((y1 - y0) / (x1 - x0));
gillwei7 0:030da9425166 157 float b = (float) -a*x0 + y0;
gillwei7 0:030da9425166 158 float cal = (float) a * mes + b;
gillwei7 0:030da9425166 159 return cal;
gillwei7 0:030da9425166 160 }
gillwei7 0:030da9425166 161
gillwei7 0:030da9425166 162 /*lint --flb "Leave library region" */
gillwei7 0:030da9425166 163