平台

芯片 ESP8266EX

模组 ESP-12F

开发板 NodeMCU

SDK ESP8266_RTOS_SDK

branch master

commit 83517ba1f5e26b9413f2ef6d2503dd73662b1272

PS HC-SR04旧版引脚5v,新版支持3.3v

code

使用内部timer调用HC-SR04,每秒测试一次距离并通过串口打印

/**
* @brief 使用ESP8266_RTOS_SDK调用超声波测距模块HC-SR04
* @date 2022/08/28
* @version SDK基于 https://github.com/espressif/ESP8266_RTOS_SDK
* @version branch master commit 83517ba1f5e26b9413f2ef6d2503dd73662b1272
*/ #include <stdio.h>
#include <string.h>
#include <stdlib.h> #include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h" #include "esp_log.h"
#include "esp_system.h" #include <string.h>
#include <sys/param.h>
#include <errno.h> #include "FreeRTOS.h"
#include "task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_log.h"
#include "esp_netif.h"
#include "esp_event.h"
#include "esp_wifi.h"
#include "nvs.h"
#include "nvs_flash.h"
#include "esp_spi_flash.h"
#include "lwip/err.h"
#include "lwip/sys.h"
#include "lwip/sockets.h"
#include <lwip/netdb.h> #include "driver/gpio.h"
#include "driver/hw_timer.h"
#include "freertos/portmacro.h" static xQueueHandle queue = NULL; /**
* @brief 定时器中断函数,1秒中断一次
*/
static void hw_callback(void *arg){
gpio_set_level(GPIO_NUM_2, !gpio_get_level(GPIO_NUM_2));//LED闪烁
uint32_t status = 0;
xQueueSendFromISR(queue, &status, NULL);
} /**
* @brief 定时器初始化
*/
static void timer_init(void){
hw_timer_init(hw_callback, NULL);
hw_timer_set_reload(true);
hw_timer_set_clkdiv(TIMER_CLKDIV_256);
hw_timer_set_intr_type(TIMER_EDGE_INT);
//80M/256 = 312500,即1秒需要31200tik;1/312500 = 0.0000032,即1tik0.0000032秒,3.2us
hw_timer_set_load_data((TIMER_BASE_CLK >> hw_timer_get_clkdiv()));//源码限制load_data < 0x1000000
hw_timer_enable(true);
} /**
* @brief IO中断函数,用于接收HC-SR04的Echo引脚反馈信号
*/
static void gpio_isr(void *arg){
//上升沿记录count,下降沿结束记录
switch(gpio_get_level(GPIO_NUM_5)){
case 1:
*(uint32_t *)arg = hw_timer_get_count_data();
break;
case 0:
//观察得ESP8266内部tik使用降序,故使用减法,又因定时器1秒中断1次,即内部tik1秒清空1次,而HC-SR04最长38ms即返回,故正常情况不会出现两次计数位于两次中断周期中
*(uint32_t *)arg -= hw_timer_get_count_data();
uint32_t status = 1;
xQueueSendFromISR(queue, &status, NULL);
break;
default:
break;
}
}
/**
* @brief IO初始化
* NodeMCU HC-SR04
* D1(GPIO5) Echo
* D2(GPIO4) Trig
* 3.3v VCC
* GND GND
*/
static void gpio_init(){
gpio_config_t io_conf;
io_conf.intr_type = GPIO_INTR_DISABLE;
io_conf.mode = GPIO_MODE_OUTPUT;
io_conf.pin_bit_mask = 1 << GPIO_NUM_2;
io_conf.pull_down_en = 0;
io_conf.pull_up_en = 0;
gpio_config(&io_conf); io_conf.intr_type = GPIO_INTR_ANYEDGE;//上升沿与下降沿均中断
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pin_bit_mask = 1 << GPIO_NUM_5;
io_conf.pull_down_en = 0;
io_conf.pull_up_en = 0;
gpio_config(&io_conf); io_conf.intr_type = GPIO_INTR_DISABLE;
io_conf.mode = GPIO_MODE_OUTPUT;
io_conf.pin_bit_mask = 1 << GPIO_NUM_4; gpio_config(&io_conf);
} static void HC_SR04_task(void *arg)
{
while(1){
uint32_t status;
xQueueReceive(queue, &status, portMAX_DELAY);
switch(status){
case 0:
gpio_set_level(GPIO_NUM_4, 0);
os_delay_us(2);
gpio_set_level(GPIO_NUM_4, 1);
os_delay_us(10);
gpio_set_level(GPIO_NUM_4, 0);
break;
case 1:
//tik为Echo反馈信号长度,声速0.34mm/us,实际距离除以2,3.2*0.34/2 = 0.544ms
//本版本SDK不支持浮点数格式化输出
printf("tik = %d length = %d um\n", *(uint32_t *)arg, *(uint32_t *)arg*544);
break;
default:
break;
}
}
} void app_main(void)
{
printf("hello world!\n"); timer_init();
gpio_init(); uint32_t tik = 0;//记录定时器tik次数,用于计算Echo信号长度
queue = xQueueCreate(10, sizeof(uint32_t));
xTaskCreate(HC_SR04_task, "HC-SR04_task", 2048, &tik, 10, NULL); //为GPIO5注册中断函数
gpio_install_isr_service(0);
gpio_isr_handler_add(GPIO_NUM_5, gpio_isr, &tik); // char arm_info[512] = { 0 };
while(1) {
printf("main is running\n");
// vTaskList(arm_info);
// printf("\nfree_heap = %d\n%s\n",esp_get_free_heap_size() ,arm_info);
// memset(arm_info, 0, sizeof(arm_info));
// vTaskGetRunTimeStats(arm_info);
// printf("%s\n", arm_info);
vTaskDelay(10000 / portTICK_PERIOD_MS);
}
}

