ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Mixly图形化编程中for循环从入门到实战:跑马灯与嵌套循环详解

2026/10/2 5:49:20 拓冰建站 浏览量
Mixly图形化编程中for循环从入门到实战:跑马灯与嵌套循环详解 做米思齐Mixly图形化系列教程写到第六篇终于轮到for循环。说实话循环这种知识点在代码世界里就像吃饭用的筷子人人会用但真正用得好的人不多。尤其是for循环很多初学者把它当成“重复多次”来用根本不碰循环变量。这样学循环等于只学了个壳。这篇我打算把for循环从原理到实操一次讲透它到底解决什么问题、Mixly里积木藏在哪、三个参数怎么设、怎么通过跑马灯和嵌套循环练出感觉最后把最常见的问题和排查方法也整理出来。适合零基础刚开始接触Mixly的爱好者也适合正在带社团或带创客课的老师们拿去直接当教案用。1. for循环到底在解决什么问题1.1 没有循环时点亮多个LED有多痛苦我上课时第一件事不是讲for循环而是让学生用笨办法完成一个任务在Arduino Uno的数字引脚2到9上各接一个LED让它们全部点亮。不用循环怎么做八个数字输出积木依次拖出来每个引脚点一遍高电平。这个操作并不难但等我说“好现在把顺序反过来让最后一个灯先亮”学生就开始傻眼刚才那8个积木要重新调整顺序或者再复制一份改成低电平。这种事做一次还可以忍受但如果在项目里反复出现整个程序就成了一团乱麻。再极端一点如果任务是让8个LED依次点亮每个亮200毫秒后灭掉然后再点亮下一个。没有循环的写法是八组“数字输出高电平、延时、数字输出低电平、延时”一共32块积木。看起来堆得密密麻麻想改一个延时参数要从头到尾翻好几遍漏改一个闪光节奏就不对了。这种“复制粘贴式”写代码的方式本质上是在透支程序的维护性——初期很爽后期全是债。for循环解决的就是这个问题。它把“重复的动作”从代码里抽出来只保留一份循环体然后靠一个循环变量去重复执行。将来要改次数只改一个参数要改引脚规律只改循环变量的初值终值和步长。这个思路不只在Arduino里适用所有编程语言都是同一套底层逻辑。所以哪怕你用图形化编程也值得认真理解for循环背后的运行机制。1.2 把三步拆开看初值、终值、步长Mixly里for循环积木的基本形式可以这样描述对于循环变量i从初值开始到终值为止每执行一次循环体后增加一个步长。积木面板上通常有三个能改的数字分别对应初值、终值和步长。这三个参数就是for循环的全部控制权所在。参数控制什么例子初值循环变量从哪里开始1终值循环变量跑到多大/多小就停10步长每跑一轮循环体循环变量加多少1举个最直观的例子“从1到10每次增加1”循环变量依次取1、2、3、4、5、6、7、8、9、10循环体一共执行10次。如果把步长改成2循环变量依次取1、3、5、7、910根本不会出现循环体只执行5次。如果把初值和终值对调、步长改成-1“从10到1每次增加-1”则变成倒着数。这三个参数一变循环访问的数值序列就完全不一样这也就决定了程序的行为。还有一点很关键Mixly这类图形化工具里的for循环通常是一个闭区间。也就是说“从1到10”意味着循环变量会真正走到10循环体能访问到10。这跟C语言里的for(int i1; i10; i)一致但和Python里range(1,10)那种只含开头、不含结尾的写法不一样。很多从写Python转过来的人第一次用Mixly会差一个数这是正常的并不是脑子笨只是语言习惯不同。适应一下就好。在Mixly里拖好for积木之后切换到Arduino代码标签看到的大概就是下面这样一个for语句。初值1进入第一段条件i10是第二段步进ii1是第三段。循环体里放的积木就是花括号里的内容。for (int i 1; i 10; i i 1) { // 循环体 }2. Mixly的for循环积木在哪认积木与版本差异2.1 控制分类下的循环家族Mixly在电脑上打开后左侧是积木分类区类似Scratch的积木面板。循环相关的积木通常放在“控制”分类里颜色和条件判断积木接近。我用过的Mixly版本里控制分类下除了“如果/否则”这类条件积木之外还有一组循环积木固定次数的“重复几次”条件式的“当…时重复”和“重复直到…”以及带“从…到…步长…”字样的for循环积木。不同版本的显示名称会有差别但认准“从…到…步长…”这个特征基本不会找错。积木适用场景背后对应的C语言结构重复n次次数固定循环体内不关心当前是第几次for (int i0; in; i)当…时重复循环次数不定条件成立才继续while(条件)重复直到…至少执行一次直到条件成立do { } while (条件)for从…到…步长…需要按固定规律遍历一个数值范围for (int i初值; i终值; i步长)这里要特别提醒一下版本问题。Mixly目前网上能下到的版本比较多老版本和新版在积木命名上不太一样。比如for循环积木旧版可能叫“控制循环”新版可能显示成“对于(i)从1到10步长为1”。如果你在控制分类里找不到优先去官网下载更新版本。另外如果你下载的版本里没有arduino相关支持多数情况是下载了某个简化或定制版本而不是通用版。解决办法同样是去米思齐官网重新下载完整版不要随便用别人二次打包的精简包省得后期缺积木缺到头大。2.2 循环变量一个只活在循环里的临时工刚接触for循环的人最容易问的问题就是这个i是哪来的我需要先在“变量”分类里新建一个变量吗不需要。for循环积木拖出来的时候循环变量就自动生成了默认叫i旁边有个下拉框可以改名。你在循环体里直接用这个i就行不用额外新建也不需要给它赋初值——初值已经写在for积木上了。这个循环变量的生命周期只在for循环内部。你可以把它理解成暑假来帮忙的临时工只在收银台这里工作固定的时间段时间一到这个人就离开了。for循环运行期间i指向的是当前这一轮的数字循环一退出i的值就没人关心了。所以不要试图在循环外面使用i也不要指望for循环结束后i能拿来继续做别的事——除非你重新定义一个真正的变量去接收它。但循环变量在循环体内部非常有用。它可以参与计算可以当作引脚的编号可以当作数组的下标可以做条件判断。比如跑马灯案例里想让数字引脚2到9轮流出高电平就可以在数字输出积木的引脚参数里放一个变量i而不是写死一个数字。这样每一轮循环程序操作的引脚号都会自动变化。这个能力是for循环最值钱的地方也是很多初学者一开始不太适应的点。适应的方法很简单先拖一个变量积木到参数框里再运行看效果。等你看过一次灯跟着变量走就再也忘不了。3. 三个练手项目吃透图形化for循环3.1 项目一LED闪烁5次第一个项目让Arduino板载的13号引脚LED闪烁5次。这个项目的好处是零硬件成本Arduino Uno板上本身就有一颗贴片LED接在13号引脚只要板子能烧录不用外接任何东西就能看效果。对刚接触Mixly的人来说这是最没有门槛的练手项目。步骤很直接在Mixly左侧“控制”分类里拖出for积木放到“初始化”积木块里面。把初值设为1终值设为5步长保持1。在循环体里依次放四块积木数字输出引脚13高电平、延时500毫秒、数字输出引脚13低电平、延时500毫秒。选好端口和开发板类型上传。运行后LED会以亮0.5秒、灭0.5秒的节奏闪烁5次然后彻底熄灭。这是因为for循环放在“初始化”块里它只会执行一遍执行完5次循环后Arduino进入空的“循环执行”块LED就保持不变了。如果你把同样一段for循环从“初始化”挪到“循环执行”里你会看到另一种现象闪烁5次、停一下、再闪烁5次。停的那一下是for循环执行完一遍后主循环重新进入下一轮for循环之前的一个极短空档。这个对比很有意思能帮助理解Arduino“初始化一次、循环执行无限次”的基本结构。如果灯完全不闪先别急着怀疑循环。把for循环先拿掉直接放一个“数字输出高电平”在初始化里看灯亮不亮。灯不亮问题大概率在板子本身或端口选择灯亮再把for循环加回来。3.2 项目二8位跑马灯第二个项目用for循环做8位跑马灯。硬件上使用Arduino Uno的数字引脚2到9每个引脚串联一个220欧姆的限流电阻再接一个LED到GND。面包板上把这8个LED排成一排注意LED的长脚是正极接电阻那一侧短脚是负极接GND。这个接线看起来简单但上课时总有学生把方向搞反灯不亮的第一责任人往往就是它。积木逻辑这样搭在“循环执行”积木块里放一个for循环。设置初值为2、终值为9、步长为1。为什么要从2开始因为Arduino Uno的0号和1号引脚同时承担串口通信功能用来控制LED容易出怪问题教学项目里大家一般避开。循环体里放三块积木数字输出引脚参数处拖入变量i高电平、延时200、数字输出引脚参数处拖入变量i低电平。上传运行。引脚参数怎么拖入变量iMixly的“数字输出”积木默认引脚位置是一个可以填数字的下拉框或者一个蓝色数字块。你要把“变量”分类里那个圆形变量i拖出来塞进引脚参数的位置。有的版本需要先把引脚参数切到“变量”模式再拖进去。第一次找不到入口很正常多试两次就熟悉了。运行起来后从2号引脚到9号引脚LED会依次点亮并熄灭像一条光带跑过。i等于2时只操作引脚2i变成3时就操作引脚3一轮结束后for循环退出但“循环执行”块紧接着又跑下一轮for循环于是光带周而复始。想让它反向跑把初值改成9、终值改成2、步长改成-1就够了。循环体一行不用动这就是for循环的维护优势。很多老师会在这个项目基础上让学生加一个效果跑马灯跑完一遍后所有灯同时闪烁两下。实现方法并不难在for循环后面再接一个“重复2次”每次循环里把8个灯同时高电平、延时、再同时低电平。你可以先让学生自己试试完再讨论很多人会惊喜地发现自己已经能用循环组合出更丰富的效果。3.3 项目三嵌套循环串口打印九九乘法表第三个项目需要把for循环叠起来用嵌套循环。先想一个问题如果只想打印一串数1到9一个for就够了但如果要打印9行数字而且每一行的内容都跟行号有关那一个for就不够用了。这时候就需要在for的循环体里再放一个for。用串口打印九九乘法表来练不需要额外硬件Arduino连接电脑就能做。很多人觉得串口打印是“调试用”的不算项目其实它是观察for循环内部运行状态的最好工具。你完全可以在一个空的for循环里只打印循环变量看它到底访问了哪些值所有边界问题都一目了然。积木搭法如下在“初始化”积木里放一个“串口波特率”积木设为9600。虽然Mixly某些版本会自动初始化但显式写出来更保险。在“循环执行”积木里放外层for变量i从1到9步长1。在外层for循环体里再放一个内层for变量j从1到i步长1。这里j的终值直接引用外层变量i非常有代表性。内层循环体里放“串口打印不换行”积木把j、乘号、i、等号、j*i这几部分用文本拼接积木接起来然后打印一个空格。内层for结束后放一个“串口打印换行”积木换到下一行。这样得到的输出是标准的下三角九九乘法表第一行只有1×1第二行是1×2、2×2第三行是1×3、2×3、3×3……一直到9×9。如果用嵌套的两个for都从1到9则会输出完整的9×981个算式里面会有大量重复项。相比起来下三角更简洁也更考验对循环终值的理解能力。这里加一段对应的C代码方便你对照理解积木到底做了什么for (int i 1; i 9; i i 1) { for (int j 1; j i; j j 1) { Serial.print(j); Serial.print(x); Serial.print(i); Serial.print(); Serial.print(i * j); Serial.print( ); } Serial.println(); }嵌套循环的执行顺序用一句话概括就是外层循环每执行一轮内层循环就要从初值完整跑到终值。比如i1时内层j从1到1只打印一个算式i2时内层j从1到2打印两个算式i9时内层j从1到9打印九个算式。这个节奏理解了后面再去看LED点阵扫描、数码管逐位扫描这些项目就会发现它们全都在用同一个套路。4. 看看积木背后的代码用Arduino语言理解for4.1 一个for积木对应三行C代码Mixly虽然以图形化为主但它最终生成的是Arduino的C代码。在Mixly编辑区右上角或菜单栏里通常有一个切换到Arduino代码的入口。很多人第一次切过去会被吓到觉得一堆英文很劝退。但只要对应着找你会发现for积木对应的代码非常整齐。还是拿LED闪烁5次举例。图形化里一段简单的for循环生成的代码大概是这个样子for (int i 1; i 5; i i 1) { digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); delay(500); }for后面括号里用分号隔开的三段正好对应积木上的三个参数第一段int i1是初始化第二段i5是循环继续的条件第三段ii1是每轮的步进。整个执行顺序是先初始化一次然后判断条件是否成立成立就进入循环体循环体跑完后执行步进再一次判断条件……如此反复直到条件不成立退出。用生活里的场景来类比这就像操场上跑圈打卡你从起点出发初始化每跑一圈到打卡点教练看一眼你的圈数有没有到上限条件判断没到就继续跑循环体每跑完一圈圈数加一步进。一旦圈数到了上限教练说今天结束退出循环。这个顺序我在课堂上反复强调因为很多学生以为循环是从初值直接“跳”到终值忽略了中间还有条件判断和步进这两个动作。4.2 从代码角度理解为什么步长可以变C语言for循环的步进语句非常灵活可以写ii1、ii2也可以写ii-1。这就是为什么Mixly里步长能设成正数也能设成负数。当步长为-1且初值大于终值时生成的代码条件判断也会相应变成i某个数。比如图形化里设置“i从10到1步长-1”对应代码大致是for (int i 10; i 1; i i - 1) { // 倒计时循环体 }这里有个小提醒在某些Mixly版本里步长积木只接受正整数你直接填-1可能填不进去。遇到这种情况可以换个方案把步长设成1然后循环体里用另一个变量接收“11-i”的结果打印出去也能得到10、9、8……1的序列。思路要灵活别在某个版本的小缺陷上卡死。从代码角度看嵌套循环也更清楚。两层for就是两层花括号套在一起内层花括号的循环体执行完才会回到外层循环的步进语句。理解了这一点就不会再把内层循环单独拆出来看而是能把整个嵌套结构当作一个完整的整体来读。5. 进阶技巧递减、break、continue与阻塞陷阱5.1 倒计时和自定义步长for不止能正着跑前面已经提过倒计时这里再系统整理一下。初值、终值和步长这三个参数决定了for循环能访问的数值序列。如果你已经熟练掌握了“从1到N每次增加1”这种标准形式接下来可以试着做三件事作为练习第一做一个10秒倒计时器。设置i从10到1步长为-1循环体里串口打印i并加一个1000毫秒延时。运行后串口监视器会依次输出10、9、8……1一个最简单的倒计时就成了。第二只访问奇数或偶数。比如想让偶数编号的引脚2、4、6、8依次做动作直接把for设置成初值2、终值8、步长2循环变量依次取2、4、6、8。相比在循环体里用条件判断区分奇偶直接改步长通常更高效代码也更直观。第三把步长和条件判断结合。如果for循环访问的是1、4、7、10这种等差数列你可以很自然地想到它将来可以用在定时采集数据、轮流检测传感器等场景。for循环的本质就是按特定规律遍历一组数理解这一点之后它的用途早就超出“让LED闪几下”这件事了。5.2 循环中断与跳过break和continue的图形化表达for循环体内部不是一定要从头跑到尾。Mixly的控制分类里还有两块积木一个写着“中断循环”一个写着“继续循环”分别对应C语言的break和continue。名字可能略有差异但作用很清楚break是立即退出整个循环continue是结束当前这一轮跳到下一轮。举一个实际例子。倒计时循环i从10到1如果你希望当i等于3时不再倒计时直接退出可以在循环体里放一个“如果”积木条件是“i 3”满足就执行“中断循环”。实际效果是只打印10、9、8、7、6、5、4然后整个for结束。另一个例子跑马灯里如果只希望奇数编号的引脚亮在循环体开头判断“i % 2 1”时就执行“继续循环”这样偶数编号的引脚不执行点亮操作直接进入下一轮。不过教学上我的态度是break和continue不一定要在入门阶段讲深。它们虽然强大但容易把循环的阅读难度拉高。能用条件判断把逻辑理清楚的场景优先用条件判断等学生有了一定积累再看这两个积木会很轻松。让初学者先看到完整的循环结构比提前教他们“跳来跳去”更重要。5.3 阻塞式delayfor循环里最容易被忽略的坑for循环和delay搭配使用是最常见的教学组合但delay本身有个隐藏代价它在等待期间会让单片机“原地发呆”。CPU不会去处理别的任务不会响应按键不会读取传感器。这个过程在技术术语里叫阻塞delay就是最典型的一种阻塞式操作。先别被我这句话吓到。教学项目里一个LED闪烁加500毫秒延时完全没问题学生就该用这种简单方式来理解时间变化。但在真实项目中如果循环里要处理多个任务比如扫描8个按键、读取两个传感器的模拟值、还要更新显示屏这时每个循环体里只要有几十毫秒的delay整体响应就会变得奇慢按键按下去没反馈传感器数据也像卡住一样。如果遇到这种情况办法不是删掉delay而是换成非阻塞的时间管理方式。在Mixly图形化里可以通过维护一个变量记录上一次的时间戳然后判断当前时间和时间戳的差值是否超过设定值来决定要不要执行某个动作。这样做的好处是等待期间单片机还能继续跑其他代码不会傻等。这属于更高阶的话题这篇就不展开。但至少要形成一个意识看到for循环里有大块delay先想一想这个延时是不是为了让人眼看到效果。如果是说明程序还处在教学演示阶段如果是数据采集或交互式场景就得警惕阻塞带来的实时性损失。6. 常见问题与排查技巧实录6.1 循环写了灯却不闪问题可能出在接线先讲一个很多初学者不愿意承认的事实程序出问题时第一嫌疑往往不是程序而是硬件。我收到过好几次“我的for循环不工作”的提问最后排查下来一半是LED引脚接在了0或1号这种复用引脚上一半是LED插反了。Arduino Uno的0号和1号引脚和USB串口共用烧录时会有干扰而LED长脚短脚搞反或者没接限流电阻信号来了也白搭。所以我给学生定了排查顺序一、烧录时提示是否成功如果串口都选不对程序再好也跑不起来二、用一个最简单的积木直接点亮LED验证硬件通路三、再回到for循环检查逻辑。三步走下来大部分“灯不闪”的问题都能定位。没必要一上来就怀疑自己for循环理解错了实际中很多问题跟循环本身一点关系都没有。6.2 次数总是差一个边界条件怎么算第二个高频问题是边界条件“我设了i从1到10为什么每次感觉少了1次”大多数时候不是程序少了一次而是你心里的预期和实际访问序列不一致。先用串口打印循环变量看实际访问了哪些数再对照自己的预期问题立刻暴露。几个常见边界再理一遍从1到10步长1实际访问1、2、3、4、5、6、7、8、9、10共10次从0到9步长1实际访问0到9也是10次但数字范围完全不同从1到10步长2访问的是1、3、5、7、9只有5次从10到1步长-1访问10、9、8、7、6、5、4、3、2、1共10次。总结成一句话循环次数不是看初值和终值之间的距离而是看初值到终值之间按步长能落下多少个点。把这些序列先打印出来边界问题的争论就少了一半。6.3 高频疑惑速查表整理一个表格把我在带学生过程中最高频的疑惑和对应的排查建议放一起。它肯定不完整但覆盖了大多数入门场景。现象或疑问常见原因排查与处理建议LED全亮或不亮接线问题、引脚0/1复用、LED方向反先用单积木直接点亮LED验证硬件循环次数总差一个边界理解不一致、步长非1导致跳过部分值在循环体里串口打印循环变量观察实际序列循环体执行太快看不出效果缺少延时或延时过短在循环体内加200毫秒以上延时找不到for积木版本过旧或用了精简版去米思齐官网下载新版完整版循环变量i显示不出、没法改名版本兼容问题升级后重新试必要时新建变量替代跑马灯只跑一次就停for循环放在了“初始化”块里把for循环移到“循环执行”块内循环里用delay后按键没反应delay阻塞了其他任务缩短延时或换用基于millis()的非阻塞写法嵌套循环打印格式乱换行位置错误或未显式设置波特率内层循环结束后打印换行并设置9600波特率串口监视器不显示数据波特率不匹配或串口被占用核对波特率关闭其他占用串口的软件表格里最后一条关于串口监视器不显示数据也值得多说一句。Mixly的串口监视器通常默认9600波特率但如果你的程序里“串口波特率”积木设成了115200两边不一致输出就会变成乱码或者完全没有。这个问题简单却最容易让人白忙活半天。新手排查时习惯性先从循环逻辑入手其实先把通信参数核对一遍能省下大量时间。再说一句个人体会。教了这么多次循环我发现最容易让学生开窍的点不是把for循环的语法讲多细而是让他亲眼看到循环变量真的在变。跑马灯里i从2变到9每一次变化的i都被灯的物理位置清清楚楚地展示出来了。这个冲击比看十页教材都大。所以如果你的时间有限这套教程里优先做跑马灯。它做完之后for循环这个坎基本就迈过去了后面再碰到数码管扫描、点阵显示、数据处理都会顺很多。下一期我准备拿for循环去做一个稍微综合点的项目——把按键、跑马灯和串口输出串起来玩到时候见。