驴友花雕
发表于 2021-7-12 16:54:40
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验一百七十七:Wemos D1 R32 ESP32开发板项目十二:随机数与读取模拟量实验开源仿真编程(Linkboy V4.60)
项目仿真运行的动态图
驴友花雕
发表于 2021-7-12 16:58:02
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十二:随机数与读取模拟量
实验开源仿真编程(Linkboy V4.60)
实验场景图
驴友花雕
发表于 2021-7-12 20:08:28
本帖最后由 驴友花雕 于 2021-7-12 20:30 编辑
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十三: 使用 ledcWrite 函数淡入淡出LED
实验接线:LED 引脚 ==> D18
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十三: 使用 ledcWrite 函数淡入淡出LED
实验接线:LED 引脚 ==> D18
*/
//使用 16 个通道中的第一个通道(从零开始)
#define LEDC_CHANNEL_0 0
// 为 LEDC 定时器使用 13 位精度
#define LEDC_TIMER_13_BIT13
// 使用 5000 Hz 作为 LEDC 基频
#define LEDC_BASE_FREQ 5000
// 淡出 LED PIN(替换为内置 LED 的 LED_BUILTIN 常量)
#define LED_PIN 18
int brightness = 0; // LED有多亮
int fadeAmount = 5; // 多少个点使 LED 褪色
// Arduino 喜欢模拟
// 值必须介于 0 和最大值之间
void ledcAnalogWrite(uint8_t channel, uint32_t value, uint32_t valueMax = 255) {
// calculate duty, 8191 from 2 ^ 13 - 1
uint32_t duty = (8191 / valueMax) * min(value, valueMax);
// 向 LEDC 写入任务
ledcWrite(channel, duty);
}
void setup() {
// Setup timer and attach timer to a led pin
ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);
ledcAttachPin(LED_PIN, LEDC_CHANNEL_0);
}
void loop() {
// set the brightness on LEDC channel 0
ledcAnalogWrite(LEDC_CHANNEL_0, brightness);
// 下次通过循环更改亮度:
brightness = brightness + fadeAmount;
// 在淡入淡出结束时反转淡入淡出的方向:
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
// 等待20毫秒看调光效果
delay(20);
}
驴友花雕
发表于 2021-7-12 20:28:20
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验一百七十七:Wemos D1 R32 ESP32开发板项目十三: 使用 ledcWrite 函数淡入淡出LED
实验场景图
驴友花雕
发表于 2021-7-12 20:31:30
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十四:逐渐亮灯—熄灭—逐渐亮灯—循环
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十四: 逐渐亮灯—熄灭—逐渐亮灯—循环
实验接线:LED 引脚 ==> D18
*/
void setup() {
//设置频率为 312500 Hz 的通道 0
sigmaDeltaSetup(0, 312500);
//将引脚 18 连接到通道 0
sigmaDeltaAttachPin(18, 0);
//初始化通道0关闭
sigmaDeltaWrite(0, 0);
}
void loop() {
//缓慢增加值
//将在 256 处溢出
static uint8_t i = 0;
sigmaDeltaWrite(0, i++);
delay(20);
}
驴友花雕
发表于 2021-7-12 20:32:36
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十四:逐渐亮灯—熄灭—逐渐亮灯—循环
实验场景图
驴友花雕
发表于 2021-7-13 06:29:59
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十五: 运行RGB LED的完整255色谱(PWM驱动LED的ledcWrite功能)
实验接脚:R-23,G-19,B-18
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十五: 运行RGB LED的完整255色谱(PWM驱动LED的ledcWrite功能)
实验接线: R-23,G-19,B-18
*/
// 设置 rgb LED 名称
uint8_t ledR = 23;
uint8_t ledG = 19;
uint8_t ledB = 18;
uint8_t ledArray = {1, 2, 3}; // 三个 LED 通道
const boolean invert = false; // 如果共阳极设置为假,如果共阴极设置为真
uint8_t color = 0; // 0 到 255 之间的值表示色调
uint32_t R, G, B; // 红绿蓝颜色分量
uint8_t brightness = 255;// 255 是最大亮度,但可以更改。 共阳极可能需要 256 才能完全关闭。
void setup() {
Serial.begin(115200);
delay(10);
ledcAttachPin(ledR, 1); // 将 RGB LED 引脚分配给通道
ledcAttachPin(ledG, 2);
ledcAttachPin(ledB, 3);
// 初始化通道
// 通道 0-15,分辨率 1-16 位,频率限制取决于分辨率
// ledcSetup (uint8_t channel, uint32_t freq, uint8_t resolution_bits);
ledcSetup(1, 12000, 8); // 12 kHz PWM,8 位分辨率
ledcSetup(2, 12000, 8);
ledcSetup(3, 12000, 8);
}
void loop() {
Serial.println("Send all LEDs a 255 and wait 2 seconds.");
// 如果您的 RGB LED 在这里关闭而不是打开,您应该检查 LED 是共阳极还是共阴极。
//如果它没有完全关闭并且是共阳极尝试使用256。
ledcWrite(1, 255);
ledcWrite(2, 255);
ledcWrite(3, 255);
delay(2000);
Serial.println("Send all LEDs a 0 and wait 2 seconds.");
ledcWrite(1, 0);
ledcWrite(2, 0);
ledcWrite(3, 0);
delay(2000);
Serial.println("Starting color fade loop.");
for (color = 0; color < 255; color++) { // 在色谱中回转
hueToRGB(color, brightness);// 调用函数将色调转换为 RGB
// 将 RGB 值写入引脚
ledcWrite(1, R); // 将红色分量写入通道 1 等。
ledcWrite(2, G);
ledcWrite(3, B);
delay(100); // RGB 超过 256 种颜色的完整循环需要 26 秒
}
}
// 将颜色转换为其红色、绿色和蓝色分量的函数。
void hueToRGB(uint8_t hue, uint8_t brightness) {
uint16_t scaledHue = (hue * 6);
uint8_t segment = scaledHue / 256; // 第 0 至 5 段
// color wheel
uint16_t segmentOffset =
scaledHue - (segment * 256); // 段内的位置
uint8_t complement = 0;
uint16_t prev = (brightness * ( 255 -segmentOffset)) / 256;
uint16_t next = (brightness *segmentOffset) / 256;
if (invert){
brightness = 255 - brightness;
complement = 255;
prev = 255 - prev;
next = 255 - next;
}
switch (segment ) {
case 0: // 红色的
R = brightness;
G = next;
B = complement;
break;
case 1: // 黄色的
R = prev;
G = brightness;
B = complement;
break;
case 2: // 绿色
R = complement;
G = brightness;
B = next;
break;
case 3: // 青色
R = complement;
G = prev;
B = brightness;
break;
case 4: // 蓝色的
R = next;
G = complement;
B = brightness;
break;
case 5: // 品红
default:
R = brightness;
G = complement;
B = prev;
break;
}
}
驴友花雕
发表于 2021-7-13 06:36:55
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验一百七十七:Wemos D1 R32 ESP32开发板项目十五: 运行RGB LED的完整255色谱(PWM驱动LED的ledcWrite功能)实验接脚:R-23,G-19,B-18
项目串口返回情况
驴友花雕
发表于 2021-7-13 07:01:40
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验一百七十七:Wemos D1 R32 ESP32开发板项目十五: 运行RGB LED的完整255色谱(PWM驱动LED的ledcWrite功能)
实验场景图
驴友花雕
发表于 2021-7-13 07:21:41
本帖最后由 驴友花雕 于 2021-7-13 07:23 编辑
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十六: 查询ESP32芯片ID(MAC地址)
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十六: 查询ESP32芯片ID(MAC地址)
*/
uint32_t chipId = 0;
void setup() {
Serial.begin(115200);
}
void loop() {
for (int i = 0; i < 17; i = i + 8) {
chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
}
Serial.printf("ESP32 Chip model = %s Rev %d\n", ESP.getChipModel(), ESP.getChipRevision());
Serial.printf("This chip has %d cores\n", ESP.getChipCores());
Serial.print("Chip ID: "); Serial.println(chipId);
delay(3000);
}
驴友花雕
发表于 2021-7-13 07:27:10
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十六: 查询ESP32芯片ID(MAC地址)
项目串口返回情况
驴友花雕
发表于 2021-7-13 07:45:17
本帖最后由 驴友花雕 于 2021-7-13 07:47 编辑
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十七: 访问esp32内部霍尔传感器的简单程序
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十七: 访问esp32内部霍尔传感器的简单程序
*/
int val = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
val = hallRead();
// 将结果打印到串行监视器:
Serial.print("sensor = ");
Serial.println(val);
delay(1000);
}
驴友花雕
发表于 2021-7-13 07:49:17
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验一百七十七:Wemos D1 R32 ESP32开发板项目十七: 访问esp32内部霍尔传感器的简单程序
项目串口返回情况
驴友花雕
发表于 2021-7-13 09:05:35
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十八: 测试GPIO中断功能
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十八: 测试GPIO中断功能
实验接线: 按键1接23,按键2接18
*/
#include <Arduino.h>
struct Button {
const uint8_t PIN;
uint32_t numberKeyPresses;
bool pressed;
};
Button button1 = {23, 0, false};
Button button2 = {18, 0, false};
void IRAM_ATTR isr(void* arg) {
Button* s = static_cast<Button*>(arg);
s->numberKeyPresses += 1;
s->pressed = true;
}
void IRAM_ATTR isr() {
button2.numberKeyPresses += 1;
button2.pressed = true;
}
void setup() {
Serial.begin(115200);
pinMode(button1.PIN, INPUT_PULLUP);
attachInterruptArg(button1.PIN, isr, &button1, FALLING);
pinMode(button2.PIN, INPUT_PULLUP);
attachInterrupt(button2.PIN, isr, FALLING);
}
void loop() {
if (button1.pressed) {
Serial.printf("Button 1 has been pressed %u times\n", button1.numberKeyPresses);
button1.pressed = false;
}
if (button2.pressed) {
Serial.printf("Button 2 has been pressed %u times\n", button2.numberKeyPresses);
button2.pressed = false;
}
static uint32_t lastMillis = 0;
if (millis() - lastMillis > 10000) {
lastMillis = millis();
detachInterrupt(button1.PIN);
}
}
驴友花雕
发表于 2021-7-13 09:39:30
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十八: 测试GPIO中断功能
项目串口返回情况
驴友花雕
发表于 2021-7-13 09:53:42
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十八: 测试GPIO中断功能
实验场景图
驴友花雕
发表于 2021-7-13 10:40:10
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十九: 测试功能中断
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十九: 测试功能中断
实验接线: 按键1接16,按键2接17
*/
#include <Arduino.h>
#include <FunctionalInterrupt.h>
#define BUTTON1 16
#define BUTTON2 17
class Button{
public:
Button(uint8_t reqPin) : PIN(reqPin){
pinMode(PIN, INPUT_PULLUP);
attachInterrupt(PIN, std::bind(&Button::isr,this), FALLING);
};
~Button() {
detachInterrupt(PIN);
}
void IRAM_ATTR isr() {
numberKeyPresses += 1;
pressed = true;
}
void checkPressed() {
if (pressed) {
Serial.printf("Button on pin %u has been pressed %u times\n", PIN, numberKeyPresses);
pressed = false;
}
}
private:
const uint8_t PIN;
volatile uint32_t numberKeyPresses;
volatile bool pressed;
};
Button button1(BUTTON1);
Button button2(BUTTON2);
void setup() {
Serial.begin(115200);
}
void loop() {
button1.checkPressed();
button2.checkPressed();
}
驴友花雕
发表于 2021-7-13 10:41:57
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目十九: 测试功能中断
实验串口返回情况
驴友花雕
发表于 2021-7-13 11:15:12
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目二十: 重复计时器(定时器可以通过连接到 PIN 0 的按钮停止)
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目二十: 重复计时器(定时器可以通过连接到 PIN 0 的按钮停止)
实验接线: 按键接0
*/
//停止按钮连接到 PIN 0 (IO0)
#define BTN_STOP_ALARM 0
hw_timer_t * timer = NULL;
volatile SemaphoreHandle_t timerSemaphore;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
volatile uint32_t isrCounter = 0;
volatile uint32_t lastIsrAt = 0;
void IRAM_ATTR onTimer() {
// 增加计数器并设置 ISR 的时间
portENTER_CRITICAL_ISR(&timerMux);
isrCounter++;
lastIsrAt = millis();
portEXIT_CRITICAL_ISR(&timerMux);
// 给出一个我们可以在循环中检查的信号量
xSemaphoreGiveFromISR(timerSemaphore, NULL);
// 如果要切换输出,在此处使用数字读/写是安全的
}
void setup() {
Serial.begin(115200);
// 将 BTN_STOP_ALARM 设置为输入模式
pinMode(BTN_STOP_ALARM, INPUT);
// 创建信号量以在计时器触发时通知我们
timerSemaphore = xSemaphoreCreateBinary();
// 使用 4 的第一个计时器(从零开始计数)。
// 为预分频器设置 80 分频器(更多信息请参见 ESP32 技术参考手册)信息)。
timer = timerBegin(0, 80, true);
// 将计时器功能附加到我们的计时器。
timerAttachInterrupt(timer, &onTimer, true);
// 设置闹钟每秒调用一次 onTimer 函数(值以微秒为单位)。
// 重复闹钟(第三个参数)
timerAlarmWrite(timer, 1000000, true);
// 开始闹钟
timerAlarmEnable(timer);
}
void loop() {
//如果计时器已触发
if (xSemaphoreTake(timerSemaphore, 0) == pdTRUE) {
uint32_t isrCount = 0, isrTime = 0;
// 读取中断计数和时间
portENTER_CRITICAL(&timerMux);
isrCount = isrCounter;
isrTime = lastIsrAt;
portEXIT_CRITICAL(&timerMux);
//打印出来
Serial.print("onTimer no. ");
Serial.print(isrCount);
Serial.print(" at ");
Serial.print(isrTime);
Serial.println(" ms");
}
// 如果按钮被按下
if (digitalRead(BTN_STOP_ALARM) == LOW) {
// 如果计时器仍在运行
if (timer) {
// 停止并释放计时器
timerEnd(timer);
timer = NULL;
}
}
}
驴友花雕
发表于 2021-7-13 11:28:21
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验一百七十七:Wemos D1 R32 ESP32开发板项目二十: 重复计时器(定时器可以通过连接到 PIN 0 的按钮停止)
实验串口返回情况
驴友花雕
发表于 2021-7-13 11:50:21
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目二十一:看门狗定时器
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百七十七:Wemos D1 R32 ESP32开发板
项目二十一:看门狗定时器
实验接线: 按键接0
*/
#include "esp_system.h"
const int button = 0; //用于触发延迟的0接脚
const int wdtTimeout = 1000;//触发看门狗的时间(以毫秒为单位)
hw_timer_t *timer = NULL;
void IRAM_ATTR resetModule() {
ets_printf("reboot\n");
esp_restart();
}
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println("running setup");
pinMode(button, INPUT_PULLUP); //初始化控制引脚
timer = timerBegin(0, 80, true); //定时器 0,div 80
timerAttachInterrupt(timer, &resetModule, true);//附加回调
timerAlarmWrite(timer, wdtTimeout * 1000, false); //在我们里面设置时间
timerAlarmEnable(timer); //开启中断
}
void loop() {
Serial.println("running main loop");
timerWrite(timer, 0); //重置定时器(饲料看门狗)
long loopTime = millis();
//按下按钮时,最多延迟 3 秒触发定时器
while (!digitalRead(button)) {
Serial.println("button pressed");
delay(500);
}
delay(1000); //模拟工作
loopTime = millis() - loopTime;
Serial.print("loop time is = ");
Serial.println(loopTime); //应该在 3000 以下
}
页:
1
2
3
[4]
5
6
7
8
9
10