基于 ESP8266_RTOS_SDK 驱动 HC-SR04
平台
芯片 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的更多相关文章
- 【tornado】系列项目(二)基于领域驱动模型的区域后台管理+前端easyui实现
本项目是一个系列项目,最终的目的是开发出一个类似京东商城的网站.本文主要介绍后台管理中的区域管理,以及前端基于easyui插件的使用.本次增删改查因数据量少,因此采用模态对话框方式进行,关于数据量大采 ...
- 【tornado】系列项目(一)之基于领域驱动模型架构设计的京东用户管理后台
本博文将一步步揭秘京东等大型网站的领域驱动模型,致力于让读者完全掌握这种网络架构中的“高富帅”. 一.预备知识: 1.接口: python中并没有类似java等其它语言中的接口类型,但是python中 ...
- 使用 Spring 2.5 基于注解驱动的 Spring MVC
http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/ 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sp ...
- [置顶] 基于视频采集卡驱动的错误修改CX26828
基于视频采集卡驱动的错误修改CX26828 1. 设置root密码 command:sudo passwd root 2.查看系统状态 输入命令:lsmod root@ubuntu:/home/yu# ...
- 使用 Spring 2.5 基于注解驱动的 Spring MVC--转
概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...
- 基于领域驱动设计(DDD)超轻量级快速开发架构(二)动态linq查询的实现方式
-之动态查询,查询逻辑封装复用 基于领域驱动设计(DDD)超轻量级快速开发架构详细介绍请看 https://www.cnblogs.com/neozhu/p/13174234.html 需求 配合Ea ...
- 基于“事件”驱动的领域驱动设计(DDD)框架分析
摘抄自 从去年10月份开始,学了几个月的领域驱动设计(Domain Driven Design,简称DDD).主要是学习领域驱动设计之父Eric Evans的名著:<Domain-driven ...
- unittest框架扩展(基于代码驱动)自动化-下
一.数据驱动/代码驱动优缺点: 使用数据驱动的好处:- 代码复用率高.同一测试逻辑编写一次,可以被多条测试数据复用,提高了测试代码的复用率,同时可以提高测试脚本的编写效率.- 异常排查效率高.测试框架 ...
- 基于领域驱动设计(DDD)超轻量级快速开发架构
smartadmin.core.urf 这个项目是基于asp.net core 3.1(最新)基础上参照领域驱动设计(DDD)的理念,并参考目前最为了流行的abp架构开发的一套轻量级的快速开发web ...
- 基于basys2驱动LCDQC12864B的verilog设计图片显示
话不多说先上图 前言 在做这个实验的时候在网上找了许多资料,都是关于使用单片机驱动LCD显示,确实用单片机驱动是要简单不少,记得在FPGA学习交流群里问问题的时候,被前辈指教,说给我最好的指教便是别在 ...
随机推荐
- RabbitMQ 08 路由模式
路由模式 路由模式结构图: 定义配置类. import org.springframework.amqp.core.Binding; import org.springframework.amqp.c ...
- 抓包整理外篇——————https 抓包 [ 五]
前言 简单介绍一下https 抓包. 正文 可能有人一开始的时候发现抓包都抓不到,原因也很简单,那是因为https 需要解密. 那么为什么https 不解密呢? 那是因为证书信任问题. 下面先介绍,上 ...
- 实训篇-Html-列表练习
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- k8s架构与原理介绍
K8s概述 目录 K8s概述 1.什么是K8s 2.K8s 设计架构 3. k8s重要节点描述 4. 过程原理: 5. k8s的核心功能 6. k8s的历史 7. k8s的安装方式 8. k8s的应用 ...
- ORA-02303: cannot drop or replace a type with type or table dependents,即无法使用类型或表的相关性来删除或取代一个类型
ORA-02303: cannot drop or replace a type with type or table dependents,即无法使用类型或表的相关性来删除或取代一个类型 在修改一个 ...
- 【笔记】go语言--Map
go语言--Map //基本结构,定义 m := map[string] string { "name" : "ccmouse",//这些是无序的,是hashm ...
- HL7传输协议
HL7消息通过各种TCP/IP传输发送,其中一些包括: 下层协议(LLP) 文件传输协议(FTP) 简单对象访问协议(SOAP) 简单邮件传输协议(SMTP) 尽管HL7可以使用多种传输协议进行数据传 ...
- 力扣8(java)-字符串转整数(atoi)(中等)
题目: 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数). 函数 myAtoi(string s) 的算法 ...
- Dataphin功能:集成——如何将业务系统的数据抽取汇聚到数据中台
简介: 数据集成是简单高效的数据同步平台,致力于提供具有强大的数据预处理能力.丰富的异构数据源之间数据高速稳定的同步能力,为数据中台的建设打好坚实的数据基座. 数据中台是当下大数据领域最前沿的数据建 ...
- [FAQ] uni-app 运行微信小程序 main.wxss 报错 unexpected token "$"
检查一下你是否在 App.vue 中有手动操作引入过 uni.scss,比如下面的 import: <style lang="scss"> @import url(&q ...