当前位置: 首页 > news >正文

【stm32简单外设篇】- 水位传感器

一、适用场景
适用场景:水箱/水槽液位监测与报警(高/中/低位)、水泵上下限控制、雨水/污水水位提醒、灌溉/鱼缸/水塔监测、教学实验与多点水位分段检测、简单液位百分比估算。。

二、器材清单

水位传感器×1

STM32 开发板(3.3V MCU)×1

若干杜邦线(公/母)×1组

稳定电源:5V/3.3V(最好是5v)

三、工作原理(要点)

导电/电极式:在液面处电极接通回路,模块测量电导或电压并输出模拟量(AO)。适合简单成本低的水位多点检测,但电极会有电化学腐蚀与电解问题,使用完后要及时擦干液体。

四、接线示意

GNDGND

VCC5V/3.3V电源

标准库

SPC1

HAL库

SPA0

五、示例代码

标准库

#include "breathing.h" #include "stm32f10x.h" #include "stdio.h" #include "bsp_usart.h" char showlight[20]; extern volatile uint16_t adc_light; void TIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能 //定时器TIM3初始化 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式,即从0开始向上数到越界 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断 //中断优先级NVIC设置 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIMx } void TIM3_IRQHandler(void) { uint16_t value; if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET) { sprintf(showlight,"light:%d\n",adc_light); Usart_SendString(USART1,showlight); } TIM_ClearITPendingBit(TIM3,TIM_IT_Update); } #include "adc_time.h" #include "stm32f10x.h" volatile uint16_t adc_light; void adcgpio_init() { GPIO_InitTypeDef PC; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); PC.GPIO_Pin = GPIO_Pin_1; PC.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOC,&PC); } void adcmode_init() { ADC_InitTypeDef adc; NVIC_InitTypeDef nvic; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE); adc.ADC_Mode=ADC_Mode_Independent; adc.ADC_ScanConvMode = DISABLE; adc.ADC_ContinuousConvMode = ENABLE; adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; adc.ADC_DataAlign = ADC_DataAlign_Right; adc.ADC_NbrOfChannel = 1; ADC_Init(ADC2,&adc); RCC_ADCCLKConfig(RCC_PCLK2_Div8); ADC_RegularChannelConfig(ADC2,ADC_Channel_11,1,ADC_SampleTime_55Cycles5); ADC_ITConfig(ADC2,ADC_IT_EOC,ENABLE); ADC_Cmd(ADC2,ENABLE); ADC_ResetCalibration(ADC2); while(ADC_GetResetCalibrationStatus(ADC2)); ADC_StartCalibration(ADC2); while(ADC_GetCalibrationStatus(ADC2)); ADC_SoftwareStartConvCmd(ADC2,ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); nvic.NVIC_IRQChannel = ADC1_2_IRQn; nvic.NVIC_IRQChannelPreemptionPriority = 3; nvic.NVIC_IRQChannelSubPriority = 0; nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic); } void adctime_Init() { adcgpio_init(); adcmode_init(); } void ADC1_2_IRQHandler(void) { if(ADC_GetITStatus(ADC2,ADC_IT_EOC) == SET) { adc_light = ADC_GetConversionValue(ADC2); } ADC_ClearITPendingBit(ADC2,ADC_IT_EOC); } #include "stm32f10x.h" #include "stdio.h" #include "bsp_SysTick.h" #include "adc_time.h" #include "breathing.h" #include "bsp_usart.h" int main() { USART_Config(); adctime_Init(); TIM3_Int_Init(4999,7199); //定时500ms while(1) { } // return 0; }

HAL库

int main(void) { /* USER CODE BEGIN 1 */ char show[20]={0}; /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC1_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { //#1。启动常规序列 HAL_ADC_Start(&hadc1); //#2.等待转换完成 HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY); //#3。获取结果 uint32_t dr = HAL_ADC_GetValue(&hadc1); //#4.把结果转换成电压 float voltage = dr *(3.3f-0.0f)/4095.0f; sprintf(show,"adc:%d,%.2f\n",dr,voltage); HAL_UART_Transmit(&huart1,show,strlen(show),HAL_MAX_DELAY); HAL_Delay(500); // if(voltage>1.5f)//光线暗 // HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_SET);// 灭灯 // else//光线亮 // HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_RESET); // 亮灯 /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }

六、讲解视频

https://www.bilibili.com/video/BV1dQ6JBSEiH/?spm_id_from=333.1387.search.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

https://www.bilibili.com/video/BV1nk6JBoE9j/?spm_id_from=333.1387.search.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

https://www.bilibili.com/video/BV1Fk6JBoEpg/?spm_id_from=333.1387.search.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

http://www.jsqmd.com/news/425158/

相关文章:

  • 大数据架构数据压缩技术:从Snappy到Zstandard
  • 2026年AI直播讲师平台推荐榜:甄选企业实测解析 - 品牌鉴赏师
  • 2026年2月围栏厂家推荐:市政工程护栏中标企业盘点 - 品牌鉴赏师
  • 吐血整理!提示工程架构师的AI上下文工程时序预测模型优化方案
  • 告别GPU依赖:基于StructBERT的轻量级中文情感分析WebUI实战评测
  • 2026年热门的不锈钢景观护栏厂家优质品牌推荐 - 品牌鉴赏师
  • 孟庆涛与 GEO 2.0:定义2026年生成式引擎优化的新行业标准
  • ABC447F题解
  • [Vitest] mockClear, mockReset, mockRestore
  • 沙拉查词 + AnkiConnect 完整操作指南
  • 设计模式--装饰器模式
  • C++进阶之bind绑定:用法实例(四百四十二)
  • 初中数学基础差?2026实测4家靠谱线上机构,精准补漏不踩坑|家长收藏 - 品牌测评鉴赏家
  • 改进粒子群算法优化混合储能系统容量配置程序
  • 《从0到1!AI应用架构师对比学习实践的快速入门指南》
  • Tic Tac DREAMIN’
  • go基础之流程控制
  • 中考数学提分|实测4家主流线上机构,避坑不踩雷,直接抄作业 - 品牌测评鉴赏家
  • 2026青木川古镇民宿权威排名|青云客栈蝉联第一,自驾亲子首选(附避坑指南) - 一个呆呆
  • 初中数学线上培训机构推荐|4家实测不踩坑,适配不同基础孩子 - 品牌测评鉴赏家
  • if language is ONLY for the sounds for chating。
  • 初中数学培优选对线上机构,少走1年弯路!实测4家主流平台,家长直接抄作业 - 品牌测评鉴赏家
  • 小学数学培优|2026实测3家线上机构,家长闭眼冲不踩坑 - 品牌测评鉴赏家
  • 100种思维模型概念(多个角度分析问题)
  • 小学数学基础差?4家靠谱线上机构实测推荐!家长闭眼抄作业 - 品牌测评鉴赏家
  • 多项式和生成函
  • 背单词 纯英文 2026年03月
  • 冲刺中考数学哪家线上辅导班好?实测5家,家长闭眼冲不踩坑 - 品牌测评鉴赏家
  • .NET周刊【月第期 --】
  • 定速风电机组:老派硬核选手的倔强