Test program for HP03SA pressure and altitude sensor and for LM77 temperature sensor. Both devices use and I2C interface.
Dependencies: HP03SA LM77 mbed
main.cpp@0:ab21c5466a81, 2015-01-10 (annotated)
- Committer:
- wim
- Date:
- Sat Jan 10 19:16:46 2015 +0000
- Revision:
- 0:ab21c5466a81
Test program for HP03SA pressure and altitude sensor and for LM77 temperature sensor. The devices use an I2C interface.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wim | 0:ab21c5466a81 | 1 | /* mbed HP03SA I2C Pressure and Temperature sensor Test |
wim | 0:ab21c5466a81 | 2 | * LM77 Temperature sensor Test |
wim | 0:ab21c5466a81 | 3 | * |
wim | 0:ab21c5466a81 | 4 | * Copyright (c) 2015 Wim Huiskamp |
wim | 0:ab21c5466a81 | 5 | * Released under the MIT License: http://mbed.org/license/mit |
wim | 0:ab21c5466a81 | 6 | * |
wim | 0:ab21c5466a81 | 7 | * version 0.1 Initial Release |
wim | 0:ab21c5466a81 | 8 | */ |
wim | 0:ab21c5466a81 | 9 | #define PCF8593_TST 0 |
wim | 0:ab21c5466a81 | 10 | #define LM77_TST 1 |
wim | 0:ab21c5466a81 | 11 | #define HP03SA_TST 1 |
wim | 0:ab21c5466a81 | 12 | |
wim | 0:ab21c5466a81 | 13 | #include "mbed.h" |
wim | 0:ab21c5466a81 | 14 | |
wim | 0:ab21c5466a81 | 15 | #if (HP03SA_TST == 1) |
wim | 0:ab21c5466a81 | 16 | #include "HP03SA.h" |
wim | 0:ab21c5466a81 | 17 | #endif |
wim | 0:ab21c5466a81 | 18 | |
wim | 0:ab21c5466a81 | 19 | #if (LM77_TST == 1) |
wim | 0:ab21c5466a81 | 20 | #include "LM77.h" |
wim | 0:ab21c5466a81 | 21 | #endif |
wim | 0:ab21c5466a81 | 22 | |
wim | 0:ab21c5466a81 | 23 | //Pin Defines for I2C Bus |
wim | 0:ab21c5466a81 | 24 | #define D_SDA p9 |
wim | 0:ab21c5466a81 | 25 | #define D_SCL p10 |
wim | 0:ab21c5466a81 | 26 | //#define D_SDA p28 |
wim | 0:ab21c5466a81 | 27 | //#define D_SCL p27 |
wim | 0:ab21c5466a81 | 28 | I2C i2c(D_SDA, D_SCL); |
wim | 0:ab21c5466a81 | 29 | |
wim | 0:ab21c5466a81 | 30 | //Pin Defines for XCLR |
wim | 0:ab21c5466a81 | 31 | #define D_XCLR p11 |
wim | 0:ab21c5466a81 | 32 | |
wim | 0:ab21c5466a81 | 33 | //Host PC Baudrate (Virtual Com Port on USB) |
wim | 0:ab21c5466a81 | 34 | #define D_BAUDRATE 9600 |
wim | 0:ab21c5466a81 | 35 | //#define D_BAUDRATE 57600 |
wim | 0:ab21c5466a81 | 36 | |
wim | 0:ab21c5466a81 | 37 | // mbed Interface Hardware definitions |
wim | 0:ab21c5466a81 | 38 | DigitalOut myled1(LED1); |
wim | 0:ab21c5466a81 | 39 | DigitalOut myled2(LED2); |
wim | 0:ab21c5466a81 | 40 | DigitalOut myled3(LED3); |
wim | 0:ab21c5466a81 | 41 | DigitalOut heartbeatLED(LED4); |
wim | 0:ab21c5466a81 | 42 | |
wim | 0:ab21c5466a81 | 43 | // Host PC Communication channels |
wim | 0:ab21c5466a81 | 44 | Serial pc(USBTX, USBRX); // tx, rx |
wim | 0:ab21c5466a81 | 45 | |
wim | 0:ab21c5466a81 | 46 | #if (HP03SA_TST == 1) |
wim | 0:ab21c5466a81 | 47 | // Generate the 32kHz master clock for HP03SA |
wim | 0:ab21c5466a81 | 48 | PwmOut mclk(p21); |
wim | 0:ab21c5466a81 | 49 | |
wim | 0:ab21c5466a81 | 50 | // Instantiate HP03SA |
wim | 0:ab21c5466a81 | 51 | HP03SA hp03sa(&i2c, D_XCLR); // I2C bus, XCLK Pin |
wim | 0:ab21c5466a81 | 52 | #endif |
wim | 0:ab21c5466a81 | 53 | |
wim | 0:ab21c5466a81 | 54 | #if (LM77_TST == 1) |
wim | 0:ab21c5466a81 | 55 | // Instantiate LM77 |
wim | 0:ab21c5466a81 | 56 | LM77 lm77(&i2c, LM77_SA0); // I2C bus, XCLK Pin |
wim | 0:ab21c5466a81 | 57 | #endif |
wim | 0:ab21c5466a81 | 58 | |
wim | 0:ab21c5466a81 | 59 | int main() { |
wim | 0:ab21c5466a81 | 60 | pc.baud(D_BAUDRATE); |
wim | 0:ab21c5466a81 | 61 | pc.printf("\r\n\r\n"); |
wim | 0:ab21c5466a81 | 62 | pc.printf("Hello world\r\n"); |
wim | 0:ab21c5466a81 | 63 | |
wim | 0:ab21c5466a81 | 64 | #if (PCF8593_TST == 1) |
wim | 0:ab21c5466a81 | 65 | char buffer[8]; |
wim | 0:ab21c5466a81 | 66 | char status; |
wim | 0:ab21c5466a81 | 67 | |
wim | 0:ab21c5466a81 | 68 | //Init PCF8593 RTC |
wim | 0:ab21c5466a81 | 69 | buffer[0] = 0x00; //control reg |
wim | 0:ab21c5466a81 | 70 | buffer[1] = 0x00; //control reg value (32Khz osc) |
wim | 0:ab21c5466a81 | 71 | status = i2c.write(0xA2, buffer, 2); |
wim | 0:ab21c5466a81 | 72 | |
wim | 0:ab21c5466a81 | 73 | if (status == 0) { |
wim | 0:ab21c5466a81 | 74 | pc.printf("RTC status = Ok\n\r"); |
wim | 0:ab21c5466a81 | 75 | } |
wim | 0:ab21c5466a81 | 76 | else { |
wim | 0:ab21c5466a81 | 77 | pc.printf("RTC status = Not Ok\n\r"); |
wim | 0:ab21c5466a81 | 78 | } |
wim | 0:ab21c5466a81 | 79 | #endif |
wim | 0:ab21c5466a81 | 80 | |
wim | 0:ab21c5466a81 | 81 | #if (LM77_TST == 1) |
wim | 0:ab21c5466a81 | 82 | if (lm77.getStatus()) { |
wim | 0:ab21c5466a81 | 83 | pc.printf("LM77 status = Ok\n\r"); |
wim | 0:ab21c5466a81 | 84 | |
wim | 0:ab21c5466a81 | 85 | pc.printf("Critical Alert temperature from LM77 is %.1f [C]\r\n", lm77.getCritAlertTemp()); |
wim | 0:ab21c5466a81 | 86 | pc.printf("Low Alert temperature from LM77 is %.1f [C]\r\n", lm77.getLowAlertTemp()); |
wim | 0:ab21c5466a81 | 87 | pc.printf("High Alert temperature from LM77 is %.1f [C]\r\n", lm77.getHighAlertTemp()); |
wim | 0:ab21c5466a81 | 88 | pc.printf("Alert Hysteresis from LM77 is %.1f [C]\r\n", lm77.getAlertHyst()); |
wim | 0:ab21c5466a81 | 89 | wait(1.0); |
wim | 0:ab21c5466a81 | 90 | |
wim | 0:ab21c5466a81 | 91 | #if(0) |
wim | 0:ab21c5466a81 | 92 | #define CA 95.0f |
wim | 0:ab21c5466a81 | 93 | #define LA 8.0f |
wim | 0:ab21c5466a81 | 94 | #define HA 15.0f |
wim | 0:ab21c5466a81 | 95 | #define HY 3.0f |
wim | 0:ab21c5466a81 | 96 | lm77.setCritAlertTemp(CA); |
wim | 0:ab21c5466a81 | 97 | lm77.setLowAlertTemp(LA); |
wim | 0:ab21c5466a81 | 98 | lm77.setHighAlertTemp(HA); |
wim | 0:ab21c5466a81 | 99 | lm77.setAlertHyst(HY); |
wim | 0:ab21c5466a81 | 100 | pc.printf("Critical Alert temperature set at %.1f [C]. Read from LM77 is %.1f [°C]\r\n", CA, lm77.getCritAlertTemp()); |
wim | 0:ab21c5466a81 | 101 | pc.printf("Low Alert temperature set at %.1f [C]. Read from LM77 is %.1f [°C]\r\n", LA, lm77.getLowAlertTemp()); |
wim | 0:ab21c5466a81 | 102 | pc.printf("High Alert temperature set at %.1f [C]. Read from LM77 is %.1f [°C]\r\n", HA, lm77.getHighAlertTemp()); |
wim | 0:ab21c5466a81 | 103 | pc.printf("Alert Hysteresis set at %.1f [C]. Read from LM77 is %.1f [°C]\r\n", HY, lm77.getAlertHyst()); |
wim | 0:ab21c5466a81 | 104 | #endif |
wim | 0:ab21c5466a81 | 105 | } |
wim | 0:ab21c5466a81 | 106 | else { |
wim | 0:ab21c5466a81 | 107 | pc.printf("LM77 status = not Ok\n\r"); |
wim | 0:ab21c5466a81 | 108 | } |
wim | 0:ab21c5466a81 | 109 | #endif |
wim | 0:ab21c5466a81 | 110 | |
wim | 0:ab21c5466a81 | 111 | #if (HP03SA_TST == 1) |
wim | 0:ab21c5466a81 | 112 | //Init MCLK |
wim | 0:ab21c5466a81 | 113 | mclk.period_us(30); //32768 KHz |
wim | 0:ab21c5466a81 | 114 | mclk.pulsewidth_us(15); //32768 KHz |
wim | 0:ab21c5466a81 | 115 | |
wim | 0:ab21c5466a81 | 116 | if (hp03sa.getStatus()) { |
wim | 0:ab21c5466a81 | 117 | pc.printf("HP03S status = Ok\n\r"); |
wim | 0:ab21c5466a81 | 118 | } |
wim | 0:ab21c5466a81 | 119 | else { |
wim | 0:ab21c5466a81 | 120 | pc.printf("HP03S status = not Ok\n\r"); |
wim | 0:ab21c5466a81 | 121 | } |
wim | 0:ab21c5466a81 | 122 | |
wim | 0:ab21c5466a81 | 123 | // Take reading from sensor before setting calibration value! |
wim | 0:ab21c5466a81 | 124 | hp03sa.sample(); |
wim | 0:ab21c5466a81 | 125 | |
wim | 0:ab21c5466a81 | 126 | // Set QNH pressure. The Altitude reading will be 0 for the set pressure. |
wim | 0:ab21c5466a81 | 127 | // hp03sa.setPressure(10247); // MSL pressure at time of testing 1024.7 hPa |
wim | 0:ab21c5466a81 | 128 | // // Results in getAltitude() = 6m because it matches local MSL pressure |
wim | 0:ab21c5466a81 | 129 | |
wim | 0:ab21c5466a81 | 130 | // Set QNH altitude. The Altitude reading will be the set value at current pressure. |
wim | 0:ab21c5466a81 | 131 | hp03sa.setAltitude(6); // About right where I live.. |
wim | 0:ab21c5466a81 | 132 | #endif |
wim | 0:ab21c5466a81 | 133 | |
wim | 0:ab21c5466a81 | 134 | while(1) { |
wim | 0:ab21c5466a81 | 135 | #if (HP03SA_TST == 1) |
wim | 0:ab21c5466a81 | 136 | // Take reading from sensor |
wim | 0:ab21c5466a81 | 137 | hp03sa.sample(); |
wim | 0:ab21c5466a81 | 138 | |
wim | 0:ab21c5466a81 | 139 | // Show Pressure |
wim | 0:ab21c5466a81 | 140 | pc.printf("Absolute atmospheric pressure is %.1f [hPa]\r\n", (float) hp03sa.getAbsPressure() / 10.0f); |
wim | 0:ab21c5466a81 | 141 | pc.printf("Sealevel atmospheric pressure is %.1f [hPa]\r\n", (float) hp03sa.getSeaPressure(6) / 10.0f); // About right where I live.. |
wim | 0:ab21c5466a81 | 142 | |
wim | 0:ab21c5466a81 | 143 | // Show Temperature |
wim | 0:ab21c5466a81 | 144 | // pc.printf("Ambient temperature is %.1f [°C]\r\n", (float) hp03sa.getTemperatureInt() / 10.0f); |
wim | 0:ab21c5466a81 | 145 | pc.printf("Ambient temperature is %.1f [C]\r\n", hp03sa.getTemperature()); |
wim | 0:ab21c5466a81 | 146 | pc.printf("Ambient temperature is %.1f [F]\r\n", hp03sa.celsiusToFahrenheit(hp03sa.getTemperature()) ); |
wim | 0:ab21c5466a81 | 147 | |
wim | 0:ab21c5466a81 | 148 | // Show Altitude |
wim | 0:ab21c5466a81 | 149 | pc.printf("Altitude estimated at %d [m]\r\n", hp03sa.getAltitude()); |
wim | 0:ab21c5466a81 | 150 | |
wim | 0:ab21c5466a81 | 151 | // Show Altitude Ft |
wim | 0:ab21c5466a81 | 152 | pc.printf("Altitude estimated at %d [ft]\r\n", hp03sa.getAltitudeFt()); |
wim | 0:ab21c5466a81 | 153 | #endif |
wim | 0:ab21c5466a81 | 154 | |
wim | 0:ab21c5466a81 | 155 | #if (LM77_TST == 1) |
wim | 0:ab21c5466a81 | 156 | // Show Temperature LM77 |
wim | 0:ab21c5466a81 | 157 | // pc.printf("Ambient temperature from LM77 is %.1f [°C]\r\n", (float) lm77.getTemperatureInt() / 10.0f); |
wim | 0:ab21c5466a81 | 158 | pc.printf("Ambient temperature from LM77 is %.1f [C]\r\n", lm77.getTemperature()); |
wim | 0:ab21c5466a81 | 159 | #endif |
wim | 0:ab21c5466a81 | 160 | |
wim | 0:ab21c5466a81 | 161 | wait(1.0); |
wim | 0:ab21c5466a81 | 162 | myled1 = 1; |
wim | 0:ab21c5466a81 | 163 | wait(0.2); |
wim | 0:ab21c5466a81 | 164 | myled1 = 0; |
wim | 0:ab21c5466a81 | 165 | } |
wim | 0:ab21c5466a81 | 166 | } |