当前位置: 首页 > article >正文

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值明显升高,实验成功!


http://www.kler.cn/a/467706.html

相关文章:

  • nginx-灰度发布策略(split_clients)
  • GitLab集成Runner详细版--及注意事项汇总【最佳实践】
  • 用公网服务代理到本地电脑笔记
  • node.js内置模块之---fs 模块
  • 【软考网工笔记】计算机基础理论与安全——网络规划与设计
  • 物体切割效果
  • Python进阶-08-继承性
  • 编译 C++ 程序:分离与保留调试信息以支持 GDB 对 Core 文件的调试
  • 如何自行解锁 ATamp;T 手机
  • UE5 slate创建SDockTab标签页的过程理解
  • Megatron - LM 怎么进行模型切分的,怎么匹配服务器的
  • 量子力学复习
  • STM32学习之MPU6050芯片 及 软件I2C读写MPU6050实验
  • linux命令行连接Postgresql常用命令
  • 【高阶数据结构】哈希表封装unordered_map、unordered_set
  • 【论文阅读】Anchor-based fast spectral ensemble clustering
  • 微服务保护—Sentinel快速入门+微服务整合 示例: 黑马商城
  • 我用AI学Android Jetpack Compose之Jetpack Compose学习路径篇
  • 字符串中常用函数
  • 时序优化方法
  • docker、数据库、Web应用程序安全
  • Stable Diffusion和Midjourney有什么区别?
  • 大学生入学审核系统的设计与实现(源码+数据库+文档)
  • v-model与 mvvm 回顾
  • Arduino UNO 驱动1.8 TFT屏幕显示中文
  • 用Python爬虫获取AliExpress商品信息:item_search API接口实战指南