问孩子一个问题:
"如果让你点亮10颗灯珠,第1颗到第10颗分别亮红色,你要写多少行代码?"
笨办法:写10行 setPixelColor(0, RED)、setPixelColor(1, RED)……写到手酸。
聪明办法:3行 for 循环搞定。
这就是编程思维:找到规律,让计算机替你重复。
今天,我们就用循环来造一辆会闪红蓝光的"警车"🚓
材料 | 数量 | 备注 |
Arduino Uno/Nano | 1块 | 主控板 |
WS2812B灯条(10灯) | 1条 | 全彩灯条 |
面包板+杜邦线 | 若干 | 连接用 |
USB数据线 | 1条 | 供电+上传程序 |
电路连接:
#include <Adafruit_NeoPixel.h>#define LED_PIN 6 // 信号线接D6#define LED_COUNT 10 // 10颗灯珠Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);// 定义颜色(RGB三原色)uint32_t RED = strip.Color(255, 0, 0); // 红色uint32_t BLUE = strip.Color(0, 0, 255); // 蓝色uint32_t OFF = strip.Color(0, 0, 0); // 熄灭void setup() { strip.begin(); strip.setBrightness(80); // 亮度80%,保护眼睛 strip.show(); // 初始化全部熄灭}void loop() { policeStrobe(); // 执行警灯爆闪模式}// ================== 核心函数:左右交替爆闪 ==================void policeStrobe() { // 【第一步】左边5颗红灯,闪3次 for(int flash = 0; flash < 3; flash++) { // 外层循环:闪3次 // 内层循环1:点亮左边5颗(索引0~4) for(int i = 0; i < 5; i++) { strip.setPixelColor(i, RED); // i=0,1,2,3,4 变红 } // 内层循环2:右边5颗熄灭(索引5~9) for(int i = 5; i < 10; i++) { strip.setPixelColor(i, OFF); // i=5,6,7,8,9 熄灭 } strip.show(); // 把颜色"推"到灯条上 delay(80); // 亮80毫秒 allOff(); // 全灭 delay(80); // 灭80毫秒 } // 【第二步】右边5颗蓝灯,闪3次 for(int flash = 0; flash < 3; flash++) { for(int i = 0; i < 5; i++) { strip.setPixelColor(i, OFF); // 左边熄灭 } for(int i = 5; i < 10; i++) { strip.setPixelColor(i, BLUE); // 右边变蓝 } strip.show(); delay(80); allOff(); delay(80); }}// 辅助函数:全部熄灭void allOff() { for(int i = 0; i < 10; i++) { strip.setPixelColor(i, OFF); } strip.show();}for(int i = 0; i < 5; i++)部分 | 含义 | 人话翻译 |
| 初始化 | 从第0颗灯开始 |
| 条件判断 | 只要编号小于5,就继续 |
| 自增 | 做完一颗,做下一颗 |
执行顺序:i = 0 → 执行代码 → i = 1 → 执行代码 → … → i = 4 → 执行代码 → i = 5(不满足条件,退出)
因为10颗灯的编号是:0, 1, 2, 3, 4, 5, 6, 7, 8, 9
i < 5 → 0,1,2,3,4(共5颗)i >= 5 && i < 10 → 5,6,7,8,9(共5颗)💡编程冷知识:程序员从0开始数数,不是从1。这是几乎所有编程语言的规矩。
代码里有两个 for 套在一起:
for(int flash = 0; flash < 3; flash++) { // 外层:闪3轮 for(int i = 0; i < 5; i++) { // 内层:点5颗灯 // ... }}外层循环1次 → 内层循环跑完5次就像:每一轮闪烁(外层),都要把5颗灯逐一点亮(内层)
任务:把蓝色改成白色,就是救护车效果。
只需要改1行:
// 把这一行uint32_t BLUE = strip.Color(0, 0, 255); // 蓝色// 改成uint32_t WHITE = strip.Color(255, 255, 255); // 白色然后代码里所有 BLUE 改成 WHITE。
思考:如果要改成消防车(全红频闪),该怎么改?
把 loop() 里的函数换一换,体验不同效果:
void loop() { policeChase(); // 红蓝光追逐跑}void policeChase() { // 红光从左追到右 for(int i = 0; i < 10; i++) { allOff(); strip.setPixelColor(i, RED); strip.setPixelColor((i+1) % 10, strip.Color(100, 0, 0)); // 拖尾效果 strip.show(); delay(60); } // 蓝光从右追到左 for(int i = 9; i >= 0; i--) { allOff(); strip.setPixelColor(i, BLUE); strip.setPixelColor((i+9) % 10, strip.Color(0, 0, 100)); strip.show(); delay(60); }}void loop() { policeFlash(); // 全屏红蓝频闪}void policeFlash() { // 全红 for(int i = 0; i < 10; i++) strip.setPixelColor(i, RED); strip.show(); delay(100); allOff(); delay(50); // 全蓝 for(int i = 0; i < 10; i++) strip.setPixelColor(i, BLUE); strip.show(); delay(100); allOff(); delay(50);}知识点 | 孩子应该记住 |
for循环 | 让计算机重复做同样的事 |
索引从0开始 | 第1颗灯是0号,第10颗是9号 |
嵌套循环 | 大循环套小循环,外层1次=内层跑完 |
修改参数 | 改数字就能换颜色、换速度、换模式 |
初级:把闪灯次数从3次改成5次,观察变化。
中级:让左边闪红灯时,右边不熄灭,而是显示暗红色(strip.Color(50,0,0))。
高级:尝试写一个函数 void setHalfColor(int start, int end, uint32_t color),把"点亮某一段灯"封装成通用函数。
本文标签:#少儿编程 #科创 #电子爱好者 #物联网 #arduino #ESP32
![]() | ![]() | ![]() |
关注我们,方便学习和答疑