ESP32 入门笔记06: FreeRTOS+《两只老虎》 (ESP32 for Arduino IDE)

news2024/11/25 10:42:20

ESP32+FreeRTOS

Esp32 模块中已经提供了 FreeRTOS(实时操作系统)固件。

FreeRTOS有助于提高系统性能管理模块的资源。FreeRTOS允许用户处理多项任务,如测量传感器读数,发出网络请求,控制电机速度等,所有这些任务都可以同时独立运行。

FreeRTOS为不同的应用程序提供了多个API。这些 API 可用于创建任务并使其在不同内核上运行。您需要创建任务以将代码的特定部分分配给特定内核。您还可以确定代码将在哪个内核上运行的优先级。

硬件

在这里插入图片描述

软件

在这里插入图片描述

tone() 函数

Arduino 内置函数:Reference > Language > Functions > Advanced io > Tone

在引脚上生成指定频率(和 50% 占空比)的方波。可以指定持续时间,否则波形会一直持续到调用 noTone()。该引脚可以连接到压电蜂鸣器或其他扬声器以播放音调。 一次只能产生一种音调。如果一个音调已经在另一个引脚上播放,则对tone() 的调用将无效。如果音调在同一个引脚上播放,则呼叫将设置其频率。 使用tone() 函数会干扰引脚3 和11 上的PWM 输出(在Mega以外的板上)。 不可能产生低于 31Hz 的音调

语法

tone(pin, frequency) // 语法一
tone(pin, frequency, duration) // 语法二

入口参数:

  • pin: 生成音调的 Arduino 引脚。
  • frequency: 以赫兹为单位的音调频率。允许的数据类型: unsigned int 无符号整数。
  • duration: 以毫秒为单位的音调持续时间(可选)。允许的数据类型:unsigned long

noTone()函数

停止生成由tone() 触发的方波。如果没有生成音调,则无效。

语法

noTone(pin)

注意: 如果您想在多个引脚上播放不同的音高,您需要在一个引脚上调用 noTone(),然后再在下一个引脚上调用tone()。

示例程序

开发环境是VSCode + PlatformIO IDE

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

// buzzer pin
#define BUZZER 19
#define ADC_PIN 34
uint16_t adc = 0;
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); // U8G2_R0:屏幕旋转0°度


/**
  * @brief  屏幕显示界面1
  * @param  无
  * @param  无
  * @retval adc:检测电池电量ADC34
  */
void page1(int adc) {
  u8g2.setFont(u8g2_font_helvR08_tf); //设置字体 字号 字形
  u8g2.setFontPosTop();  // 设置定位的位置以字符顶开始
  u8g2.setCursor(0,0);  // 设置屏幕坐标
  u8g2.print(String("ADC:") + String(adc));
  u8g2.nextPage();//刷新屏幕
}

/**
  * @brief  《两只老虎》简谱
  * @param  无
  * @param  无
  * @retval count:计数
  */
void two_tigers_music_play()
{
byte count = 0;                 // byte 占1个字节 1*8bit=8位 0~256 节省内存
// low 1-7 低音
unsigned int  LOW_1 = 262;      // unsigned int 占4个字节 4*8bit=32位  0~4294967295
unsigned short LOW_1_P_5 = 277; // unsigned short 等于 uint16_t
uint16_t LOW_2 = 294;           // uint16_t 占2个字节 2*8bit=16位  0~65535
uint16_t LOW_2_P_5 = 311;
uint16_t LOW_3 = 330;
uint16_t LOW_4 = 349;
uint16_t LOW_4_P_5 = 370;
uint16_t LOW_5 = 392;
uint16_t LOW_5_P_5 = 415;
uint16_t LOW_6 = 440;
uint16_t LOW_6_P_5 = 466;
uint16_t LOW_7 = 494;

for (count = 0; count < 2; count++) // 每句歌词唱两遍
{
  tone(BUZZER, LOW_1);
  delay(500);
  tone(BUZZER, LOW_2);
  delay(500);
  tone(BUZZER, LOW_3);
  delay(500);
  tone(BUZZER, LOW_1);
  delay(500);
  
  noTone(BUZZER);
  delay(500);
}

for (count = 0; count < 2; count++)
{
  tone(BUZZER, LOW_3);
  delay(500);
  tone(BUZZER, LOW_4);
  delay(500);
  tone(BUZZER, LOW_5);
  delay(1000);

  noTone(BUZZER);
  delay(500);
}

for (count = 0; count < 2; count++)
{
  tone(BUZZER, LOW_5);
  delay(350);
  tone(BUZZER, LOW_6);
  delay(150); 
  tone(BUZZER, LOW_5);
  delay(350);
  tone(BUZZER, LOW_4);
  delay(150); 
  tone(BUZZER, LOW_3);
  delay(500);
  tone(BUZZER, LOW_1);
  delay(500);

  noTone(BUZZER);
  delay(500);
}

for (count = 0; count < 2; count++)
{
  tone(BUZZER, LOW_1_P_5);
  delay(500);
  tone(BUZZER, LOW_5_P_5);
  delay(500);
  tone(BUZZER, LOW_1_P_5);
  delay(1000);

  noTone(BUZZER);
  delay(500);
}

} 

