这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sdo第四期-液体流量检测仪DIY】-成果帖

共3条 1/1 1 跳转至

【Let'sdo第四期-液体流量检测仪DIY】-成果帖

高工
2025-02-04 11:56:18     打赏

前面的开箱贴和过程贴,已经实现开发板的熟悉,相关的程序开发环境熟悉,软件开发调试,串口输出调试信息,OLED屏幕信息显示,液体流量的测量原理,继电器控制液体流量功能,无论硬件的连接接线,还是软件的开发调试,都已经基本的实现,结合以上设计,接下来进行100ml,200ml的定量控制功能。

首先项目概述和设计思路,通过开发板的USER按键实现按键控制功能,主要实现的功能是当短按一下USER按键,开启控制继电器进而控制水泵启动输出水流,输出的水流经过流量计带动流量计的信号引脚输出脉冲信号,该脉冲信号没开发板的MCU引脚捕获,进行脉冲计数,根据捕获到的脉冲数和对应输出水流量的比例关系,调试出实际的输出水流量,当流量计输出的脉冲数达到设定的100ml或者200ml流量时,自动关闭继电器的输出,进而关闭水泵,停止水流的输出。在控制水流量启动输出的同时,OLED屏幕上第二行会实时显示流量数值,第三行显示总流量数值,当完成流量输出,停止水泵时,OLED屏幕上流量也停止更新,停留在当前的数值下。流量100ml和200ml的量程切换是通过长按USER按键来实现的,程序开始默认设置的设定流量是100ml,当想要切换到200ml设定流量时,通过长按USER按键约3秒钟之后,设定流量自动切换到200ml量程,当想要在切换回100ml量程,再次长按USER按键约3秒钟自后,OLED屏幕上的设定流量自动切换回100ml。

硬件设计:

OLED屏幕的硬件接线:屏幕自带四根引线,两个是电源,接3.3V和GND,两个是I2C通信线,一个是SCL,一个是SDA,具体接法是电源VCC接开发板的3.3V,地GND接开发板的GND,时钟SCL接开发板的A0引脚,数据SDA接开发板的A1引脚。

继电器模块的水泵的接线:继电器模块的输入端O控制引脚接开发板上的PA12引脚,+端引脚接电源模块的3.3V电源,-端接电源模块的地GND,输出控制端,ON端接电源模块的5V电源,COM端接水泵的红线电源正极线,而水泵的负极白线接电源模块的地GND,完成继电器控制水泵的硬件接线连接。

流量计的接线:流量计上有箭头指示水流的流向,在流量计接水泵和水管的时候需要注意,箭头的输入端接水泵,箭头的输出端接输出水管,流量计有三根线,其中红色的表示电源正输入端,接电源模块的5V电源正,黑色的表示电源负输入端,接电源模块的地GND,黄色的表示脉冲信号的输出,为了进行输出脉冲信号的采集,接到开发板上的PA8(D7)引脚上。

需要注意的是用户USER按键连接的开发板上的引脚是PC13,指示LED灯LD2连接到开发板上引脚是PA5(D13)。

完成以上硬件的连接接线之后,后面就可以进行软件的开发和调试了。

项目关键代码展示:

uint32_t  KeyDownTime=0;

uint32_t  FlowSet=100;

uint32_t  CurrentFlow=000;

uint32_t  TotalFlow=000;

volatile uint32_t time = 0; // ms ¼Æʱ±äÁ¿ 

uint32_t  FlowStart=0;


extern __IO uint16_t IC2Value;

extern __IO uint16_t IC1Value;

extern  uint32_t  PulseNum;

extern uint32_t  TotalPulseNum;


/**

  * @brief  Ö÷º¯Êý

  * @param  ÎÞ  

  * @retval ÎÞ

  */

int main(void)

{

/* ´®¿Ú³õʼ»¯ */

USART_Config();

/* LED¶Ë¿Ú³õʼ»¯ */

LED_GPIO_Config();

LED1_OFF;

  LED2_ON;

/* °´¼ü¶Ë¿Ú³õʼ»¯ */

Key_GPIO_Config();

/* ͨÓö¨Ê±Æ÷³õʼ»¯£¬ÓÃÓÚÉú³ÉPWMÐźŠ*/

delay_init();

OLED_Init();

OLED_ColorTurn(0);//0Õý³£ÏÔʾ£¬1 ·´É«ÏÔʾ

  OLED_DisplayTurn(0);//0Õý³£ÏÔʾ 1 ÆÁÄ»·­×ªÏÔʾ

delay_ms(500);

  OLED_Clear();

GENERAL_TIM_Init();

BASIC_TIM_Init();

/* ¸ß¼¶¶¨Ê±Æ÷³õʼ»¯ £¬Óû§²¶»ñPWMÐźÅ*/

ADVANCE_TIM_Init();

OLED_ShowChinese(0,0,11,16,1);//she

OLED_ShowChinese(18,0,12,16,1);//ding

OLED_ShowChinese(36,0,17,16,1);//liu

  OLED_ShowChinese(54,0,18,16,1);//liang

OLED_ShowString(72,0,":",16,1); 

OLED_ShowNum(90,0,FlowSet,3,16,1);

OLED_ShowString(115,0,"ml",16,1);

OLED_ShowChinese(0,18,13,16,1);//shun

  OLED_ShowChinese(18,18,14,16,1);//shi

OLED_ShowChinese(36,18,17,16,1);//liu

  OLED_ShowChinese(54,18,18,16,1);//liang

OLED_ShowNum(90,18,CurrentFlow,3,16,1);

OLED_ShowString(72,18,":",16,1);  

OLED_ShowString(115,18,"ml",16,1);


OLED_ShowChinese(0,36,15,16,1);//lei

  OLED_ShowChinese(18,36,16,16,1);//ji

OLED_ShowChinese(36,36,17,16,1);//liu

  OLED_ShowChinese(54,36,18,16,1);//liang

OLED_ShowNum(80,36,TotalFlow,4,16,1);

OLED_ShowString(72,36,":",16,1);  

OLED_ShowString(115,36,"ml",16,1);

  while(1)

  {  

CurrentFlow=PulseNum;

TotalFlow=FlowSet*TotalPulseNum+CurrentFlow;

OLED_ShowNum(90,0,FlowSet,3,16,1);

OLED_ShowNum(90,18,CurrentFlow,3,16,1);

OLED_ShowNum(80,36,TotalFlow,4,16,1);

OLED_Refresh();

delay_ms(10);

if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON  )

{

if(KeyDownTime>=2000)

{

if(100==FlowSet)

{

FlowSet=200;

}

else

{

FlowSet=100;

}

}

else

{

FlowStart=1;

TotalPulseNum=0;

        LED1_OFF;

printf("Set Flow = %d ",FlowSet);

printf("Current Flow = %d ",IC1Value);

printf("Total Flow = %d ",IC2Value);


}

}

    if ( time == 10 ) /* 10 * 100 ms = 1s ʱ¼äµ½ */

    {

      time = 0;

/* LED2 È¡·´ */      

LED2_TOGGLE;

    } 

  }

}

屏幕显示效果如下图所示:

微信图片_20250203202016.jpg

至此完成液体流量检测仪的开发,并完成成果展示,终于大功告成


专家
2025-02-04 17:50:21     打赏
2楼

感谢分享


专家
2025-02-04 17:51:52     打赏
3楼

感谢分享


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]