本帖最后由 netlhx 于 2016-6-7 11:31 编辑
首先声明,咱不养花,但隔壁有喜欢养花的。所以以外行的眼光来做一个浇花助手,必有不妥帖之处,海涵海涵!
侍弄花草本来是很风雅的事情,为何要让技术来插一杠子,都是无聊惹的祸?!
正题正题。
一、物料准备
- 12VDC电源一个,用来给水泵及开发板供电
- 小水泵一个,当然是用来抽水(含水管及花洒等配件)
- YL-69土壤湿度传感器,用来检测土壤湿度
- 继电器,打开或关闭水泵
- NUCLEO32小型开发板一块
- 其它配件
部分设备来自TB,部分为改装,充分发挥DIY的破坏本色。
二、改装及设计
功能框图
太简单,浪费了一块好板子,有木有?
下面看看需要改装的部分。
首先是电源的改造,12VDC本来是用来给水泵供电的,但是咱的开发板也要电,所以得改一下
一刀两断,然后引出两根电源线,直接用杜邦线改装了,不用担心电流大小的限制,毕竟开发板上的电流还是很小的。注意红色接的是+12V,千万不要搞错。
然后是改造继电器的外围电路。这个继电器没有原理图,同时避免把它弄坏了。所以只能按照黑盒原理来推测和改装了。从功能上看,外围电路开路,则会自动打开继电器,如果是闭合,则关闭继电器输出。所以咱用一个简单的S9012来控制打开和关断。继电器内部有限流电阻,所以咱只要使用三极管的开关功能就行了。
注意LED的正极与NUCLEO32的PB4连接,这样就很好控制水泵了。
现在准备一块小万用板,准备连接。连接很简单,就不上原理图了,给个组装好后的效果图。
注意NUCLEO32小板没有焊死,体验过后就可以拆下来,仍然是一块独立的开发板。
接下来调试程序。
先看YL-69湿度传感器,基本的原理图如下
两种输出接口,D0输出二值信号,高或低电平;AO输出模拟信号。
本文使用STM32的ADC功能读取传感器输出的值,使用的引脚为PB1。下面是ADC初始化代码
/* ADC init function */
void MX_ADC_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
/**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc.Instance = ADC1;
hadc.Init.OversamplingMode = DISABLE;
hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ContinuousConvMode = ENABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.DMAContinuousRequests = DISABLE;
hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.LowPowerFrequencyMode = DISABLE;
hadc.Init.LowPowerAutoPowerOff = DISABLE;
HAL_ADC_Init(&hadc);
/**Configure for the selected ADC regular channel to be converted.
*/
sConfig.Channel = ADC_CHANNEL_9;
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
}
默认时钟为32MHZ,所以对ADC时钟进行4分频,采样时间设为最长,也就是239.5个时钟周期,连续采样。
将YL-69连接到设备,开始调试。首先在开路状态下读取值,模拟干水的情况,得到4095,也就是输出3.3V;然后短接传感器的两个探头,模拟被水淹的情况,得到的值为64左右,约为0V。
接下来的逻辑就简单了,根据上面的功能框图,MCU反复读取ADC的值,然后决定浇还是不浇。
下面是主循环中关键功能代码
if(adc_value > 3000)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
count ++;
if(count == 20)
{
count = 0;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
}
}
else
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
}
注意这里的阀值设定,直接取3000作为是否浇水的依据,有进一步调整的必要。比如不同的土壤,花肥的使用情况,植物喜湿程序等。这是下一步改善的方向。
嗯,很简单吧!
三、结果
下面是全部调试和组装好成品图。
注意及局限:
- 组装时注意线不能接错,DC输出的是12V,所以一定要接到VIN,千万不能接到5V上面,否则会烧板子。
- YL-69的电源来自NUCLEO32的3V3输出,注意接线引脚
- 水泵直接从储水器皿中取水,所以需要一个稳定的水源
- 只有一个湿度探头,所以只能检测一处土壤的湿度值
- 程序逻辑相对比较简单,特别是阀值的设定,简单粗暴,需要进一步结合实际情况进行优化、调整。
- 整个设计器件的组合尚不够紧凑,如果能设计一块专用的PCB板,将MCU,继电器,电源转换等全部做成一个盒子,则实用性会非常好。
- 下一步的方向:添加WIFI或BLE传感器,实现远程监控,自动浇水与手动控制,效果会更好。
最后为本次DIY中牺牲的NUCLEO L073默哀3分钟!
DIY无小事,不可不慎!
|