diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h
index 85fc686fdf368e1df89417610186b96277087122..da8444a173d1fa1f5eb884547294ec25e0c8a1f8 100644
--- a/epicardium/epicardium.h
+++ b/epicardium/epicardium.h
@@ -99,8 +99,8 @@ API(API_INTERRUPT_DISABLE, int epic_interrupt_disable(api_int_id_t int_id));
 /** ``^C`` interrupt. See :c:func:`epic_isr_ctrl_c` for details.  */
 #define EPIC_INT_CTRL_C                 1
 /* Debug interrupt, please ignore */
-#define EPIC_INT_BHI160_TEST            2
-API_ISR(EPIC_INT_BHI160_TEST, epic_isr_bhi160_test);
+#define EPIC_INT_BHI160_ACCELEROMETER   2
+API_ISR(EPIC_INT_BHI160_ACCELEROMETER, epic_isr_bhi160_accelerometer);
 
 /* Number of defined interrupts. */
 #define EPIC_INT_NUM                    3
diff --git a/epicardium/modules/bhi.c b/epicardium/modules/bhi.c
index 79ce0a724fcf9e11c14d0c6185d116a293f77cad..b237dd535de3c539627a8b879b2de2d903b6b005 100644
--- a/epicardium/modules/bhi.c
+++ b/epicardium/modules/bhi.c
@@ -11,6 +11,7 @@
 #include "semphr.h"
 #include "queue.h"
 
+#include "api/interrupt-sender.h"
 #include "epicardium.h"
 #include "modules/log.h"
 #include "modules/modules.h"
@@ -215,6 +216,9 @@ bhi160_handle_packet(bhy_data_type_t data_type, bhy_data_generic_t *sensor_data)
 			&data_vector,
 			BHI160_MUTEX_WAIT_MS
 		);
+		if(sensor_id == VS_ID_ACCELEROMETER_WAKEUP) {
+			api_interrupt_trigger(EPIC_INT_BHI160_ACCELEROMETER);
+		}
 		break;
 	default:
 		break;
