ESP32 入门笔记06: WIFI时钟 + FreeRTOS+《两只老虎》 (ESP32 for Arduino IDE)
创始人
2024-04-07 22:07:37
0

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 
#include 
#include 
#include // 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 
// #include  // tone库 ESP32 for Arduino IDE  
#include // 屏幕显示依赖库
#include 
#include 
#include 
// 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 
// #include  // tone库 ESP32 for Arduino IDE  
#include // 屏幕显示依赖库
#include 
#include 
#include 
// 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)

相关内容

热门资讯

布达拉宫的导游词 布达拉宫的导游词  作为一名乐于为游客排忧解难的导游,时常需要用到导游词,导游词具有注重口语化、精简...
吉林关东三宝讲解导游词 吉林关东三宝讲解导游词范文  吉林人参关东三宝之一。  为多年生草本植物,素有“百草之王”美称。吉林...
介绍西湖的导游词 介绍西湖的导游词(精选18篇)  作为一名乐于为游客排忧解难的导游,时常要开展导游词准备工作,导游词...
泰山景点导游词 泰山景点导游词  作为一位不辞辛劳的导游,时常会需要准备好导游词,导游词由引言、主体和结语三部分构成...
陕西省简介导游词 陕西省简介导游词  陕西,简称“陕”或“秦”,中华人民共和国省级行政单位之一,省会古都西安。下面是小...
故宫导游词 故宫导游词300字2篇  导游词一  各位朋友,现在我们已经进入故宫,故宫导游词300字2篇。此处是...
天梯山导游词 天梯山导游词天梯山游览区位于邢台市西东牛庄,距市中心22公里,面积18平方公里。这里山势突兀,雄浑险...
淄博市鲁山国家森林公园导游词 淄博市鲁山国家森林公园导游词各位游客:  大家好!  欢迎您到鲁山国家森林公园观光旅游。我是本次活动...
照金香山导游词 照金香山导游词  导语:香山公园位于北京西郊,地势险峻,苍翠连绵,占地188公顷,是一座具有山林特色...
云冈石窟导游词 云冈石窟导游词各位游客大家好,很荣幸能当你们的导游,我姓詹,大家可以叫我詹导游。今天,我们将参观举世...
普陀山风景名胜区导游词 普陀山风景名胜区导游词  出历史名城锦州西北行十余里,有一座群峰险壑逶迤伴绕,飞泉云岫横生妙境的名山...
江西省九江庐山牯岭导游词 江西省九江庐山牯岭导游词  作为一名导游,就有可能用到导游词,导游词不是以一代百、千篇一律的,它必须...
台湾阿里山介绍导游词 台湾阿里山介绍导游词  阿里山,台湾地区地名,是台湾地区的著名旅游风景区,阿里山位于台湾省嘉义市东方...
河南内乡县衙导游词 河南内乡县衙导游词  各位游客,大家好!  内乡县衙开始建于元朝大德八年(公元132019年),距今...
导游词的方法技巧以及 导游词的方法技巧以及范文  作为一名尽职尽责的导游,编写导游词是必不可少的,导游词作为一种解说的文体...
导游词结束语怎么写 导游词结束语怎么写  结束语1  各位朋友几天的行程,还有10分钟就要结束了,在此刻要和大家说再见的...
上海南浦大桥导游词 上海南浦大桥导游词  竣工通车于1991年12月1日的南浦大桥,总长8346米,通航净高46米,5....
贵阳河滨公园导游词 贵阳河滨公园导游词  作为一位无私奉献的导游,总归要编写导游词,一篇完整的导游词,其结构一般包括习惯...
天生三桥导游词 关于天生三桥导游词范文(通用9篇)  作为一位出色的导游人员,有必要进行细致的导游词准备工作,借助导...