使用CuteCom查看结果

[20:55:58:198] tik = 145 length = 7830 um␍␊
[20:55:59:198] tik = 144 length = 7776 um␍␊
[20:56:00:198] tik = 145 length = 7830 um␍␊
[20:56:01:199] tik = 154 length = 8316 um␍␊
[20:56:02:209] tik = 3337 length = 180198 um␍␊
[20:56:03:210] tik = 3185 length = 171990 um␍␊
[20:56:03:237] main is running␍␊
[20:56:04:210] tik = 3126 length = 168804 um␍␊
[20:56:05:210] tik = 3106 length = 167724 um␍␊
[20:56:06:299] tik = 31254 length = 1687716 um␍␊
[20:56:07:200] tik = 350 length = 18900 um␍␊
[20:56:08:201] tik = 342 length = 18468 um␍␊
[20:56:09:201] tik = 351 length = 18954 um␍␊
[20:56:10:201] tik = 352 length = 19008 um␍␊
[20:56:11:202] tik = 354 length = 19116 um␍␊
[20:56:12:202] tik = 355 length = 19170 um␍␊
[20:56:13:202] tik = 355 length = 19170 um␍␊
[20:56:13:240] main is running␍␊
[20:56:14:203] tik = 355 length = 19170 um␍␊
[20:56:15:203] tik = 364 length = 19656 um␍␊
[20:56:16:203] tik = 358 length = 19332 um␍␊
[20:56:17:204] tik = 358 length = 19332 um␍␊

