单片机高水位抽水控制程序 (单片机水位探测程序)

1、能不能检测电平:有风险

自动水位控制,说简单其实也不难。拔掉它的外衣,核心的部分不过就是检测几个高低电平。这几个点就可选择NPN三极管的集电极,就像图上标注的4个位置。对于这个三极管怎么分类型,我有一个好的建议:让这个箭头导通有电,中间的电压高就是NPN。因为P就是position嘛,正极。

单片机水位控制系统原理图设计,51单片机水位传感器电路图

但是,这里可能有个小问题,如图辨识的点1,在三极管断开的时候它的电位是5V,这个电位足够检测为1;但是导通的时候,这个点的电压能不能降低到0.7V以下尚待探究,如果不能那就不能通过检测逻辑电平的方式来检测水位。

2、检测双边沿:可行

既然检测电平不太准确,这有风险呀,一不小心会把我们的电机烧坏的,要不就是该停的时候不停,导致溢水。水本来就贵,不要白白浪费。那我们来检测下降沿吧,这个道理很容易懂,水上来了自然会触发一个上升沿,我们就当这是个按键

反过来推算,水位下降了,那就检测下降沿,综合起来咱们在实际中检测双边沿。刚好我们的ESP8266可以满足这个功能,在对相应的IO进行初始化的时候,用 GPIO_PIN_INTR_ANYEDGE 定义就行。

2、检测上升沿:可行//***按键初始化:
void GPIO_Init(void)
{
	/*设置GPIO_0*/
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U , FUNC_GPIO0);//GPIO0做为普通IO使用
	GPIO_DIS_OUTPUT(0);
	PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);//GPIO0上拉输入

	_xt_isr_mask(1<<ETS_GPIO_INUM);  
	gpio_intr_handler_register(gpio0_intr_handler, NULL);//设置中断函数
	gpio_pin_intr_state_set(0, GPIO_PIN_INTR_ANYEDGE);//双边沿触发
	_xt_isr_unmask(1 << ETS_GPIO_INUM); //使能GPIO中断
}

//***按键中断响应
void gpio0_intr_handler()
{
    uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);//读取GPIO状态寄存器,获取中断信息
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);//清除中断信息
    if(gpio_status & (BIT(0)))//GPIO0产生的中断
    {
        if(!GPIO_INPUT_GET(0))//GPIO0是低电平
        {
            printf("shuiwei_1 up\r\n");
        }
        else
        {
          	printf("shuiwei_1 down\r\n");
        }
    }

    //还可以检测其他引脚的中断
}

3、电路连接

整体的电路原理也很简单,分为两部分,一是水位的检测,二是单片机的检测。使用ESP8266的4个IO引脚来检测4个探头位置的双边沿,咱们能够知道哪个位置发生了水位的变化,相应的就会触发IO引脚中断。

在这里ESP的作用相当于我们的眼睛,我们是看见相应位置的LED亮了,知道水位到这了,而ESP就通过检测IO的边沿触发,来知道水位的变化。

详见原理图:

水位检测电路   ---  单片机的检测
		探头1     ----   采集点1
    探头2     ----   采集点2
    探头3     ----   采集点3
    探头4     ----   采集点4

单片机水位控制系统原理图设计,51单片机水位传感器电路图

4、运行逻辑

运行逻辑不复杂,分开理解也是2部分,一部分是在main函数中隔一段时间就查询一个水位的变量,然后做出相应的动作:开启水泵或是停止水泵,另一部分就是IO中断的回调,在这个回调函数里面对水位变量进行相应的赋值。

user_init(void)
{
    Init_FUN();
    shuiwei_control =0;
	for(;;)
	{

		if(shuiwei_control &&(1<<0))
		{
			/**抽水**/
		}
		if(shuiwei_control &&(1<<1))
		{

		}
		if(shuiwei_control &&(1<<2))
		{

		}
		if(shuiwei_control &&(1<<3))
		{
			/**停水**/
		}
	}

接下来的计划:

等相关的硬件到了之后,再尝试搭建百度云的平台,让水位信息上传到云端,能够远程监控和控制。

如果有疑问想获取源码( 主流程的代码其实都在上面 ),可以后台私信我,我把源码整理好发给你。

水塔自动控制系列.往期回顾:

1、《DIY水位检测器》---使用三极管搭建的水位监测电路。

2、《DIY小水泵:成本不足3块钱》---模拟供水的水泵。

3、《使用ESP8266做核心控制:开发环境搭建---完成SDK的导入和程序编译。

4、《既是wifi模块,又是MCU的ESP8266:测水位、开水泵、发无线(1)》---完成程序的烧写和稳定的串口打印。