ESP32移植Openharmony外设篇(7)土壤湿度传感器YL-69

土壤湿度传感器YL-69

模块简介

简介

YL-69土壤湿度传感器是一种用于测量土壤湿度的传感器,其工作原理为电阻式。传感器的主体为一个具有两个接头的金属探头,可以将其插入到土壤中,接头内部包含有两个金属探针,通过探针与土壤接触来测量土壤的湿度。

当土壤干燥时,土壤的电阻变大,传感器的输出电压也随之增加,反之,当土壤湿度增加时,土壤的电阻变小,传感器的输出电压也随之降低。通过测量传感器输出电压的大小,就能获得土壤湿度的信息。

YL-69土壤湿度传感器的优点是结构简单,成本低廉,易于使用和安装,可以广泛应用于农业、园艺、环境监测等领域。

特性

土壤湿度传感器特性:

(1) 土壤湿度传感器YL-69,表面采用镀镍处理,有加宽的感应面积,可以提高导电性能 ,防止接触土壤容易生锈的问题,延长使用寿命;

(2) 模块采用金手指设计直接插在拓展板上,即插即用,采用type-C口连接土壤湿度探头,使用方便。

(3) 比较器采用LM393芯片,工作稳定。

原理图

搜集资料可以知道,该传感器是通过ADC读取模拟量来判断土壤湿度;又根据原理图可知,Soil_OUT是接在IO_2上的,查询ESP_IDF编程手册的GPIO口汇总图可以看到其对应的ADC组别和通道号。

所以我们使用ADC2通道2进行ADC采集。

同时我们注意到可以通过Soil_Motor控制电机转动(模拟水泵抽水)通过Soil_LED控制LED灯,二者都是通过简单的GPIO口设置高低电平进行控制。

所以初步的思路是通过土壤湿度传感器测量土壤湿度,如果湿度低于阈值,水泵抽水;如果湿度高于阈值,LED灯闪烁示警。

参考代码

adc_soil_example.c
/*
 * Copyright (c) 2022 Hunan OpenValley Digital Industry Development Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <stdio.h>
#include "cmsis_os2.h"
#include "ohos_run.h"
#include "osal_irq.h"

/* ADC2 Example*/
#include <stdio.h>
#include <stdlib.h>
#include "driver/gpio.h"
#include "driver/adc_common.h"
#include "esp_adc_cal.h"

#define GPIO_MOTOR GPIO_NUM_23
#define GPIO_LED GPIO_NUM_22
//ADC所接的通道
#define ADC2_TEST_CHANNEL ADC2_CHANNEL_2

osThreadId_t g_taskID = NULL;
int read_raw;
int ret;
int count;

//ADC初始化
//ADC_ATTEN_DB_0:表示参考电压为1.1V
//ADC_ATTEN_DB_2_5:表示参考电压为1.5V
//ADC_ATTEN_DB_6:表示参考电压为2.2V
//ADC_ATTEN_DB_11:表示参考电压为3.9V
void adc_Init()
{
	//adc1_config_width(ADC_WIDTH_12Bit);// 12位分辨率
	adc2_config_channel_atten(ADC2_TEST_CHANNEL,ADC_ATTEN_DB_0);// 设置通道2和1.1V参考电压
}

void motor_gpio_init()
{    
  //配置为输出
    gpio_config_t gpio_soil = {
        .intr_type = GPIO_INTR_DISABLE, //关闭中断
        .mode = GPIO_MODE_OUTPUT,        //输出模式
        .pin_bit_mask = 1ULL << GPIO_MOTOR,  //23引脚
        .pull_down_en = GPIO_PULLDOWN_DISABLE,  //关闭下拉
        .pull_up_en = GPIO_PULLUP_ENABLE        //开启上拉
    };

    gpio_config(&gpio_soil);
}

