sensor.cpp (3564B)
1 /* sensor utilities 2 * Handles all interaction with sensor 3 */ 4 5 #include <Arduino.h> 6 7 #include "../include/sensor.h" 8 9 /* macros */ 10 #define SAMPLE_NUMBER 10 11 #define SENSOR_NUMBER 1 12 #define INTERVAL_NUMBER 3 13 #define SAMPLE_RATE 500 14 15 enum { 16 SENSOR_1 = 26, 17 SENSOR_2 = 25, 18 SENSOR_3 = 34, 19 SENSOR_4 = 39 20 }; 21 22 struct interval { 23 int lower_limit; 24 int upper_limit; 25 }; 26 27 /* function definitions*/ 28 static int *read_series(int sensor); 29 static int find_interval(int *series, int sensor, int *result); 30 static int in_range(int num, int u_lim, int l_lim); 31 static int get_average(int *series); 32 static int decide_result(int *ser); 33 34 /* variables */ 35 struct interval sensor1_intervals[INTERVAL_NUMBER]; 36 struct interval sensor2_intervals[INTERVAL_NUMBER]; 37 struct interval sensor3_intervals[INTERVAL_NUMBER]; 38 struct interval sensor4_intervals[INTERVAL_NUMBER]; 39 40 static struct interval* all_intervals[] = { 41 sensor1_intervals, 42 sensor2_intervals, 43 sensor3_intervals, 44 sensor4_intervals 45 }; 46 47 static int sens_arr[] = { 48 SENSOR_1, 49 SENSOR_2, 50 SENSOR_3, 51 SENSOR_4 52 }; 53 54 /* function implementations */ 55 56 /* get a series of readings from a sensor */ 57 static int * 58 read_series(int sensor) 59 { 60 int *ser = NULL; 61 62 ser = (int*)malloc(SAMPLE_NUMBER * sizeof(int)); 63 64 if (ser == NULL) { 65 Serial.print("ERROR ALLOCATING MEMORY\n\r"); 66 return NULL; 67 } 68 69 for (int i = 0; i < SAMPLE_NUMBER; ++i) { 70 ser[i] = sensor_read(sensor); 71 Serial.print(ser[i]); 72 Serial.print("\n\r"); 73 delay(SAMPLE_RATE); 74 } 75 return ser; 76 } 77 78 static int 79 in_range(int num, int u_lim, int l_lim) 80 { 81 if (l_lim < num && num < u_lim) { 82 return 1; 83 } 84 return 0; 85 } 86 87 static int 88 get_average(int *series, int size) 89 { 90 int avg = 0; 91 int tmp = 0; 92 93 for (int i = 0; i < size; i++) { 94 tmp += series[i]; 95 } 96 97 avg = tmp / size; 98 99 Serial.print("Average: "); 100 Serial.print(avg); 101 Serial.print("\n\r"); 102 return avg; 103 } 104 105 /* finds which of a sensors intervals an int is in */ 106 static int 107 find_interval(int in, int sensor, int *result) 108 { 109 struct interval *ivl= NULL; 110 int u_lim, l_lim = 0; 111 112 ivl = all_intervals[sensor]; 113 for (int i = 0; i < INTERVAL_NUMBER; ++i) { 114 l_lim = ivl[i].lower_limit; 115 u_lim = ivl[i].upper_limit; 116 if (in_range(in, u_lim, l_lim)) { 117 Serial.print("In interval: "); 118 result[i]++; 119 } else { 120 Serial.print("Not in interval: "); 121 } 122 Serial.print(i + 1); 123 Serial.print("\n\r"); 124 } 125 return 0; 126 } 127 128 /* consolidate partial results from sensor to final verdict, -1 if undecided */ 129 static int 130 decide_result(int *ser) 131 { 132 for (int i = 0; i < INTERVAL_NUMBER; i++) { 133 printf("Interval %i: %i\n", i + 1, ser[i]); 134 } 135 return 0; 136 } 137 138 void 139 sensor_init(void) 140 { 141 pinMode(SENSOR_1, INPUT); 142 pinMode(SENSOR_2, INPUT); 143 pinMode(SENSOR_3, INPUT); 144 pinMode(SENSOR_4, INPUT); 145 146 /* testing */ 147 sensor_set_limit(0, 0, 1500, 1300); 148 } 149 150 int 151 sensor_read(int sensor) 152 { 153 int rx = 0; 154 155 rx = analogRead(sens_arr[sensor]); 156 return rx; 157 } 158 159 /* return which item sensors indicate */ 160 int 161 sensor_analyze(void) 162 { 163 int *ser, *tmp, res, avg; 164 int result[INTERVAL_NUMBER] = { 0 }; 165 166 ser = tmp = NULL; 167 res = avg = 0; 168 169 for (int i = 0; i < SENSOR_NUMBER; ++i) { 170 ser = read_series(i); 171 if (ser == NULL) { 172 Serial.print("ERROR READING SERIES\n\r"); 173 res = -1; 174 goto out_free_ser; 175 } 176 avg = get_average(ser, SAMPLE_NUMBER); 177 find_interval(avg, i, result); 178 } 179 180 res = decide_result(result); 181 182 183 out_free_ser: 184 free(ser); 185 ser = NULL; 186 return res; 187 } 188 189 void 190 sensor_set_limit(int sensor, int interval, int upper, int lower) 191 { 192 struct interval *ivl; 193 194 ivl = all_intervals[sensor]; 195 196 ivl[interval].upper_limit = upper; 197 ivl[interval].lower_limit = lower; 198 199 200 }