/**
  * @brief  任务2函数
  * @param  无
  * @param  无
  * @retval pvParameters:
  */
void task_2( void * pvParameters ){
for(;;){
  adc = analogRead(ADC_PIN);
  page1(adc); // 显示电量
  vTaskDelay(1);
}
}
/**
  * @brief  任务3函数
  * @param  无
  * @param  无
  * @retval pvParameters:
  */
void task_3( void * pvParameters ){
for(;;){
  two_tigers_music_play();// 播放营业
  vTaskDelay(1);
}
}

/**
  * @brief  初始化setup()
  * @param  无
  * @param  无
  * @retval 
  */
void setup() {
  pinMode(BUZZER, OUTPUT);
  pinMode(ADC_PIN, INPUT);
  u8g2.enableUTF8Print();
  u8g2.setI2CAddress(0x3C*2);
  u8g2.begin();
  u8g2.firstPage();
  do
  {
    page1(adc);
  }while(u8g2.nextPage());


  xTaskCreatePinnedToCore(task_2, "task_2", 4096, NULL, 0, NULL, 1);
  xTaskCreatePinnedToCore(task_3, "task_3", 4096, NULL, 8, NULL, 1);
//xTaskCreatePinnedToCore 函数参数说明:
// task_2:实现任务的函数名称(task1)
// "task_2":任务的任何名称(“ task1”等)
// 4096:分配给任务的堆栈大小,以字为单位
// NULL:任务输入参数(可以为NULL)
// 2:任务的优先级(0是最低优先级)
// NULL:任务句柄(可以为NULL)
// 1:任务将运行的ESP32D的内核ID(0或1)
}

void loop() {
  vTaskDelay(1);
}



参考资料

  • [1] 使用ARDUINO UNO和无源蜂鸣器实现音乐-《两只老虎》
  • [2] Arduino之运用u8gbil库控制OLED
  • [3] Mixly2.0 中自带u8g2和freeRTOS积木模块
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

旅游推荐系统

摘要 随着社会的发展&#xff0c;人们生活水平的提高&#xff0c;旅游逐渐成为人们生活中的重要活动&#xff0c;2019年国内旅游人数超过60亿人次。并且&#xff0c;旅游业已经成为了我国经济发展的一个重要支柱&#xff0c;近年来我国旅游业对GDP贡献值呈上升趋势。2019年&am…

【附源码】计算机毕业设计java装修服务分析系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【数据结构】链表OJ特别篇 —— 面试情景带你深度剖析 环形链表系列问题 复制带随机指针的链表

文章目录0. 前言1. 环形链表2. 环形链表延伸问题3. 环形链表 II4. 复制带随机指针的链表5. 结语0. 前言 Hello&#xff0c;大家好&#xff0c;我是anduin。这期的内容依然是链表OJ。但与前两期不同的是&#xff0c;这次我会模拟面试的情景&#xff0c;由浅入深&#xff0c;以生…

冶金行业数字化供应链管理系统:赋能企业端到端供应链优化,推动行业数字化变革

作为国之重器&#xff0c;冶金行业在国家大基建战略的支持下&#xff0c;迎来了新一轮的发展良机&#xff0c;然而冶金行业整体产能过剩、对于产业链下游依赖严重等情况依然突出&#xff0c;机遇与挑战并存&#xff0c;在此环境下&#xff0c;如何在激烈的竞争中提升企业自身竞…

多对一和一对多的处理P21,P22

多对一&#xff1a; 按照查询嵌套处理&#xff1a; StudentMapper&#xff1a;&#xff08;接口很简单需要返回一个List&#xff09; package com.Li.dao;import com.Li.pojo.Student; import org.apache.ibatis.annotations.Select;import java.util.List;public interface …

无人机和热成像

当它变得可见时&#xff0c;看不见的世界是一个令人惊叹的景象。 热成像就是这样&#xff0c;透过使用专门的摄影机和技术&#xff0c;使看不见的红外光谱可见。 我们周围那个无形的世界隐藏着什么&#xff0c;这是一个完整的隐藏世界。 图片来源&#xff1a;Keith Davis/热成像…

腾讯面试真题 | 没在我八股文列表里。。。

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

零基础自学javase黑马课程第十天

零基础自学javase黑马课程第十天 ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&#x1f39e;2022年11月1日&#x…

【MySQL】深入理解MySQL索引优化器工作原理

