From be9b1437db93fab74da70f32366b0a278351bb1a Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Wed, 19 May 2021 17:49:14 +0100 Subject: [PATCH] Add MicroPython bindings for BME280 and BMP280 --- drivers/bme280/bme280.cpp | 8 ++ drivers/bme280/bme280.hpp | 4 + drivers/bmp280/bmp280.cpp | 8 ++ drivers/bmp280/bmp280.hpp | 4 + .../examples/breakout_bme280/demo_bme280.py | 14 +++ .../examples/breakout_bmp280/demo_bmp280.py | 14 +++ .../modules/breakout_bme280/breakout_bme280.c | 46 +++++++++ .../breakout_bme280/breakout_bme280.cpp | 96 +++++++++++++++++++ .../modules/breakout_bme280/breakout_bme280.h | 12 +++ .../modules/breakout_bme280/micropython.cmake | 20 ++++ .../modules/breakout_bme280/micropython.mk | 13 +++ .../modules/breakout_bmp280/breakout_bmp280.c | 46 +++++++++ .../breakout_bmp280/breakout_bmp280.cpp | 95 ++++++++++++++++++ .../modules/breakout_bmp280/breakout_bmp280.h | 12 +++ .../modules/breakout_bmp280/micropython.cmake | 20 ++++ .../modules/breakout_bmp280/micropython.mk | 13 +++ micropython/modules/micropython.cmake | 2 + 17 files changed, 427 insertions(+) create mode 100644 micropython/examples/breakout_bme280/demo_bme280.py create mode 100644 micropython/examples/breakout_bmp280/demo_bmp280.py create mode 100644 micropython/modules/breakout_bme280/breakout_bme280.c create mode 100644 micropython/modules/breakout_bme280/breakout_bme280.cpp create mode 100644 micropython/modules/breakout_bme280/breakout_bme280.h create mode 100644 micropython/modules/breakout_bme280/micropython.cmake create mode 100755 micropython/modules/breakout_bme280/micropython.mk create mode 100644 micropython/modules/breakout_bmp280/breakout_bmp280.c create mode 100644 micropython/modules/breakout_bmp280/breakout_bmp280.cpp create mode 100644 micropython/modules/breakout_bmp280/breakout_bmp280.h create mode 100644 micropython/modules/breakout_bmp280/micropython.cmake create mode 100755 micropython/modules/breakout_bmp280/micropython.mk diff --git a/drivers/bme280/bme280.cpp b/drivers/bme280/bme280.cpp index c98d4a10..31aba0e3 100644 --- a/drivers/bme280/bme280.cpp +++ b/drivers/bme280/bme280.cpp @@ -72,4 +72,12 @@ namespace pimoroni { reading.humidity = data.humidity; return reading; } + + I2C* BME280::get_i2c() const { + return i2c; + } + + int BME280::get_int() const { + return interrupt; + } } \ No newline at end of file diff --git a/drivers/bme280/bme280.hpp b/drivers/bme280/bme280.hpp index f06a26e8..9ab8f198 100644 --- a/drivers/bme280/bme280.hpp +++ b/drivers/bme280/bme280.hpp @@ -35,6 +35,10 @@ namespace pimoroni { BME280(uint8_t address) : BME280(new I2C(), address) {} BME280(I2C *i2c, uint8_t address = DEFAULT_I2C_ADDRESS, uint interrupt = PIN_UNUSED) : i2c(i2c), address(address), interrupt(interrupt) {} + // For print access in micropython + I2C* get_i2c() const; + int get_int() const; + bme280_reading read(); BME280::bme280_reading read_forced(); diff --git a/drivers/bmp280/bmp280.cpp b/drivers/bmp280/bmp280.cpp index 744b7b1a..019f3b2e 100644 --- a/drivers/bmp280/bmp280.cpp +++ b/drivers/bmp280/bmp280.cpp @@ -57,4 +57,12 @@ namespace pimoroni { return result; } + + I2C* BMP280::get_i2c() const { + return i2c; + } + + int BMP280::get_int() const { + return interrupt; + } } \ No newline at end of file diff --git a/drivers/bmp280/bmp280.hpp b/drivers/bmp280/bmp280.hpp index 6ae33529..02249b0c 100644 --- a/drivers/bmp280/bmp280.hpp +++ b/drivers/bmp280/bmp280.hpp @@ -34,6 +34,10 @@ namespace pimoroni { BMP280(uint8_t address) : BMP280(new I2C(), address) {} BMP280(I2C *i2c, uint8_t address = DEFAULT_I2C_ADDRESS, uint interrupt = PIN_UNUSED) : i2c(i2c), address(address), interrupt(interrupt) {} + // For print access in micropython + I2C* get_i2c() const; + int get_int() const; + bmp280_reading read(); // Bindings for bmp280_dev diff --git a/micropython/examples/breakout_bme280/demo_bme280.py b/micropython/examples/breakout_bme280/demo_bme280.py new file mode 100644 index 00000000..382c7b44 --- /dev/null +++ b/micropython/examples/breakout_bme280/demo_bme280.py @@ -0,0 +1,14 @@ +import time +from breakout_bme280 import BreakoutBME280 +from pimoroni_i2c import PimoroniI2C + +PINS_BREAKOUT_GARDEN = {"sda": 4, "scl": 5} +PINS_PICO_EXPLORER = {"sda": 20, "scl": 21} + +i2c = PimoroniI2C(**PINS_BREAKOUT_GARDEN) +bme = BreakoutBME280(i2c) + +while True: + reading = bme.read() + print(reading) + time.sleep(1.0) diff --git a/micropython/examples/breakout_bmp280/demo_bmp280.py b/micropython/examples/breakout_bmp280/demo_bmp280.py new file mode 100644 index 00000000..af2eb28c --- /dev/null +++ b/micropython/examples/breakout_bmp280/demo_bmp280.py @@ -0,0 +1,14 @@ +import time +from breakout_bmp280 import BreakoutBMP280 +from pimoroni_i2c import PimoroniI2C + +PINS_BREAKOUT_GARDEN = {"sda": 4, "scl": 5} +PINS_PICO_EXPLORER = {"sda": 20, "scl": 21} + +i2c = PimoroniI2C(**PINS_BREAKOUT_GARDEN) +bmp = BreakoutBMP280(i2c) + +while True: + reading = bmp.read() + print(reading) + time.sleep(1.0) diff --git a/micropython/modules/breakout_bme280/breakout_bme280.c b/micropython/modules/breakout_bme280/breakout_bme280.c new file mode 100644 index 00000000..bfa8bcd4 --- /dev/null +++ b/micropython/modules/breakout_bme280/breakout_bme280.c @@ -0,0 +1,46 @@ +#include "breakout_bme280.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// BreakoutBME280 Class +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/***** Methods *****/ +MP_DEFINE_CONST_FUN_OBJ_1(BreakoutBME280_read_obj, BreakoutBME280_read); + +/***** Binding of Methods *****/ +STATIC const mp_rom_map_elem_t BreakoutBME280_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&BreakoutBME280_read_obj) }, +}; +STATIC MP_DEFINE_CONST_DICT(BreakoutBME280_locals_dict, BreakoutBME280_locals_dict_table); + +/***** Class Definition *****/ +const mp_obj_type_t breakout_bme280_BreakoutBME280_type = { + { &mp_type_type }, + .name = MP_QSTR_breakout_bme280, + .print = BreakoutBME280_print, + .make_new = BreakoutBME280_make_new, + .locals_dict = (mp_obj_dict_t*)&BreakoutBME280_locals_dict, +}; + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// breakout_bme280 Module +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/***** Globals Table *****/ +STATIC const mp_map_elem_t breakout_bme280_globals_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_breakout_bme280) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_BreakoutBME280), (mp_obj_t)&breakout_bme280_BreakoutBME280_type }, +}; +STATIC MP_DEFINE_CONST_DICT(mp_module_breakout_bme280_globals, breakout_bme280_globals_table); + +/***** Module Definition *****/ +const mp_obj_module_t breakout_bme280_user_cmodule = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t*)&mp_module_breakout_bme280_globals, +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// +MP_REGISTER_MODULE(MP_QSTR_breakout_bme280, breakout_bme280_user_cmodule, MODULE_BREAKOUT_BME280_ENABLED); +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/micropython/modules/breakout_bme280/breakout_bme280.cpp b/micropython/modules/breakout_bme280/breakout_bme280.cpp new file mode 100644 index 00000000..10279707 --- /dev/null +++ b/micropython/modules/breakout_bme280/breakout_bme280.cpp @@ -0,0 +1,96 @@ +#include "drivers/bme280/bme280.hpp" + +#define MP_OBJ_TO_PTR2(o, t) ((t *)(uintptr_t)(o)) + +// SDA/SCL on even/odd pins, I2C0/I2C1 on even/odd pairs of pins. +#define IS_VALID_SCL(i2c, pin) (((pin) & 1) == 1 && (((pin) & 2) >> 1) == (i2c)) +#define IS_VALID_SDA(i2c, pin) (((pin) & 1) == 0 && (((pin) & 2) >> 1) == (i2c)) + + +using namespace pimoroni; + +extern "C" { +#include "breakout_bme280.h" +#include "pimoroni_i2c.h" + +/***** I2C Struct *****/ +typedef struct _PimoroniI2C_obj_t { + mp_obj_base_t base; + I2C *i2c; +} _PimoroniI2C_obj_t; + +/***** Variables Struct *****/ +typedef struct _breakout_bme280_BreakoutBME280_obj_t { + mp_obj_base_t base; + BME280 *breakout; +} breakout_bme280_BreakoutBME280_obj_t; + +/***** Print *****/ +void BreakoutBME280_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { + (void)kind; //Unused input parameter + breakout_bme280_BreakoutBME280_obj_t *self = MP_OBJ_TO_PTR2(self_in, breakout_bme280_BreakoutBME280_obj_t); + BME280* breakout = self->breakout; + mp_print_str(print, "BreakoutBME280("); + + mp_print_str(print, "i2c = "); + mp_obj_print_helper(print, mp_obj_new_int((breakout->get_i2c()->get_i2c() == i2c0) ? 0 : 1), PRINT_REPR); + + mp_print_str(print, ", sda = "); + mp_obj_print_helper(print, mp_obj_new_int(breakout->get_i2c()->get_sda()), PRINT_REPR); + + mp_print_str(print, ", scl = "); + mp_obj_print_helper(print, mp_obj_new_int(breakout->get_i2c()->get_scl()), PRINT_REPR); + + mp_print_str(print, ", int = "); + mp_obj_print_helper(print, mp_obj_new_int(breakout->get_int()), PRINT_REPR); + + mp_print_str(print, ")"); +} + +/***** Constructor *****/ +mp_obj_t BreakoutBME280_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + breakout_bme280_BreakoutBME280_obj_t *self = nullptr; + + enum { ARG_i2c, ARG_address, ARG_int }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_i2c, MP_ARG_OBJ, {.u_obj = nullptr} }, + { MP_QSTR_address, MP_ARG_INT, {.u_int = BME280::DEFAULT_I2C_ADDRESS} }, + { MP_QSTR_interrupt, MP_ARG_INT, {.u_int = PIN_UNUSED} }, + }; + + // Parse args. + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + + if(!MP_OBJ_IS_TYPE(args[ARG_i2c].u_obj, &PimoroniI2C_type)) { + mp_raise_ValueError(MP_ERROR_TEXT("BreakoutBME280: Bad i2C object")); + return mp_const_none; + } + + _PimoroniI2C_obj_t *i2c = (_PimoroniI2C_obj_t *)MP_OBJ_TO_PTR(args[ARG_i2c].u_obj); + + self = m_new_obj(breakout_bme280_BreakoutBME280_obj_t); + self->base.type = &breakout_bme280_BreakoutBME280_type; + + self->breakout = new BME280(i2c->i2c, args[ARG_address].u_int, args[ARG_int].u_int); + + if(!self->breakout->init()) { + mp_raise_msg(&mp_type_RuntimeError, "BreakoutBME280: breakout not found when initialising"); + } + + return MP_OBJ_FROM_PTR(self); +} + +mp_obj_t BreakoutBME280_read(mp_obj_t self_in) { + breakout_bme280_BreakoutBME280_obj_t *self = MP_OBJ_TO_PTR2(self_in, breakout_bme280_BreakoutBME280_obj_t); + BME280::bme280_reading result = self->breakout->read_forced(); + + mp_obj_t tuple[3]; + tuple[0] = mp_obj_new_float(result.temperature); + tuple[1] = mp_obj_new_float(result.pressure); + tuple[2] = mp_obj_new_float(result.humidity); + return mp_obj_new_tuple(3, tuple); +} + +} \ No newline at end of file diff --git a/micropython/modules/breakout_bme280/breakout_bme280.h b/micropython/modules/breakout_bme280/breakout_bme280.h new file mode 100644 index 00000000..6ead8b07 --- /dev/null +++ b/micropython/modules/breakout_bme280/breakout_bme280.h @@ -0,0 +1,12 @@ +// Include MicroPython API. +#include "py/runtime.h" + +/***** Constants *****/ + +/***** Extern of Class Definition *****/ +extern const mp_obj_type_t breakout_bme280_BreakoutBME280_type; + +/***** Extern of Class Methods *****/ +extern void BreakoutBME280_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind); +extern mp_obj_t BreakoutBME280_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args); +extern mp_obj_t BreakoutBME280_read(mp_obj_t self_in); \ No newline at end of file diff --git a/micropython/modules/breakout_bme280/micropython.cmake b/micropython/modules/breakout_bme280/micropython.cmake new file mode 100644 index 00000000..584e854d --- /dev/null +++ b/micropython/modules/breakout_bme280/micropython.cmake @@ -0,0 +1,20 @@ +set(MOD_NAME breakout_bme280) +string(TOUPPER ${MOD_NAME} MOD_NAME_UPPER) +add_library(usermod_${MOD_NAME} INTERFACE) + +target_sources(usermod_${MOD_NAME} INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/${MOD_NAME}.c + ${CMAKE_CURRENT_LIST_DIR}/${MOD_NAME}.cpp + ${CMAKE_CURRENT_LIST_DIR}/../../../drivers/bme280/src/bme280.c + ${CMAKE_CURRENT_LIST_DIR}/../../../drivers/bme280/bme280.cpp +) + +target_include_directories(usermod_${MOD_NAME} INTERFACE + ${CMAKE_CURRENT_LIST_DIR} +) + +target_compile_definitions(usermod_${MOD_NAME} INTERFACE + MODULE_${MOD_NAME_UPPER}_ENABLED=1 +) + +target_link_libraries(usermod INTERFACE usermod_${MOD_NAME}) \ No newline at end of file diff --git a/micropython/modules/breakout_bme280/micropython.mk b/micropython/modules/breakout_bme280/micropython.mk new file mode 100755 index 00000000..ed13d3a3 --- /dev/null +++ b/micropython/modules/breakout_bme280/micropython.mk @@ -0,0 +1,13 @@ +set(MOD_NAME breakout_as7262) +BREAKOUT_MOD_DIR := $(USERMOD_DIR) + +# Add our source files to the respective variables. +SRC_USERMOD += $(BREAKOUT_MOD_DIR)/${MOD_NAME}.c +SRC_USERMOD_CXX += $(BREAKOUT_MOD_DIR)/${MOD_NAME}.cpp + +# Add our module directory to the include path. +CFLAGS_USERMOD += -I$(BREAKOUT_MOD_DIR) +CXXFLAGS_USERMOD += -I$(BREAKOUT_MOD_DIR) + +# We use C++ features so have to link against the standard library. +LDFLAGS_USERMOD += -lstdc++ \ No newline at end of file diff --git a/micropython/modules/breakout_bmp280/breakout_bmp280.c b/micropython/modules/breakout_bmp280/breakout_bmp280.c new file mode 100644 index 00000000..d40a5261 --- /dev/null +++ b/micropython/modules/breakout_bmp280/breakout_bmp280.c @@ -0,0 +1,46 @@ +#include "breakout_bmp280.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// BreakoutBMP280 Class +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/***** Methods *****/ +MP_DEFINE_CONST_FUN_OBJ_1(BreakoutBMP280_read_obj, BreakoutBMP280_read); + +/***** Binding of Methods *****/ +STATIC const mp_rom_map_elem_t BreakoutBMP280_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&BreakoutBMP280_read_obj) }, +}; +STATIC MP_DEFINE_CONST_DICT(BreakoutBMP280_locals_dict, BreakoutBMP280_locals_dict_table); + +/***** Class Definition *****/ +const mp_obj_type_t breakout_bmp280_BreakoutBMP280_type = { + { &mp_type_type }, + .name = MP_QSTR_breakout_bmp280, + .print = BreakoutBMP280_print, + .make_new = BreakoutBMP280_make_new, + .locals_dict = (mp_obj_dict_t*)&BreakoutBMP280_locals_dict, +}; + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// breakout_bmp280 Module +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/***** Globals Table *****/ +STATIC const mp_map_elem_t breakout_bmp280_globals_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_breakout_bmp280) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_BreakoutBMP280), (mp_obj_t)&breakout_bmp280_BreakoutBMP280_type }, +}; +STATIC MP_DEFINE_CONST_DICT(mp_module_breakout_bmp280_globals, breakout_bmp280_globals_table); + +/***** Module Definition *****/ +const mp_obj_module_t breakout_bmp280_user_cmodule = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t*)&mp_module_breakout_bmp280_globals, +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// +MP_REGISTER_MODULE(MP_QSTR_breakout_bmp280, breakout_bmp280_user_cmodule, MODULE_BREAKOUT_BMP280_ENABLED); +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/micropython/modules/breakout_bmp280/breakout_bmp280.cpp b/micropython/modules/breakout_bmp280/breakout_bmp280.cpp new file mode 100644 index 00000000..c78bbe65 --- /dev/null +++ b/micropython/modules/breakout_bmp280/breakout_bmp280.cpp @@ -0,0 +1,95 @@ +#include "drivers/bmp280/bmp280.hpp" + +#define MP_OBJ_TO_PTR2(o, t) ((t *)(uintptr_t)(o)) + +// SDA/SCL on even/odd pins, I2C0/I2C1 on even/odd pairs of pins. +#define IS_VALID_SCL(i2c, pin) (((pin) & 1) == 1 && (((pin) & 2) >> 1) == (i2c)) +#define IS_VALID_SDA(i2c, pin) (((pin) & 1) == 0 && (((pin) & 2) >> 1) == (i2c)) + + +using namespace pimoroni; + +extern "C" { +#include "breakout_bmp280.h" +#include "pimoroni_i2c.h" + +/***** I2C Struct *****/ +typedef struct _PimoroniI2C_obj_t { + mp_obj_base_t base; + I2C *i2c; +} _PimoroniI2C_obj_t; + +/***** Variables Struct *****/ +typedef struct _breakout_bmp280_BreakoutBMP280_obj_t { + mp_obj_base_t base; + BMP280 *breakout; +} breakout_bmp280_BreakoutBMP280_obj_t; + +/***** Print *****/ +void BreakoutBMP280_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { + (void)kind; //Unused input parameter + breakout_bmp280_BreakoutBMP280_obj_t *self = MP_OBJ_TO_PTR2(self_in, breakout_bmp280_BreakoutBMP280_obj_t); + BMP280* breakout = self->breakout; + mp_print_str(print, "BreakoutBMP280("); + + mp_print_str(print, "i2c = "); + mp_obj_print_helper(print, mp_obj_new_int((breakout->get_i2c()->get_i2c() == i2c0) ? 0 : 1), PRINT_REPR); + + mp_print_str(print, ", sda = "); + mp_obj_print_helper(print, mp_obj_new_int(breakout->get_i2c()->get_sda()), PRINT_REPR); + + mp_print_str(print, ", scl = "); + mp_obj_print_helper(print, mp_obj_new_int(breakout->get_i2c()->get_scl()), PRINT_REPR); + + mp_print_str(print, ", int = "); + mp_obj_print_helper(print, mp_obj_new_int(breakout->get_int()), PRINT_REPR); + + mp_print_str(print, ")"); +} + +/***** Constructor *****/ +mp_obj_t BreakoutBMP280_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + breakout_bmp280_BreakoutBMP280_obj_t *self = nullptr; + + enum { ARG_i2c, ARG_address, ARG_int }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_i2c, MP_ARG_OBJ, {.u_obj = nullptr} }, + { MP_QSTR_address, MP_ARG_INT, {.u_int = BMP280::DEFAULT_I2C_ADDRESS} }, + { MP_QSTR_interrupt, MP_ARG_INT, {.u_int = PIN_UNUSED} }, + }; + + // Parse args. + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + + if(!MP_OBJ_IS_TYPE(args[ARG_i2c].u_obj, &PimoroniI2C_type)) { + mp_raise_ValueError(MP_ERROR_TEXT("BreakoutBMP280: Bad i2C object")); + return mp_const_none; + } + + _PimoroniI2C_obj_t *i2c = (_PimoroniI2C_obj_t *)MP_OBJ_TO_PTR(args[ARG_i2c].u_obj); + + self = m_new_obj(breakout_bmp280_BreakoutBMP280_obj_t); + self->base.type = &breakout_bmp280_BreakoutBMP280_type; + + self->breakout = new BMP280(i2c->i2c, args[ARG_address].u_int, args[ARG_int].u_int); + + if(!self->breakout->init()) { + mp_raise_msg(&mp_type_RuntimeError, "BreakoutBMP280: breakout not found when initialising"); + } + + return MP_OBJ_FROM_PTR(self); +} + +mp_obj_t BreakoutBMP280_read(mp_obj_t self_in) { + breakout_bmp280_BreakoutBMP280_obj_t *self = MP_OBJ_TO_PTR2(self_in, breakout_bmp280_BreakoutBMP280_obj_t); + BMP280::bmp280_reading result = self->breakout->read(); + + mp_obj_t tuple[2]; + tuple[0] = mp_obj_new_float(result.temperature); + tuple[1] = mp_obj_new_float(result.pressure); + return mp_obj_new_tuple(2, tuple); +} + +} \ No newline at end of file diff --git a/micropython/modules/breakout_bmp280/breakout_bmp280.h b/micropython/modules/breakout_bmp280/breakout_bmp280.h new file mode 100644 index 00000000..5eb72ced --- /dev/null +++ b/micropython/modules/breakout_bmp280/breakout_bmp280.h @@ -0,0 +1,12 @@ +// Include MicroPython API. +#include "py/runtime.h" + +/***** Constants *****/ + +/***** Extern of Class Definition *****/ +extern const mp_obj_type_t breakout_bmp280_BreakoutBMP280_type; + +/***** Extern of Class Methods *****/ +extern void BreakoutBMP280_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind); +extern mp_obj_t BreakoutBMP280_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args); +extern mp_obj_t BreakoutBMP280_read(mp_obj_t self_in); \ No newline at end of file diff --git a/micropython/modules/breakout_bmp280/micropython.cmake b/micropython/modules/breakout_bmp280/micropython.cmake new file mode 100644 index 00000000..663e6030 --- /dev/null +++ b/micropython/modules/breakout_bmp280/micropython.cmake @@ -0,0 +1,20 @@ +set(MOD_NAME breakout_bmp280) +string(TOUPPER ${MOD_NAME} MOD_NAME_UPPER) +add_library(usermod_${MOD_NAME} INTERFACE) + +target_sources(usermod_${MOD_NAME} INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/${MOD_NAME}.c + ${CMAKE_CURRENT_LIST_DIR}/${MOD_NAME}.cpp + ${CMAKE_CURRENT_LIST_DIR}/../../../drivers/bmp280/src/bmp280.c + ${CMAKE_CURRENT_LIST_DIR}/../../../drivers/bmp280/bmp280.cpp +) + +target_include_directories(usermod_${MOD_NAME} INTERFACE + ${CMAKE_CURRENT_LIST_DIR} +) + +target_compile_definitions(usermod_${MOD_NAME} INTERFACE + MODULE_${MOD_NAME_UPPER}_ENABLED=1 +) + +target_link_libraries(usermod INTERFACE usermod_${MOD_NAME}) \ No newline at end of file diff --git a/micropython/modules/breakout_bmp280/micropython.mk b/micropython/modules/breakout_bmp280/micropython.mk new file mode 100755 index 00000000..ed13d3a3 --- /dev/null +++ b/micropython/modules/breakout_bmp280/micropython.mk @@ -0,0 +1,13 @@ +set(MOD_NAME breakout_as7262) +BREAKOUT_MOD_DIR := $(USERMOD_DIR) + +# Add our source files to the respective variables. +SRC_USERMOD += $(BREAKOUT_MOD_DIR)/${MOD_NAME}.c +SRC_USERMOD_CXX += $(BREAKOUT_MOD_DIR)/${MOD_NAME}.cpp + +# Add our module directory to the include path. +CFLAGS_USERMOD += -I$(BREAKOUT_MOD_DIR) +CXXFLAGS_USERMOD += -I$(BREAKOUT_MOD_DIR) + +# We use C++ features so have to link against the standard library. +LDFLAGS_USERMOD += -lstdc++ \ No newline at end of file diff --git a/micropython/modules/micropython.cmake b/micropython/modules/micropython.cmake index 616697f6..7c8dd9b3 100644 --- a/micropython/modules/micropython.cmake +++ b/micropython/modules/micropython.cmake @@ -23,6 +23,8 @@ include(breakout_sgp30/micropython) include(breakout_colourlcd240x240/micropython) include(breakout_bh1745/micropython) include(breakout_bme68x/micropython) +include(breakout_bme280/micropython) +include(breakout_bmp280/micropython) include(pico_scroll/micropython) include(pico_rgb_keypad/micropython)