【花雕学编程】Arduino OLED 之绘制点阵图

在这里插入图片描述
《Arduino 手册(思路与案例)》栏目介绍:
在电子制作与智能控制的应用领域:广泛涉及了Arduino BLDC、Arduino CNC、Arduino ESP32 SPP、Arduino FreeRTOS、Arduino FOC、Arduino GRBL、Arduino HTTP、Arduino HUB75、Arduino IoT Cloud、Arduino JSON、Arduino LCD、Arduino OLED、Arduino LVGL、Arduino PID 及 Arduino TFT 等方面的相关拓展思路和众多参考案例。本专栏目前博客近2300篇。
https://blog.csdn.net/weixin_41659040/category_12422453.html

Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。

Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

在这里插入图片描述

概念概述
Arduino OLED 指的是将 Arduino 开发平台与 OLED(有机发光二极管)显示屏相结合的应用组合。Arduino 是开源电子原型平台,具备灵活的硬件扩展性和简单易上手的编程环境;OLED 显示屏则以其自发光、高对比度、宽视角、响应速度快等优势,为信息展示提供了优质的视觉体验。二者结合能实现各类数据显示、图形绘制及交互界面展示等功能,在电子制作、物联网、机器人等诸多领域广泛应用。
详细解释

Arduino 相关特性
硬件特性
开源设计:Arduino 的硬件设计方案完全公开,用户能够获取其原理图、PCB 版图等详细资料。这不仅降低了开发成本,还方便开发者根据自身需求对硬件进行修改和扩展,例如制作自定义外形或功能的开发板。
丰富接口资源:Arduino 开发板配备了多种类型的接口。数字输入输出引脚可用于连接开关、继电器、LED 等设备,实现数字信号的读取和输出控制;模拟输入引脚能够采集如温度传感器、光照传感器输出的连续模拟信号,经内部 ADC(模拟 - 数字转换器)转换为数字值供程序处理。
多种供电方式:支持 USB 供电、外接电源适配器供电以及电池供电等多种方式。使用 USB 供电时,可方便地与计算机连接进行程序上传和调试;外接电源适配器则能提供稳定的电源,适用于长时间运行的项目;电池供电赋予了 Arduino 设备便携性,可应用于移动监测等场景。
软件特性
简易编程环境:Arduino 使用基于 C/C++ 的编程语言,其语法简洁易懂。Arduino IDE 是专门为其开发的集成开发环境,具有跨平台性,可在 Windows、Mac OS、Linux 等操作系统上运行。IDE 提供了直观的代码编辑界面、便捷的编译和上传功能,还内置了大量示例代码,帮助初学者快速入门。
庞大的库资源:Arduino 社区拥有丰富的开源库,涵盖了传感器驱动、通信协议、图形绘制等各个领域。例如,Wire 库用于 I2C 通信,SPI 库用于 SPI 通信,开发者可以直接调用这些库,无需从头编写底层代码,大大提高了开发效率。
OLED 显示屏特性
显示原理
OLED 基于有机材料的电致发光特性工作。当在有机材料层两端施加电压时,电子从阴极注入,空穴从阳极注入,二者在有机材料中相遇并复合,释放出能量以光的形式呈现,从而实现发光显示。由于每个像素都能独立发光,OLED 显示屏无需背光源。
性能优势
自发光与高对比度:自发光特性使得 OLED 能够实现真正的黑色显示,因为不发光的像素完全不产生光线。这使得其对比度极高,图像的亮部更亮,暗部更暗,色彩表现更加生动逼真。
宽视角:OLED 的视角非常宽广,通常可达 170° 以上。从不同角度观看显示屏,画面的颜色和亮度变化极小,能为用户提供一致的视觉体验,适用于各种需要多角度观察的应用场景。
快速响应时间:OLED 的响应时间极短,一般在几微秒到几十微秒之间。相比传统的液晶显示屏,OLED 在显示动态画面时不会出现拖影现象,能够清晰、流畅地展示快速变化的图像,如动画、视频等。
轻薄与低功耗:由于无需背光源,OLED 显示屏的结构更加简单,厚度更薄,重量更轻。同时,其在显示黑色画面时几乎不消耗电能,只有发光的像素才会消耗功率,因此在显示深色画面较多的场景下,功耗显著降低。
Arduino 与 OLED 的连接和通信
通信接口类型
SPI(Serial Peripheral Interface):SPI 是一种高速的全双工串行通信协议,Arduino 通过 SPI 接口与 OLED 显示屏连接时,通常需要使用时钟线(SCK)、主输出从输入线(MOSI)、主输入从输出线(MISO)和片选线(SS)。SPI 通信速度快,适合需要快速传输大量数据的应用场景,如显示高分辨率的图像或视频流。
I2C(Inter - Integrated Circuit):I2C 是一种串行通信协议,使用两根线进行通信,即时钟线(SCL)和数据线(SDA)。I2C 接口简单,占用 Arduino 的引脚资源少,并且支持多个设备挂载在同一总线上,通过不同的设备地址进行区分。在一些对引脚资源要求较高的项目中,I2C 接口更为适用。
通信流程
初始化:在 Arduino 代码中,首先需要初始化所选的通信接口(SPI 或 I2C),并设置相关的通信参数,如时钟频率、设备地址等。
发送数据:Arduino 根据需要显示的内容,将数据按照 OLED 显示屏的通信协议进行编码,然后通过通信接口发送给 OLED 显示屏。数据可以是字符、数字、图形等信息。
显示更新:OLED 显示屏接收到数据后,对其进行解码和处理,将相应的内容显示在屏幕上。为了实现动态显示效果,Arduino 可以定期更新发送的数据,使 OLED 显示屏不断刷新显示内容。