本文导读 本文将解读MySQL数据库查询优化器&#xff08;CBO&#xff09;的工作原理。简单介绍了MySQL Server的组成&#xff0c;MySQL优化器选择索引额原理以及SQL成本分析&#xff0c;最后通过 select 查询总结整个查询过程。 一、MySQL 优化器是如何选择索引的 下面我们来…

2022年最新浙江建筑特种工(施工升降机)真题题库及答案

百分百题库提供特种工&#xff08;施工升降机&#xff09;考试试题、特种工&#xff08;施工升降机&#xff09;考试预测题、特种工&#xff08;施工升降机&#xff09;考试真题、特种工&#xff08;施工升降机&#xff09;证考试题库等,提供在线做题刷题&#xff0c;在线模拟考…

web前端期末大作业——基于html+css+javascript学生宿舍管理系统网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

双十一到了,当我用Python采集了电商平台所有商品后发现....

Python采集电商平台写在前面环境及模块案例实现思路代码展示效果展示最后写在前面 这不是双十一快到了&#xff0c;为了以最优惠的价格买到自己想买的商品&#xff0c;我不惜用Python把ya ma xun 所有商品撸了一遍。 环境及模块 使用环境 python 3.8 pycharm 2021 模块及安…

重磅发布 | 更快、更强的 .NET 7

.NET Conf 2022在11⽉8⽇11点正式开始了&#xff0c;为期三天的会议&#xff08;11⽉8-10⽇&#xff09;&#xff0c;围绕 .NET 7 展开。相信各位⼩伙伴都已经开始安装 .NET 7 正式版本以及相关的开发⼯具。这次 .NET 7 围绕传统的 C#&#xff0c;ASP.NET Core, Blazor, .NET M…

如何用python给女神写一封照片情书?亲测表白率100%~

嗨害大家好鸭&#xff01;我是小熊猫❤ 咳咳…大家都问我 是怎么追到我女神的&#xff0c; 斗胆来分享一下俺的小教程&#x1f4a8; 实现步骤 想要实现把情书写在像素中&#xff0c; 那么我们就需要用到pillow这个神器。 众所周知&#xff0c;图片是由无数个像素所组成的&…

【Spring Boot项目】个人在线音乐播放器

文章目录项目简介数据库表的设计拦截器及返回数据格式注册功能登陆功能音乐列表相关业务查询功能上传音乐播放音乐收藏音乐删除功能删除单个音乐批量删除音乐收藏列表查询收藏的音乐取消收藏注销功能项目简介 本项目主要是实现了在线播放音乐的功能&#xff0c;用户可以随时登…

[RCTF 2019]Nextphp

知识点&#xff1b;利用 FFI 绕过 disable_functionFFI 介绍与利用 首先 FFI 肯定要开&#xff0c;且 PHP 版本肯定要早 7.4 以上 简介&#xff1a; FFI &#xff0c;可以让我们直接在PHP脚本中调用C语言写的库中的函数。 FFI 的安全性问题 FFI虽然给了我们很大的灵活性&am…

人脸视频检索系统设计(C++)

目录 人脸检索系统框架的构建 1 一.软件实现的主要界面 1 二.软件的需求概括 1 三.软件代码设计过程中需要注意的问题 2 四.程序到目前为止产生的诸多缺陷 4 五.程序的详细设计过程 4 1.输入部分的设计 4 2.检测结果部分的设计过程 10 人脸检索系统框架的构建 ------FaceMFC_v…

腾讯148道面试题,(程序员必备学习方向)全会拿45Koffer没问题

相信你可能经历过这些&#xff1a; 已经工作两三年了&#xff0c;每个项目都会加班加点全力以赴去完成&#xff0c;薪资增长幅度却不如人意。听说年后离职的老同事&#xff0c;金三刚拿下高薪offer&#xff0c;年薪直奔50万了。由于现在的公司接触不到新技术&#xff0c;对自己…

思科网络部署实验

作者介绍&#xff1a; 作者&#xff1a;小刘在C站 每天分享课堂笔记&#xff0c;一起努力&#xff0c;共赴美好人生&#xff01; 夕阳下&#xff0c;是最美的绽放。 今天带个大家一个实验&#xff0c;为网络篇的综合实验&#xff0c;有能力的可以试一试不会的可以私信小刘。 配…

排序算法:插入排序、冒泡排序、选择排序、希尔排序、堆排序、快速排序、归并排序

排序算法相关总结&#xff0c;涉及的排序算法有&#xff1a;插入排序、冒泡排序、选择排序、希尔排序、堆排序、快速排序、归并排序&#xff08;动图不是自己画的&#x1f31e;&#xff09;。 目录1.插入排序2.冒泡排序3.选择排序4.希尔排序5.堆排序6.快速排序7.归并排序总结稳…