diff --git a/epicardium/modules/serial.c b/epicardium/modules/serial.c
index bf341fe79f1d36242481c150e6dd56dfcae119c6..25fe11e49457c0b9326fb5f3e875c0a4a0e3cbb0 100644
--- a/epicardium/modules/serial.c
+++ b/epicardium/modules/serial.c
@@ -62,7 +62,7 @@ static void enqueue_char(char chr)
 
 	if (chr == 0x0e) {
 		/* Control-N */
-		api_interrupt_trigger(EPIC_INT_BHI160_TEST);
+		/* Unused at the moment. Used to trigger test functions when needed */
 	}
 
 	if (xQueueSend(read_queue, &chr, 100) == errQUEUE_FULL) {
diff --git a/pycardium/meson.build b/pycardium/meson.build
index cf5f5ba57ecdbdb4d321cd5d6bc08dfc151024ff..763431b353187691a0a6494c10516ffed9a217da 100644
--- a/pycardium/meson.build
+++ b/pycardium/meson.build
@@ -1,6 +1,7 @@
 name = 'pycardium'
 
 modsrc = files(
+  'modules/bhi160-sys.c',
   'modules/interrupt.c',
   'modules/leds.c',
   'modules/sys_display.c',
diff --git a/pycardium/modules/bhi160-sys.c b/pycardium/modules/bhi160-sys.c
new file mode 100644
index 0000000000000000000000000000000000000000..35d81b257f3f43d1a16c97e6788ce808d5cd022d
--- /dev/null
+++ b/pycardium/modules/bhi160-sys.c
@@ -0,0 +1,61 @@
+#include "py/obj.h"
+#include "py/runtime.h"
+#include "py/builtin.h"
+#include "epicardium.h"
+#include "api/common.h"
+#include "mphalport.h"
+
+STATIC mp_obj_t mp_bhi160_enable_sensor(size_t n_args, const mp_obj_t *args)
+{
+	int sensor_type = mp_obj_get_int(args[0]);
+
+	struct bhi160_sensor_config cfg = { 0 };
+	cfg.sample_buffer_len           = mp_obj_get_int(args[1]);
+	cfg.sample_rate                 = mp_obj_get_int(args[2]);
+	cfg.dynamic_range               = mp_obj_get_int(args[3]);
+
+	//cfg.sample_buffer_len = 200;
+	//cfg.sample_rate       = 4;
+	//cfg.dynamic_range     = 2;
+
+	int sd = epic_bhi160_enable_sensor(sensor_type, &cfg);
+
+	return MP_OBJ_NEW_SMALL_INT(sd);
+}
+
+STATIC mp_obj_t mp_bhi160_read_sensor(mp_obj_t stream_id_in)
+{
+	struct bhi160_data_vector buf[100];
+	int sd = mp_obj_get_int(stream_id_in);
+
+	int n = epic_stream_read(sd, buf, sizeof(buf));
+
+	return MP_OBJ_NEW_SMALL_INT(n);
+}
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(
+	mp_bhi160_enable_sensor_obj, 4, 4, mp_bhi160_enable_sensor
+);
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(
+	mp_bhi160_read_sensor_obj, mp_bhi160_read_sensor
+);
+
+STATIC const mp_rom_map_elem_t bhi160_module_globals_table[] = {
+	{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_sys_bhi160) },
+	{ MP_ROM_QSTR(MP_QSTR_enable_sensor),
+	  MP_ROM_PTR(&mp_bhi160_enable_sensor_obj) },
+	{ MP_ROM_QSTR(MP_QSTR_read_sensor),
+	  MP_ROM_PTR(&mp_bhi160_read_sensor_obj) },
+};
+STATIC MP_DEFINE_CONST_DICT(bhi160_module_globals, bhi160_module_globals_table);
+
+// Define module object.
+const mp_obj_module_t bhi160_module = {
+	.base    = { &mp_type_module },
+	.globals = (mp_obj_dict_t *)&bhi160_module_globals,
+};
+
+/* clang-format off */
+// Register the module to make it available in Python
+MP_REGISTER_MODULE(MP_QSTR_sys_bhi160, bhi160_module, MODULE_BHI160_ENABLED);
diff --git a/pycardium/modules/interrupt.c b/pycardium/modules/interrupt.c
index 8a1a4c282a005833b1dfe03dec51554b67e971ce..416aeaf52dc4825d62082f0bad2cc36aa1c9ab5e 100644
--- a/pycardium/modules/interrupt.c
+++ b/pycardium/modules/interrupt.c
@@ -81,7 +81,7 @@ static const mp_rom_map_elem_t interrupt_module_globals_table[] = {
 	  MP_ROM_PTR(&interrupt_enable_callback_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_disable_callback),
 	  MP_ROM_PTR(&interrupt_disable_callback_obj) },
-	{ MP_ROM_QSTR(MP_QSTR_BHI160), MP_OBJ_NEW_SMALL_INT(2) },
+	{ MP_ROM_QSTR(MP_QSTR_BHI160_ACCELEROMETER), MP_OBJ_NEW_SMALL_INT(2) },
 };
 static MP_DEFINE_CONST_DICT(
 	interrupt_module_globals, interrupt_module_globals_table
diff --git a/pycardium/modules/py/bhi160.py b/pycardium/modules/py/bhi160.py
new file mode 100644
index 0000000000000000000000000000000000000000..b03ba52c6369658d57fa41df4a0470990b35e334
--- /dev/null
+++ b/pycardium/modules/py/bhi160.py
@@ -0,0 +1,32 @@
+import sys_bhi160
+import interrupt
+
+class BHI160Accelerometer:
+    def __init__(self,sample_rate=4, dynamic_range=2, callback=None, sample_buffer_len=200):
+        interrupt.disable_callback(interrupt.BHI160_ACCELEROMETER)
+        interrupt.set_callback(interrupt.BHI160_ACCELEROMETER, self._accelerometer_interrupt)
+        self.acc_sd = sys_bhi160.enable_sensor(0, sample_buffer_len, sample_rate, dynamic_range)
+        self._callback = callback
+        if callback:
+            interrupt.enable_callback(interrupt.BHI160_ACCELEROMETER)
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, _et, _ev, _t):
+        self.close()
+
+    def close():
+        if self.acc_sd != None:
+            self.acc_sd = None
+            self.acc_sd = sys_bhi160.disable_sensor(0)
+            interrupt.disable_callback(interrupt.BHI160_ACCELEROMETER)
+            interrupt.set_callback(interrupt.BHI160_ACCELEROMETER, None)
+
+    def _accelerometer_interrupt(self, _):
+        if self.acc_sd != None:
+            data = sys_bhi160.read_sensor(self.acc_sd)
+            print(data)
+            if self._callback:
+                self._callback(data)
+
diff --git a/pycardium/modules/py/meson.build b/pycardium/modules/py/meson.build
index eab92f959051c62bfc4ab065d3385e721d6711f2..d164445c681176d34bc377f70cc4e51d7eca9c54 100644
--- a/pycardium/modules/py/meson.build
+++ b/pycardium/modules/py/meson.build
@@ -1,4 +1,5 @@
 python_modules = files(
+  'bhi160.py',
   'color.py',
   'htmlcolor.py',
   'display.py',
diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h
index e8ac9dac50a12c6a1566c07626050358940587fc..b60308a554a46b3493ac2515cee8860382aae3fa 100644
--- a/pycardium/modules/qstrdefs.h
+++ b/pycardium/modules/qstrdefs.h
@@ -29,7 +29,11 @@ Q(vibrate)
 Q(set_callback)
 Q(enable_callback)
 Q(disable_callback)
-Q(BHI160)
+Q(BHI160_ACCELEROMETER)
+
+Q(sys_bhi160)
+Q(enable_sensor)
+Q(read_sensor)
 
 /* display */
 Q(sys_display)
diff --git a/pycardium/mpconfigport.h b/pycardium/mpconfigport.h
index 9bed1f600fd79535f4f53d6792f0ded869cf99d0..2f220b008d7f6754bf21afdd0f4cf6c1deffbad4 100644
--- a/pycardium/mpconfigport.h
+++ b/pycardium/mpconfigport.h
@@ -38,6 +38,7 @@
 
 /* Modules */
 #define MODULE_UTIME_ENABLED                (1)
+#define MODULE_BHI160_ENABLED               (1)
 #define MODULE_LEDS_ENABLED                 (1)
 #define MODULE_VIBRA_ENABLED                (1)
 #define MODULE_INTERRUPT_ENABLED            (1)