关于花卉浇水指示器的实现过程

描述

开发者 张同学 通过外接湿度传感器,利用RVB2601处理湿度传感器送来的信号,用RVB2601点亮不同颜色的LED灯及OLED显示不同数量的横线表示花卉土壤的干湿度,完成了创意应用开发——花卉浇水指示器。

 

花卉浇水指示器的实现过程,请见本文详细介绍。

 

01 项目背景

   

花儿人见人爱,很多人都喜欢养殖花卉,刚买来的花儿艳丽多姿,没过几天,花儿就蔫了。其中浇水是否恰当,是主要问题。

花卉是否缺水?花卉是否应该浇水了?花卉的浇水问题,对很多人来说是个难题。

 

02 作品简介

   

2.1 设置湿度传感器

当花卉土壤过于干燥时,RVB2601的红色LED点亮,同时OLED仅显示几根横线,提醒花卉需要浇水,参见下图1。

指示器

实测图1-红色灯亮

 

2.2 此传感器与RVB2601相连

当花卉土壤干湿度恰当时,RVB2601的绿色LED点亮,同时OLED显示恰当数量的横线,表示花卉不需浇水或通风散湿,参见下图2。

指示器

实测图2-绿色灯亮

 

2.3 RVB2601处理湿度传感器送来的信号

当花卉土壤过于潮湿时,RVB2601的蓝色LED点亮,同时OLED显示几乎满屏的横线,提醒花卉需要通风散湿,参见下图3。

指示器

实测图3-蓝色灯亮

 

4.4 用RVB2601点亮不同颜色的LED灯及OLED显示不同数量的横线表示花卉土壤的干湿度。

 

 

03 系统框图

   

用“平头哥RISC-V RVB2601开发板”检测土壤湿度的办法:

  • 开发板读取土壤湿度传感器的模拟信号,经开发板ADC转换后变成数字信号,然后驱动开发板的LED及OLED;

  • 经筛选,选取下款湿度传感器,参见图4:

指示器

图4 湿度传感器外形图

 

湿度传感器模块为双输出模式:数字量输出及模拟量输出,比较器采用LM393芯片,工作稳定,信号干净。设有固定螺栓孔,方便安装。

电路图参见图5:

指示器

图5电路图

 

04 各部分功能说明和解析

   

4.1 土壤湿度传感器

   参见图6:

指示器

图6土壤湿度传感器

 

4.2 土壤湿度信号放大处理模块

参见图7:

指示器

图7土壤湿度信号放大处理模块

 

4.3 湿度处理、显示模块

即RVB2601,参见图8:

指示器

图8 RVB2601

 

05 作品源码和案例中处理的传感器数据

   

5.1 作品源码

#define _DEFAULT_SOURCE /* needed for usleep() */
#include 
#include 
#include 
#include 
#include 
#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 
#include 
 
 
#include 
#include 
 
 
#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!
");
    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);
     //editfind in filesfind in files 搜索“EXAMPLE_ADC_CHANNEL0_PIN”可得:
//g:C-SkyCDKCSKYPACKch2601_evbv7.4.3includeoard_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!
", aos_get_app_version());
 
    while(1) 
      {
          /* Read result */
        data = csi_adc_read(&adc);
          printf("get adc result: %d
", data);//在串口调试助手中显示
         printf("the voltage is: %d mV
", 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;k2800)
             {
                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.
");
     return 0;
}

 

5.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

 

06 视频演示

   

https://pan.baidu.com/s/14e7PXorkclUSF74BCm4Bzw 

提取码:jkdf

 

07 项目总结

   

花卉的浇水问题,对很多人来说是个难题。此款“花卉浇水指示器”将浇水问题,转化为土壤的干湿度问题,用传感器检测的数值,直观地指示花儿是否需要浇水,不需依仗经验,主观判断,值得推广。

 


审核编辑 :李倩


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分