diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h
index 29b8244a13309468c599dfae01021fe95756083c..e865f8b547dcc44c3ce6dba5b2c29066838959b2 100644
--- a/epicardium/epicardium.h
+++ b/epicardium/epicardium.h
@@ -112,9 +112,12 @@ API(API_INTERRUPT_DISABLE, int epic_interrupt_disable(api_int_id_t int_id));
 #define EPIC_INT_UART_RX                2
 /** RTC Alarm interrupt.  See :c:func:`epic_isr_rtc_alarm` */
 #define EPIC_INT_RTC_ALARM              3
+/** TODO: BHI */
+#define EPIC_INT_BHI160_ACCELEROMETER   4
+API_ISR(EPIC_INT_BHI160_ACCELEROMETER, epic_isr_bhi160_accelerometer);
 
 /* Number of defined interrupts. */
-#define EPIC_INT_NUM                    4
+#define EPIC_INT_NUM                    5
 /* clang-format on */
 
 API_ISR(EPIC_INT_RESET, epic_isr_reset);
diff --git a/epicardium/modules/bhi.c b/epicardium/modules/bhi.c
index 79ce0a724fcf9e11c14d0c6185d116a293f77cad..77ad773f5e013bdee71a1a297a80c407139a5ae1 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/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 10770a19648a9bd9af182dfd58e2f0fddbf32def..90dd700a8fc0022163c65ce10a883baed3d75b45 100644
--- a/pycardium/modules/interrupt.c
+++ b/pycardium/modules/interrupt.c
@@ -85,6 +85,8 @@ static const mp_rom_map_elem_t interrupt_module_globals_table[] = {
 	/* Interrupt Numbers */
 	{ MP_ROM_QSTR(MP_QSTR_RTC_ALARM),
 	  MP_OBJ_NEW_SMALL_INT(EPIC_INT_RTC_ALARM) },
+	{ MP_ROM_QSTR(MP_QSTR_BHI160_ACCELEROMETER),
+	  MP_OBJ_NEW_SMALL_INT(EPIC_INT_BHI160_ACCELEROMETER) },
 };
 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..4d13895f64b36d453d02c4a5ca3883b17601133d
--- /dev/null
+++ b/pycardium/modules/py/bhi160.py
@@ -0,0 +1,38 @@
+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(self):
+        if self.acc_sd is not 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 is not 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 dedc57c05513debe59a7441493dcf7d86ec0060d..8b6495cf46287ed610749cf168936e387fa5e055 100644
--- a/pycardium/modules/qstrdefs.h
+++ b/pycardium/modules/qstrdefs.h
@@ -33,9 +33,14 @@ Q(vibrate)
 Q(set_callback)
 Q(enable_callback)
 Q(disable_callback)
-Q(BHI160)
+Q(BHI160_ACCELEROMETER)
 Q(RTC_ALARM)
 
+/* bhi160 */
+Q(sys_bhi160)
+Q(enable_sensor)
+Q(read_sensor)
+
 /* display */
 Q(sys_display)
 Q(display)
diff --git a/pycardium/mpconfigport.h b/pycardium/mpconfigport.h
index 233c01bbb82dd986e9ec54c53275ffef96631269..4b57b43a5ca18e4e25ac03a8018dfe59b0dcf4c8 100644
--- a/pycardium/mpconfigport.h
+++ b/pycardium/mpconfigport.h
@@ -39,6 +39,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)