37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验一百七十七:Wemos D1 ESP32 WiFi蓝牙4MB4闪存UNO R32开发板模块 UNO D1 R32(ESP32)开发板 兼容Arduino

 知识点:ESP32芯片
(包括:ESP32- d0wd、ESP32- d0wdq6、ESP32- d2wd、ESP32- s0wd)集成了Wi-Fi和双模式蓝牙。根据型号差异,ESP32包含一个或两个低功耗Xtensa®32位LX6微处理器(s),最大时钟速度240 MHz(通常是160 MHz)和Xtensa RAM / ROM,本地内存和JTAG接口。

 
处理器:
 主处理器: Tensilica Xtensa 32位LX6微处理器
 核心: 2 或 1(取决于变化)除ESP32-S0WD为单核外,ESP32系列所有芯片均为双核。
 时钟频率:高达 240 MHz
 性能:高达 600 DMIPS
 超低功耗协处理器: 允许您在深度睡眠时进行 ADC 转换、计算和电平阈值。
 无线连接:
 的Wi-Fi: 802.11 B / G / N / E / I(802.11n标准@ 2.4GHz的高达150兆比特/秒)
 蓝牙: v4.2 BR/EDR 和蓝牙低功耗 (BLE)
 记忆:
 内部存储器:
 ROM: 448 KiB用于启动和核心功能。
 SRAM: 520 KiB用于数据和指令。
 RTC 快速 SRAM: 8 KiB用于从深度睡眠模式进行 RTC 启动期间的数据存储和主 CPU。
 RTC 慢速 SRAM: 8 KiB用于深度睡眠模式下的协处理器访问。
 电子保险丝: 1 Kibit其中 256 位用于系统(MAC 地址和芯片配置),其余 768 位保留用于客户应用,包括 Flash-Encryption 和 Chip-ID。
 嵌入式闪存:Flash 通过 ESP32-D2WD 和 ESP32-PICO-D4 上的 IO16、IO17、SD_CMD、SD_CLK、SD_DATA_0 和 SD_DATA_1 内部连接。
 0 MiB(ESP32-D0WDQ6、ESP32-D0WD 和 ESP32-S0WD 芯片)
 2 MiB(ESP32-D2WD 芯片)
 4 MiB(ESP32-PICO-D4 SiP 模块)
 外部闪存和 SRAM: ESP32 最多支持四个 16 MiB 外部 QSPI闪存和 SRAM,具有基于 AES 的硬件加密,以保护开发人员的程序和数据。ESP32 可以通过高速缓存访问外部 QSPI flash 和 SRAM。
 高达 16 MiB 的外部闪存被内存映射到 CPU 代码空间,支持 8 位、16 位和 32 位访问。支持代码执行。
 多达 8 MiB 的外部闪存/SRAM 存储器映射到 CPU 数据空间,支持 8 位、16 位和 32 位访问。闪存和 SRAM 支持数据读取。SRAM 支持数据写入。
 带有嵌入式 flash 的 ESP32 芯片不支持外部 flash 和外设之间的地址映射。
 外设输入/输出:带有 DMA 的丰富外设接口,包括电容式触摸、ADC(模数转换器)、DAC(数模转换器)、I²C(内部集成电路)、UART(通用异步接收器/发送器) )、CAN 2.0(控制器局域网)、SPI(串行外设接口)、I²S(集成 IC 间声音)、RMII(简化的媒体独立接口)、PWM(脉宽调制)等。
 安全:
 支持 IEEE 802.11 标准安全功能,包括 WFA、WPA/WPA2 和 WAPI
 安全启动
 闪存加密
 1024位OTP,客户最高768位
 加密硬件加速:AES、SHA-2、RSA、椭圆曲线加密(ECC)、随机数生成器(RNG)

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验一百七十七:Wemos D1 R32 ESP32开发板
 项目二十五:读取模拟量与闪灯(旋转电位器模拟输入)
 实验接脚:2脚为板载LED,4脚接电位器OUT
