HarveyBates / STM32-SDI12

Its a SDI-12 library for STM32 microcontrollers.
MIT License
3 stars 1 forks source link

Does the library require external logic inverters? #1

Closed rimen05 closed 1 year ago

rimen05 commented 1 year ago

Hi Harvey.

First of all, thank you very much for sharing your library.

That said, since the SDI12 protocol is an inverted logic one, I was wondering whether the library requires external logic inverters.

Thank you very much for your answer.

HarveyBates commented 1 year ago

Hey mate, no external logic converters are needed 👍

rimen05 commented 1 year ago

Great. I wonder how you achieve that. Do you setup it in the "main.c" file? For your info, I am trying to adapt this library to the bluepill's MCU (stm32f103). Best Regards,

HarveyBates5B commented 1 year ago

Yea you would do something like this in your main.c file:

#include "sdi12.h"

// This is just the normal setup of a UART
// See the MX_UART1_UART_Init method below for settings
UART_HandleTypeDef huart1; 
static void MX_USART1_UART_Init(void);

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_USART1_UART_Init();
    SDI12_Init(&huart1);

    // Buffer to hold data returned from sensor
    char data[64] = {0};
    char addr = '0'; // SDI-12 address

    while(1) {
        SDI12_Measure_TypeDef measurement_info;
        memset(data, 0, sizeof(data));
        SDI12_StartMeasurement(addr, &measurement_info);
        HAL_Delay(measurement_info.Time * 1000);
        SDI12_SendData(addr, &measurement_info, data);
        HAL_Delay(10000);
    }
}

// This is your UART implementation auto-generated by STM32CubeMX
// Take note of the TX on startup setup at the bottom (this is non-standard so you need to add this)
static void MX_USART1_UART_Init(void) {
    /* USER CODE BEGIN USART1_Init 0 */

    /* USER CODE END USART1_Init 0 */

    /* USER CODE BEGIN USART1_Init 1 */

    /* USER CODE END USART1_Init 1 */
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 1200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_EVEN;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_TXINVERT_INIT|UART_ADVFEATURE_RXINVERT_INIT
            |UART_ADVFEATURE_SWAP_INIT;
    huart1.AdvancedInit.TxPinLevelInvert = UART_ADVFEATURE_TXINV_ENABLE;
    huart1.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
    huart1.AdvancedInit.Swap = UART_ADVFEATURE_SWAP_ENABLE;
    if (HAL_UART_Init(&huart1) != HAL_OK) {
        Error_Handler();
    }
    /* USER CODE BEGIN USART1_Init 2 */

    // Keep TX as the transmit pin on startup
    huart1.AdvancedInit.Swap = UART_ADVFEATURE_SWAP_DISABLE;
    if (HAL_UART_Init(&huart1) != HAL_OK) {
        Error_Handler();
    }

    /* USER CODE END USART1_Init 2 */
}
rimen05 commented 1 year ago

Thank you very much!