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)

相关内容

热门资讯

诚信的英语作文【经典3篇】 篇一:诚信的英语作文In today's society, integrity plays a cr...
英语作文的文章的正文【精选3... 英语作文的文章的正文 篇一Global Warming and Its Effects on the...
黑骏马英语读后感【通用3篇】 黑骏马英语读后感 篇一《黑骏马》是法国作家让·吉诺的作品,通过讲述一个关于马和人之间的深厚情感的故事...
我的爱好英语作文【通用6篇】 我的爱好英语作文 篇一我的爱好英语英语是我最喜欢的学科,也是我的爱好之一。我对英语的热爱始于我上小学...
浙江今年四级英语作文【最新3... 浙江今年四级英语作文 篇一Title: The Importance of Environmenta...
国庆节英语作文 精选国庆节英语作文10篇  在日常学习、工作抑或是生活中,许多人都有过写作文的经历,对作文都不陌生吧...
谜语用英语怎么读【实用3篇】 谜语用英语怎么读 篇一How to Read Riddles in EnglishIntroduct...
火星的英语作文(优选4篇) 火星的英语作文 篇一Exploring the Mysteries of MarsMars, als...
我的饮食习惯英语作文my e... 我的饮食习惯英语作文篇一:My Eating HabitsI have always been co...
写我的好朋友英语作文【最新6... My Best Friend - Part 1I would like to introduce m...
四年级英语作文50字(通用3... 四年级英语作文50字 篇一:My Summer VacationI had a great summ...
忙碌的周末 英文作文(推荐3... Busy WeekendEssay OneLast weekend, I had a very bu...
英语作文(优秀6篇) 英语作文 篇一Title: The Importance of Learning a Second ...
练字的英语作文【通用6篇】 练字的英语作文 篇一:The Benefits of Practicing CalligraphyC...
番茄炒鸡蛋英语作文(实用4篇... Tomato and Egg Stir-Fry: A Classic Chinese DishTom...
my best friend... my best friend作文(精选23篇)  在现实生活或工作学习中,大家都经常接触到作文吧,作...
我的家庭英语作文(推荐6篇) 我的家庭英语作文 篇一My FamilyMy family consists of four mem...
春节的英语作文(优质6篇) 春节的英语作文 篇一The Spring FestivalThe Spring Festival, ...
端午节初中英语作文(精彩6篇... 端午节初中英语作文 篇一The Dragon Boat FestivalThe Dragon Boa...
作文 外语与母语(经典3篇) 作文 外语与母语 篇一外语与母语的重要性语言是人类交流的工具,而外语和母语则是我们生活中最常使用的两...