实验开源代码
/*【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验一百七十七:Wemos D1 R32 ESP32开发板项目二十五:读取模拟量与闪灯(旋转电位器模拟输入)实验接脚:2脚为板载LED,4脚接电位器OUT
*/#if CONFIG_FREERTOS_UNICORE
#define ARDUINO_RUNNING_CORE 0
#else
#define ARDUINO_RUNNING_CORE 1
#endif#ifndef LED_BUILTIN
#define LED_BUILTIN 2
#endif// 为 Blink 和 AnalogRead 定义两个任务
void TaskBlink( void *pvParameters );
void TaskAnalogReadA3( void *pvParameters );// the setup function runs once when you press reset or power the board
void setup() {// initialize serial communication at 115200 bits per second:Serial.begin(115200);// Now set up two tasks to run independently.xTaskCreatePinnedToCore(TaskBlink,  "TaskBlink"   // A name just for humans,  1024  // This stack size can be checked & adjusted by reading the Stack Highwater,  NULL,  2  // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.,  NULL ,  ARDUINO_RUNNING_CORE);xTaskCreatePinnedToCore(TaskAnalogReadA3,  "AnalogReadA3",  1024  // Stack size,  NULL,  1  // Priority,  NULL ,  ARDUINO_RUNNING_CORE);// Now the task scheduler, which takes over control of scheduling individual tasks, is automatically started.
}void loop()
{// Empty. Things are done in Tasks.
}/*--------------------------------------------------*/
/*---------------------- Tasks ---------------------*/
/*--------------------------------------------------*/void TaskBlink(void *pvParameters)  // This is a task.
{(void) pvParameters;/*BlinkTurns on an LED on for one second, then off for one second, repeatedly.If you want to know what pin the on-board LED is connected to on your ESP32 model, checkthe Technical Specs of your board.
*/// initialize digital LED_BUILTIN on pin 13 as an output.pinMode(LED_BUILTIN, OUTPUT);for (;;) // A Task shall never return or exit.{digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)vTaskDelay(1000);  // one tick delay (15ms) in between reads for stabilitydigitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOWvTaskDelay(1000);  // one tick delay (15ms) in between reads for stability}
}void TaskAnalogReadA3(void *pvParameters)  // This is a task.
{(void) pvParameters;/*AnalogReadSerialReads an analog input on pin A4, prints the result to the serial monitor.Graphical representation is available using serial plotter (Tools > Serial Plotter menu)Attach the center pin of a potentiometer to pin A3, and the outside pins to +5V and ground.This example code is in the public domain.
*/for (;;){// read the input on analog pin 4:int sensorValueA4 = analogRead(4);// print out the value you read:Serial.println(sensorValueA4);vTaskDelay(100);  // one tick delay (15ms) in between reads for stability} 
}
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验一百七十七:Wemos D1 R32 ESP32开发板
 项目二十五:读取模拟量与闪灯(旋转电位器模拟输入)
 实验接脚:2脚为板载LED,4脚接电位器OUT
项目串口返回情况

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验一百七十七:Wemos D1 R32 ESP32开发板
 项目二十五:读取模拟量与闪灯(旋转电位器模拟输入)
实验串口绘图器返回情况

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验一百七十七:Wemos D1 R32 ESP32开发板
 项目二十五:读取模拟量与闪灯(旋转电位器模拟输入)
 实验接脚:2脚为板载LED,4脚接电位器OUT
实验场景图

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验一百七十七:Wemos D1 R32 ESP32开发板
 项目二十六:打印 ESP32 上次复位原因
实验开源代码
/*【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验一百七十七:Wemos D1 R32 ESP32开发板项目二十六:打印 ESP32 上次复位原因
*/#include <rom/rtc.h>#define uS_TO_S_FACTOR 1000000  /* Conversion factor for micro seconds to seconds */void print_reset_reason(RESET_REASON reason){switch ( reason) {case 1 : Serial.println ("POWERON_RESET"); break;         /**<1,  Vbat power on reset*/case 3 : Serial.println ("SW_RESET"); break;              /**<3,  Software reset digital core*/case 4 : Serial.println ("OWDT_RESET"); break;            /**<4,  Legacy watch dog reset digital core*/case 5 : Serial.println ("DEEPSLEEP_RESET"); break;       /**<5,  Deep Sleep reset digital core*/case 6 : Serial.println ("SDIO_RESET"); break;            /**<6,  Reset by SLC module, reset digital core*/case 7 : Serial.println ("TG0WDT_SYS_RESET"); break;      /**<7,  Timer Group0 Watch dog reset digital core*/case 8 : Serial.println ("TG1WDT_SYS_RESET"); break;      /**<8,  Timer Group1 Watch dog reset digital core*/case 9 : Serial.println ("RTCWDT_SYS_RESET"); break;      /**<9,  RTC Watch dog Reset digital core*/case 10 : Serial.println ("INTRUSION_RESET"); break;      /**<10, Instrusion tested to reset CPU*/case 11 : Serial.println ("TGWDT_CPU_RESET"); break;      /**<11, Time Group reset CPU*/case 12 : Serial.println ("SW_CPU_RESET"); break;         /**<12, Software reset CPU*/case 13 : Serial.println ("RTCWDT_CPU_RESET"); break;     /**<13, RTC Watch dog Reset CPU*/case 14 : Serial.println ("EXT_CPU_RESET"); break;        /**<14, for APP CPU, reseted by PRO CPU*/case 15 : Serial.println ("RTCWDT_BROWN_OUT_RESET"); break; /**<15, Reset when the vdd voltage is not stable*/case 16 : Serial.println ("RTCWDT_RTC_RESET"); break;     /**<16, RTC Watch dog reset digital core and rtc module*/default : Serial.println ("NO_MEAN");}
}void verbose_print_reset_reason(RESET_REASON reason){switch ( reason){case 1  : Serial.println ("Vbat power on reset"); break;case 3  : Serial.println ("Software reset digital core"); break;case 4  : Serial.println ("Legacy watch dog reset digital core"); break;case 5  : Serial.println ("Deep Sleep reset digital core"); break;case 6  : Serial.println ("Reset by SLC module, reset digital core"); break;case 7  : Serial.println ("Timer Group0 Watch dog reset digital core"); break;case 8  : Serial.println ("Timer Group1 Watch dog reset digital core"); break;case 9  : Serial.println ("RTC Watch dog Reset digital core"); break;case 10 : Serial.println ("Instrusion tested to reset CPU"); break;case 11 : Serial.println ("Time Group reset CPU"); break;case 12 : Serial.println ("Software reset CPU"); break;case 13 : Serial.println ("RTC Watch dog Reset CPU"); break;case 14 : Serial.println ("for APP CPU, reseted by PRO CPU"); break;case 15 : Serial.println ("Reset when the vdd voltage is not stable"); break;case 16 : Serial.println ("RTC Watch dog reset digital core and rtc module"); break;default : Serial.println ("NO_MEAN");}
}void setup() {// put your setup code here, to run once:Serial.begin(115200);delay(2000);Serial.println("CPU0 reset reason:");print_reset_reason(rtc_get_reset_reason(0));verbose_print_reset_reason(rtc_get_reset_reason(0));Serial.println("CPU1 reset reason:");print_reset_reason(rtc_get_reset_reason(1));verbose_print_reset_reason(rtc_get_reset_reason(1));// Set ESP32 to go to deep sleep to see a variation// in the reset reason. Device will sleep for 5 seconds.esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);Serial.println("Going to sleep");esp_deep_sleep(5 * uS_TO_S_FACTOR);
}void loop() {// put your main code here, to run repeatedly:
}/*Example Serial Log:====================rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)configsip: 0, SPIWP:0x00clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00mode:DIO, clock div:1load:0x3fff0008,len:8load:0x3fff0010,len:160load:0x40078000,len:10632load:0x40080000,len:252entry 0x40080034CPU0 reset reason:RTCWDT_RTC_RESETRTC Watch dog reset digital core and rtc moduleCPU1 reset reason:EXT_CPU_RESETfor APP CPU, reseted by PRO CPUGoing to sleepets Jun  8 2016 00:22:57rst:0x5 (DEEPSLEEP_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)configsip: 0, SPIWP:0x00clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00mode:DIO, clock div:1load:0x3fff0008,len:8load:0x3fff0010,len:160load:0x40078000,len:10632load:0x40080000,len:252entry 0x40080034CPU0 reset reason:DEEPSLEEP_RESETDeep Sleep reset digital coreCPU1 reset reason:EXT_CPU_RESETfor APP CPU, reseted by PRO CPUGoing to sleepets Jun  8 2016 00:22:57rst:0x5 (DEEPSLEEP_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)configsip: 0, SPIWP:0x00clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00mode:DIO, clock div:1load:0x3fff0008,len:8load:0x3fff0010,len:160load:0x40078000,len:10632load:0x40080000,len:252entry 0x40080034CPU0 reset reason:DEEPSLEEP_RESETDeep Sleep reset digital coreCPU1 reset reason:EXT_CPU_RESETfor APP CPU, reseted by PRO CPUGoing to sleep
*/
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验一百七十七:Wemos D1 R32 ESP32开发板
 项目二十六:打印 ESP32 上次复位原因