应用场景
数据监测与显示:在环境监测系统中,Arduino 连接各种传感器(如温度传感器、湿度传感器、空气质量传感器等)采集环境数据,然后将数据通过通信接口传输到 OLED 显示屏上进行实时显示。用户可以直观地了解环境参数的变化情况。
智能家居控制:在智能家居系统中,Arduino 作为控制核心,连接各种家电设备和传感器。OLED 显示屏可以显示家电设备的状态(如开关状态、温度设置等),并提供操作菜单,用户可以通过触摸按键或其他输入设备在 OLED 显示屏上进行操作,实现对家电设备的远程控制。
机器人交互界面:在机器人项目中,OLED 显示屏可以作为机器人的交互界面,显示机器人的工作状态、任务进度、传感器数据等信息。同时,还可以显示一些动画或图标,增强机器人的人机交互体验。
手持设备与可穿戴设备:由于 OLED 显示屏的轻薄和低功耗特性,与 Arduino 结合可用于开发手持设备和可穿戴设备。例如,制作一个便携式的健康监测设备,通过 Arduino 连接心率传感器、计步器等,将监测数据显示在 OLED 显示屏上,方便用户随时查看自己的健康状况。

在这里插入图片描述

在Arduino项目中,OLED之绘制点阵图(Drawing Bitmaps on OLED) 是一种利用OLED屏幕显示自定义图像的技术。通过将预定义的位图数据转换为像素信息并在屏幕上显示出来,可以极大地增强设备的视觉表现力和用户交互体验。以下从 主要特点、应用场景 和 注意事项 三个方面进行详细解析。

主要特点

  1. 高对比度与清晰度
    OLED显示屏具有自发光特性,提供高对比度和鲜艳的颜色,使得点阵图显示效果非常出色。
    支持多种颜色深度设置(单色或灰度),适应不同的应用需求。
  2. 低功耗
    相比传统LCD屏,OLED在显示静态图像时能耗更低,特别适合电池供电的便携式设备。
    当部分像素不亮时不会消耗电力,进一步优化了能效比。
  3. 灵活性强
    点阵图可以是任何大小的位图文件,开发者可以根据需要调整图像尺寸以适应不同分辨率的OLED屏幕。
    支持动画效果,可以通过连续显示一系列点阵图来创建动态图像或动画序列。
  4. 易于集成
    Arduino平台提供了丰富的OLED驱动库(如Adafruit_SSD1306、U8g2lib),这些库通常包含了便捷的API用于加载和显示位图。
    支持I2C或SPI通信接口,方便与其他传感器或模块连接,实现一体化解决方案。
  5. 多功能显示能力
    可以同时显示文本、数字、图标等多种类型的信息,支持复杂的布局设计。
    结合图形库,可以轻松地在图像上叠加其他元素,如进度条、状态指示灯等。

