远程控制浇花系统--继电器模块

2019-07-14 02:51发布

             其实这个模块周三就弄好了,但是一直想等买了mini水泵然后演示下的,至少拍个视频或者照片那啥的贴出来。不过都很忙一直,所以就没管了,周末病了,不想去实验室,就把原理这边的说说吧,以后拍了图片再贴进来吧!        首先说说控制电路这一块吧。其实继电器的控制电路,你百度一下,网上有一堆可以选择的,仔细看看也都大同小异。嗯,主要是按你是想单电源还是多电源,单电源的话要有隔离效果就要多设计下电路,多用一个三极管,或者直接用光电耦合来隔离控制信号和传输信号。不过如果你是多电源就没这个问题,给控制信号一个电源,给传输信号一个电源,他们没有物理链接,很好的隔离了。我画的这个图就是双电源,控制信号是5v的电源(我用我开发板上的输出5v),传输信号用的是12v(暂定的,如果电机买的是其他的电压的,就换个),因为小电机的功率和效率问题,所以给了12v。这里我加了一个指示灯,是用来提示继电器工作状况的,其实也就是I/O口的输出情况,方便修改程序和了解工作情况。      这是我画的控制模块的电路图,和网上给的没什么差别,其实呢,实际做起来,你还是要测试的,就是具体的参数。这个控制模块不是我焊的,因为我发现师兄有留下好东西啊,直接把他的(有点丑但是能用)拿过来用,不过测试他的板子花了我不少时间。他的是焊了两个继电器,其实效果都一样的。电路设计不拘一格。           上次讲到串口程序测试成功了,不过是用LED灯的显示代替浇花控制。这里我修改了程序,让它能直接对继电器操作,由继电器控制水泵,实现浇花真实过程。         其实实现这个也很简单,就是把对LED的I/O控制换掉,我用的是对开发板上的无线模块的I/O口的控制,也就是PC4和PC5,之所以用两个I/O是因为我说了,我用的师兄焊好的板子,他用了两个继电器做好的控制电路,我不想焊,直接就拿来用,所以就用两个I/O口来控制,原理还是上面那个图。        继电器控制程序单独写成一个文件。 #include "stm32f10x.h" #include "jdq.h" #include "sys.h" //初始化PC4和PC5为输出口.并使能这两个口的时钟 //JDQ IO初始化 void JDQ_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //JDQ1-->PC.4 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOC,GPIO_Pin_4); //PC.4 输出高 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //JDQ2-->PC.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOC,GPIO_Pin_5); //PC.5 输出高 } void zuobian(void) //左边输出电源Vin { JDQ0=0; JDQ1=0; // GPIO_ResetBits(GPIOC,GPIO_Pin_4); // GPIO_ResetBits(GPIOC,GPIO_Pin_5); } void youbian(void) //右边输出电源Vin { JDQ0=0; JDQ1=1; // GPIO_ResetBits(GPIOC,GPIO_Pin_4); // GPIO_SetBits(GPIOC,GPIO_Pin_5); } void zantian(void) //两边都不输出 { JDQ0=1; JDQ1=1; // GPIO_SetBits(GPIOC,GPIO_Pin_4); // GPIO_SetBits(GPIOC,GPIO_Pin_5); }           头文件就不用说了,这个程序没什么难点,就是GPIO的操作控制,你可以直接把继电器当成LED灯来思考,就so easy了。至于下面定义的几个函数,是我根据师兄的板子自己写的操作函数,可以看到我是在操作两个继电器,不同I/O输出,继电器的选择不同,这是测试的结果,没什么可讲的。如果你是自己按我画的那个电路图,完全不需要这些函数,直接操作I/O就搞定,更简单。这就告诉我们哈,懒人就要从别的方面弥补,硬件用的是别人的,软件就要多下点功夫才行。         把这个替换掉LED灯的操作也很简单。 if(j==0) { // printf("1"); // LED0=0; // delay_ms(1000); // LED0=1; youbian(); //右边输出电源电压 delays(60); //延时60秒,浇水60s zuobian(); //两边都不输出电源电压 delays(5); //延时5秒 }          这里我做了修改的部分是延时。因为测试结果发现,用原来的延时函数delay_ms(),没办法延时1分钟,我在网上发现大家给的都是短暂延时,就是ms级别的,最多的也不超过3s,这个都是可以用这个函数实现的;但是时间久了就不行,至于原因我还在找。所以我重写了延时函数,自己定义了一个delays()函数,直接秒延时,我测试了,可以延时1分钟,你要是问我为嘛要延时这么久,你想啊,浇花难道就浇几秒?of course not!我假定它要浇1分钟,具体还要看电机的效率,如果电机很给力,抽水能力强,一下子就完成工作,那就减少延时时间,就是据如此类的工作,不断完善就行了。 PS:无线通信这个模块嘛,估计要等等再做了,因为做光立方的元件到了,答应送人的,一定要做好啊,对自己焊工很着急啊。。。