From 2e8aa31cbf060fc00f642714650111a0d70711dd Mon Sep 17 00:00:00 2001 From: Matthias Mitscherlich Date: Mon, 6 Feb 2023 16:21:56 +0100 Subject: [PATCH] Added I2C and BMP280 i2c already running and functional, bmp280 code is still in the main and needs re-organisation Temperature readout works, pressure is not required at this stage --- code/.settings/org.eclipse.cdt.core.prefs | 6 + code/main/CMakeLists.txt | 2 + code/main/inc/bmp280.h | 70 ++++++++++++ code/main/inc/i2c.h | 86 +++++++++++++++ code/main/inc/wordmap.h | 1 + code/main/main.cpp | 129 +++++++++++----------- code/main/src/bmp280.cpp | 51 +++++++++ code/main/src/gpio.cpp | 10 -- code/main/src/i2c.cpp | 122 ++++++++++++++++++++ code/main/src/wifi.cpp | 8 +- doc/matrix.ods | Bin 5528 -> 12209 bytes 11 files changed, 409 insertions(+), 76 deletions(-) create mode 100644 code/.settings/org.eclipse.cdt.core.prefs create mode 100644 code/main/inc/bmp280.h create mode 100644 code/main/inc/i2c.h create mode 100644 code/main/src/bmp280.cpp create mode 100644 code/main/src/i2c.cpp diff --git a/code/.settings/org.eclipse.cdt.core.prefs b/code/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 0000000..c8ec5df --- /dev/null +++ b/code/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,6 @@ +doxygen/doxygen_new_line_after_brief=true +doxygen/doxygen_use_brief_tag=false +doxygen/doxygen_use_javadoc_tags=true +doxygen/doxygen_use_pre_tag=false +doxygen/doxygen_use_structural_commands=false +eclipse.preferences.version=1 diff --git a/code/main/CMakeLists.txt b/code/main/CMakeLists.txt index 8811206..e64c792 100644 --- a/code/main/CMakeLists.txt +++ b/code/main/CMakeLists.txt @@ -4,7 +4,9 @@ idf_component_register( SRCS # list the source files of this component "main.cpp" + "src/bmp280.cpp" "src/gpio.cpp" + "src/i2c.cpp" "src/wifi.cpp" "src/logger.cpp" "src/led_strip_encoder.c" diff --git a/code/main/inc/bmp280.h b/code/main/inc/bmp280.h new file mode 100644 index 0000000..e68ff8b --- /dev/null +++ b/code/main/inc/bmp280.h @@ -0,0 +1,70 @@ +// -------------------------------------------------------------------------------------------------------------------- +/// \file bme280.h +/// \brief File description +// -------------------------------------------------------------------------------------------------------------------- +// +// vbchaos software design +// +// -------------------------------------------------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2023 vbchaos +// -------------------------------------------------------------------------------------------------------------------- + + +#ifndef MAIN_INC_BMP280_H_ +#define MAIN_INC_BMP280_H_ + +/** + * bme280 implementation + * \defgroup bme280 + * \brief {group_description} + * \addtogroup {Layer} + * + * Detailed description + * @{ + */ + + + +// -------------------------------------------------------------------------------------------------------------------- +// Include files +// -------------------------------------------------------------------------------------------------------------------- + +// CompilerIncludes +// All include files that are provided by the compiler directly + + + +// ProjectIncludes +// All include files that are provided by the project + +// -------------------------------------------------------------------------------------------------------------------- +// Constant and macro definitions +// -------------------------------------------------------------------------------------------------------------------- + + + +// -------------------------------------------------------------------------------------------------------------------- +// Type definitions. +// -------------------------------------------------------------------------------------------------------------------- + + + +// -------------------------------------------------------------------------------------------------------------------- +// Function declarations +// -------------------------------------------------------------------------------------------------------------------- + +class BMP280 +{ + public: + + private: + +}; + + +/** @} */ + +#endif /* MAIN_INC_BMP280_H_ */ diff --git a/code/main/inc/i2c.h b/code/main/inc/i2c.h new file mode 100644 index 0000000..c250d18 --- /dev/null +++ b/code/main/inc/i2c.h @@ -0,0 +1,86 @@ +// -------------------------------------------------------------------------------------------------------------------- +/// \file i2c.h +/// \brief File description +// -------------------------------------------------------------------------------------------------------------------- +// +// vbchaos software design +// +// -------------------------------------------------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2023 vbchaos +// -------------------------------------------------------------------------------------------------------------------- + + +#ifndef MAIN_INC_I2C_H_ +#define MAIN_INC_I2C_H_ + +/** + * i2c implementation + * \defgroup i2c + * \brief {group_description} + * \addtogroup {Layer} + * + * Detailed description + * @{ + */ + + + +// -------------------------------------------------------------------------------------------------------------------- +// Include files +// -------------------------------------------------------------------------------------------------------------------- + +// CompilerIncludes +// All include files that are provided by the compiler directly +#include "stdint.h" + + +// ProjectIncludes +// All include files that are provided by the project + +// -------------------------------------------------------------------------------------------------------------------- +// Constant and macro definitions +// -------------------------------------------------------------------------------------------------------------------- + + + +// -------------------------------------------------------------------------------------------------------------------- +// Type definitions. +// -------------------------------------------------------------------------------------------------------------------- + + + +// -------------------------------------------------------------------------------------------------------------------- +// Function declarations +// -------------------------------------------------------------------------------------------------------------------- + + +class I2C +{ + public: + + I2C(unsigned int SCL, unsigned int SDA); + + bool write_register(uint8_t slaveAddress, uint8_t registerAddress, uint8_t* const data, uint8_t length); + + bool read_register(uint8_t slaveAddress, uint8_t registerAddress, uint8_t* data, uint8_t length); + + private: + + static unsigned int number; + unsigned int thisNumber; + unsigned int SCL; + unsigned int SDA; + unsigned int frequency; + unsigned int timeout_ms; + + void write(uint8_t slaveAddress, uint8_t registerAddress, uint8_t* const data, uint8_t length); + + void read(uint8_t slaveAddress, uint8_t registerAddress, uint8_t* data, uint8_t length); +}; + +/** @} */ + +#endif /* MAIN_INC_I2C_H_ */ diff --git a/code/main/inc/wordmap.h b/code/main/inc/wordmap.h index 3bf9b66..b74bb36 100644 --- a/code/main/inc/wordmap.h +++ b/code/main/inc/wordmap.h @@ -80,6 +80,7 @@ class Wordmap struct word { string identifier; +// list pixels; LEDMatrix::coordinate position; int length; }; diff --git a/code/main/main.cpp b/code/main/main.cpp index 3b17f85..ce48e28 100644 --- a/code/main/main.cpp +++ b/code/main/main.cpp @@ -33,7 +33,9 @@ #include "driver/uart_select.h" #include "driver/gptimer.h" +#include "inc/bmp280.h" #include "inc/gpio.h" +#include "inc/i2c.h" #include "inc/led_strip_encoder.h" #include "inc/ledmatrix.h" #include "inc/logger.h" @@ -49,8 +51,6 @@ #define RMT_LED_STRIP_RESOLUTION_HZ 10000000 // 10MHz resolution, 1 tick = 0.1us (led strip needs a high resolution) #define RMT_LED_STRIP_GPIO_NUM 0 -#define RMT_LED_STRIP_GPIO_AUX 1 - // -------------------------------------------------------------------------------------------------------------------- // Type definitions @@ -81,32 +81,16 @@ static rmt_encoder_handle_t led_encoder = NULL; static LEDMatrix_Parameters_t ledmatrix_parameters = { LEDMATRIX_ORIENTATION_ROW_LEFT_RIGHT, - LEDMATRIX_ORIENTATION_COLUM_UP_DOWN, + LEDMATRIX_ORIENTATION_COLUM_DOWN_UP, LEDMATRIX_ORIENTATION_ROW, - 6, - 4, + 11, + 10, &led_chan, &led_encoder, &tx_config }; -static rmt_channel_handle_t led_aux_chan = NULL; -static rmt_transmit_config_t tx_aux_config; -static rmt_encoder_handle_t led_aux_encoder = NULL; -static LEDMatrix_Parameters_t ledmatrix_aux_parameters = -{ - LEDMATRIX_ORIENTATION_ROW_LEFT_RIGHT, - LEDMATRIX_ORIENTATION_COLUM_DOWN_UP, - LEDMATRIX_ORIENTATION_COLUM, - 11, - 10, - &led_aux_chan, - &led_aux_encoder, - &tx_aux_config -}; - static LEDMatrix matrix(&ledmatrix_parameters); -static LEDMatrix aux(&ledmatrix_aux_parameters); static Wordmap map(&matrix); @@ -125,11 +109,28 @@ static bool timerCallback(gptimer_handle_t timer, const gptimer_alarm_event_data static void devTask(void* parameters); static void colourMapTask(void* parameters); + +static int bmp280_compensate_T_int32(int adc_T); // -------------------------------------------------------------------------------------------------------------------- // Function definitions // -------------------------------------------------------------------------------------------------------------------- +int t_fine; +uint16_t dig_T1 = 0x6AA3; +int16_t dig_T2 = 0x6555; +int16_t dig_T3 = 0x0032; +int bmp280_compensate_T_int32(int adc_T) +{ + int var1, var2, T; + var1 = ((((adc_T>>3) - ((int)dig_T1<<1))) * ((int)dig_T2)) >> 11; + var2 = (((((adc_T>>4) - ((int)dig_T1)) * ((adc_T>>4) - ((int)dig_T1))) >> 12) * ((int)dig_T3)) >> 14; + t_fine = var1 + var2; + T = (t_fine * 5 + 128) >> 8; +return T; +} + + extern "C" void app_main(void) { esp_log_level_set("*", ESP_LOG_WARN); @@ -164,12 +165,12 @@ extern "C" void app_main(void) // Logger logger(10, uartPort); - LOGGER_PRINT("-----------------------------------------------------------------------"); - LOGGER_PRINT("System Start"); - LOGGER_PRINT(""); - LOGGER_PRINT("WordClock"); - LOGGER_PRINT("Release: %f", RELEASE); - LOGGER_PRINT("Compiled on %d %d", __TIME__, __DATE__); + LOGGER_PRINT("\n\r-----------------------------------------------------------------------\n\r"); + LOGGER_PRINT("System Start\n\r"); + LOGGER_PRINT("\n\r"); + LOGGER_PRINT("WordClock\n\r"); + LOGGER_PRINT("Release: %f\n\r", RELEASE); + LOGGER_PRINT("Compiled on %d %d\n\r\n\r\n\r", __TIME__, __DATE__); //-------------------------------------------- @@ -202,38 +203,30 @@ extern "C" void app_main(void) //-------------------------------------------- - // RMT Channel + // I2C // - LOGGER_INFO("Create RMT TX channel"); -// memset(&tx_chan_config, 0, sizeof(tx_chan_config)); + // SourceClock: GPIO 8 + // SourceData: GPIO 9 + I2C i2c0(8, 9); -// tx_chan_config.clk_src = RMT_CLK_SRC_DEFAULT; // select source clock -// tx_chan_config.gpio_num = RMT_LED_STRIP_GPIO_AUX; -// tx_chan_config.mem_block_symbols = 64; // increase the block size can make the LED less flickering -// tx_chan_config.resolution_hz = RMT_LED_STRIP_RESOLUTION_HZ; -// tx_chan_config.trans_queue_depth = 4; - -// ESP_ERROR_CHECK(rmt_new_tx_channel(&tx_chan_config, &led_aux_chan)); - -// LOGGER_INFO("Install led strip encoder"); -// led_strip_encoder_config_t encoder_aux_config; -// memset(&encoder_aux_config, 0, sizeof(encoder_aux_config)); -// encoder_config.resolution = RMT_LED_STRIP_RESOLUTION_HZ; - -// ESP_ERROR_CHECK(rmt_new_led_strip_encoder(&encoder_aux_config, &led_aux_encoder)); - -// LOGGER_INFO("Enable RMT TX channel"); -// ESP_ERROR_CHECK(rmt_enable(led_chan)); - -// memset(&tx_config, 0, sizeof(tx_config)); -// tx_config.loop_count = 0; + uint8_t data[6]; + // Read BME280 ID register + i2c0.read_register(0x76, 0xD0, data, 1); + LOGGER_DEBUG("BMP280 ID: %02X", data[0]); + // Read compensation values + i2c0.read_register(0x76, 0x88, data, 6); + // Set the oversampling to x1 + uint8_t writeData = 0x27; + i2c0.write_register(0x76, 0xF4, &writeData, 1); //-------------------------------------------- // LED Matrix // matrix.setGlobalColour(0x10, 0, 0x04); - matrix.setGlobalColour(0x80, 0, 0x40); +// matrix.setGlobalColour(0x80, 0, 0x40); + + //-------------------------------------------- // GP Timer for automatic matrix re-draw trigger @@ -263,11 +256,11 @@ extern "C" void app_main(void) LOGGER_ERROR("Task not created"); } -// // Create the colour Map task -// if(xTaskCreate(colourMapTask, "ColourTask", 2048, NULL, 3, &colourMapTaskHandle) != pdPASS) -// { -// LOGGER_ERROR("Task not created"); -// } + // Create the colour Map task + if(xTaskCreate(colourMapTask, "ColourTask", 2048, NULL, 3, &colourMapTaskHandle) != pdPASS) + { + LOGGER_ERROR("Task not created"); + } Wifi wifi; wifi.start_client(); @@ -292,6 +285,18 @@ extern "C" void app_main(void) // Add a seconds indicator matrix.setPixelValue(10, 9, clock.getTime() % 2); + + i2c0.read_register(0x76, 0xF7, data, 3); + LOGGER_DEBUG("BMP280 pressure: %02X %02X %02X", data[0], data[1], data[2]); + + i2c0.read_register(0x76, 0xFA, data, 3); + int32_t value = 0; + value |= data[0] << 12; + value |= data[1] << 4; + value |= data[2] >> 4; + int valueComp = bmp280_compensate_T_int32(value); + LOGGER_DEBUG("BMP280 temperature: %02X %02X %02X -> %d", data[0], data[1], data[2], valueComp); + // Update the clock every second (1000 ms) vTaskDelay(1000); @@ -314,9 +319,9 @@ static void devTask(void* parameters) static void colourMapTask(void* parameters) { - uint8_t red = 0; + uint8_t red = 0x10; uint8_t green = 0; - uint8_t blue = 0; + uint8_t blue = 0x04; uint32_t counter = 0; @@ -325,10 +330,10 @@ static void colourMapTask(void* parameters) { matrix.setGlobalColour(red, green, blue); - red = counter & 0xFF; - green = (counter >> 8) & 0xFF; - blue = (counter >> 16) & 0xFF; - counter++; +// red = counter & 0xFF; +// green = (counter >> 8) & 0xFF; +// blue = (counter >> 16) & 0xFF; +// counter++; vTaskDelay(30); } diff --git a/code/main/src/bmp280.cpp b/code/main/src/bmp280.cpp new file mode 100644 index 0000000..7596e25 --- /dev/null +++ b/code/main/src/bmp280.cpp @@ -0,0 +1,51 @@ +// -------------------------------------------------------------------------------------------------------------------- +/// \file bme280.cpp +/// \brief Description +// -------------------------------------------------------------------------------------------------------------------- +// +// vbchaos software design +// +// -------------------------------------------------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2023 vbchaos +// -------------------------------------------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------------------------------------------- +// Include files +// -------------------------------------------------------------------------------------------------------------------- + +#include + +// -------------------------------------------------------------------------------------------------------------------- +// Constant and macro definitions +// -------------------------------------------------------------------------------------------------------------------- + + + +// -------------------------------------------------------------------------------------------------------------------- +// Type definitions +// -------------------------------------------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------------------------------------------- +// File-scope variables +// -------------------------------------------------------------------------------------------------------------------- + + + +// -------------------------------------------------------------------------------------------------------------------- +// Function declarations +// -------------------------------------------------------------------------------------------------------------------- + + + +// -------------------------------------------------------------------------------------------------------------------- +// Function definitions +// -------------------------------------------------------------------------------------------------------------------- + + + + diff --git a/code/main/src/gpio.cpp b/code/main/src/gpio.cpp index 9d59029..4994f37 100644 --- a/code/main/src/gpio.cpp +++ b/code/main/src/gpio.cpp @@ -17,9 +17,6 @@ // Include files // -------------------------------------------------------------------------------------------------------------------- -#include "esp_system.h" -#include "esp_log.h" - #include #include "driver/gpio.h" @@ -52,11 +49,7 @@ // Function definitions // -------------------------------------------------------------------------------------------------------------------- - - - GPIO::GPIO(int number, GPIO_Direction_t direction) - { this->number = number; this->direction = direction; @@ -111,6 +104,3 @@ GPIO_Value_t GPIO::GetInput(void) return this->value; } - - - diff --git a/code/main/src/i2c.cpp b/code/main/src/i2c.cpp new file mode 100644 index 0000000..a97176b --- /dev/null +++ b/code/main/src/i2c.cpp @@ -0,0 +1,122 @@ +// -------------------------------------------------------------------------------------------------------------------- +/// \file i2c.cpp +/// \brief Description +// -------------------------------------------------------------------------------------------------------------------- +// +// vbchaos software design +// +// -------------------------------------------------------------------------------------------------------------------- +/// $Revision: $ +/// $Author: $ +/// $Date: $ +// (c) 2023 vbchaos +// -------------------------------------------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------------------------------------------- +// Include files +// -------------------------------------------------------------------------------------------------------------------- + +#include "i2c.h" + +#include "driver/i2c.h" + +// -------------------------------------------------------------------------------------------------------------------- +// Constant and macro definitions +// -------------------------------------------------------------------------------------------------------------------- + +#define I2C_MASTER_FREQ_HZ 400000 /*!< I2C master clock frequency */ +#define I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */ +#define I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */ +#define I2C_MASTER_TIMEOUT_MS 1000 + +// -------------------------------------------------------------------------------------------------------------------- +// Type definitions +// -------------------------------------------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------------------------------------------- +// File-scope variables +// -------------------------------------------------------------------------------------------------------------------- + + + +// -------------------------------------------------------------------------------------------------------------------- +// Function declarations +// -------------------------------------------------------------------------------------------------------------------- + + + +// -------------------------------------------------------------------------------------------------------------------- +// Function definitions +// -------------------------------------------------------------------------------------------------------------------- + +// Reset the class variable +unsigned int I2C::number = 0; + +I2C::I2C(unsigned int SCL, unsigned int SDA) +{ + I2C::thisNumber = number++; + I2C::SCL = SCL; + I2C::SDA = SDA; + + I2C::frequency = I2C_MASTER_FREQ_HZ; + I2C::timeout_ms = I2C_MASTER_TIMEOUT_MS; +// + i2c_port_t i2c_master_port = (i2c_port_t)I2C::thisNumber; + + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = (int)I2C::SDA, + .scl_io_num = (int)I2C::SCL, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master = {I2C::frequency}, + .clk_flags = 0 + }; + + ESP_ERROR_CHECK(i2c_param_config(i2c_master_port, &conf)); + + ESP_ERROR_CHECK(i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0)); + +} + + +bool I2C::write_register(uint8_t slaveAddress, uint8_t registerAddress, uint8_t* const data, uint8_t length) +{ + bool returnValue = true; + + write(slaveAddress, registerAddress, data, length); + + return returnValue; +} + + +bool I2C::read_register(uint8_t slaveAddress, uint8_t registerAddress, uint8_t* data, uint8_t length) +{ + bool returnValue = true; + + read(slaveAddress, registerAddress, data, length); + + return returnValue; +} + + +void I2C::write(uint8_t slaveAddress, uint8_t registerAddress, uint8_t* const data, uint8_t length) +{ + uint8_t buffer[length + 1]; + + buffer[0] = registerAddress; + for (int i = 0; i < length; i++) + { + buffer[i+1] = data[i]; + } + + ESP_ERROR_CHECK(i2c_master_write_to_device((i2c_port_t)thisNumber, slaveAddress, buffer, sizeof(buffer), timeout_ms / portTICK_PERIOD_MS)); +} + + +void I2C::read(uint8_t slaveAddress, uint8_t registerAddress, uint8_t* data, uint8_t length) +{ + ESP_ERROR_CHECK(i2c_master_write_read_device((i2c_port_t)thisNumber, slaveAddress, ®isterAddress, 1, data, length, timeout_ms / portTICK_PERIOD_MS)); +} diff --git a/code/main/src/wifi.cpp b/code/main/src/wifi.cpp index 550a57f..9436f63 100644 --- a/code/main/src/wifi.cpp +++ b/code/main/src/wifi.cpp @@ -48,10 +48,10 @@ // -------------------------------------------------------------------------------------------------------------------- -//static const char* ssid = "Kowalski"; -//static const char* pass = "madagascar"; -static const char* ssid = "vbchaos"; -static const char* pass = "mijninternet"; +static const char* ssid = "Kowalski"; +static const char* pass = "madagascar"; +//static const char* ssid = "vbchaos"; +//static const char* pass = "mijninternet"; // -------------------------------------------------------------------------------------------------------------------- // Function declarations diff --git a/doc/matrix.ods b/doc/matrix.ods index 8b788ee29ad1a2591a2eb3d2b172962694e469e6..03ec4ec95022e1770b1bac9679f8b94bc6e6edfe 100644 GIT binary patch literal 12209 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 Af&c&j literal 5528 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 Q07TcFA;&3x_iY7XSbN