四位数码管由四个独立的七段数码管组成,每个数码管可以显示0-9的数字。它们通常有共阴或共阳两种类型,共阴数码管的阴极连接在一起,共阳数码管的阳极连接在一起,如下图所示:

四位数码管引脚较多,一般搭配驱动芯片来使用以节省I/O端口,常见的驱动芯片有74HC595、TM1650、TM1637等,本文使用TM1650驱动的四位数码管模块。
TM1650是一种带键盘扫描接口的LED驱动控制专用电路,只需要通过二个引脚(SCL和SDA)与MCU通讯就可以完成数码管的驱动,可节省MCU引脚资源。
安装TM1650库
在arduino.cc网站的library频道搜索“tm1650",下载最新版本的zip文件,通过“导入库”->“添加.zip库”方式安装,安装后查看验证。

硬件连线:CLK引脚接SCL、DIO引脚接SDA
#include <TM1650.h>
TM1650 tm1650; // 实例化
void setup() {
  Serial.begin(115200);
  Wire.begin();
  tm1650.init();  // 初始化
}
void loop() {
  tm1650.displayOff();
  tm1650.displayString("____");
  tm1650.setBrightness(TM1650_MIN_BRIGHT);
  tm1650.displayOn();
  Serial.println("显示:____");
  delay(1000);
  char line[] = "1234";
  tm1650.displayString(line);
  Serial.println("显示:1234");
  tm1650.setBrightnessGradually(TM1650_MAX_BRIGHT);
  delay(2000);
  tm1650.setBrightnessGradually(TM1650_MIN_BRIGHT);
  tm1650.displayOff();
  delay(1000);
  
  tm1650.displayString("abcd");
  Serial.println("显示:abcd");
  tm1650.displayOn();
  delay(2000);
  
  Serial.println("滚动显示:1234567890abcdefghjlnop");
  if (tm1650.displayRunning("1234567890abcdefghjlnop")) {
    while (tm1650.displayRunningShift()) delay(500);
  }
  delay(2000);
  
  Serial.println("亮度交替调节(5次)");
  for (int i = 0; i<5; i++) {
    tm1650.setBrightness(1);
    delay(200);
    tm1650.setBrightness(7);
    delay(200);
  }
  Serial.println("逐个闪烁显示:小数点(5次)");
  for (int i = 0; i<5; i++) {
    for (int j = 0; j<4; j++) {
      tm1650.setDot(j,true);
      delay(200);
    }
    for (int j = 0; j<4; j++) {
      tm1650.setDot(j,false);
      delay(200);
    }
  }
  String chars = "ABCD";
  Serial.println("在指定位显示字符");
  for (int i=0; i<chars.length();i++) {
    tm1650.clear();
    byte b = ((byte) chars[i]) & 0b01111111;
    tm1650.setPosition(i,  TM1650_CDigits[b]);
    Serial.println("在指定位显示字符");
    delay(2000);
  }
  String numbers = "5678";
  Serial.println("在指定位显示数据");
  for (int i=0; i<numbers.length(); i++) {
    tm1650.clear();
    byte b = ((byte) numbers[i]) & 0b01111111;
    tm1650.setPosition(i,  TM1650_CDigits[b]);
    Serial.println("在指定位显示字符");
    delay(2000);
  }
} 关于TM1650库的更多信息,请访问以下网站:
  https://github.com/arkhipenko/TM1650
 
            二进制(binary),发现者莱布尼茨,是在数学和数字电路中以2为基数的记数系统,是以2为基数代表系统的二进位制。这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示 。
Arduino-ESP32与ESP-IDF的版本对应表。
Arduino+ESP32上使用TFT_eSPI库快速点亮这个屏幕,驱动芯片ST7789
本节我们在迭代二的基础上使用四位数码管和OLED显示屏显示相关交互信息。
 
            Queue 库提供了一个通用的 C++ 动态队列实现,专为在 Arduino 项目中使用而定制。
 
            本程序是小鹏物联网智能浇花套件的单机版程序(不连接物联网),供同学们参考。
 
            ArrayList 类是一个 C++ 模板类,它提供了 ArrayList 的实现,以便轻松存储任何指定类型的值。它允许使用索引进行高效存储和检索,支持排序操作。
 
            ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。
在本文中,先解释 MSB(最高有效位)和 LSB(最低有效位)的概念,以及 MSBFIRST 和 LSBFIRST。然后展示了 MSBFIRST 和 LSBFIRST 的使用如何影响移位寄存器的输出。
TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速与方向,输入电压在3V~12V,因此在集成化、小型化的电机控制系统中,它可以作为理想的电机驱动器件。
 
            Arduino-ESP32项目提供的Preferences库是一个专为ESP32设计的非易失性存储解决方案,它替代了传统的Arduino EEPROM库,提供了更强大、更可靠的数据存储功能。