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) // 语法二
tone(17, 1760, 1000, 0);  // 17:管脚  1760:频率 1000:延时 0:通道

入口参数:

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

noTone()函数

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

语法

noTone(pin)

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

示例程序P1

开发环境是VSCode + PlatformIO IDE

#include <Arduino.h>
#include <ESP32Tone.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);
}

示例程序P2

开发环境是VSCode + PlatformIO IDE

/*
1.ESP32 NTP Client-Server: Get Date and Time (Arduino IDE) : https://randomnerdtutorials.com/esp32-date-time-ntp-client-server-arduino/
2.ESP32 Weather Station Interface PCB Shield (Temperature, Humidity, Pressure, Date and Time):https://randomnerdtutorials.com/esp32-weather-station-pcb/
3.esp32获取网络天气时钟--桌面旋转太空人天气预报站: https://blog.csdn.net/DWX_top/article/details/120650278
*/#include <Arduino.h>
// #include <ESP32Tone.h> // tone库 ESP32 for Arduino IDE
#include <U8g2lib.h>// 屏幕显示依赖库
#include <Wire.h>
#include <WiFi.h>
#include <time.h>
// buzzer pin
#define BUZZER 19
#define ADC_PIN 34
#define BUTTON 18
uint16_t adc = 0;
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); // U8G2_R0:屏幕旋转0°度
// Insert your network credentials
const char* ssid     = "CMCC-e47q";// wifi名称
const char* password = "23vc6uxj"; // wifi 密码// NTP Server Details
const char* ntpServer = "pool.ntp.org"; //"ntp.ntsc.ac.cn";
const long  gmtOffset_sec = 28800;  // 北京时区
const int   daylightOffset_sec = 3600;uint16_t alarm_clock_hour = 0;
uint16_t alarm_clock_minute = 0;
/*** @brief  屏幕界面1* @param  adc :读取电池的ADC* @retval alarm_clock_minute: 时钟的分钟数值*/
uint16_t page1(uint16_t adc) {//DATE AND TIMEstruct tm timeinfo;if(!getLocalTime(&timeinfo)){//Serial.println("Failed to obtain time");}//Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");//GET DATE//Get full weekday namechar weekDay[10];strftime(weekDay, sizeof(weekDay), "%a", &timeinfo);//Get day of monthchar dayMonth[4];strftime(dayMonth, sizeof(dayMonth), "%d", &timeinfo);//Get abbreviated month namechar monthName[5];strftime(monthName, sizeof(monthName), "%b", &timeinfo);//Get yearchar year[6];strftime(year, sizeof(year), "%Y", &timeinfo);//GET TIME//Get hour (12 hour format)/*char hour[4];strftime(hour, sizeof(hour), "%I", &timeinfo);*///Get hour (24 hour format)char hour[4];strftime(hour, sizeof(hour), "%H", &timeinfo);alarm_clock_hour = atoi(hour);  // c标准库函数-- atoi() 将字符串转换为整型//Get minutechar minute[4];strftime(minute, sizeof(minute), "%M", &timeinfo);alarm_clock_minute = atoi(minute); // c标准库函数-- atoi() 将字符串转换为整型u8g2.firstPage();do{u8g2.setFont(u8g2_font_timR08_tf); //设置字体 字号 字形u8g2.setFontPosTop();  // 设置定位的位置以字符顶开始u8g2.setCursor(0,0);  // 设置屏幕坐标u8g2.print(String("bat:") + String(adc));u8g2.setFont(u8g2_font_timR18_tf); //设置字体 字号 字形u8g2.setFontPosTop();  // 设置定位的位置以字符顶开始u8g2.setCursor(30,10);  // 设置屏幕坐标u8g2.print(String(hour) + String(":") + String(minute)); // 时 分u8g2.setFont(u8g2_font_timR10_tf); //设置字体 字号 字形u8g2.setFontPosTop();  // 设置定位的位置以字符顶开始u8g2.setCursor(16,40);  // 设置屏幕坐标u8g2.print(String(weekDay) + String(",") + String(dayMonth) + String(" ") + String(monthName) + String(" ")+String(year)); // 星期 , 日 月 年}while(u8g2.nextPage());//刷新屏幕vTaskDelay(100);return alarm_clock_minute;
}/*** @brief  《两只老虎》简谱* @param  无* @param  无* @retval 无*/
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(100);
}
}
/*** @brief  任务3函数* @param  无* @param  无* @retval pvParameters:*/
void task_3( void * pvParameters ){
for(;;){if((alarm_clock_minute % 60) == 0 || digitalRead(BUTTON)== 0){two_tigers_music_play();// 整点播放 or 按键触发播放}vTaskDelay(1);
}
}/*** @brief  初始化setup()* @param  无* @param  无* @retval */
void setup() {Serial.begin(115200);pinMode(BUZZER, OUTPUT);pinMode(ADC_PIN, INPUT);pinMode(BUTTON,INPUT_PULLUP);u8g2.enableUTF8Print();u8g2.setI2CAddress(0x3C*2);u8g2.begin();u8g2.firstPage();do{page1(adc);}while(u8g2.nextPage());// Connect to Wi-FiSerial.print("Connecting to ");Serial.println(ssid);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi connected.");// Init and get the timeconfigTime(gmtOffset_sec, daylightOffset_sec, ntpServer);xTaskCreatePinnedToCore(task_2, "task_2", 4096, NULL, 2, NULL, 1);xTaskCreatePinnedToCore(task_3, "task_3", 4096, NULL, 0, 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);
}


示例程序P3

ESP32的ADC 和DAC 使用要点总结:

  • 1.要用 dacWrite() 而非 analogWrite() 函数,前者 输出模拟信号,后者输出 PWM 信号;
  • 2.要使用analogReadMilliVolts() 直接读取电压,这个函数会结合衰减系数和特征曲线进行计算。
  • 3.要把esp32 库升级到2.0.5版本以上,否则 analogReadMilliVolts() 读数是错误的。
  • 4.使用电阻分压,使待测电压降低到2500mV以内。
  • 5.根据 ADC原始结果计算电压,可以使用公式:Vout = Dout * Vmax / Dmax
    - Vout :电压
    - Dout :ADC 原始数字读数。
    - Vmax :最大可测量输入模拟电压,请参阅 ADC 衰减。
    - Dmax:输出 ADC 原始数字读取结果的最大值,在 Single Read 模式下为 4095,在 Continuous Read 模式下为 4095。
/*
1.ESP32 NTP Client-Server: Get Date and Time (Arduino IDE) : https://randomnerdtutorials.com/esp32-date-time-ntp-client-server-arduino/
2.ESP32 Weather Station Interface PCB Shield (Temperature, Humidity, Pressure, Date and Time):https://randomnerdtutorials.com/esp32-weather-station-pcb/
3.esp32获取网络天气时钟--桌面旋转太空人天气预报站: https://blog.csdn.net/DWX_top/article/details/120650278
*/#include <Arduino.h>
// #include <ESP32Tone.h> // tone库 ESP32 for Arduino IDE
#include <U8g2lib.h>// 屏幕显示依赖库
#include <Wire.h>
#include <WiFi.h>
#include <time.h>
// BUZZER_PIN pin
#define BUZZER_PIN 19
#define ADC_PIN 34
#define BUTTON_PIN 18
// uint16_t adc = 0;
float volt = 0;U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); // U8G2_R0:屏幕旋转0°度
// Insert your network credentials
const char* ssid     = "CMCC-e47q";// wifi名称
const char* password = "23vc6uxj"; // wifi 密码// NTP Server Details
const char* ntpServer = "pool.ntp.org"; //"ntp.ntsc.ac.cn";
const long  gmtOffset_sec = 28800;  // 北京时区
const int   daylightOffset_sec = 3600;uint16_t alarm_clock_hour = 0;
uint16_t alarm_clock_minute = 0;
/*** @brief  屏幕界面1* @param  volt :读取电池的电压* @retval alarm_clock_minute: 时钟的分钟数值*/
uint16_t page1(float volt) {//DATE AND TIMEstruct tm timeinfo;if(!getLocalTime(&timeinfo)){//Serial.println("Failed to obtain time");}//Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");//GET DATE//Get full weekday namechar weekDay[10];strftime(weekDay, sizeof(weekDay), "%a", &timeinfo);//Get day of monthchar dayMonth[4];strftime(dayMonth, sizeof(dayMonth), "%d", &timeinfo);//Get abbreviated month namechar monthName[5];strftime(monthName, sizeof(monthName), "%b", &timeinfo);//Get yearchar year[6];strftime(year, sizeof(year), "%Y", &timeinfo);//GET TIME//Get hour (12 hour format)/*char hour[4];strftime(hour, sizeof(hour), "%I", &timeinfo);*///Get hour (24 hour format)char hour[4];strftime(hour, sizeof(hour), "%H", &timeinfo);alarm_clock_hour = atoi(hour);  // c标准库函数-- atoi() 将字符串转换为整型//Get minutechar minute[4];strftime(minute, sizeof(minute), "%M", &timeinfo);alarm_clock_minute = atoi(minute); // c标准库函数-- atoi() 将字符串转换为整型u8g2.firstPage();do{u8g2.setFont(u8g2_font_timR08_tf); //设置字体 字号 字形u8g2.setFontPosTop();  // 设置定位的位置以字符顶开始u8g2.setCursor(0,0);  // 设置屏幕坐标u8g2.print(String("bat:") + String(volt));u8g2.setFont(u8g2_font_timR18_tf); //设置字体 字号 字形u8g2.setFontPosTop();  // 设置定位的位置以字符顶开始u8g2.setCursor(30,10);  // 设置屏幕坐标u8g2.print(String(hour) + String(":") + String(minute)); // 时 分u8g2.setFont(u8g2_font_timR10_tf); //设置字体 字号 字形u8g2.setFontPosTop();  // 设置定位的位置以字符顶开始u8g2.setCursor(16,40);  // 设置屏幕坐标u8g2.print(String(weekDay) + String(",") + String(dayMonth) + String(" ") + String(monthName) + String(" ")+String(year)); // 星期 , 日 月 年}while(u8g2.nextPage());//刷新屏幕vTaskDelay(100);return alarm_clock_minute;
}/*** @brief  《两只老虎》简谱* @param  无* @param  无* @retval 无*/
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_PIN, LOW_1);delay(500);tone(BUZZER_PIN, LOW_2);delay(500);tone(BUZZER_PIN, LOW_3);delay(500);tone(BUZZER_PIN, LOW_1);delay(500);noTone(BUZZER_PIN);delay(500);
}for (count = 0; count < 2; count++)
{tone(BUZZER_PIN, LOW_3);delay(500);tone(BUZZER_PIN, LOW_4);delay(500);tone(BUZZER_PIN, LOW_5);delay(1000);noTone(BUZZER_PIN);delay(500);
}for (count = 0; count < 2; count++)
{tone(BUZZER_PIN, LOW_5);delay(350);tone(BUZZER_PIN, LOW_6);delay(150); tone(BUZZER_PIN, LOW_5);delay(350);tone(BUZZER_PIN, LOW_4);delay(150); tone(BUZZER_PIN, LOW_3);delay(500);tone(BUZZER_PIN, LOW_1);       delay(500);noTone(BUZZER_PIN);delay(500);
}for (count = 0; count < 2; count++)
{tone(BUZZER_PIN, LOW_1_P_5);delay(500);tone(BUZZER_PIN, LOW_5_P_5);delay(500);tone(BUZZER_PIN, LOW_1_P_5);delay(1000);noTone(BUZZER_PIN);delay(500);
}} /*** @brief  任务2函数* @param  无* @param  无* @retval pvParameters:*/
void task_2( void * pvParameters ){for(;;){// volt = analogRead(ADC_PIN) *4.2 / 4095;           //  ADC 原始结果计算电压公式:Vout = Dout * Vmax / Dmaxvolt = analogReadMilliVolts(ADC_PIN) * 11 / 1000.0;  // 10k + 1k 电阻串联分4.2V电压  1V = 1000mVpage1(volt); // 显示电量vTaskDelay(100);
}
}
/*** @brief  任务3函数* @param  无* @param  无* @retval pvParameters:*/
void task_3( void * pvParameters ){
for(;;){if((alarm_clock_minute % 60) == 0 || digitalRead(BUTTON_PIN)== 0){two_tigers_music_play();// 整点播放 or 按键触发播放}vTaskDelay(1);
}
}/*** @brief  初始化setup()* @param  无* @param  无* @retval */
void setup() {Serial.begin(115200);pinMode(BUZZER_PIN, OUTPUT);pinMode(ADC_PIN, INPUT);pinMode(BUTTON_PIN,INPUT_PULLUP);u8g2.enableUTF8Print();u8g2.setI2CAddress(0x3C*2);u8g2.begin();u8g2.firstPage();do{page1(volt);}while(u8g2.nextPage());// Connect to Wi-FiSerial.print("Connecting to ");Serial.println(ssid);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi connected.");// Init and get the timeconfigTime(gmtOffset_sec, daylightOffset_sec, ntpServer);xTaskCreatePinnedToCore(task_2, "task_2", 4096, NULL, 2, NULL, 1);xTaskCreatePinnedToCore(task_3, "task_3", 4096, NULL, 0, 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);
}
float adc;
adc = analogRead(ADC_PIN) * 4.2 / 4095;           //  ADC 原始结果计算电压公式:Vout = Dout * Vmax / Dmax
adc = analogReadMilliVolts(ADC_PIN) * 11 / 1000.0;  // 10k + 1k 电阻串联分4.2V电压  1V = 1000mV

参考资料

  • [1] 【CSDN】使用ARDUINO UNO和无源蜂鸣器实现音乐-《两只老虎》

  • [2] 【CSDN】Arduino之运用u8gbil库控制OLED

  • [3] Mixly2.0 中自带u8g2和freeRTOS积木模块

  • [4] 【RNT】ESP32 NTP Client-Server: Get Date and Time (Arduino IDE)

  • [5] 【RNT】ESP32 Weather Station Interface PCB Shield (Temperature, Humidity, Pressure, Date and Time)

  • [6] 【CSDN】esp32获取网络天气时钟–桌面旋转太空人天气预报站

  • [7]【B站】ESP32-S2 正确调用 ADC DAC库函数(Arduino 环境)

  • [8]【ESPRESSIF】Analog to Digital Converter (ADC)

ESP32 入门笔记06: WIFI时钟 + FreeRTOS+《两只老虎》 (ESP32 for Arduino IDE)相关推荐

  1. ESP32 入门笔记05: BLE 蓝牙客户端和服务器 (ESP32 for Arduino IDE)

    目录 1. BLE 服务器和客户端 2. GATT 协议 3. UUID 4. 项目概述 4.1 材料清单 4.2 ESP32 BLE 服务器 4.3 ESP32 BLE 客户端 参考资料 1. BL ...

  2. ESP32 入门笔记01:乐鑫ESP32-DevKitC开发板信息、开发环境搭建以及学资料准备

    文章目录 一.ESP32-DevKitC 开发板介绍 二.ESP32 开发环境 1. Arduino IDE 1.1 开发环境搭建步骤 1.2 实验:使用 Arduino IDE 将代码上传到 ESP ...

  3. ESP32 入门笔记03:PWM (ESP32 for Arduino IDE)

    先导知识 ESP32 入门笔记01:开发板信息.开发环境搭建以及学资料准备 ESP32 入门笔记02: GPIO参考指南 ESP32 有一个 LED PWM 控制器,具有 16 个独立通道,可配置为生 ...

  4. ESP32 入门笔记08:1.54寸(240*240)彩色TFT 显示高清IPS LCD 屏幕 SPI接口

    目录 1.屏幕规格 2.原理图 3.程序实现 3.1引脚定义 3.2Adafruit_GFX / Arduino_ST7789版 3.3TFT_eSPI库版 3.3.1配置TFT_eSPI a.选择屏 ...

  5. 用鸿蒙OS在蜂鸣器上播放一曲《两只老虎》

    本文介绍如何在HiSpark Wi-Fi IoT套件上,使用Harmony OS IoT硬件子系统的PWM接口 驱动蜂鸣器 播放音乐. 用PWM输出方波的API 鸿蒙系统IoT硬件子系统提供了PWM相 ...

  6. 蜂鸣器播放《两只老虎》

    文章目录 前言 一.回顾蜂鸣器 二.乐谱知识 2.1 音符音频 2.2 两只老虎乐谱 三.系统框图 四.模块调用 五.模块原理图 六.工程源码 6.1 音符选择模块代码 6.2 pwm产生模块代码 6 ...

  7. FPGA实现蜂鸣器播放音乐实验,以儿歌《两只老虎》为例

    ** FPGA实现蜂鸣器播放音乐 ** 实现功能: 开发板上电后,通过蜂鸣器播放<两只老虎>. 设计思路 原理:想要让蜂鸣器播放音乐,就需要知道每个音符的频率,再通过换算将频率转换为周期, ...

  8. FPGA蜂鸣器实现歌曲《两只老虎》

    1.简谱中的符号含义 2.两只老虎简谱 3.音符与频率的对照表 4.首先在这里解释一个名词→音乐频率--众所周知,声音是由物体的振动产生的,本质是传播媒介的振动,另外声音有两大特性--音量和音色,我们 ...

  9. 计算机弹奏两只老虎爱跳舞,原神风物之诗琴乐谱大全

    原神风物之诗琴乐谱大全带给大家,这是很多小伙伴都非常期待的内容,最近原神风物之诗琴玩法引起了大家的注意,但是大家不知道弹什么,手心游戏小编就带给大家最全的乐谱介绍. 原神风物之诗琴乐谱大全 弹奏键位 ...

  10. python 常量_大疆机甲大师Python开发: 两只老虎

    大疆机甲大师演奏<两只老虎>https://www.zhihu.com/video/1168271599123320832 之前大疆机甲大师Python开发: 中文命名变量初尝试说到跳过了 ...

最新文章

  1. 数学——函数极限知识以及sympy库的limit
  2. JQuery 给DOM控件绑定和移除事件的方法
  3. vs2017c语言程序添加图标,笔试编程必备技巧——Visual Studio 2017添加自定义代码片段...
  4. 暴雪BN2.0 呼之欲出即将到来
  5. AMESim找图形平衡点的方法
  6. 关于依赖倒置,控制反转和依赖注入的趣谈
  7. Ubuntu 挂载windows硬盘突然变成只读了???
  8. 如何高效完成产品生命周期管理
  9. NAT64与DNS64基本原理概述
  10. 写个单机版斗地主程序,复习c++面向对象
  11. excel max函数的使用
  12. vue项目动态域名设置方法
  13. Firfox的炫酷名字怎么来,各位,好不好奇~!
  14. 5分钟使用Unity制作AR应用,结合EasyAR制作AR(转)
  15. pairing function
  16. STM32F103移植FreeRTOS
  17. 怎么使用javascript制作图片切换
  18. 聚合支付系统开发究竟难不难?
  19. 编写一个程序实现输入一个英文字母,如果是小写字母将其转换成大写输出,如果是大写字母则直接输出。
  20. 图像质量评价概述(评估指标、传统检测方法)

热门文章

  1. Mybatis复杂查询(详细举例)
  2. Dell EMC PowerEdge R740 服务器的驱动程序和固件更新
  3. C++入门(六)之String
  4. 阿里p9就三分钟。。。。。
  5. 源码分析 | 像盗墓一样分析Spring是怎么初始化xml并注册bean的
  6. jquery知识点总结(2)--- CSS模块+筛选模块+文档处理(CUD)模块+事件模块
  7. 2020moectf—flower
  8. python有趣的例子和故事_Python几个有趣和特别的小故事
  9. 如何登录华为云服务器
  10. 台式计算机无法连接网络,台式电脑无法连接无线网络怎么办