应用场景

  1. 智能穿戴设备
    在智能手表或健身追踪器上显示品牌Logo、个性化图标或活动图标,提升产品辨识度和用户体验。
    示例:当用户完成每日步数目标时,屏幕上显示庆祝图案。
  2. 智能家居控制面板
    展示各种家电的状态图标,如空调开启/关闭状态、灯光亮度等级等,便于用户快速了解家中设备情况。
    示例:在家庭自动化系统中,使用图标表示不同房间的温度设定值。
  3. 工业控制系统
    在工业自动化场景中,用于显示机器运行状态、故障报警图标等重要信息,提高生产效率和安全性。
    示例:工厂车间内的PLC控制面板,显示当前生产线的工作状态图标。
  4. 物联网(IoT)设备
    物联网节点可以通过OLED屏向用户展示网络连接状态、数据传输情况等图标信息,增强设备的可用性。
    示例:智能插座上的OLED显示屏,显示当前功率消耗及用电量统计图标。
  5. 教育与研究工具
    作为实验装置的一部分,用于显示实验结果、过程变量等图标化信息,便于教学演示和科学研究。
    示例:基于Arduino的物理实验仪器,实时显示测量数据和计算结果图标。

注意事项

  1. 内存管理
    Arduino微控制器的RAM有限,处理大型点阵图可能会超出内存容量。
    对于较大的位图,考虑使用外部存储(如SD卡)读取数据,并采用分段加载的方式减少内存占用。
  2. 图像格式与转换
    确保使用的图像格式与所选OLED库兼容。通常需要将标准图像文件(如PNG、JPEG)转换为特定格式(如XBM、BMP)才能被Arduino识别。
    使用合适的工具(如在线转换器或专门软件)将图像转换为正确的格式,并根据需要调整图像尺寸和颜色深度。
  3. 刷新频率
    高频刷新点阵图会增加CPU负担并可能导致性能下降。
    根据实际需求合理设置刷新间隔,特别是在动态显示多个点阵图的情况下,避免不必要的频繁刷新。
  4. 电源稳定性
    尽管OLED相比LCD更节能,但在长时间连续工作的情况下仍需注意电源稳定性,避免因电压波动导致显示异常。
    对于电池供电的应用,考虑使用低功耗模式或定时关闭屏幕以延长续航时间。
  5. 用户体验设计
    设计时要考虑用户阅读习惯,选择合适的图像大小和颜色搭配,确保信息易于理解。
    提供简洁明了的操作指引或状态提示,帮助用户快速掌握设备操作方法。

