平台

芯片 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. 多次复制Excel符合要求的数据行:Python批量实现

      本文介绍基于Python语言,读取Excel表格文件数据,并基于其中某一列数据的值,将这一数据处于指定范围的那一行加以复制,并将所得结果保存为新的Excel表格文件的方法.   首先,我们来明确一 ...

  2. Redis Stack功能介绍及redis-om-dotnet使用示例

    为了简化开发人员对较新的 Redis 模块及其提供的功能的体验,同时简化支持其功能的文档和客户端.以帮助开发人员从开始使用 Redis 的那一刻起,就能充分提高工作效率.Redis Stack诞生了. ...

  3. leetcode-数组中两元素的最大乘积

    题目描述 给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值. 请你计算并返回该式的最大值. 示例 1: 输入:nums ...

  4. 用HarmonyOS做一个可以手势控制的电子相册应用(ArkTS)

    介绍 本篇 Codelab 介绍了如何实现一个简单的电子相册应用,主要功能包括: 1.  实现首页顶部的轮播效果. 2.  实现页面多种布局方式. 3.  实现通过手势控制图片的放大.缩小.左右滑动查 ...

  5. 并发系列64章(TPL 数据流(二))第八章

    前言 续第七章. 正文 数据流块的并行处理 数据流块在网格上本身就是并行的,为什么这么说呢? 加入有两个数据库,他们链接在一起,然后给他们post数据. 当数据流块一在运行的时候,数据流块二也在执行, ...

  6. c# 优化代码的一些规则——判断null值得不同写法[六]

    前言 先来看一个例子: 假设updated 是一个委托: if(updated!=null) { updated(); } 请问上面写法在多线程中安全吗?如果不安全会抛出什么异常呢? 正文 上面的答案 ...

  7. c#程序员必学清单补充

    作为 C# 程序员,除了上述经典书籍和开源框架外,还需要掌握以下技术: 1. .NET Core 和 ASP.NET Core:了解并熟练掌握 .NET Core 和 ASP.NET Core 框架, ...

  8. 深度解读《深度探索C++对象模型》之返回值优化

    接下来我将持续更新"深度解读<深度探索C++对象模型>"系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表. 没有启用返回值优 ...

  9. SnakeYaml反序列化分析

    前言 SnakeYaml是Java中解析yaml的库,而yaml是一种人类可读的数据序列化语言,通常用于编写配置文件等.yaml真是到哪都有啊. 环境搭建 <dependency> < ...

  10. JavaWeb技术JSP连接数据库操作

    "感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!" 0X01 ...