|
|
|
@ -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 */ |
|
|
|
|
|
|
|
|