【平头哥RVB2601创意应用开发】花卉浇水指示器
[复制链接]
花卉浇水指示器
作者:张泽中
花儿人见人爱,很多人都喜欢养殖花卉,刚买来的花儿艳丽多姿,没过几天,花儿就蔫了。其中浇水是否恰当,是主要问题。
花卉是否缺水?花卉是否应该浇水了?花卉的浇水问题,对很多人来说是个难题。
本创意:
1 设置湿度传感器;
2 此传感器与RVB2601相连;
3 RVB2601处理湿度传感器送来的信号;
4 用RVB2601点亮不同颜色的LED灯及OLED显示不同数量的横线表示花卉土壤的干湿度。
1.当花卉土壤过于干燥时,RVB2601的红色LED点亮,同时OLED仅显示几根横线,提醒花卉需要浇水,参见下图1。
图1 实测图1 -红色灯亮.jpg
2.当花卉土壤干湿度燥恰当时,RVB2601的绿色LED点亮,同时OLED显示恰当数量的横线,表示花卉不需浇水或通风散湿,参见下图2。
实测图2-绿色灯亮
3.当花卉土壤过于潮湿时,RVB2601的蓝色LED点亮,同时OLED显示几乎满屏的横线,提醒花卉需要通风散湿,参见下图3。。
实测图3-蓝色灯亮
用“平头哥RISC-V RVB2601开发板”检测土壤湿度的办法:
1 开发板读取土壤湿度传感器的模拟信号,经开发板ADC转换后变成数字信号,然后驱动开发板的LED及OLED;
2 经筛选,选取下款湿度传感器,参见图4:
图4 湿度传感器外形图
湿度传感器模块为双输出模式:数字量输出及模拟量输出,比较器采用LM393芯片,工作稳定,信号干净。设有固定螺栓孔,方便安装。
电路图参见图5:
图5电路图
1 土壤湿度传感器
参见图6:
图6土壤湿度传感器
2 土壤湿度信号发大处理模块
参见图7:
图7土壤湿度信号发大处理模块
3 湿度处理、显示模块
即RVB2601,参见图8:
图8 RVB2601
五、作品源码和案例中处理的传感器数据
1 作品源码
#define _DEFAULT_SOURCE /* needed for usleep() */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <aos/aos.h>
#include "aos/cli.h"
#include "app_config.h"
#include "app_init.h"
#include "csi_config.h"
#include "hw_config.h"
#include "csi_config.h"
#include "lvgl.h"
#include "lv_label.h"
#include "oled.h"
#include "board_config.h"
#include "drv/gpio_pin.h"
#include <drv/pin.h>
#include <drv/pwm.h>
#include <drv/adc.h>
#include <drv/tick.h>
#define TAG "APP"
/**************************oled*****************************/
extern void oled_draw_point(uint8_t r, uint8_t c, uint8_t t);
extern void Fill_RAM(unsigned char Data);
extern void oled_reflesh();
/**************************************************************/
/*******************************led****************************/
csi_gpio_pin_t MY_PIN_LED_RED;
csi_gpio_pin_t MY_PIN_LED_GREEN;
csi_gpio_pin_t MY_PIN_LED_BLUE;
/*************************************************************/
#define ADC_CHECK_RETURN(ret) \
do \
{ \
if (ret != CSI_OK) \
return -1; \
} \
while(0);
static csi_adc_t adc;
int main(void)
{
char j,k;
int ret;
uint32_t data;
int x0,x1,y0,y1;
//uint8_t p1[128][64];
/********************************light led*****************************/
board_yoc_init();
LOGD(TAG, "board_yoc_init() completed!\n");
aos_msleep(1000); //by me
oled_init();
//PA4 - BLUE PA7-RED PA25 GREEN
csi_pin_set_mux(PA4, PIN_FUNC_GPIO);
csi_pin_set_mux(PA7, PIN_FUNC_GPIO);
csi_pin_set_mux(PA25, PIN_FUNC_GPIO);
csi_gpio_pin_init(&MY_PIN_LED_BLUE, PA4);
csi_gpio_pin_init(&MY_PIN_LED_RED, PA7);
csi_gpio_pin_init(&MY_PIN_LED_GREEN, PA25);
csi_gpio_pin_dir(&MY_PIN_LED_GREEN, GPIO_DIRECTION_OUTPUT);
csi_gpio_pin_dir(&MY_PIN_LED_RED, GPIO_DIRECTION_OUTPUT);
csi_gpio_pin_dir(&MY_PIN_LED_BLUE, GPIO_DIRECTION_OUTPUT);
csi_gpio_pin_write(&MY_PIN_LED_BLUE, GPIO_PIN_HIGH);
csi_gpio_pin_write(&MY_PIN_LED_RED, GPIO_PIN_HIGH);
csi_gpio_pin_write(&MY_PIN_LED_GREEN, GPIO_PIN_HIGH);
/***************************************************************************/
/***********************************ADC******************************/
csi_pin_set_mux(EXAMPLE_ADC_CHANNEL0_PIN, EXAMPLE_ADC_CHANNEL0_PIN_FUNC);
//edit\find in files\find in files\ 搜索“EXAMPLE_ADC_CHANNEL0_PIN”可得:
//g:\C-Sky\CDK\CSKY\PACK\ch2601_evb\v7.4.3\include\board_config.h有此字段:
//#define EXAMPLE_ADC_CHANNEL0_PIN EXAMPLE_ADC_CH0,再搜索:
//EXAMPLE_ADC_CH0,可得:#define EXAMPLE_ADC_CH0 PA3、P18
//可见,本程序的ADC输入引脚是:PA3
//PA3:J1:9-10脚,参见:
//RVB2601开发板用户手册:37067137319852441601615475227781dm4cDSePeY-音频DAC、音频ADC.pdf P8/19
ret = csi_adc_init(&adc, 0);
ADC_CHECK_RETURN(ret);
csi_adc_continue_mode(&adc, true);
ADC_CHECK_RETURN(ret);
//开启/关闭ADC连续采样模式,false->禁止
//参见:ADC · GitBook.pdf
ret = csi_adc_freq_div(&adc, 128);
if(ret == 0){
return -1;
}
/* Configure sampling time */
ret = csi_adc_sampling_time(&adc, 2);
ADC_CHECK_RETURN(ret);
/* Enable channel */
ret = csi_adc_channel_enable(&adc, 0, true);
ADC_CHECK_RETURN(ret);
/* Trigger new conversion */
ret = csi_adc_start(&adc);
ADC_CHECK_RETURN(ret);
// LOGD(TAG, "%s ,ADC INITED!\n", aos_get_app_version());
while(1)
{
/* Read result */
data = csi_adc_read(&adc);
printf("get adc result: %d\n", data);//在串口调试助手中显示
printf("the voltage is: %d mV\n", data*3300/4096);
aos_msleep(500);
/***********************************************************end of ADC************************/
/*************************************OLED***********************/
x0=50;
x1=80;
y0=63;
y1=(4096-data)/3.3/20;
for(j=y0;j>y0-y1;j--)
{
Fill_RAM(0x00);
for(k=x0;k<x1;k++)
oled_draw_point(j,k,0xFF);
//x,y是反的,所以将j,k的位置对调
}
oled_reflesh();
printf("oled_refleshed !\n\n");
/*************************************END OF OLED*********************/
/************************************LED****************************/
csi_gpio_pin_write(&MY_PIN_LED_BLUE, GPIO_PIN_HIGH);
csi_gpio_pin_write(&MY_PIN_LED_RED, GPIO_PIN_HIGH);
csi_gpio_pin_write(&MY_PIN_LED_GREEN, GPIO_PIN_HIGH); //熄灭led
if(data>2800)
{
csi_gpio_pin_write(&MY_PIN_LED_RED, GPIO_PIN_LOW);
//aos_msleep(2000);
//acsi_gpio_pin_write(&MY_PIN_LED_RED, GPIO_PIN_HIGH);
}
if(data<800)
{
csi_gpio_pin_write(&MY_PIN_LED_BLUE, GPIO_PIN_LOW);
//aos_msleep(2000);
//csi_gpio_pin_write(&MY_PIN_LED_BLUE, GPIO_PIN_HIGH);
}
if((data>=800)&&(data<=2800))
{
csi_gpio_pin_write(&MY_PIN_LED_GREEN, GPIO_PIN_LOW);
//aos_msleep(2000);
//csi_gpio_pin_write(&MY_PIN_LED_GREEN, GPIO_PIN_HIGH);
}
/********************************END OF LED***************************/
aos_msleep(5000);
Fill_RAM(0x00);
oled_reflesh();
}
csi_adc_uninit(&adc);
printf("csi_adc_uninited.\n");
return 0;
}
2传感器数据
实测的传感器数据如下:
1. 土壤极端干燥时的电压值: 2.99V
根据多次试验,当电压值为:2 .26V时,土壤就比较干燥,此时的Data:2.26*4096/3300=2805。
2.土壤湿度最适当时的电压值:1.50V
根据多次试验,当电压值为:0.65-2 .26V时,土壤湿度比较适当,此时的Data:0.65*4096/3300到2805即:807~2805。
3.土壤极端过湿时的电压值:0.56V
根据多次试验,当电压值为:0.65V时,土壤就过湿,此时的Data:0.65*4096/3300=807
六、视频演示(视频简介+链接)
1 传感器实测值.mp4
“1 传感器实测值.mp4”介绍了如何测定土壤的干湿度。
1 传感器实测值
2 工作视频.mp4
“2 工作视频.mp4”演示了花卉浇水指示器的工作流程。
2 工作视频
3 链接:
https://pan.baidu.com/s/14e7PXorkclUSF74BCm4Bzw
提取码:jkdf
七、项目总结(项目文字总结+帖子分享链接汇总)
花卉的浇水问题,对很多人来说是个难题。此款“花卉浇水指示器
”将浇水问题,转化为土壤的干湿度问题,用传感器检测的数值,直观地指示花儿是否需要浇水,不需依仗经验,主观判断,值得推广。
八、其他
感谢平头哥提供的RVB2601 RISC-V 开发板!
感谢EEWORLD电子工程世界提供的交流平台!
|