前面的开箱贴和过程贴,已经实现开发板的熟悉,相关的程序开发环境熟悉,软件开发调试,串口输出调试信息,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;
}
}
}
屏幕显示效果如下图所示:
至此完成液体流量检测仪的开发,并完成成果展示,终于大功告成