From a3939b6f9a6ccc263aa1efb6ed6ae2d74d2efce0 Mon Sep 17 00:00:00 2001 From: Andreas Berthoud Date: Fri, 18 Jun 2021 23:54:37 +0200 Subject: [PATCH] i2c: load and interprete moisture value from seesaw --- nucleo-wb55-i2c/Core/Src/main.c | 113 ++++++++++++++++++++++++-------- 1 file changed, 87 insertions(+), 26 deletions(-) diff --git a/nucleo-wb55-i2c/Core/Src/main.c b/nucleo-wb55-i2c/Core/Src/main.c index 625bc1a..02f7d3b 100644 --- a/nucleo-wb55-i2c/Core/Src/main.c +++ b/nucleo-wb55-i2c/Core/Src/main.c @@ -59,6 +59,31 @@ static void MX_I2C1_Init(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ + +#define SEESAW_REGISTER_LEN (2) +#define SEESAW_TEMPERATURE_BUFFER_LEN (4) +#define SEESAW_MOISTURE_BUFFER_LEN (2) + +#define SEESAW_STATUS_BASE (0x00) +#define SEESAW_TOUCH_BASE (0x0F) +#define SEESAW_STATUS_TEMP (0x04) +#define SEESAW_TOUCH_CHANNEL_OFFSET (0x10) + +typedef uint8_t seesaw_register_t[SEESAW_REGISTER_LEN]; + +typedef struct seesaw_board { + int temperature_i2c_timeout; + int temperature_write_read_timeout; + int moisture_i2c_timeout; + int moisture_write_read_timeout; + int address; + uint8_t temperature_buffer[SEESAW_TEMPERATURE_BUFFER_LEN]; + uint8_t moisture_buffer[SEESAW_MOISTURE_BUFFER_LEN]; +} seesaw_board_t; + +const seesaw_register_t temperature_register = {SEESAW_STATUS_BASE, SEESAW_STATUS_TEMP}; +const seesaw_register_t moisture_register = {SEESAW_TOUCH_BASE, SEESAW_TOUCH_CHANNEL_OFFSET}; + HAL_StatusTypeDef i2c_write(uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) { //printf("I2C WRITE | address=0x%04x | size=0x%04x\n", DevAddress, Size); return HAL_I2C_Master_Transmit(&hi2c1, DevAddress, pData, Size, Timeout); @@ -69,11 +94,44 @@ HAL_StatusTypeDef i2c_read(uint16_t DevAddress, uint8_t *pData, uint16_t Size, u return HAL_I2C_Master_Receive(&hi2c1, DevAddress, pData, Size, Timeout); } +HAL_StatusTypeDef seesaw_read( + int address, + seesaw_register_t seesaw_register, + uint8_t * buffer, + int i2c_timeout, + int write_read_timeout +) { + HAL_StatusTypeDef i2c_status; + i2c_status = i2c_write( + address, + seesaw_register, + SEESAW_REGISTER_LEN, + i2c_timeout + ); + if (i2c_status != HAL_OK) { return i2c_status; } + + HAL_Delay(write_read_timeout); + + i2c_status = i2c_read( + address, + buffer, + SEESAW_TEMPERATURE_BUFFER_LEN, + i2c_timeout + ); + if (i2c_status != HAL_OK) { return i2c_status; } + + return HAL_OK; +} + float getTemp(uint8_t * buf) { int32_t ret = ((uint32_t)buf[0] << 24) | ((uint32_t)buf[1] << 16) | ((uint32_t)buf[2] << 8) | (uint32_t)buf[3]; return (1.0 / (1UL << 16)) * ret; } + +int getMoisture(uint8_t * buf) { + return ((uint16_t)buf[0] << 8) | buf[1]; +} /* USER CODE END 0 */ /** @@ -118,43 +176,46 @@ int main(void) /* Infinite loop */ /* USER CODE BEGIN WHILE */ - int index = 0; + + /* I2C config */ + const seesaw_board_t seesaw_board = { + .temperature_i2c_timeout = 1000, + .temperature_write_read_timeout = 100, + .moisture_i2c_timeout = 3000, + .moisture_write_read_timeout = 100, + .address = 0x36 << 1, // shift by one because it is a 7bit address + }; + HAL_StatusTypeDef i2c_status; - int ADAFRUIT_ADDR = 0x36 << 1; - const int BUF_LEN = 4; - uint8_t buf[BUF_LEN]; - uint8_t prefix[2]; - prefix[0] = 0x0; - prefix[1] = 0x4; + + printf("\n\n\nHoi, da bini wieder\n"); while (1) { - //printf("test %d\n\r", index++); - //HAL_Delay(100); - - HAL_Delay(10); - i2c_status = i2c_write(ADAFRUIT_ADDR, prefix, 2, 1000); + i2c_status = seesaw_read( + seesaw_board.address, + temperature_register, + seesaw_board.temperature_buffer, + seesaw_board.temperature_i2c_timeout, + seesaw_board.temperature_write_read_timeout + ); if (i2c_status != HAL_OK) { - printf("ERROR: %d\n", (int)i2c_status); Error_Handler(); } - - HAL_Delay(100); - - i2c_status = i2c_read(ADAFRUIT_ADDR, buf, BUF_LEN, 1000); + printf("Temperature: %2.2f degree celsius | ", getTemp(seesaw_board.temperature_buffer)); + + i2c_status = seesaw_read( + seesaw_board.address, + moisture_register, + seesaw_board.moisture_buffer, + seesaw_board.moisture_i2c_timeout, + seesaw_board.moisture_write_read_timeout + ); if (i2c_status != HAL_OK) { - printf("ERROR: %d\n", (int)i2c_status); Error_Handler(); } - - //printf("Buffer: "); - for (int i = 0; i < BUF_LEN; i++) { - //printf("%d ", buf[i]); - } - //printf("\n"); - - printf("Temperature: %2.2f degree celsius\n", getTemp(buf)); + printf("Moisture value: %d\n", getMoisture(seesaw_board.moisture_buffer)); /* USER CODE END WHILE */