项目串口返回情况
 
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验一百七十七:Wemos D1 R32 ESP32开发板
 项目二十七:实现RGB-LED颜色的变换
 实验接脚:LED R接14,B接27,G接16
实验开源代码
/*【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验一百七十七:Wemos D1 R32 ESP32开发板项目二十七:实现RGB-LED颜色的变换实验接脚:LED R接14,B接27,G接16
*/uint8_t ledR = 14;
uint8_t ledG = 27;
uint8_t ledB = 16;void setup(){Serial.begin(115200);delay(10);ledcAttachPin(ledR, 1); //引脚的通道ledcAttachPin(ledG, 2);ledcAttachPin(ledB, 3);ledcSetup(1, 12000, 8); // 12 kHz PWM,8位的分辨率ledcSetup(2, 12000, 8);ledcSetup(3, 12000, 8);
}void loop(){//红色ledcWrite(1, 0);ledcWrite(2, 255);ledcWrite(3, 255);delay(2000);//绿色ledcWrite(1, 255);ledcWrite(2, 0);ledcWrite(3, 255);delay(2000);//蓝色ledcWrite(1, 255);ledcWrite(2, 255);ledcWrite(3, 0);delay(2000);
}
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 实验一百七十七:Wemos D1 R32 ESP32开发板
 项目二十七:实现RGB-LED颜色的变换
 实验接脚:LED R接14,B接27,G接16
Arduino实验场景图
 