123

Dependencies:   mbed HTS221 LPS25HB

Files at this revision

API Documentation at this revision

Comitter:
Simon_mbed
Date:
Mon Apr 06 08:54:17 2020 +0000
Commit message:
13

Changed in this revision

HTS221.lib Show annotated file Show diff for this revision Revisions of this file
LPS25HB.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
readme.md Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HTS221.lib	Mon Apr 06 08:54:17 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/teams/ST/code/HTS221/#ccf7f36492ae
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LPS25HB.lib	Mon Apr 06 08:54:17 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mcm/code/LPS25HB/#c94efb61cefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Apr 06 08:54:17 2020 +0000
@@ -0,0 +1,51 @@
+#include "mbed.h"
+#include "HTS221Sensor.h"
+
+Serial pc(SERIAL_TX, SERIAL_RX);
+
+
+DigitalOut myled(LED1);
+DigitalOut led(LED1);
+
+DevI2C devi2c(I2C_SDA, I2C_SCL);
+
+HTS221Sensor hts221(&devi2c);
+
+
+int main()
+{
+    float hum = 0;
+    float temp = 0;
+    pc.baud(9600);
+    pc.printf("Hello World !\n");
+
+
+
+    HTS221_Init_st init_st;
+    init_st.avg_h = HTS221_AVGH_4;
+    init_st.avg_t = HTS221_AVGT_4;
+    init_st.odr = HTS221_ODR_1HZ;
+    init_st.bdu_status = HTS221_ENABLE;
+    init_st.heater_status = HTS221_ENABLE;
+    init_st.irq_level = HTS221_HIGH_LVL;
+    init_st.irq_output_type = HTS221_PUSHPULL;
+    init_st.irq_enable = HTS221_DISABLE;
+
+    int ret =  hts221.init(&init_st);
+
+    if(ret ==0) {
+        pc.printf("init succesed!");
+    }
+
+
+    hts221.enable();
+    while(1) {
+
+        hts221.get_humidity(&hum);
+        hts221.get_temperature(&temp);
+        
+        pc.printf("hum:%f temp:%f\r\n",hum,temp);
+        wait(1);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h	Mon Apr 06 08:54:17 2020 +0000
@@ -0,0 +1,8 @@
+#ifndef __MAIN__H
+#define __MAIN__H
+#include <stdint.h>
+
+uint8_t HAL_ReadReg(uint8_t addr, uint8_t RegAddr, uint8_t NumByteToRead,uint8_t* Data);
+uint8_t HAL_WriteReg(uint8_t addr, uint8_t RegAddr, uint8_t NumByteToRead,uint8_t* Data);
+
+#endif /* __MAIN__H */
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Apr 06 08:54:17 2020 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/7130f322cb7e
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/readme.md	Mon Apr 06 08:54:17 2020 +0000
@@ -0,0 +1,347 @@
+#include "mbed.h"
+#include "HTS221_driver.h"
+
+/*------------------------------------------------------------------------------
+Before to use this example, ensure that you an hyperterminal installed on your
+computer. More info here: https://developer.mbed.org/handbook/Terminals
+
+The default serial comm port uses the SERIAL_TX and SERIAL_RX pins (see their
+definition in the PinNames.h file).
+
+The default serial configuration in this case is 9600 bauds, 8-bit data, no parity
+
+If you want to change the baudrate for example, you have to redeclare the
+serial object in your code:
+
+Serial pc(SERIAL_TX, SERIAL_RX);
+
+Then, you can modify the baudrate and print like this:
+
+pc.baud(115200);
+pc.printf("Hello World !\n");
+------------------------------------------------------------------------------*/
+
+//https://www.cnblogs.com/zlbg/p/4216251.html
+
+DigitalOut myled(LED1);
+DigitalOut led(LED1);
+
+I2C i2c(I2C_SDA, I2C_SCL);
+HTS221Sensor hts221;
+char data_write[2];
+char data_read[4];
+
+
+float t0, t1, h0, h1;
+int t0out, t1out, h0out, h1out;
+
+int16_t outHumi = 0;
+int16_t outTemp = 0;
+
+float valueHumi = 0;
+float valueTemp = 0;
+
+
+
+float mapFloat(int x, int in_min, int in_max, float out_min, float out_max)
+{
+    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
+}
+
+
+void read_calidata0()
+{
+
+//Read Cali Data
+
+    //read out t0degCx8, t1degCx8
+    data_write[0] = HTS221_T0_DEGC_X8;
+    i2c.write(0xBE, data_write, 1, 1);
+    i2c.read(0xBF,data_read, 4, 0);
+
+
+
+
+    int t0degCx8 = ((data_read[3] & 0b00000011) << 8) | data_read[0];
+    int t1degCx8 = ((data_read[3] & 0b00001100) << 6) | data_read[1];
+    t0 = t0degCx8/8.0;
+    t1 = t1degCx8/8.0;
+
+    //read out t0out, t1out
+
+    data_write[0] = HTS221_T0_OUT_L |0x80;
+    i2c.write(0xBE, data_write, 1, 1);
+    i2c.read(0xBF,data_read, 4, 0);
+
+    t0out = (data_read[1] << 8) | data_read[0];
+    t1out = (data_read[3] << 8) | data_read[2];
+
+
+    //read out h0RHx2, h1RHx2
+    data_write[0] = HTS221_H0_RH_X2 |0x80;
+    i2c.write(0xBE, data_write, 1, 1);
+    i2c.read(0xBF,data_read, 2, 0);
+
+    unsigned char h0RHx2  =  data_read[0];
+    unsigned char h1RHx2  =  data_read[1];
+
+    h0 = h0RHx2/2.0;
+    h1 = h1RHx2/2.0;
+
+    //read out h0t0Out
+
+    data_write[0] = HTS221_H0_T0_OUT_L |0x80;
+    i2c.write(0xBE, data_write, 1, 1);
+    i2c.read(0xBF,data_read, 2, 0);
+
+    h0out   =  (data_read[1] << 8) | data_read[0];
+
+
+    //read out h1t0Out
+    data_write[0] = HTS221_H1_T0_OUT_L |0x80;
+    i2c.write(0xBE, data_write, 1, 1);
+    i2c.read(0xBF,data_read, 2, 0);
+
+    h1out   =  (data_read[1] << 8) | data_read[0];
+
+    //print the calibration coefficients
+    printf("Calibration coefficients: \r\n");
+    printf("t0 =%f `C t0out = %d \r\n",t0,t0out);
+    printf("t1 =%f `C t1out = %d \r\n",t1,t1out);
+    printf("h0 =%f RH h0out = %d \r\n",h0,h0out);
+    printf("h1 =%f RH h1out = %d \r\n",h1,h1out);
+    printf("------------------------\r\n");
+
+}
+
+HTS221_Error_et HTS221_Get_Temperature1(int16_t *value)
+{
+    int16_t T0_out,T1_out,T_out,T0_degC_x8_u16,T1_degC_x8_u16;
+    int16_t T0_degC, T1_degC;
+    uint8_t buffer[4], tmp;
+    uint32_t tmp32;
+
+    /*1. Read from 0x32 & 0x33 registers the value of coefficients T0_d egC_x8 and T1_de gC_x8*/
+    data_write[0] = HTS221_T0_DEGC_X8;
+    i2c.write(0xBE, data_write, 1, 1);
+    i2c.read(0xBF,(char*)buffer, 2, 0);
+
+    /*2. Read from 0x35 register the value of the MSB bits of T1_deg C and T0_deg C */
+    data_write[0] = HTS221_T0_T1_DEGC_H2;
+    i2c.write(0xBE, data_write, 1, 1);
+    i2c.read(0xBF,(char*)&tmp, 1, 0);
+
+    /*Calculate the T0_deg C and T1_deg C values*/
+
+    T0_degC_x8_u16 = (((uint16_t)(tmp & 0x03)) << 8) | ((uint16_t)buffer[0]);
+    T1_degC_x8_u16 = (((uint16_t)(tmp & 0x0C)) << 6) | ((uint16_t)buffer[1]);
+    T0_degC = T0_degC_x8_u16>>3;
+    T1_degC = T1_degC_x8_u16>>3;
+
+    /*3. Read from 0x3C & 0x3D registers the value of T0_OUT*/
+    /*4. Read from 0x3E & 0x3F registers the value of T1_OUT*/
+
+    data_write[0] = HTS221_T0_OUT_L |0x80;
+    i2c.write(0xBE, data_write, 1, 1);
+    i2c.read(0xBF,(char*)buffer, 4, 0);
+
+    T0_out = (((uint16_t)buffer[1])<<8) | (uint16_t)buffer[0];
+    T1_out = (((uint16_t)buffer[3])<<8) | (uint16_t)buffer[2];
+
+    /* 5.Read from 0x2A & 0x2B registers the value T_OUT (ADC _OUT).*/
+
+    data_write[0] = HTS221_TEMP_OUT_L_REG;
+    i2c.write(0xBE, data_write, 1, 1);
+    i2c.read(0xBF,(char*)buffer, 2, 0);
+
+    T_out = (((uint16_t)buffer[1])<<8) | (uint16_t)buffer[0];
+
+    /* 6. Compute the Temperature value by linea r interpolation*/
+    tmp32 = ((uint32_t)(T_out - T0_out)) * ((uint32_t)(T1_degC - T0_degC)*10);
+    *value = tmp32 /(T1_out - T0_out) + T0_degC*10;
+
+    return HTS221_OK;
+
+
+}
+
+int main()
+{
+    HTS221_Error_et ret;
+    uint8_t deviceid;
+    
+    HTS221_Get_DeviceID(&deviceid);
+
+    HTS221_Init_st init_st;
+    init_st.avg_h = HTS221_AVGH_4;
+    init_st.avg_t = HTS221_AVGT_4;
+    init_st.odr = HTS221_ODR_1HZ;
+    init_st.bdu_status = HTS221_ENABLE;
+    init_st.heater_status = HTS221_ENABLE;
+    init_st.irq_level = HTS221_HIGH_LVL;
+    init_st.irq_output_type = HTS221_PUSHPULL;
+    init_st.irq_enable = HTS221_DISABLE;
+
+    HTS221_Set_InitConfig(&init_st);
+
+
+
+    if(deviceid != HTS221_WHO_AM_I_VAL) {
+        printf("HTS221 Not Found!\r\n");
+        while(1) {
+            myled=!myled;
+            wait(0.2);
+        }
+    } else {
+        printf("HTS221 Has Found!\r\n");
+    }
+
+    HTS221_Activate();
+
+
+
+    HTS221_BitStatus_et mode;
+    HTS221_Get_PowerDownMode(&mode);
+    if(mode == HTS221_SET) {
+        printf("HTS221 in power down mode\r\n");
+
+        ret = HTS221_Set_PowerDownMode(HTS221_RESET);
+        if(ret != HTS221_OK) {
+            printf("HTS221_Set_PowerDownMode failed");
+        }
+    }
+    HTS221_Get_PowerDownMode(&mode);
+    if(mode == HTS221_SET) {
+        printf("HTS221 in power down mode\r\n");
+
+        ret = HTS221_Set_PowerDownMode(HTS221_RESET);
+        if(ret != HTS221_OK) {
+            printf("HTS221_Set_PowerDownMode failed");
+        }
+    }
+
+    HTS221_Set_BduMode(HTS221_DISABLE);
+
+    uint16_t humidity;
+    int16_t temperature;
+    uint16_t humi;
+    int16_t temp;
+    int16_t temp2;
+
+
+
+    HTS221_DrdyLevel_et level = HTS221_LOW_LVL ;
+
+    printf("pre level=%02x\r\n",level);
+
+    HTS221_Set_IrqActiveLevel(HTS221_HIGH_LVL);
+
+
+    HTS221_Get_IrqActiveLevel(&level);
+
+    printf("aft level=%d\r\n",level);
+
+
+    //  while(1) {
+//    HTS221_StartOneShotMeasurement();
+//
+//    ret = HTS221_Get_Measurement(&humidity,&temperature);
+//    if(ret==HTS221_OK){
+//        printf("humidity:%d%%,temperature:%dC\r\n",humidity/10,temperature/10);
+//    }else
+//    {
+//        printf("GET Measurement failed\r\n");
+//    }
+//    ret = HTS221_Get_Humidity(&humi);
+//      if(ret==HTS221_OK){
+//        printf("humi:%d\r\n",humi);
+//    }else
+//    {
+//        printf("GET humi failed\r\n");
+//    }
+//
+//    ret = HTS221_Get_Temperature(&temp);
+//    if(ret==HTS221_OK){
+//        printf("temp:%d\r\n",temp);
+//    }else
+//    {
+//        printf("GET temp failed\r\n");
+//    }
+//
+//
+//
+//     ret = HTS221_Get_Temperature1(&temp2);
+//
+//    if(ret==HTS221_OK){
+//        printf("temp2:%d\r\n",temp2);
+//    }else
+//    {
+//        printf("GET temp2 failed\r\n");
+//    }
+//
+//
+//    wait(1);
+//    }
+
+
+
+    //Find the HTS221
+    data_write[0] = HTS221_WHO_AM_I_REG;
+    i2c.write(0xBE, data_write, 1, 1);
+    i2c.read(0xBF,data_read, 1, 0);
+
+
+    //turn on the HTS221, set the update mode to one shot
+    data_write[0] = HTS221_CTRL_REG1;
+    data_write[1] = 0x84;
+    int status = i2c.write(0xBE, data_write, 2, 0);
+    if(status!=0) {
+        while(1) {
+            myled=!myled;
+            wait(0.2);
+        }
+    }
+
+    read_calidata0();
+
+
+    while(1) {
+        //perform a measurement
+        data_write[0] = HTS221_CTRL_REG2;
+        data_write[1] = 0x01;
+        i2c.write(0xBE, data_write, 2, 0);
+        //check the status
+        status = 0;
+        while (status != 0x03) { //typical conversition time: 3ms
+
+
+            wait(0.3);
+            data_write[0] = HTS221_STATUS_REG;
+            i2c.write(0xBE, data_write, 1, 0);
+            i2c.read(0xBF,data_read, 1, 0);
+            status = data_read[0];
+
+            wait(0.1);
+//            printf("status:%d\r\n",status);
+        }
+
+        //read multiple bytes incrementing the register address
+
+        data_write[0] = HTS221_HR_OUT_L_REG |0x80;
+        i2c.write(0xBE, data_write, 1, 1);
+        i2c.read(0xBF,data_read, 4, 0);
+
+        outHumi = (data_read[1] << 8) | data_read[0];
+        outTemp = (data_read[3] << 8) | data_read[2];
+
+        valueTemp = mapFloat(outTemp, t0out, t1out, t0, t1);
+        valueHumi = mapFloat(outHumi, h0out, h1out, h0, h1);
+
+        printf("Temp:%f `C Humi:%f RH \r\n",valueTemp,valueHumi);
+
+
+
+        led = !led; // Toggle LED
+        wait(3); // 1 second
+    }
+}