平台

芯片 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. 【FAQ】关于分析服务错误获取所选日期前一天事件数据的解决方法

    开发者通过华为分析服务下载所需的事件数据,这些数据可以导入到开发者自有的分析系统中,用于构建自定义报告或生成受众群体的个性化分析等,从而帮助制定切实有效的营销活动.数据导出支持按照用户属性和导出事件作 ...

  2. Jenkins首次启动慢

    场景描述启动Jenkins后,打开网站,发现一直卡在这个启动页面,慢,很慢,非常慢 解决方法 进入Jenkins的安装目录,找到"hudson.model.UpdateCenter.xml& ...

  3. centos 6.4更新163源

    centos 6.4更新163源   1. 备份现在的源文件    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base. ...

  4. nginx重新整理——————http请求的11个阶段中的access阶段[十五]

    前言 简单介绍一下access 阶段. 正文 限制某些ip地址的访问权限: syntax: allow address| CIDR|unix:|all; defuat: - context: http ...

  5. 浅谈TypeScript对业务可维护性的影响

    前言 笔者认为, TypeScript是服务于业务的, 核心就是提高代码的可维护性. TypeScript是把双刃剑, 如果类型系统使用的不好, 反而会阻碍开发, 甚至最后就变成了anyScript. ...

  6. MQTT实战系列(一)——MQTT简介

    随着移动互联网以及物联网应用的蓬勃发展,阿里云推出微消息队列 MQTT,从而实现端(浏览器.Android.iOS.智能设备.直播互动.车联网)与云的双向通信,通过消息实现万物互联. MQTT (Me ...

  7. Redis基础(一)——字符串、hash类型的基本使用

    day09--Redis Redis介绍和安装 # Redis:软件,存储数据的,速度非常快,Redis是一个key-value存储系统(没有表的概念),cs架构的软件 服务端 客户端(python作 ...

  8. 快手基于RocketMQ的在线消息系统建设实践

    简介: 快手需要建设一个主要面向在线业务的消息系统作为 Kafka 的补充,低延迟.高并发.高可用.高可靠的分布式消息中间件 RocketMQ 正是我们所需的. 作者:黄理 黄理,10多年软件开发和架 ...

  9. Apache RocketMQ + Hudi 快速构建 Lakehouse

    ​简介:基于RocketMQ和Hudi零代码构建Lakehouse架构,以及RocketMQ Connector & RocketMQ Stream助力ETL数据分析,为大家提供快速构建Lak ...

  10. Snowflake如日中天是否代表Hadoop已死?大数据体系到底是什么?

    ​简介: 本文作者关涛是大数据系统领域的资深专家,在微软(互联网/Azure云事业群)和阿里巴巴(阿里云)经历了大数据发展20年过程中的后15年.本文试从系统架构的角度,就大数据架构热点,每条技术线的 ...