nandwrite 写 NAND 的几个容易忽略的细节
记录用 nandwrite 往 NAND 闪存写数据时 -p 和 -s 的真实含义,以及操作前容易忽略的坑。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-06-11 17:15:39 Arduino TCS34725 颜色传感器 积分时间 嵌入式
调 TCS34725 的时候,积分时间这玩意一开始很容易忽略,等实际跑起来发现数据要么飘得厉害,要么强光下直接读数拉满,才回头翻看这一项。
积分时间本质上就是传感器内部光电二极管在把电荷转给 ADC 之前,留出来累积光信号的那段时间。
Adafruit 的库把这个封装得很简单,就一个 setIntegrationTime 函数,但简单背后藏着几个容易踩的坑。
积分时间越长,同样的光照下收集到的光电子就越多,能分辨更暗的光线变化。代价是测量一次要等更久,循环速度会掉下来,而且如果环境光本来就强,很容易就饱和——四个通道的值全部顶到 65535,再怎么调增益都没用。反过来,时间设得太短,弱光下读出来的数值可能就几十甚至个位数,基本没法用。
库的 setIntegrationTime 原型接受一个 uint8_t 参数,官方建议用那组预定义宏:
TCS34725_INTEGRATIONTIME_2_4MS (2.4 ms)TCS34725_INTEGRATIONTIME_24MS (24 ms)TCS34725_INTEGRATIONTIME_50MS (50 ms)TCS34725_INTEGRATIONTIME_101MS (101 ms)TCS34725_INTEGRATIONTIME_154MS (154 ms)TCS34725_INTEGRATIONTIME_700MS (700 ms)很多人会以为这些宏可以随便选,设一个 50 ms 就万事大吉。实际上表里没有的中间值你是没法直接传的,因为芯片的 RGBC 时序和内部时钟分频是按固定档位走的,库只暴露了这几个可选值。
试过直接填数字,编译能过,跑起来不起作用。
我一般是在 setup() 里调用,紧跟在 tcs.begin() 之后。注意如果 begin() 失败了,后面别继续设积分时间,否则 I2C 写寄存器的时候会卡住或者出现不确定行为——虽然一般不至于,但代码里最好还是加个判断。
拿 50 ms 来说,设完之后一次 getRawData 调用基本也是这个量级的耗时,因为库会等一次积分周期完成再读。别在主循环里干等着轮询,如果用 700 ms 积分,每一轮光读颜色就要 0.7 秒,还要算上你其他的逻辑和 delay,整机的响应会迟钝很多。
快速变化的场景,比如颜色分拣或者检测 LED 闪烁,2.4 ms 或 24 ms 会更合适。
另外有一个容易被忽视的点:修改积分时间后,增益设置还停留在之前的默认值(通常是 1x)。
如果之前为了弱光环境把增益调到了 16x,换成长积分时间之后不降增益,强光下饱和得比你想象中快得多。这两项最好一起调整。
常见代码大概长这样,没太多特别的地方,但每次初始化都别忘了设,不然默认是 2.4 ms,容易在低照度下出问题。
#include <Wire.h>
#include "Adafruit_TCS34725.h"
Adafruit_TCS34725 tcs = Adafruit_TCS34725();
void setup() {
Serial.begin(9600);
if (!tcs.begin()) {
Serial.println("Failed to find TCS34725 sensor!");
while (1);
}
Serial.println("TCS34725 sensor found!");
// 设置积分时间为 50 毫秒
tcs.setIntegrationTime(TCS34725_INTEGRATIONTIME_50MS);
}
void loop() {
uint16_t red, green, blue, clear;
tcs.getRawData(&red, &green, &blue, &clear);
Serial.print("Red: ");
Serial.print(red);
Serial.print(", Green: ");
Serial.print(green);
Serial.print(", Blue: ");
Serial.print(blue);
Serial.print(", Clear: ");
Serial.println(clear);
delay(1000);
}
最后提一句库版本,有些旧版本的 Adafruit_TCS34725 库里缺 TCS34725_INTEGRATIONTIME_700MS 这个宏,编译会报错。
如果遇到,先更新库,别手写一个 0x00 往寄存器里塞,具体寄存器映射得查数据手册,搞不好会把其他配置位覆盖掉。
真要用得稳,还是根据现场光照实际测一遍:拿串口打出 raw 值,看看不同积分时间下四个通道的读数范围,保证最高值离 65535 有一段安全距离,同时暗部信号足够分辨。
经验上室内普通照明 24 ms 够用,隔着磨砂玻璃之类的用 101 ms 或 154 ms,户外直射光那就直接上 2.4 ms 并降增益。每换一个场景都值得重调一次。
记录用 nandwrite 往 NAND 闪存写数据时 -p 和 -s 的真实含义,以及操作前容易忽略的坑。
探索色彩世界的奥秘!本文揭示Arduino如何通过TCS34725颜色传感器的积分时间设置,精准捕捉每一道光影。我们将深入探讨`setIntegrationTime`的魔力,让你的项目拥有如同人眼般灵敏的色彩感知力,无论是智能分拣、环境光感应,都能达到新的高度。