Changed hts221 into Class.

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

Fork of hts221 by Kyle Rodgers

Committer:
kylerodgers
Date:
Fri Jul 24 15:21:28 2015 +0000
Revision:
1:da79e74eadd1
Parent:
0:030da9425166
Child:
2:6d7166d49741
Changed into Class

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
kylerodgers 1:da79e74eadd1 19 HTS221::HTS221 (PinName sda, PinName scl) : _i2c(sda, scl)
kylerodgers 1:da79e74eadd1 20 {
kylerodgers 1:da79e74eadd1 21 init();
kylerodgers 1:da79e74eadd1 22 calib();
kylerodgers 1:da79e74eadd1 23 }
gillwei7 0:030da9425166 24
kylerodgers 1:da79e74eadd1 25 bool HTS221::init(void)
gillwei7 0:030da9425166 26 {
gillwei7 0:030da9425166 27 bool transfer_succeeded = true;
gillwei7 0:030da9425166 28
kylerodgers 1:da79e74eadd1 29 _i2c.frequency(400000);
kylerodgers 1:da79e74eadd1 30 register_write(0x10 , TRes_4 << 3 | HRes_5);
kylerodgers 1:da79e74eadd1 31 register_write(0x20 , PD_On | BDU_On | ODR_1Hz); // Control register 1
kylerodgers 1:da79e74eadd1 32 register_write(0x21 , NoBoot | HeaterOff | No_OS); // Control register 2
kylerodgers 1:da79e74eadd1 33 register_write(0x22 , DRDY_H | PP_OD_PP | DRDY_NON); // Control register 3
gillwei7 0:030da9425166 34
gillwei7 0:030da9425166 35 // Read and verify product ID
kylerodgers 1:da79e74eadd1 36 transfer_succeeded &= verify_product_id();
gillwei7 0:030da9425166 37
gillwei7 0:030da9425166 38 return transfer_succeeded;
gillwei7 0:030da9425166 39 }
gillwei7 0:030da9425166 40
kylerodgers 1:da79e74eadd1 41 bool HTS221::verify_product_id(void)
gillwei7 0:030da9425166 42 {
gillwei7 0:030da9425166 43 char who_am_i[1];
kylerodgers 1:da79e74eadd1 44 register_read(ADDRESS_WHO_AM_I, &who_am_i[0], 1);
gillwei7 0:030da9425166 45 if (who_am_i[0] != expected_who_am_i) return false;
gillwei7 0:030da9425166 46 else return true;
gillwei7 0:030da9425166 47 }
gillwei7 0:030da9425166 48
kylerodgers 1:da79e74eadd1 49 void HTS221::register_write(uint8_t register_address, uint8_t value)
gillwei7 0:030da9425166 50 {
gillwei7 0:030da9425166 51 char w2_data[2];
gillwei7 0:030da9425166 52
gillwei7 0:030da9425166 53 w2_data[0] = register_address;
gillwei7 0:030da9425166 54 w2_data[1] = value;
kylerodgers 1:da79e74eadd1 55 _i2c.write(HTS221_WriteADDE, w2_data, 2);
gillwei7 0:030da9425166 56
gillwei7 0:030da9425166 57 }
gillwei7 0:030da9425166 58
kylerodgers 1:da79e74eadd1 59 void HTS221::register_read(char register_address, char *destination, uint8_t number_of_bytes)
gillwei7 0:030da9425166 60 {
kylerodgers 1:da79e74eadd1 61 _i2c.write(HTS221_WriteADDE, &register_address, 1, 1);
kylerodgers 1:da79e74eadd1 62 _i2c.read(HTS221_WriteADDE, destination, number_of_bytes); //Note by Tsungta, API may have a bug
gillwei7 0:030da9425166 63
gillwei7 0:030da9425166 64 //runaboud read function added by Tsungta
gillwei7 0:030da9425166 65 /* if (number_of_bytes == 1) {
gillwei7 0:030da9425166 66 i2c.write(HTS221_WriteADDE, &register_address, 1, 1);
gillwei7 0:030da9425166 67 i2c.write(HTS221_ReadADDE);
gillwei7 0:030da9425166 68 *destination = i2c.read(0);
gillwei7 0:030da9425166 69 i2c.stop();
gillwei7 0:030da9425166 70 } else {
gillwei7 0:030da9425166 71 register_address |= 0x80;
gillwei7 0:030da9425166 72 i2c.write(HTS221_WriteADDE, &register_address, 1, 1);
gillwei7 0:030da9425166 73 i2c.write(HTS221_ReadADDE);
gillwei7 0:030da9425166 74 while (number_of_bytes-- > 0)
gillwei7 0:030da9425166 75 *destination++ = i2c.read(0);
gillwei7 0:030da9425166 76 i2c.stop();
gillwei7 0:030da9425166 77 }*/
gillwei7 0:030da9425166 78 }
gillwei7 0:030da9425166 79
kylerodgers 1:da79e74eadd1 80 void HTS221::calib(void)
gillwei7 0:030da9425166 81 {
gillwei7 0:030da9425166 82 char cal_data[16];
gillwei7 0:030da9425166 83
kylerodgers 1:da79e74eadd1 84 register_read(0xB0, cal_data, 16);
gillwei7 0:030da9425166 85
gillwei7 0:030da9425166 86 H0_rH_x2 = cal_data[0];
gillwei7 0:030da9425166 87 H1_rH_x2 = cal_data[1];
gillwei7 0:030da9425166 88 T0_degC_x8 = ((cal_data[5] & 0x03) << 8) + cal_data[2]; //MSB + LSB in
gillwei7 0:030da9425166 89 T1_degC_x8 = ((cal_data[5] & 0x0C) << 6) + cal_data[3]; // MSB
gillwei7 0:030da9425166 90
gillwei7 0:030da9425166 91 H0_T0_OUT = (cal_data[7] << 8) + cal_data[6];
gillwei7 0:030da9425166 92 H1_T0_OUT = (cal_data[11] << 8) + cal_data[10];
gillwei7 0:030da9425166 93 T0_OUT = (cal_data[13] << 8) + cal_data[12];
gillwei7 0:030da9425166 94 T1_OUT = (cal_data[15] << 8) + cal_data[14];
gillwei7 0:030da9425166 95
gillwei7 0:030da9425166 96 // convert negative 2's complement values to native negative value
gillwei7 0:030da9425166 97 if (H0_T0_OUT&0x8000) H0_T0_OUT = -(0x8000-(0x7fff&H0_T0_OUT));
gillwei7 0:030da9425166 98 if (H1_T0_OUT&0x8000) H1_T0_OUT = -(0x8000-(0x7fff&H1_T0_OUT)); //((~H1_T0_OUT)+1);//
gillwei7 0:030da9425166 99 if (T0_OUT&0x8000) T0_OUT = -(0x8000-(0x7fff&T0_OUT));
gillwei7 0:030da9425166 100 if (T1_OUT&0x8000) T1_OUT = -(0x8000-(0x7fff&T1_OUT));
gillwei7 0:030da9425166 101
gillwei7 0:030da9425166 102 T0_DegC_cal = (float) T0_degC_x8/8;
gillwei7 0:030da9425166 103 T1_DegC_cal = (float) T1_degC_x8/8;
gillwei7 0:030da9425166 104 H0_RH_cal = (float) H0_rH_x2/2;
gillwei7 0:030da9425166 105 H1_RH_cal = (float) H1_rH_x2/2;
gillwei7 0:030da9425166 106
gillwei7 0:030da9425166 107 }
gillwei7 0:030da9425166 108
kylerodgers 1:da79e74eadd1 109 void HTS221::ReadTempHumi( float *pTemp , float *pHumi)
gillwei7 0:030da9425166 110 {
gillwei7 0:030da9425166 111 char sensor_data[4];
gillwei7 0:030da9425166 112 int16_t H_OUT;
gillwei7 0:030da9425166 113 int16_t T_OUT;
gillwei7 0:030da9425166 114
kylerodgers 1:da79e74eadd1 115 register_read(0xA8, sensor_data, 4);
gillwei7 0:030da9425166 116
gillwei7 0:030da9425166 117 H_OUT = (sensor_data[1] << 8) + sensor_data[0];
gillwei7 0:030da9425166 118 T_OUT = (sensor_data[3] << 8) + sensor_data[2];
gillwei7 0:030da9425166 119
gillwei7 0:030da9425166 120 // convert negative 2's complement values to native negative value
gillwei7 0:030da9425166 121 if (H_OUT&0x8000) H_OUT = -(0x8000-(0x7fff&H_OUT)); //((~H_OUT)+1);;
gillwei7 0:030da9425166 122 if (T_OUT&0x8000) T_OUT = -(0x8000-(0x7fff&T_OUT));
gillwei7 0:030da9425166 123
gillwei7 0:030da9425166 124 *pTemp = linear_interpolation(T0_OUT, T0_DegC_cal, T1_OUT, T1_DegC_cal, T_OUT);
gillwei7 0:030da9425166 125 *pHumi = linear_interpolation(H0_T0_OUT, H0_RH_cal, H1_T0_OUT, H1_RH_cal, H_OUT);
gillwei7 0:030da9425166 126 // Constraint for measurement after calibration
gillwei7 0:030da9425166 127 if ((int)*pHumi>MaxHumi-1 | (int)*pHumi==-72) *pHumi = MaxHumi;
gillwei7 0:030da9425166 128 if ((int)*pHumi<MinHumi ) *pHumi = MinHumi;
gillwei7 0:030da9425166 129 if ((int)*pTemp>MaxTemp-1) *pHumi = MaxTemp;
gillwei7 0:030da9425166 130 if ((int)*pHumi<MinTemp ) *pHumi = MinTemp ;
gillwei7 0:030da9425166 131 }
gillwei7 0:030da9425166 132
kylerodgers 1:da79e74eadd1 133 float HTS221::linear_interpolation(int16_t x0, float y0, int16_t x1, float y1, float mes)
gillwei7 0:030da9425166 134 {
gillwei7 0:030da9425166 135 float a = (float) ((y1 - y0) / (x1 - x0));
gillwei7 0:030da9425166 136 float b = (float) -a*x0 + y0;
gillwei7 0:030da9425166 137 float cal = (float) a * mes + b;
gillwei7 0:030da9425166 138 return cal;
kylerodgers 1:da79e74eadd1 139 }