mbed Sensor node for Instrumented Booth over ETH.
Dependencies: EthernetInterface-1 MaxbotixDriver Presence HTU21D_TEMP_HUMID_SENSOR_SAMPLE Resources SHARPIR mbed-rtos mbed-src WDT_K64F nsdl_lib
Fork of Trenton_Switch_LPC1768_ETH by
sensor_ctl.cpp@33:d39c30e9264b, 2014-12-12 (annotated)
- Committer:
- andcor02
- Date:
- Fri Dec 12 16:46:43 2014 +0000
- Revision:
- 33:d39c30e9264b
- Parent:
- 32:c957a1948ac1
- Child:
- 40:b2e9bc654ca1
implemented height with tighter control and count variable, threshold on ir needs maybe tweaking to improve response and noise suppression. In very working state.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andcor02 | 25:cb16c5248769 | 1 | /** Implements Sensor Control for CES Instrumented Booth */ |
andcor02 | 25:cb16c5248769 | 2 | |
andcor02 | 25:cb16c5248769 | 3 | #include "mbed.h" |
andcor02 | 25:cb16c5248769 | 4 | #include "sensor_ctl.h" |
erigow01 | 26:4cac6b346e4f | 5 | #include "node_cfg.h" |
andcor02 | 25:cb16c5248769 | 6 | |
andcor02 | 25:cb16c5248769 | 7 | //Sensor Drivers |
andcor02 | 25:cb16c5248769 | 8 | #include "RHT03.h" |
andcor02 | 25:cb16c5248769 | 9 | #include "MAX9814.h" |
andcor02 | 25:cb16c5248769 | 10 | #include "sonar.h" |
erigow01 | 27:6017a643f386 | 11 | #include "Presence.h" |
andcor02 | 25:cb16c5248769 | 12 | #include "SHARPIR.h" |
andcor02 | 25:cb16c5248769 | 13 | |
andcor02 | 25:cb16c5248769 | 14 | //Sensor MDS Resources |
andcor02 | 25:cb16c5248769 | 15 | #include "door_trip.h" |
andcor02 | 25:cb16c5248769 | 16 | #include "height.h" |
erigow01 | 27:6017a643f386 | 17 | #include "presence_resource.h" |
andcor02 | 25:cb16c5248769 | 18 | #include "sound_level.h" |
andcor02 | 25:cb16c5248769 | 19 | #include "temperature.h" |
andcor02 | 25:cb16c5248769 | 20 | |
andcor02 | 25:cb16c5248769 | 21 | //Common Sensors |
erigow01 | 27:6017a643f386 | 22 | #if NODE_SENSOR_STATION |
andcor02 | 25:cb16c5248769 | 23 | RHT03 temperature(PTB2); |
andcor02 | 25:cb16c5248769 | 24 | MAX9814 microphone(PTB3); //Analogue in required. |
erigow01 | 27:6017a643f386 | 25 | #if NODE_PIR_STATION |
erigow01 | 28:908a6f58aa7f | 26 | Presence pir(PTB11, false, PIR_SENSOR_DEBOUNCE_MS); //(InterruptPin), for PIR sensor, |
erigow01 | 27:6017a643f386 | 27 | #endif //NODE PIR STATION |
erigow01 | 27:6017a643f386 | 28 | #if NODE_KIOSK_STATION |
erigow01 | 28:908a6f58aa7f | 29 | Presence kiosk(PTB10, true, KIOSK_SENSOR_DEBOUNCE_MS); //(Interrupt pinrequired, no timeout) |
erigow01 | 27:6017a643f386 | 30 | #endif //NODE KIOSK STATION |
erigow01 | 27:6017a643f386 | 31 | #if NODE_DOOR_TRIP_STATION |
andcor02 | 33:d39c30e9264b | 32 | SHARPIR sharpir(PTB10); //(AnalogIn required), for IR door trip |
erigow01 | 27:6017a643f386 | 33 | #endif //NODE TRIP STATION |
erigow01 | 27:6017a643f386 | 34 | #if NODE_HEIGHT_STATION |
erigow01 | 32:c957a1948ac1 | 35 | Timer sonarTimer; |
erigow01 | 32:c957a1948ac1 | 36 | Timer debounceHeight; |
erigow01 | 32:c957a1948ac1 | 37 | Sonar sonar(PTC10, sonarTimer); //(AnalogIn required, Leave as SW2.) |
erigow01 | 32:c957a1948ac1 | 38 | |
erigow01 | 32:c957a1948ac1 | 39 | #define DOOR_HEIGHT_START_MEASURING_THRESHOLD_CM 150 |
erigow01 | 32:c957a1948ac1 | 40 | #define DOOR_HEIGHT_STOP_MEASURING_THRESHOLD_CM 140 |
erigow01 | 32:c957a1948ac1 | 41 | #define DOOR_HEIGHT_STOP_MEASURING_SAMPLE_COUNT 2 |
erigow01 | 32:c957a1948ac1 | 42 | #define DOOR_HEIGHT_SENSOR_MOUNT_HEIGHT_CM 220 |
erigow01 | 27:6017a643f386 | 43 | #endif //NODE HEIGHT STATION |
erigow01 | 27:6017a643f386 | 44 | #endif //NODE_SENSOR_STATION |
andcor02 | 25:cb16c5248769 | 45 | |
andcor02 | 25:cb16c5248769 | 46 | |
andcor02 | 25:cb16c5248769 | 47 | //Variables provided to rest of applications |
erigow01 | 26:4cac6b346e4f | 48 | float current_temperature_value = 0; |
erigow01 | 26:4cac6b346e4f | 49 | float current_ambient_noise_value = 0; |
andcor02 | 25:cb16c5248769 | 50 | //Either height XOR kiosk presence XOR PIR station... |
andcor02 | 30:b74aa0729b07 | 51 | float current_height_value = 0; |
erigow01 | 26:4cac6b346e4f | 52 | bool current_presence_value = false; //Either from Kiosk or PIR |
andcor02 | 25:cb16c5248769 | 53 | //And it might have a door trip.. |
erigow01 | 26:4cac6b346e4f | 54 | bool current_door_trip_value = false; |
erigow01 | 26:4cac6b346e4f | 55 | |
erigow01 | 31:389416beb4c3 | 56 | //Door trip... |
erigow01 | 26:4cac6b346e4f | 57 | float door_trip_starting_volts = 0; |
erigow01 | 32:c957a1948ac1 | 58 | |
erigow01 | 32:c957a1948ac1 | 59 | //Door Height... |
erigow01 | 32:c957a1948ac1 | 60 | float door_height_max_value = 0; |
erigow01 | 32:c957a1948ac1 | 61 | bool door_height_measuring = 0; |
andcor02 | 33:d39c30e9264b | 62 | int door_height_sample_count = 0; |
erigow01 | 31:389416beb4c3 | 63 | |
erigow01 | 31:389416beb4c3 | 64 | |
andcor02 | 25:cb16c5248769 | 65 | //Initialisation |
andcor02 | 25:cb16c5248769 | 66 | void init_sensors() { |
erigow01 | 26:4cac6b346e4f | 67 | #if NODE_DOOR_TRIP_STATION |
erigow01 | 26:4cac6b346e4f | 68 | door_trip_starting_volts = sharpir.volt(); |
erigow01 | 26:4cac6b346e4f | 69 | #endif |
erigow01 | 32:c957a1948ac1 | 70 | #if NODE_HEIGHT_STATION |
erigow01 | 32:c957a1948ac1 | 71 | sonarTimer.start(); |
erigow01 | 32:c957a1948ac1 | 72 | #endif |
andcor02 | 25:cb16c5248769 | 73 | } |
andcor02 | 25:cb16c5248769 | 74 | |
erigow01 | 27:6017a643f386 | 75 | #if NODE_SENSOR_STATION |
erigow01 | 27:6017a643f386 | 76 | |
andcor02 | 25:cb16c5248769 | 77 | //timer handler functions |
andcor02 | 25:cb16c5248769 | 78 | void handle_temperature_report_timer() { |
andcor02 | 25:cb16c5248769 | 79 | if(temperature.readData() == RHT_ERROR_NONE) { |
andcor02 | 25:cb16c5248769 | 80 | //Only report valid data... |
andcor02 | 25:cb16c5248769 | 81 | current_temperature_value = temperature.getTemperatureC(); |
andcor02 | 25:cb16c5248769 | 82 | printf("Temperature Sample: %2.2f\r\n", current_temperature_value); |
erigow01 | 26:4cac6b346e4f | 83 | temperature_report(); |
andcor02 | 25:cb16c5248769 | 84 | } else { |
andcor02 | 25:cb16c5248769 | 85 | printf("Temperature Sampleing Failure\r\n"); |
andcor02 | 25:cb16c5248769 | 86 | } |
andcor02 | 25:cb16c5248769 | 87 | } |
andcor02 | 25:cb16c5248769 | 88 | |
andcor02 | 25:cb16c5248769 | 89 | void handle_microphone_sample_timer() |
andcor02 | 25:cb16c5248769 | 90 | { |
andcor02 | 25:cb16c5248769 | 91 | float sample = microphone.sound_level(); |
erigow01 | 26:4cac6b346e4f | 92 | //printf("Sound Sample: %2.2f\r\n", sample); |
andcor02 | 25:cb16c5248769 | 93 | if (sample > current_ambient_noise_value){ |
andcor02 | 25:cb16c5248769 | 94 | current_ambient_noise_value = sample; |
andcor02 | 25:cb16c5248769 | 95 | } |
andcor02 | 25:cb16c5248769 | 96 | } |
andcor02 | 25:cb16c5248769 | 97 | |
andcor02 | 25:cb16c5248769 | 98 | void handle_microphone_report_timer() |
andcor02 | 25:cb16c5248769 | 99 | { |
andcor02 | 25:cb16c5248769 | 100 | //Report. |
erigow01 | 26:4cac6b346e4f | 101 | sound_level_report(); |
andcor02 | 25:cb16c5248769 | 102 | //Reset noise... |
andcor02 | 25:cb16c5248769 | 103 | current_ambient_noise_value = 0; |
andcor02 | 25:cb16c5248769 | 104 | } |
andcor02 | 25:cb16c5248769 | 105 | |
erigow01 | 27:6017a643f386 | 106 | #if NODE_PIR_STATION |
erigow01 | 26:4cac6b346e4f | 107 | void handle_motion_report_timer(){ |
erigow01 | 27:6017a643f386 | 108 | bool new_pir = pir.isPresent(); |
erigow01 | 26:4cac6b346e4f | 109 | //printf("PIR Sample: %d\r\n", new_pir); |
erigow01 | 26:4cac6b346e4f | 110 | //printf("Old PIR Sample: %d\r\n", current_presence_value); |
erigow01 | 26:4cac6b346e4f | 111 | if(new_pir != current_presence_value) { |
erigow01 | 26:4cac6b346e4f | 112 | //printf("Reporting PIR...\r\n"); |
erigow01 | 26:4cac6b346e4f | 113 | current_presence_value = new_pir; |
erigow01 | 27:6017a643f386 | 114 | presence_report(); |
erigow01 | 26:4cac6b346e4f | 115 | } |
erigow01 | 26:4cac6b346e4f | 116 | } |
erigow01 | 27:6017a643f386 | 117 | #endif //NODE_PIR_STATION |
erigow01 | 26:4cac6b346e4f | 118 | |
erigow01 | 27:6017a643f386 | 119 | #if NODE_KIOSK_STATION |
erigow01 | 26:4cac6b346e4f | 120 | void handle_kiosk_report_timer(){ |
erigow01 | 27:6017a643f386 | 121 | bool new_kiosk = kiosk.isPresent(); |
erigow01 | 26:4cac6b346e4f | 122 | if(new_kiosk != current_presence_value) { |
erigow01 | 26:4cac6b346e4f | 123 | current_presence_value = new_kiosk; |
erigow01 | 27:6017a643f386 | 124 | presence_report(); |
erigow01 | 26:4cac6b346e4f | 125 | } |
erigow01 | 26:4cac6b346e4f | 126 | } |
erigow01 | 27:6017a643f386 | 127 | #endif //NODE_KIOSK_STATION |
erigow01 | 26:4cac6b346e4f | 128 | |
erigow01 | 27:6017a643f386 | 129 | #if NODE_DOOR_TRIP_STATION |
erigow01 | 26:4cac6b346e4f | 130 | void handle_door_trip_report_timer(){ |
erigow01 | 26:4cac6b346e4f | 131 | float value= sharpir.volt(); |
andcor02 | 33:d39c30e9264b | 132 | printf ("\n\r door:%f", value); |
erigow01 | 26:4cac6b346e4f | 133 | bool new_door_trip = 0; |
andcor02 | 33:d39c30e9264b | 134 | if (value>door_trip_starting_volts+0.2) { |
erigow01 | 26:4cac6b346e4f | 135 | new_door_trip=true; |
andcor02 | 33:d39c30e9264b | 136 | } else if (value<door_trip_starting_volts+0.2) { |
erigow01 | 26:4cac6b346e4f | 137 | new_door_trip=false; |
erigow01 | 26:4cac6b346e4f | 138 | } |
erigow01 | 26:4cac6b346e4f | 139 | |
erigow01 | 26:4cac6b346e4f | 140 | if (new_door_trip != current_door_trip_value) { |
erigow01 | 26:4cac6b346e4f | 141 | current_door_trip_value = new_door_trip; |
erigow01 | 26:4cac6b346e4f | 142 | door_trip_report(); |
erigow01 | 26:4cac6b346e4f | 143 | } |
erigow01 | 26:4cac6b346e4f | 144 | } |
erigow01 | 27:6017a643f386 | 145 | #endif //NODE_DOOR_TRIP_STATION |
erigow01 | 26:4cac6b346e4f | 146 | |
erigow01 | 27:6017a643f386 | 147 | #if NODE_HEIGHT_STATION |
andcor02 | 29:9599a156f78b | 148 | void handle_door_height_sample_timer(){ |
erigow01 | 32:c957a1948ac1 | 149 | int height_sample = DOOR_HEIGHT_SENSOR_MOUNT_HEIGHT_CM-sonar.read(); |
andcor02 | 33:d39c30e9264b | 150 | printf("\n\r %d", height_sample); |
erigow01 | 32:c957a1948ac1 | 151 | if(height_sample > DOOR_HEIGHT_START_MEASURING_THRESHOLD_CM) { |
erigow01 | 32:c957a1948ac1 | 152 | door_height_sample_count=0; |
erigow01 | 32:c957a1948ac1 | 153 | if (height_sample > door_height_max_value) { |
erigow01 | 32:c957a1948ac1 | 154 | door_height_max_value = height_sample; |
erigow01 | 32:c957a1948ac1 | 155 | } |
erigow01 | 32:c957a1948ac1 | 156 | door_height_measuring=true; |
andcor02 | 29:9599a156f78b | 157 | } |
andcor02 | 29:9599a156f78b | 158 | |
erigow01 | 32:c957a1948ac1 | 159 | if((height_sample < DOOR_HEIGHT_STOP_MEASURING_THRESHOLD_CM && door_height_measuring )){ |
erigow01 | 32:c957a1948ac1 | 160 | door_height_sample_count++; |
erigow01 | 32:c957a1948ac1 | 161 | if (door_height_sample_count > DOOR_HEIGHT_STOP_MEASURING_SAMPLE_COUNT){ |
erigow01 | 32:c957a1948ac1 | 162 | current_height_value=door_height_max_value; |
erigow01 | 32:c957a1948ac1 | 163 | door_height_max_value=0,door_height_measuring=false; |
erigow01 | 32:c957a1948ac1 | 164 | door_height_sample_count = 0; |
erigow01 | 32:c957a1948ac1 | 165 | height_report(); |
erigow01 | 32:c957a1948ac1 | 166 | } |
andcor02 | 29:9599a156f78b | 167 | } |
andcor02 | 25:cb16c5248769 | 168 | } |
erigow01 | 32:c957a1948ac1 | 169 | #endif //NODE HEIGHT STATION |
andcor02 | 25:cb16c5248769 | 170 | |
erigow01 | 27:6017a643f386 | 171 | #endif //NODE_SENSOR_STATION |