在这里插入图片描述
1、静态显示 BMP 图标(如 WiFi、电池图标)​​

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// WiFi 图标(16x16 像素,黑白 BMP 格式)
const unsigned char wifiIcon[16 * 2] PROGMEM = {  // 每行 2 字节(16px / 8bit)
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x21, 0x00,
  0x40, 0x80, 0x40, 0x80, 0x49, 0x80, 0x55, 0x40,
  0x65, 0x40, 0x65, 0x40, 0x7F, 0x80, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

void setup() {
  if (!display.begin(SSD1306_I2C_ADDRESS, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("WiFi Icon Demo");
  display.display();
  delay(2000);
}

void loop() {
  display.clearDisplay();
  
  // 绘制 WiFi 图标(16x16,左上角 (10, 20))
  display.drawBitmap(10, 20, wifiIcon, 16, 16, SSD1306_WHITE);
  
  display.display();
  delay(5000);  // 显示 5 秒
}

​​要点解读​​
​​drawBitmap(x, y, bitmap, w, h, color)​​
在 (x, y) 位置绘制 w × h 的点阵图,color 可选 SSD1306_WHITE 或 SSD1306_BLACK。
​​BMP 数据存储​​
使用 PROGMEM 存储图标数据,减少 RAM 占用(适用于 Arduino UNO 等小内存设备)。
​​图标设计​​
每个字节代表 8 像素(1bit=1px),16x16 图标需要 32 字节(16×2)。

2、动态显示动画(如呼吸灯效果)​​

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// 心形动画帧(每帧 16x16)
const unsigned char heartFrames[4][16 * 2] PROGMEM = {
  {  // 帧 1
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x21, 0x00,
    0x40, 0x80, 0x40, 0x80, 0x49, 0x80, 0x55, 0x40,
    0x65, 0x40, 0x65, 0x40, 0x7F, 0x80, 0x00, 0x00
  },
  {  // 帧 2(放大版)
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x0E, 0x00, 0x1F, 0x00, 0x3F, 0x80,
    0x7F, 0xC0, 0x7F, 0xC0, 0x7F, 0xC0, 0x3F, 0x80,
    0x1F, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00
  },
  {  // 帧 3(缩小版)
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x2A, 0x80,
    0x55, 0x40, 0x55, 0x40, 0x2A, 0x80, 0x15, 0x00,
    0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  },
  {  // 帧 4(闪烁)
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  }
};

void setup() {
  if (!display.begin(SSD1306_I2C_ADDRESS, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  display.clearDisplay();
  display.display();
  delay(1000);
}

void loop() {
  for (int i = 0; i < 4; i++) {
    display.clearDisplay();
    display.drawBitmap(32, 16, heartFrames[i], 16, 16, SSD1306_WHITE);  // 绘制当前帧
    display.display();
    delay(300);  // 每帧显示 300ms
  }
}

​​要点解读​​
​​动画原理​​
使用多帧 BMP 数据,循环切换实现动画效果。
​​帧率控制​​
delay(300) 控制动画速度,可调整以改变流畅度。
​​优化方向​​
可增加更多帧使动画更平滑,或使用 millis() 替代 delay() 避免阻塞。

3、自定义绘制图形(如温度计、电池电量)​​

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void drawThermometer(int x, int y, int level) {
  // 画温度计外壳
  display.drawRect(x, y, 10, 40, SSD1306_WHITE);
  
  // 画温度液柱(level: 0-40)
  display.fillRect(x + 2, y + 40 - level, 6, level, SSD1306_WHITE);
  
  // 画温度刻度
  for (int i = 0; i <= 4; i++) {
    display.drawLine(x - 5, y + 10 * i, x + 15, y + 10 * i, SSD1306_WHITE);
    display.printNumber(20 + i * 5, x - 8, y + 10 * i - 5, 1);  // 显示温度值
  }
}

void drawBattery(int x, int y, int percent) {
  // 画电池外壳
  display.drawRect(x, y, 20, 10, SSD1306_WHITE);
  
  // 画电池电量(percent: 0-100)
  int fillWidth = (percent * 18) / 100;
  display.fillRect(x + 2, y + 2, fillWidth, 6, SSD1306_WHITE);
  
  // 画电池正极
  display.fillRect(x + 18, y + 4, 2, 2, SSD1306_WHITE);
}

void setup() {
  if (!display.begin(SSD1306_I2C_ADDRESS, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  display.clearDisplay();
  display.display();
  delay(1000);
}

void loop() {
  display.clearDisplay();
  
  // 绘制温度计(20°C)
  drawThermometer(20, 10, 20);  // level = 20px
  
  // 绘制电池(75%)
  drawBattery(20, 60, 75);
  
  display.display();
  delay(5000);  // 显示 5 秒
}

​​要点解读​​
​​自定义图形绘制​​
使用 drawRect()、fillRect()、drawLine() 等函数组合绘制复杂图形。
​​参数化设计​​
drawThermometer() 和 drawBattery() 接受位置和数值参数,提高复用性。
​​单位转换​​
温度计液柱高度 level 与实际温度值关联(如 20°C → 20px)。
​​优化方向​​
可增加动态更新(如实时温度读取),或结合动画效果。

在这里插入图片描述
4、自定义图标显示(设备状态指示)
功能:通过点阵图显示设备连接状态(如Wi-Fi信号强度图标)。
硬件:Arduino UNO + SSD1306 OLED(128x64)。
核心代码片段:

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);
 
// 定义Wi-Fi图标点阵数据(16x16像素)
static const uint8_t wifiIcon[] PROGMEM = {
  0b00000000, 0b00000000,
  0b00001100, 0b00000000,
  0b00011110, 0b00000000,
  0b00111111, 0b00000000,
  0b01111111, 0b10000000,
  0b01111111, 0b11000000,
  0b00111111, 0b11000000,
  0b00011110, 0b00000000,
  0b00001100, 0b00000000,
  0b00000000, 0b00000000,
  0b00000000, 0b00000000,
  0b00000000, 0b00000000,
  0b00000000, 0b00000000,
  0b00000000, 0b00000000,
  0b00000000, 0b00000000,
  0b00000000, 0b00000000
};
 
void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.drawBitmap(50, 20, wifiIcon, 16, 16, SSD1306_WHITE); // 在(50,20)绘制图标
  display.display();
}
 
void loop() {}

要点解读:
点阵数据存储:使用PROGMEM将图标数据存入Flash,节省RAM空间。
坐标定位:drawBitmap(x, y, data, width, height, color)参数精确控制图标位置和大小。
多状态扩展:可通过切换不同点阵数据实现信号强度分级显示(如3格、4格信号)。

5、动态进度条(数据加载动画)
功能:模拟数据加载进度条,通过点阵图逐帧更新实现动态效果。
硬件:Arduino Nano + SSD1306 OLED。
核心代码片段:

#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);
 
void drawProgress(uint8_t percent) {
  u8g2.firstPage();
  do {
    u8g2.drawFrame(10, 30, 108, 10); // 外框
    uint8_t width = map(percent, 0, 100, 0, 108);
    u8g2.drawBox(10, 30, width, 10); // 进度填充
    u8g2.setCursor(40, 50);
    u8g2.print(percent); u8g2.print("%");
  } while (u8g2.nextPage());
}
 
void setup() {
  u8g2.begin();
}
 
void loop() {
  for (int i = 0; i <= 100; i++) {
    drawProgress(i);
    delay(50);
  }
}

要点解读:
动态计算:map()函数将百分比转换为进度条实际宽度。
分层绘制:先画外框再填充内容,避免覆盖问题。
性能优化:u8g2库的双缓冲机制确保动画流畅,适合低帧率场景。

6、简易贪吃蛇游戏界面
功能:通过点阵图绘制游戏角色和场景,实现基础交互。
硬件:Arduino Pro Micro + SSD1306 OLED + 2个按钮。
核心代码片段:

#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, -1);
 
// 蛇头点阵图(8x8像素)
static const uint8_t snakeHead[] PROGMEM = {
  0b00000000,
  0b00111100,
  0b01000010,
  0b01000010,
  0b01111110,
  0b00000000,
  0b00000000,
  0b00000000
};
 
int snakeX = 64, snakeY = 32; // 初始位置
 
void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  pinMode(2, INPUT_PULLUP); // 方向控制
}
 
void loop() {
  if (!digitalRead(2)) { snakeX--; } // 左移
 
  display.clearDisplay();
  display.drawBitmap(snakeX, snakeY, snakeHead, 8, 8, SSD1306_WHITE);
  display.display();
  delay(100);
}

要点解读:

游戏循环:通过主循环持续更新角色位置并重绘屏幕。
碰撞检测:需额外代码判断snakeX/Y是否超出屏幕边界。
扩展性:可结合数组存储蛇身坐标,实现长度增长机制。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。

在这里插入图片描述

「雕爷编程Arduino动手做寻迹的实验可以使用TCRT5000红外反射光电开关寻迹传感器模块。这个传感器模块可以通过检测周围的光反射来进行寻迹操作。你可以将这个模块连接到mBot的主控板mCore V1.5的RJ25接口上,因为mBot的主控板兼容Arduino系统,所以你可以使用Arduino编程语言来控制mBot进行寻迹操作。请参考【Arduino】168种传感器模块系列实验中的实验六十六,该实验详细介绍了如何使用TCRT5000红外反射光电开关寻迹传感器模块进行寻迹。祝你成功完成实验!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【雕爷编程Arduino动手做(194)---makeblock mbot 主控板2](https://blog.csdn.net/weixin_41659040/article/details/132141677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [【雕爷编程Arduino动手做(65)---红外寻迹传感器](https://blog.csdn.net/weixin_41659040/article/details/106604080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值