gas_sensor

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

commit 09d8d41d51e8f222efa1281a4f7563a9c0c628f8
parent d111705216ed3edd035a6a31063aee40e87060a4
Author: Tonton <tonterface@proton.me>
Date:   Sat,  4 Jul 2026 15:22:50 +0200

add sensor functions

add get average function and make get_interval use average
refactor return types to separate row in function definitions

Diffstat:
Minclude/sensor.h | 1+
Msrc/display.cpp | 24++++++++++++++++--------
Msrc/menu.cpp | 40+++++++++++++++++++++++++---------------
Msrc/sensor.cpp | 114++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------
4 files changed, 126 insertions(+), 53 deletions(-)

diff --git a/include/sensor.h b/include/sensor.h @@ -4,5 +4,6 @@ void sensor_init(void); int sensor_read(int); int sensor_analyze(void); +void sensor_set_limit(int, int, int, int); #endif // !MENU_H diff --git a/src/display.cpp b/src/display.cpp @@ -25,7 +25,8 @@ Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, SCREEN_RESET); /* function declarations */ /* function implementations */ -void dsp_print_result(int res) +void +dsp_print_result(int res) { display.clearDisplay(); dsp_write("RESULT:", 0, 0); @@ -34,7 +35,8 @@ void dsp_print_result(int res) display.display(); } -void dsp_print_main(void) +void +dsp_print_main(void) { display.clearDisplay(); dsp_write("1. Analyze", 0, 0); @@ -43,12 +45,14 @@ void dsp_print_main(void) display.display(); } -void dsp_print_gotomain(void) +void +dsp_print_gotomain(void) { dsp_write("Continue?", 0, SCREEN_ROW * 3); } -void dsp_print_menu1(void) +void +dsp_print_menu1(void) { display.clearDisplay(); dsp_write("Wait for", 0, 0); @@ -56,19 +60,22 @@ void dsp_print_menu1(void) } -void dsp_print_menu2(void) +void +dsp_print_menu2(void) { display.clearDisplay(); dsp_write("Menu 2", 0, 0); } -void dsp_print_menu3(void) +void +dsp_print_menu3(void) { display.clearDisplay(); dsp_write("Menu 3", 0, 0); } -void dsp_init(void) +void +dsp_init(void) { if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println("Allocation failed"); @@ -81,7 +88,8 @@ void dsp_init(void) display.setTextSize(2); } -void dsp_write(char str[], int x, int y) +void +dsp_write(char str[], int x, int y) { display.setCursor(x, y); display.print(str); diff --git a/src/menu.cpp b/src/menu.cpp @@ -19,23 +19,24 @@ static void menu_item3(void); static void print_live(void); /* function implementations */ -static int get_input(void) +static int +get_input(void) { /* implement handling of physical buttons */ - int input; + int input = 0; while (Serial.available() <= 0) { delay(100); } - /* always read to not clog buffer */ if (Serial.available() > 0) input = Serial.parseInt(); return input; } -static int goto_main(void) +static int +goto_main(void) { - char input; + char input = 0; dsp_print_gotomain(); do { @@ -46,7 +47,8 @@ static int goto_main(void) menu_main(); } -static void print_main(void) +static void +print_main(void) { dsp_print_main(); Serial.print("\e[1;1H\e[2J"); @@ -56,7 +58,8 @@ static void print_main(void) Serial.print("3. Params\n\r"); } -static void select_menu_item(int input) +static void +select_menu_item(int input) { switch (input) { case 1: @@ -75,9 +78,10 @@ static void select_menu_item(int input) } } -static void menu_item1(void) +static void +menu_item1(void) { - int res; + int res = 0; Serial.print("\e[1;1H\e[2J"); dsp_print_menu1(); @@ -87,7 +91,8 @@ static void menu_item1(void) goto_main(); } -static void menu_item2(void) +static void +menu_item2(void) { Serial.print("\e[1;1H\e[2J"); dsp_print_menu2(); @@ -96,7 +101,8 @@ static void menu_item2(void) goto_main(); } -static void menu_item3(void) +static void +menu_item3(void) { Serial.print("\e[1;1H\e[2J"); dsp_print_menu3(); @@ -104,10 +110,12 @@ static void menu_item3(void) goto_main(); } -static void print_live(void) +static void +print_live(void) { - int rx, in; + int rx, in = 0; + /* implement for loop to print from all sensors */ while (Serial.available() <= 0) { rx = sensor_read(0); dsp_print_result(rx); @@ -124,9 +132,11 @@ static void print_live(void) Serial.print("\n\r"); } -void menu_main(void) +void +menu_main(void) { - int input; + int input = 0; + print_main(); input = get_input(); select_menu_item(input); diff --git a/src/sensor.cpp b/src/sensor.cpp @@ -21,6 +21,12 @@ struct interval { int upper_limit; }; +/* function definitions*/ +static int *read_series(int sensor); +static int find_interval(int *series, int sensor); +static int in_range(int num, int u_lim, int l_lim); +static int get_average(int *series); + /* variables */ struct interval sensor1_intervals[INTERVAL_NUMBER]; struct interval sensor2_intervals[INTERVAL_NUMBER]; @@ -41,15 +47,14 @@ static int sens_arr[] = { SENSOR_4 }; - -/* function definitions*/ -static int *read_series(int sensor); -static int find_interval(int *series, int sensor); - /* function implementations */ -static int *read_series(int sensor) + +/* get a series of readings from a sensor */ +static int * +read_series(int sensor) { - int *ser; + int *ser = NULL; + ser = (int*)malloc(SAMPLE_NUMBER * sizeof(int)); if (ser == NULL) { @@ -66,7 +71,8 @@ static int *read_series(int sensor) return ser; } -static int in_range(int num, int u_lim, int l_lim) +static int +in_range(int num, int u_lim, int l_lim) { if (l_lim < num && num < u_lim) { return 1; @@ -74,39 +80,79 @@ static int in_range(int num, int u_lim, int l_lim) return 0; } -static int find_interval(int *series, int sensor) +static int +get_average(int *series, int size) +{ + int avg = 0; + int tmp = 0; + + for (int i = 0; i < size; i++) { + tmp += series[i]; + } + + avg = tmp / size; + + Serial.print("Average: "); + Serial.print(avg); + Serial.print("\n\r"); + return avg; +} + +/* find which interval of a specific sensor an int is in */ +static int +find_interval(int in, int sensor) { /* only checks a single int currently */ - struct interval *sen; - int *ser; - int u_lim, l_lim; + /* maybe make this receive an avg of series??*/ + struct interval *ivl= NULL; + int u_lim, l_lim = 0; - ser = series; - sen = all_intervals[sensor]; + ivl = all_intervals[sensor]; for (int i = 0; i < INTERVAL_NUMBER; ++i) { - l_lim = sen[i].lower_limit; - u_lim = sen[i].upper_limit; - if (in_range(ser[0], u_lim, l_lim)) { - Serial.print("In interval 1\n\r"); + l_lim = ivl[i].lower_limit; + u_lim = ivl[i].upper_limit; + if (in_range(in, u_lim, l_lim)) { + Serial.print("In interval: "); } else { - Serial.print("Not in interval 1\n\r"); + Serial.print("Not in interval: "); } + Serial.print(i + 1); + Serial.print("\n\r"); } return 0; } -int sensor_read(int sensor) +void +sensor_init(void) +{ + pinMode(SENSOR_1, INPUT); + pinMode(SENSOR_2, INPUT); + pinMode(SENSOR_3, INPUT); + pinMode(SENSOR_4, INPUT); + + /* testing */ + sensor_set_limit(0, 0, 1500, 1300); + // all_intervals[0]->lower_limit = 1300; + // all_intervals[0]->upper_limit = 1500; +} + +int +sensor_read(int sensor) { - int rx; + int rx = 0; rx = analogRead(sens_arr[sensor]); return rx; } -int sensor_analyze() +/* return which item sensors indicate */ +int +sensor_analyze(void) { - int *ser; - int res; + int *ser, res, avg; + + ser = NULL; + res = avg = 0; for (int i = 0; i < SENSOR_NUMBER; ++i) { ser = read_series(i); @@ -115,20 +161,28 @@ int sensor_analyze() res = -1; goto out_free_ser; } - find_interval(ser, i); + avg = get_average(ser, SAMPLE_NUMBER); + find_interval(avg, i); } + + /* temp */ res = 1; out_free_ser: free(ser); + ser = NULL; return res; } -void sensor_init(void) +void +sensor_set_limit(int sensor, int interval, int upper, int lower) { - pinMode(SENSOR_1, INPUT); - pinMode(SENSOR_2, INPUT); - pinMode(SENSOR_3, INPUT); - pinMode(SENSOR_4, INPUT); + struct interval *ivl; + + ivl = all_intervals[sensor]; + + ivl[interval].upper_limit = upper; + ivl[interval].lower_limit = lower; + }