# HG changeset patch # User matthewreed # Date 2018-08-24 20:02:34 # Node ID ab94f8a0a0c6a0d9f327bccbd99ae35c53296e02 # Parent d651f75c8fbc0029f83075c0955e0e8b1fc8f2c4 Read analog ph sensor diff --git a/Inc/config.h b/Inc/config.h --- a/Inc/config.h +++ b/Inc/config.h @@ -6,7 +6,7 @@ #define DEFAULT_CAN_ID 0x208 #define DEFAULT_BROADCAST_ID 0x00000000 #define DEFAULT_DATA_RATE 1000 -#define DEFAULT_LED_BRIGHTNESS 100 +#define DEFAULT_LED_BRIGHTNESS 20 typedef struct { uint8_t x; diff --git a/Inc/ph.h b/Inc/ph.h --- a/Inc/ph.h +++ b/Inc/ph.h @@ -7,7 +7,9 @@ #include #include -void init(void); -float get_ph(void); +void ph_init(void); +void ph_update(void); +float ph_get(void); +float ph_convert(uint32_t ph_raw); #endif /*_GPIO_H_ */ diff --git a/Makefile b/Makefile --- a/Makefile +++ b/Makefile @@ -47,7 +47,8 @@ BUILD_DIR = build # source ###################################### # C sources -C_SOURCES = \ +C_SOURCES = \ +Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_adc.c \ Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_can.c \ Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_i2c_ex.c \ Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rcc_ex.c \ @@ -165,6 +166,9 @@ LDFLAGS = $(MCU) -specs=nano.specs -T$(L # default action: build all all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin +# flash via serial wire debug +flash: all + st-flash --reset write $(BUILD_DIR)/$(TARGET).bin 0x8000000 ####################################### # build the application diff --git a/Src/main.c b/Src/main.c --- a/Src/main.c +++ b/Src/main.c @@ -13,6 +13,7 @@ int main(void) HAL_Init(); system_init(); gpio_init(); + ph_init(); protocol_init(PROTOMODULE); @@ -54,6 +55,7 @@ int main(void) if (HAL_GetTick() - loop_timer_1s >= 1000) { + ph_update(); loop_timer_1s = HAL_GetTick(); } @@ -65,7 +67,7 @@ int main(void) if (HAL_GetTick() - loop_timer_data >= (protocol_get_settings()->val.data_rate)) { - protocol_send_data(NONE, 0, get_ph()); + protocol_send_data(WATER_PH, 0, ph_get()); loop_timer_data = HAL_GetTick(); } diff --git a/Src/ph.c b/Src/ph.c --- a/Src/ph.c +++ b/Src/ph.c @@ -4,25 +4,21 @@ ADC_HandleTypeDef hadc; DMA_HandleTypeDef hdma_adc; uint32_t adc_reading; - +float ph_readings[10] = {0}; +uint8_t ph_i = 0; -void init(void) +void ph_init(void) { __HAL_RCC_ADC1_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; - GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_7; + GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - GPIO_InitStruct.Pin = GPIO_PIN_0; - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - ADC_ChannelConfTypeDef sConfig; hadc.Instance = ADC1; @@ -60,13 +56,38 @@ void init(void) HAL_ADC_ConfigChannel(&hadc, &sConfig); HAL_ADC_Start_DMA(&hadc, &adc_reading, 1); + + //fill the rolling average buffer with real readings so the first reading isn't ~0 + for (uint8_t i = 0; i < 10; i++) + { + ph_update(); + HAL_Delay(100); + } } -float get_ph(void) +void ph_update(void) +{ + uint32_t ph_raw = adc_reading; + ph_readings[ph_i] = ph_convert(ph_raw); //convert adc counts to pH + ph_i = (ph_i + 1) % 10; +} + +float ph_get(void) { float ph = 0; - ph = (float) adc_reading; + for (uint8_t i = 0; i < 10; i++) + { + ph += ph_readings[i]; + } + ph = ph / 10; return ph; } + +float ph_convert(uint32_t ph_raw) +{ + float ph = (float)ph_raw; + + return ph; +}