驴友花雕 发表于 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
查看完整版本: 最像Arduino Uno的ESP32开发板之WeMos D1 R32