static void adc_test(void)
{
  static uint8_t state = 0;
	adc_Init();
  motor_gpio_init();
	while(1){
    gpio_set_level(GPIO_MOTOR,1);
        switch(state)
        {
            case 0:
            {
                esp_err_t r = adc2_get_raw( ADC2_TEST_CHANNEL, ADC_WIDTH_12Bit, &read_raw);
                if ( r == ESP_OK ) 
                {
                    ret += read_raw;
                    count ++;
                } else if ( r == ESP_ERR_TIMEOUT )
                {            //说明ADC2的引脚已被用为WIFI占用
                    printf("ADC2 used by Wi-Fi.\n");
                    break;
                }
                if(count == 10)
                {
                    state = 1;
                }
            }
            case 1:
            {
                printf("MQ2 adc value is %d\r\n",ret/count);
                state = 0;
                ret = 0;
                count = 0;
            }
        }
		osDelay(100);
	}
}

static void adc_task(void)
{
    osThreadAttr_t attr;
    attr.name = "adc_test";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024;
    attr.priority = 26;
    g_taskID = osThreadNew((osThreadFunc_t)adc_test, NULL, &attr);
    if (g_taskID == NULL) {
        printf("Failed to create Test ADC thread!\n");
    }
}

OHOS_APP_RUN(adc_task);
BUILD.gn
# Copyright (c) 2022 Hunan OpenValley Digital Industry Development Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//kernel/liteos_m/liteos.gni")
module_name = get_path_info(rebase_path("."), "name")
kernel_module(module_name){
    sources = [
        "adc_soil_example.c",
    ]
    include_dirs = [
        "//drivers/hdf_core/framework/include/platform/",
        "//drivers/hdf_core/framework/include/utils/",
        "//drivers/hdf_core/framework/support/platform/include/adc",
        "//drivers/hdf_core/adapter/khdf/liteos_m/osal/include/",
        "//drivers/hdf_core/framework/include/core/",
        "//drivers/hdf_core/framework/include/osal/",
        "//drivers/hdf_core/interfaces/inner_api/utils",
        "//device/soc/esp/esp32/components/driver/include",
        "//device/soc/esp/esp32/components/esp_adc_cal/include",
        "//device/soc/esp/esp32/components/driver/esp32/include",
    ]
}

编译并烧录

在源码根目录下使用hb工具对写好的代码进行编译

选择mini级系统

同理 产品选择esp公司下的esp32

选择完毕后在源码根目录下执行hb build -f 进行编译

编译完成后会有如下界面,并且编译后的代码固件位于:out\esp32\esp32

实验现象

按下ESP32开发板上的EN键,即可观察到实验现象:

将纸巾沾湿包裹住土壤湿度探头,可以看到读取到的adc值明显升高,实验成功!

相关推荐
老薛爱吃大西瓜6 分钟前
MPU中断处理
c语言·单片机·嵌入式硬件
wenchm23 分钟前
细说STM32F407单片机FSMC连接外部SRAM的方法及HAL驱动
stm32·单片机·嵌入式硬件
厉昱辰25 分钟前
一文读懂51单片机的中断系统
stm32·单片机·51单片机
Stanford_110630 分钟前
关于物联网的基础知识(一)
服务器·物联网·微信小程序·微信公众平台·twitter·微信开放平台
折途1 小时前
【STC库函数】Compare比较器的使用
单片机·嵌入式硬件
不能只会打代码2 小时前
32单片机从入门到精通之软件编程——通信协议(十一)
单片机·嵌入式硬件·32单片机
轻口味2 小时前
【每日学点鸿蒙知识】跳转三方地图、getStringSync性能、键盘避让模式等
华为·harmonyos
儿歌八万首2 小时前
鸿蒙ArkUI实现部门树列表
华为·harmonyos·鸿蒙·arkui
小禾苗_3 小时前
51单片机——8*8LED点阵
单片机·嵌入式硬件·51单片机
Stanford_11063 小时前
关于单片机的基础知识(一)
前端·c++·单片机·嵌入式硬件·微信公众平台·twitter·微信开放平台