gas_sensor

gas sensor project
git clone _git@git.tontus.eu/gas_sensor.git
Log | Files | Refs

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 }