Software to create an Environmental Comfort Measurement station using an mbed LPC1768.
Dependencies: 4DGL-uLCD-SE SCP1000 SHTx mbed
Fork of SHT15_Example by
main.cpp@1:036d23e0eb5a, 2014-03-23 (annotated)
- Committer:
- kylepost3
- Date:
- Sun Mar 23 22:03:11 2014 +0000
- Revision:
- 1:036d23e0eb5a
- Parent:
- 0:f850dfb07e93
Published Version 1.0 of the Environmental Comfort Measurement project
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
NegativeBlack | 0:f850dfb07e93 | 1 | #include "mbed.h" |
NegativeBlack | 0:f850dfb07e93 | 2 | #include "SHTx/sht15.hpp" |
kylepost3 | 1:036d23e0eb5a | 3 | #include "SCP1000.h" |
kylepost3 | 1:036d23e0eb5a | 4 | #include "uLCD_4DGL.h" |
kylepost3 | 1:036d23e0eb5a | 5 | |
kylepost3 | 1:036d23e0eb5a | 6 | uLCD_4DGL uLCD(p28,p27,p29); // serial tx, serial rx, reset pin; |
kylepost3 | 1:036d23e0eb5a | 7 | SCP1000 scp1000(p5,p6,p7,p8); |
kylepost3 | 1:036d23e0eb5a | 8 | SHTx::SHT15 sensor(p9, p10); |
kylepost3 | 1:036d23e0eb5a | 9 | DigitalOut busy(LED1); |
kylepost3 | 1:036d23e0eb5a | 10 | DigitalIn mode(p14); |
NegativeBlack | 0:f850dfb07e93 | 11 | |
kylepost3 | 1:036d23e0eb5a | 12 | |
kylepost3 | 1:036d23e0eb5a | 13 | // Declare pins for color sensor |
kylepost3 | 1:036d23e0eb5a | 14 | AnalogIn red_in(p15); |
kylepost3 | 1:036d23e0eb5a | 15 | AnalogIn green_in(p16); |
kylepost3 | 1:036d23e0eb5a | 16 | AnalogIn blue_in(p17); |
kylepost3 | 1:036d23e0eb5a | 17 | |
kylepost3 | 1:036d23e0eb5a | 18 | BusOut red_gain(p26, p25); |
kylepost3 | 1:036d23e0eb5a | 19 | BusOut green_gain(p24, p23); |
kylepost3 | 1:036d23e0eb5a | 20 | BusOut blue_gain(p22, p21); |
kylepost3 | 1:036d23e0eb5a | 21 | |
kylepost3 | 1:036d23e0eb5a | 22 | |
NegativeBlack | 0:f850dfb07e93 | 23 | |
kylepost3 | 1:036d23e0eb5a | 24 | float comfort_calc(float val, int min, int max){ |
kylepost3 | 1:036d23e0eb5a | 25 | float delta; |
kylepost3 | 1:036d23e0eb5a | 26 | |
kylepost3 | 1:036d23e0eb5a | 27 | if (val < min) |
kylepost3 | 1:036d23e0eb5a | 28 | delta = val-min; |
kylepost3 | 1:036d23e0eb5a | 29 | else if (val > max) |
kylepost3 | 1:036d23e0eb5a | 30 | delta = val - max; |
kylepost3 | 1:036d23e0eb5a | 31 | else |
kylepost3 | 1:036d23e0eb5a | 32 | delta = 0; |
kylepost3 | 1:036d23e0eb5a | 33 | |
kylepost3 | 1:036d23e0eb5a | 34 | delta = delta * 10 / (max-min); |
kylepost3 | 1:036d23e0eb5a | 35 | |
kylepost3 | 1:036d23e0eb5a | 36 | return delta; |
kylepost3 | 1:036d23e0eb5a | 37 | } |
NegativeBlack | 0:f850dfb07e93 | 38 | |
kylepost3 | 1:036d23e0eb5a | 39 | void delta_print(float delta, char* type){ |
kylepost3 | 1:036d23e0eb5a | 40 | if (delta == 0) |
kylepost3 | 1:036d23e0eb5a | 41 | uLCD.printf("%s: GOOD \r\n", type); |
kylepost3 | 1:036d23e0eb5a | 42 | else if (delta < 0) |
kylepost3 | 1:036d23e0eb5a | 43 | uLCD.printf("%s: LOW \r\n", type); |
kylepost3 | 1:036d23e0eb5a | 44 | else |
kylepost3 | 1:036d23e0eb5a | 45 | uLCD.printf("%s: HIGH \r\n", type); |
kylepost3 | 1:036d23e0eb5a | 46 | } |
kylepost3 | 1:036d23e0eb5a | 47 | |
kylepost3 | 1:036d23e0eb5a | 48 | int main() { |
NegativeBlack | 0:f850dfb07e93 | 49 | // Speed things up a bit. |
NegativeBlack | 0:f850dfb07e93 | 50 | sensor.setOTPReload(false); |
NegativeBlack | 0:f850dfb07e93 | 51 | sensor.setResolution(true); |
NegativeBlack | 0:f850dfb07e93 | 52 | |
kylepost3 | 1:036d23e0eb5a | 53 | //Declare internal variables |
kylepost3 | 1:036d23e0eb5a | 54 | float temp, humid, inHg, tempF; |
kylepost3 | 1:036d23e0eb5a | 55 | int press; |
kylepost3 | 1:036d23e0eb5a | 56 | |
kylepost3 | 1:036d23e0eb5a | 57 | int red = 0; |
kylepost3 | 1:036d23e0eb5a | 58 | int green = 0; |
kylepost3 | 1:036d23e0eb5a | 59 | int blue = 0; |
kylepost3 | 1:036d23e0eb5a | 60 | |
kylepost3 | 1:036d23e0eb5a | 61 | int prev_mode = 0; |
kylepost3 | 1:036d23e0eb5a | 62 | |
kylepost3 | 1:036d23e0eb5a | 63 | //declare comfort values |
kylepost3 | 1:036d23e0eb5a | 64 | float temp_delta = 0; |
kylepost3 | 1:036d23e0eb5a | 65 | float humid_delta = 0; |
kylepost3 | 1:036d23e0eb5a | 66 | float press_delta = 0; |
kylepost3 | 1:036d23e0eb5a | 67 | float color_delta = 0; |
kylepost3 | 1:036d23e0eb5a | 68 | |
kylepost3 | 1:036d23e0eb5a | 69 | float comfort = 0; |
kylepost3 | 1:036d23e0eb5a | 70 | |
kylepost3 | 1:036d23e0eb5a | 71 | // Sets the gain of the color sensor |
kylepost3 | 1:036d23e0eb5a | 72 | red_gain = 3; |
kylepost3 | 1:036d23e0eb5a | 73 | green_gain = 3; |
kylepost3 | 1:036d23e0eb5a | 74 | blue_gain = 3; |
kylepost3 | 1:036d23e0eb5a | 75 | |
kylepost3 | 1:036d23e0eb5a | 76 | sensor.setScale(false); // Sets the sensor temp. setting to Celsius |
kylepost3 | 1:036d23e0eb5a | 77 | |
kylepost3 | 1:036d23e0eb5a | 78 | uLCD.baudrate(600000); |
kylepost3 | 1:036d23e0eb5a | 79 | uLCD.cls(); |
NegativeBlack | 0:f850dfb07e93 | 80 | while(1) { |
kylepost3 | 1:036d23e0eb5a | 81 | //busy = true; |
NegativeBlack | 0:f850dfb07e93 | 82 | sensor.update(); |
kylepost3 | 1:036d23e0eb5a | 83 | |
kylepost3 | 1:036d23e0eb5a | 84 | temp = (sensor.getTemperature() + scp1000.readTemperature() )/ 2; // Averages the 2 available temperature readings |
kylepost3 | 1:036d23e0eb5a | 85 | humid = sensor.getHumidity(); |
kylepost3 | 1:036d23e0eb5a | 86 | press = scp1000.readPressure(); |
kylepost3 | 1:036d23e0eb5a | 87 | busy = false; |
kylepost3 | 1:036d23e0eb5a | 88 | |
kylepost3 | 1:036d23e0eb5a | 89 | tempF = temp * 9.0 / 5.0 + 32.0; // Converts temp from C to F |
NegativeBlack | 0:f850dfb07e93 | 90 | |
kylepost3 | 1:036d23e0eb5a | 91 | // Scale the RGB sensor values to usuable values |
kylepost3 | 1:036d23e0eb5a | 92 | red = red_in * 1000; |
kylepost3 | 1:036d23e0eb5a | 93 | green = green_in * 1000; |
kylepost3 | 1:036d23e0eb5a | 94 | blue = blue_in * 1700; |
kylepost3 | 1:036d23e0eb5a | 95 | |
kylepost3 | 1:036d23e0eb5a | 96 | // Convert pressure to mmhg |
kylepost3 | 1:036d23e0eb5a | 97 | inHg = press / 3376.85; |
kylepost3 | 1:036d23e0eb5a | 98 | |
kylepost3 | 1:036d23e0eb5a | 99 | |
kylepost3 | 1:036d23e0eb5a | 100 | temp_delta = comfort_calc(tempF, 65, 75); |
kylepost3 | 1:036d23e0eb5a | 101 | humid_delta = comfort_calc(humid, 30, 70); |
kylepost3 | 1:036d23e0eb5a | 102 | press_delta = comfort_calc(inHg, 28, 31); |
kylepost3 | 1:036d23e0eb5a | 103 | color_delta = comfort_calc(red+green+blue, 30, 450); |
kylepost3 | 1:036d23e0eb5a | 104 | |
kylepost3 | 1:036d23e0eb5a | 105 | |
NegativeBlack | 0:f850dfb07e93 | 106 | |
kylepost3 | 1:036d23e0eb5a | 107 | comfort = abs(temp_delta) + abs(humid_delta) + abs(press_delta)+ abs(color_delta); |
kylepost3 | 1:036d23e0eb5a | 108 | comfort = 100 - comfort; |
kylepost3 | 1:036d23e0eb5a | 109 | |
kylepost3 | 1:036d23e0eb5a | 110 | // Beggining of printing modes |
kylepost3 | 1:036d23e0eb5a | 111 | uLCD.locate(0,0); |
NegativeBlack | 0:f850dfb07e93 | 112 | |
kylepost3 | 1:036d23e0eb5a | 113 | |
kylepost3 | 1:036d23e0eb5a | 114 | if (mode==0){ // Sensor detail mode |
kylepost3 | 1:036d23e0eb5a | 115 | if (prev_mode != mode) |
kylepost3 | 1:036d23e0eb5a | 116 | uLCD.cls(); |
kylepost3 | 1:036d23e0eb5a | 117 | |
kylepost3 | 1:036d23e0eb5a | 118 | // Prints the temperature in celcius |
kylepost3 | 1:036d23e0eb5a | 119 | uLCD.printf("Temp: %3.2f F\r\n", tempF); |
kylepost3 | 1:036d23e0eb5a | 120 | |
kylepost3 | 1:036d23e0eb5a | 121 | // Prints the relative Humidity |
kylepost3 | 1:036d23e0eb5a | 122 | uLCD.printf("Humdity: %3.2f %%\r\n", humid); |
kylepost3 | 1:036d23e0eb5a | 123 | |
kylepost3 | 1:036d23e0eb5a | 124 | // Prints barometric pressure |
kylepost3 | 1:036d23e0eb5a | 125 | uLCD.printf("Press: %3.2f inHg\r\n\n", inHg); |
kylepost3 | 1:036d23e0eb5a | 126 | if (inHg >=28.9) |
kylepost3 | 1:036d23e0eb5a | 127 | uLCD.printf("High Pressure"); |
kylepost3 | 1:036d23e0eb5a | 128 | else |
kylepost3 | 1:036d23e0eb5a | 129 | uLCD.printf("Low Pressure"); |
kylepost3 | 1:036d23e0eb5a | 130 | |
kylepost3 | 1:036d23e0eb5a | 131 | //Print color sensor values |
kylepost3 | 1:036d23e0eb5a | 132 | uLCD.printf("\n\n"); |
kylepost3 | 1:036d23e0eb5a | 133 | uLCD.printf("Red: %i\r\n", red); |
kylepost3 | 1:036d23e0eb5a | 134 | uLCD.printf("Green: %i\r\n", green); |
kylepost3 | 1:036d23e0eb5a | 135 | uLCD.printf("Blue: %i\r\n", blue); |
kylepost3 | 1:036d23e0eb5a | 136 | |
kylepost3 | 1:036d23e0eb5a | 137 | uLCD.printf("\nt:%3.2f h:%3.2f \np:%3.2f l:%3.2f \r\n", temp_delta, humid_delta, press_delta, color_delta); |
kylepost3 | 1:036d23e0eb5a | 138 | |
kylepost3 | 1:036d23e0eb5a | 139 | prev_mode = 0; |
kylepost3 | 1:036d23e0eb5a | 140 | } |
kylepost3 | 1:036d23e0eb5a | 141 | else { // Normal mode |
kylepost3 | 1:036d23e0eb5a | 142 | if (prev_mode != mode) |
kylepost3 | 1:036d23e0eb5a | 143 | uLCD.cls(); |
kylepost3 | 1:036d23e0eb5a | 144 | |
NegativeBlack | 0:f850dfb07e93 | 145 | |
kylepost3 | 1:036d23e0eb5a | 146 | delta_print(temp_delta, "Temp"); |
kylepost3 | 1:036d23e0eb5a | 147 | delta_print(humid_delta, "Humid"); |
kylepost3 | 1:036d23e0eb5a | 148 | delta_print(press_delta, "Press"); |
kylepost3 | 1:036d23e0eb5a | 149 | delta_print(color_delta, "Light"); |
kylepost3 | 1:036d23e0eb5a | 150 | |
kylepost3 | 1:036d23e0eb5a | 151 | if (comfort >90) |
kylepost3 | 1:036d23e0eb5a | 152 | uLCD.printf("\n\nComfortable \r\n"); |
kylepost3 | 1:036d23e0eb5a | 153 | else |
kylepost3 | 1:036d23e0eb5a | 154 | uLCD.printf("\n\nUncomfortable\r\n"); |
kylepost3 | 1:036d23e0eb5a | 155 | |
kylepost3 | 1:036d23e0eb5a | 156 | uLCD.printf("Rating %3.0f/100\r\n", comfort); |
kylepost3 | 1:036d23e0eb5a | 157 | prev_mode = 1; |
kylepost3 | 1:036d23e0eb5a | 158 | } |
kylepost3 | 1:036d23e0eb5a | 159 | wait(.5); |
NegativeBlack | 0:f850dfb07e93 | 160 | } |
NegativeBlack | 0:f850dfb07e93 | 161 | } |
kylepost3 | 1:036d23e0eb5a | 162 | |
kylepost3 | 1:036d23e0eb5a | 163 |