基于 ESP8266_RTOS_SDK 驱动 HC-SR04的更多相关文章

  1. 【tornado】系列项目(二)基于领域驱动模型的区域后台管理+前端easyui实现

    本项目是一个系列项目,最终的目的是开发出一个类似京东商城的网站.本文主要介绍后台管理中的区域管理,以及前端基于easyui插件的使用.本次增删改查因数据量少,因此采用模态对话框方式进行,关于数据量大采 ...

  2. 【tornado】系列项目(一)之基于领域驱动模型架构设计的京东用户管理后台

    本博文将一步步揭秘京东等大型网站的领域驱动模型,致力于让读者完全掌握这种网络架构中的“高富帅”. 一.预备知识: 1.接口: python中并没有类似java等其它语言中的接口类型,但是python中 ...

  3. 使用 Spring 2.5 基于注解驱动的 Spring MVC

    http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/ 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sp ...

  4. [置顶] 基于视频采集卡驱动的错误修改CX26828

    基于视频采集卡驱动的错误修改CX26828 1. 设置root密码 command:sudo passwd root 2.查看系统状态 输入命令:lsmod root@ubuntu:/home/yu# ...

  5. 使用 Spring 2.5 基于注解驱动的 Spring MVC--转

    概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...

  6. 基于领域驱动设计(DDD)超轻量级快速开发架构(二)动态linq查询的实现方式

    -之动态查询,查询逻辑封装复用 基于领域驱动设计(DDD)超轻量级快速开发架构详细介绍请看 https://www.cnblogs.com/neozhu/p/13174234.html 需求 配合Ea ...

  7. 基于“事件”驱动的领域驱动设计(DDD)框架分析

    摘抄自 从去年10月份开始,学了几个月的领域驱动设计(Domain Driven Design,简称DDD).主要是学习领域驱动设计之父Eric Evans的名著:<Domain-driven ...

  8. unittest框架扩展(基于代码驱动)自动化-下

    一.数据驱动/代码驱动优缺点: 使用数据驱动的好处:- 代码复用率高.同一测试逻辑编写一次,可以被多条测试数据复用,提高了测试代码的复用率,同时可以提高测试脚本的编写效率.- 异常排查效率高.测试框架 ...

  9. 基于领域驱动设计(DDD)超轻量级快速开发架构

    smartadmin.core.urf 这个项目是基于asp.net core 3.1(最新)基础上参照领域驱动设计(DDD)的理念,并参考目前最为了流行的abp架构开发的一套轻量级的快速开发web ...

  10. 基于basys2驱动LCDQC12864B的verilog设计图片显示

    话不多说先上图 前言 在做这个实验的时候在网上找了许多资料,都是关于使用单片机驱动LCD显示,确实用单片机驱动是要简单不少,记得在FPGA学习交流群里问问题的时候,被前辈指教,说给我最好的指教便是别在 ...

随机推荐

  1. 鸿蒙手表定位功能Demo体验,适用儿童、老年和外出旅游安全市场

    针对儿童和老人,可穿戴的智能手表用处很大.市场也有许多类似的产品,支持接打电话.支付扫码.定位等功能,属于新兴的商业机会.依托华为品牌,鸿蒙手表也致力为用户打造精品的.产品质量佳.可穿戴的智能体验.对 ...

  2. 国产开源数据库OpenGauss的安装运行

    步骤一:OpenGauss 的安装 环境 OS:openEuler 20.03 64bit with ARM 架构:arm64 部署:单机 安装过程 1.环境配置 安装依赖包: yum install ...

  3. openGauss/MogDB 学习笔记之 -- PITR恢复

    openGauss/MogDB 学习笔记之 -- PITR 恢复 概念描述 背景信息 当数据库崩溃或希望回退到数据库之前的某一状态时,MogDB 的即时恢复功能(Point-In-Time Recov ...

  4. GPT-3的训练一次成本约为140万美元

    训练GPT模型的成本非常高昂,因为它需要大量的计算资源和时间.具体来说,GPT-3的训练成本约为140万美元,对于一些更大的LLM模型,训练成本介于200万美元至1200万美元之间.此外,OpenAI ...

  5. Blocks—单调栈

    思路: 题目意思是求平均数>=k的最长序列先求出a[i]-k的前缀和就是求sum[i]-sum[j]>=0的最大i-j当j<=k<=isum[j]<=sum[k]j< ...

  6. jenkins 持续集成和交付——gogs安装(外篇)

    前言 因为在jenkins 过程中一般需要去处理一些git的东西,为了完整性,填补一下git管理安装,这里使用gogs,因为gogs比较小,我运行的小机器能够承受,当然只适合个人,这里用来做实验,网上 ...

  7. 从LLaMA-Factory项目认识微调

    概述 什么是LLaMA-Factory? LLaMA-Factory是一个在github上开源的,专为大模型训练设计的平台.项目提供中文说明,可以参考官方文档:https://github.com/h ...

  8. dva使用yarn编译出错

    1. 报错信息 ./src/models/example.jsModule build failed: TypeError: /Users/user/Desktop/learn-code/10.Rea ...

  9. Beetl 源码解析:GroupTemplate 类

    本文首发于公众号:腐烂的橘子 前言 Beetl 是一款 Java 模板引擎,在公司的项目中大量运用,它的作用是写通用代码时,有一些差异化的逻辑需要处理,这时可以把这些差异化的逻辑写在模板里,程序直接调 ...

  10. HarmonyOS NEXT应用开发案例—状态栏显隐变化

    介绍 本示例介绍使用Scroll组件的滚动事件 onScroll 实现状态栏显隐变化.该场景多用于各种软件的首页.我的等页面中. 效果预览图 使用说明 加载完成后显示状态栏显隐变化页面,上下拖动屏幕, ...