如何在Arduino中创建IO条形图?Tinkercad中LED条形图故障排查求助
解决LED条形图故障 + Arduino IO条形图创建指南
我来帮你排查黄色和橙色LED不工作的问题,同时详细讲讲怎么在Arduino里实现IO条形图功能~
一、先搞定黄色/橙色LED不工作的问题
咱们从硬件和代码两个维度逐一排查:
硬件排查要点
- 先确认接线:黄色LED的长脚(阳极)要通过220Ω电阻接到引脚2,短脚(阴极)接GND;橙色LED对应引脚1,接线逻辑一样。接反的话LED肯定不亮,这是新手常犯的错~
- 核对引脚对应:别实际接线时把黄色LED接到了引脚4,代码里却写的是引脚2,这种 mismatch 也会导致LED没反应。
- 单独测试LED:把黄色LED直接接到3.3V和GND,看能不能点亮,排除LED本身损坏的可能。
代码排查与优化
避开引脚1(TX串口引脚)
Arduino的引脚1是默认的串口发送(TX)引脚,只要你的Arduino和电脑通过USB连在一起,这个引脚就会被串口通信占用,橙色LED自然没法正常工作。建议换成空闲的引脚,比如引脚4:// 修改setup里的引脚初始化 pinMode(4, OUTPUT); // 然后把loop里的引脚1全部替换成4 if (outputValue > 91) { digitalWrite(4, HIGH); } else { digitalWrite(4, LOW); }调低阈值,让LED更容易触发
你代码里黄色LED需要outputValue > 51才亮,橙色要>91,这意味着传感器得输出超过一半、接近满量程的数值才会触发。如果你的传感器实际输出范围没这么大,LED当然不会亮。可以先调低阈值测试:// 红色LED(引脚3):超过10就亮 if (outputValue > 10) { digitalWrite(3, HIGH); } else { digitalWrite(3, LOW); } // 黄色LED(引脚2):超过40就亮(从51下调) if (outputValue > 40) { digitalWrite(2, HIGH); } else { digitalWrite(2, LOW); } // 橙色LED(引脚4):超过70就亮(从91下调) if (outputValue > 70) { digitalWrite(4, HIGH); } else { digitalWrite(4, LOW); }加调试输出,搞清楚传感器实际数值
加入串口打印,看看sensorValue和outputValue的真实范围,这样调整阈值更有依据:void setup() { // 原有的pinMode代码... Serial.begin(9600); // 初始化串口通信 } void loop() { sensorValue = analogRead(A0); outputValue = map(sensorValue, 0, 1023, 0, 100); // 打印数值到串口监视器 Serial.print("传感器数值: "); Serial.print(sensorValue); Serial.print(" | 映射后数值: "); Serial.println(outputValue); // 原有的LED控制代码... }打开Arduino IDE的串口监视器(右下角那个放大镜图标),就能看到实时数值,判断是不是没达到LED的触发条件。
二、如何在Arduino中创建IO条形图
IO条形图就是根据输入值(比如传感器读数),点亮对应数量的LED,形成类似进度条的效果。下面分两种场景给你方案:
场景1:LED数量少(3-5个)—— 基础版(单个IO控单个LED)
这种方式代码直观,容易理解:
- 硬件搭建:每个LED串联220Ω电阻,阳极接数字引脚,阴极接GND。比如用引脚3、2、4分别控制红、黄、橙LED。
- 优化代码(用数组简化逻辑):
用数组存储引脚和阈值,以后加LED只需要修改数组,不用重复写if-else,更简洁:// 存储LED引脚和对应阈值 const int ledPins[] = {3, 2, 4}; const int thresholds[] = {10, 40, 70}; int sensorValue = 0; int outputValue = 0; // 自动计算LED数量,不用手动数 int ledCount = sizeof(ledPins) / sizeof(ledPins[0]); void setup() { pinMode(A0, INPUT); // 批量初始化LED引脚 for (int i = 0; i < ledCount; i++) { pinMode(ledPins[i], OUTPUT); } Serial.begin(9600); } void loop() { sensorValue = analogRead(A0); outputValue = map(sensorValue, 0, 1023, 0, 100); // 逐个控制LED亮灭 for (int i = 0; i < ledCount; i++) { digitalWrite(ledPins[i], outputValue > thresholds[i] ? HIGH : LOW); } delay(20); // 适当延长延迟,避免LED闪烁 }
场景2:LED数量多(8个以上)—— 移位寄存器版(节省IO)
如果需要8个甚至更多LED,用74HC595移位寄存器,只需要3个Arduino引脚就能控制8个LED,非常节省IO资源:
- 硬件连接:
- 74HC595的
VCC接5V,GND接Arduino的GND SER(数据输入引脚)接Arduino引脚11SRCLK(移位时钟引脚)接引脚12RCLK(锁存时钟引脚)接引脚13- 每个LED串联220Ω电阻,一端接74HC595的Q0-Q7引脚,另一端接GND
- 74HC595的
- 代码实现:
这样,传感器数值越高,点亮的LED数量越多,完美实现条形图效果。const int dataPin = 11; // 74HC595的数据引脚 const int clockPin = 12; // 移位时钟引脚 const int latchPin = 13; // 锁存时钟引脚 int sensorValue = 0; int outputValue = 0; void setup() { pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(latchPin, OUTPUT); Serial.begin(9600); } void loop() { sensorValue = analogRead(A0); // 把传感器数值映射到0-8(对应0到8个LED点亮) outputValue = map(sensorValue, 0, 1023, 0, 8); // 生成要发送给移位寄存器的二进制数据 byte ledState = 0; for (int i = 0; i < outputValue; i++) { bitSet(ledState, i); // 点亮第i个LED } // 发送数据到移位寄存器 digitalWrite(latchPin, LOW); // 打开锁存,准备接收数据 shiftOut(dataPin, clockPin, MSBFIRST, ledState); // 发送数据 digitalWrite(latchPin, HIGH); // 关闭锁存,更新LED状态 delay(20); }
内容的提问来源于stack exchange,提问作者kaluaaa
相关产品推荐
相关产品推荐

