一、传感妙用
第1课 滑动接近检测

一、任务目标
用接近值和滑动量一起判断车位:接近>50 且 滑动量<30 时 1 号灯设为红色,否则绿色;同时打印两个读数。完整代码再给占用计时。
二、我们要学什么
- 学习要点:接近 + 滑动量必须同时满足才判占用,不能只看一个数
- 本课过关:能指出红灯条件是「接近>50 并且 滑动量<30」;完整代码占用时点阵显示停放计时。
- 示例对齐:体验题对应 「1-1-1 滑动接近检测」;完整代码对应 「1-1-2 滑动接近检测并计时」。
三、本节要点
本节不是摄像头认车。体验 1-1-1 每秒读接近/滑动量、打印、改灯色;点阵停放秒数是完整代码 1-1-2。
1读场景明确真实任务
2对要点接近且够暗才算占用
3载入运行本课积木/代码
四、解题思路
- 输入:接近值 ps_nl()、滑动互补值 als_vis()。
- 输出:体验:打印两数 + 1 号灯红(1)/绿(2)。完整代码:占用时点阵显示停放计时。
- 生活对照:车位下方既要「有东西挡住」,又要「够暗」,才更像有车。
- 验证现象:用手靠近且遮光应变红;只靠近仍很亮或只遮光不靠近,应保持绿。
本课主要用到:外接 LTR553(P16/P17)、指示灯;完整代码另用定时器、点阵屏。
- 1明确任务「滑动接近检测」:外接 LTR553:接近用 ps_nl(),滑动互补值用 als_vis(),再开关指示灯。
- 2写出占用条件:接近>50 并且 滑动量<30。
- 3占用则灯2亮(禁行),否则灯1亮(放行);每轮 sleep 1 秒。
- 4完整代码用「开始停放」打开定时器累加,离开则计时清零。
流程示意(可对照左侧文字)
五、图形块功能讲解
下面只列出本课首次出现的 Mixly 图形块(真积木截图)。已在前面课讲过的不再重复;先认新块,再点「载入」对照拖搭。
| 图形块 | 分类 | 作用 | 本课用法 |
|---|---|---|---|
![]() | 控制 | 按条件反复执行内部积木;条件为「真」时相当于 while True 无限循环。 | 载入后可在工具箱对照本课用法。 |
![]() | 变量 | 给变量写入新值。 | 载入后可在工具箱对照本课用法。 |
![]() | 外设 | LTR553 红外接近计数 ps_nl()。 | 体验:接近值 = xsensor.ps_nl()。 |
![]() | 外设 | LTR553 可见光 als_vis()。 | 体验:滑动互补值 = xsensor.als_vis()。 |
![]() | 串口 | 一次打印多个值。 | 体验:print(接近值, 滑动互补值)。 |
![]() | 变量 | 读取变量当前值。 | 载入后可在工具箱对照本课用法。 |
![]() | 控制 | 满足条件时执行对应分支,用于按键、传感阈值的判断。 | 载入后可在工具箱对照本课用法。 |
![]() | 逻辑 | 组合多个条件。 | 载入后可在工具箱对照本课用法。 |
![]() | 逻辑 | 比较两个值(大于/等于/小于等),得到真或假。 | 载入后可在工具箱对照本课用法。 |
![]() | 板载执行 | 设置板载状态灯开关(setonoff)。 | 体验:占用红(1),空闲绿(2)。 |
![]() | 控制 | 暂停指定时间,常用于动画节奏或等待。 | 载入后可在工具箱对照本课用法。 |
![]() | 控制 | 按固定周期触发回调,适合节拍、采样。 | 完整代码:Timer 0、period=1000,回调里累加停放计时。 |
![]() | 板载显示 | 按设定时间显示图案或字符串。 | 完整代码:占用时点阵显示停放计时。 |
![]() | 函数 | 封装一段可重复调用的积木。 | 载入后可在工具箱对照本课用法。 |
![]() | 变量 | 声明在函数内外都能用的变量。 | 载入后可在工具箱对照本课用法。 |
![]() | 数学 | 对变量做 +=、-= 等自身运算。 | 完整代码:停放计时 += 1。 |
六、知识点讲解
本课核心是双条件占用:接近够近、环境够暗,两件事同时成立才把 1 号灯设成红。不是图像识别。
接近值
ps_nl() 越大越像有物体靠近。体验阈值是 50。
滑动互补值
als_vis() 越小越暗。体验阈值是 30。只用滑动量会把阴天当成「有车」。
停放计时
完整代码在占用期间让定时器每秒 +1,离开就把计时和「开始停放」清掉。
- 改接近阈值或滑动量阈值再运行,红灯难易会变。
- 过关:能口述「为什么必须用并且,不能只看接近」。
先对灯色,再对照完整代码的点阵秒数。
七、编程练习
点「载入」打开 MixVM(board=mixgo_zero_design)。在 Mixly 工具栏点「运行 / 停止」,「检查」做关键字核对。请先读本页「四、解题思路」与「五、图形块功能讲解」,再点载入。
aW1wb3J0IG1hY2hpbmUKaW1wb3J0IGx0cjU1M2Fscwpmcm9tIG1peGdvX3plcm8gaW1wb3J0IG9uYm9hcmRfbGVkCmltcG9ydCB0aW1lCgoKaTJjX2V4dGVuZCA9IG1hY2hpbmUuU29mdEkyQyhzY2wgPSBtYWNoaW5lLlBpbigxNiksIHNkYT1tYWNoaW5lLlBpbigxNyksIGZyZXE9MTAwMDAwKQp4c2Vuc29yID0gbHRyNTUzYWxzLkxUUl81NTNBTFMoaTJjX2V4dGVuZCkKd2hpbGUgVHJ1ZToKICAgIOaOpei/keWAvCA9IHhzZW5zb3IucHNfbmwoKQogICAg5ruR5Yqo5LqS6KGl5YC8ID0geHNlbnNvci5hbHNfdmlzKCkKICAgIHByaW50KOaOpei/keWAvCwg5ruR5Yqo5LqS6KGl5YC8KQogICAgaWYg5o6l6L+R5YC8ID4gNTAgYW5kIOa7keWKqOS6kuihpeWAvCA8IDMwOgogICAgICAgIG9uYm9hcmRfbGVkLnNldG9ub2ZmKDEsMCkKICAgICAgICBvbmJvYXJkX2xlZC5zZXRvbm9mZigyLDEpCiAgICBlbHNlOgogICAgICAgIG9uYm9hcmRfbGVkLnNldG9ub2ZmKDEsMSkKICAgICAgICBvbmJvYXJkX2xlZC5zZXRvbm9mZigyLDApCiAgICB0aW1lLnNsZWVwKDEpCg==","design":{"devices":[{"id":"zero-main","type":"mixgo_zero","x":0,"y":0},{"id":"ltr553als-1","type":"ltr553als","x":-176,"y":-41}],"wires":[{"from":{"deviceId":"zero-main","pin":"P16"},"to":{"deviceId":"ltr553als-1","pin":"SCL"}},{"from":{"deviceId":"zero-main","pin":"P17"},"to":{"deviceId":"ltr553als-1","pin":"SDA"}},{"from":{"deviceId":"ltr553als-1","pin":"VCC"},"to":{"deviceId":"zero-main","pin":"5V0_L1"}},{"from":{"deviceId":"ltr553als-1","pin":"GND"},"to":{"deviceId":"zero-main","pin":"GND_L1"}}]}},{"title":"编程题1:完整代码","hint":"1-1-2 滑动接近检测并计时.mix。阅读运行。","starter":"import machine\nimport ltr553als\nfrom mixgo_zero import onboard_led\nfrom mixgo_zero import onboard_matrix\nimport random\n\n\ndef tim_callback(tim):\n global 停放计时\n global 开始停放\n if 开始停放:\n 停放计时 += 1\n\n\n\ni2c_extend = machine.SoftI2C(scl = machine.Pin(16), sda=machine.Pin(17), freq=100000)\nxsensor = ltr553als.LTR_553ALS(i2c_extend)\ntim = machine.Timer(0, period=1000, mode=machine.Timer.PERIODIC, callback=tim_callback)\n停放计时 = 0\n开始停放 = False\nwhile True:\n 接近值 = xsensor.ps_nl()\n 滑动互补值 = random.randint(1, 1000)\n print(接近值, 滑动互补值)\n if 接近值 > 50 and 滑动互补值 < 30:\n 开始停放 = True\n onboard_led.setonoff(1,0)\n onboard_led.setonoff(2,1)\n onboard_matrix.shows(停放计时, space=0, center=True)\n else:\n onboard_led.setonoff(1,1)\n onboard_led.setonoff(2,0)\n 停放计时 = 0\n 开始停放 = False\n","kind":"full","expect_contains":["mixgo_zero","onboard_matrix","onboard_led","ltr553als","setonoff","random"],"mix":"aW1wb3J0IG1hY2hpbmUKaW1wb3J0IGx0cjU1M2Fscwpmcm9tIG1peGdvX3plcm8gaW1wb3J0IG9uYm9hcmRfbGVkCmZyb20gbWl4Z29femVybyBpbXBvcnQgb25ib2FyZF9tYXRyaXgKCgpkZWYgdGltX2NhbGxiYWNrKHRpbSk6CiAgICBnbG9iYWwg5YGc5pS+6K6h5pe2CiAgICBnbG9iYWwg5byA5aeL5YGc5pS+CiAgICBpZiDlvIDlp4vlgZzmlL46CiAgICAgICAg5YGc5pS+6K6h5pe2ICs9IDEKCgoKaTJjX2V4dGVuZCA9IG1hY2hpbmUuU29mdEkyQyhzY2wgPSBtYWNoaW5lLlBpbigxNiksIHNkYT1tYWNoaW5lLlBpbigxNyksIGZyZXE9MTAwMDAwKQp4c2Vuc29yID0gbHRyNTUzYWxzLkxUUl81NTNBTFMoaTJjX2V4dGVuZCkKdGltID0gbWFjaGluZS5UaW1lcigwLCBwZXJpb2Q9MTAwMCwgbW9kZT1tYWNoaW5lLlRpbWVyLlBFUklPRElDLCBjYWxsYmFjaz10aW1fY2FsbGJhY2spCuWBnOaUvuiuoeaXtiA9IDAK5byA5aeL5YGc5pS+ID0gRmFsc2UKd2hpbGUgVHJ1ZToKICAgIOaOpei/keWAvCA9IHhzZW5zb3IucHNfbmwoKQogICAg5ruR5Yqo5LqS6KGl5YC8ID0geHNlbnNvci5hbHhfdmlzKCkKICAgIHByaW50KOaOpei/keWAvCwg5ruR5Yqo5LqS6KGl5YC8KQogICAgaWYg5o6l6L+R5YC8ID4gNTAgYW5kIOa7keWKqOS6kuihpeWAvCA8IDMwOgogICAgICAgIOW8gOWni+WBnOaUviA9IFRydWUKICAgICAgICBvbmJvYXJkX2xlZC5zZXRvbm9mZigxLDApCiAgICAgICAgb25ib2FyZF9sZWQuc2V0b25vZmYoMiwxKQogICAgICAgIG9uYm9hcmRfbWF0cml4LnNob3dzKOWBnOaUvuiuoeaXtiwgc3BhY2U9MCwgY2VudGVyPVRydWUpCiAgICBlbHNlOgogICAgICAgIG9uYm9hcmRfbGVkLnNldG9ub2ZmKDEsMSkKICAgICAgICBvbmJvYXJkX2xlZC5zZXRvbm9mZigyLDApCiAgICAgICAg5YGc5pS+6K6h5pe2ID0gMAogICAgICAgIOW8gOWni+WBnOaUviA9IEZhbHNlCg==","design":{"devices":[{"id":"zero-main","type":"mixgo_zero","x":0,"y":0},{"id":"ltr553als-1","type":"ltr553als","x":-176,"y":-41}],"wires":[{"from":{"deviceId":"zero-main","pin":"P16"},"to":{"deviceId":"ltr553als-1","pin":"SCL"}},{"from":{"deviceId":"zero-main","pin":"P17"},"to":{"deviceId":"ltr553als-1","pin":"SDA"}},{"from":{"deviceId":"ltr553als-1","pin":"VCC"},"to":{"deviceId":"zero-main","pin":"5V0_L1"}},{"from":{"deviceId":"ltr553als-1","pin":"GND"},"to":{"deviceId":"zero-main","pin":"GND_L1"}}]}},{"title":"编程题2:补全","hint":"在「1-1-1 滑动接近检测.mix」基础上补全 TODO。","starter":"import machine\nimport ltr553als\nfrom mixgo_zero import onboard_led\nimport time\nimport random\n\n\ni2c_extend = machine.SoftI2C(scl = machine.Pin(16), sda=machine.Pin(17), freq=100000)\nxsensor = ltr553als.LTR_553ALS(i2c_extend)\nwhile True:\n 接近值 = xsensor.ps_nl()\n 滑动互补值 = random.randint(1, 1000)\n print(接近值, 滑动互补值)\n if 接近值 > 50 and 滑动互补值 < 30:\n onboard_led.setonoff(1,0)\n onboard_led.setonoff(2,1)\n else:\n onboard_led.setonoff(1,1)\n onboard_led.setonoff(2,0)\n # TODO: 对照官方示例补全下一行\n pass # 原: time.sleep(1)\n","kind":"fill","expect_contains":["mixgo_zero","onboard_led","ltr553als","ps_nl","setonoff","random"],"mix":"aW1wb3J0IG1hY2hpbmUKaW1wb3J0IGx0cjU1M2Fscwpmcm9tIG1peGdvX3plcm8gaW1wb3J0IG9uYm9hcmRfbGVkCmltcG9ydCB0aW1lCgoKaTJjX2V4dGVuZCA9IG1hY2hpbmUuU29mdEkyQyhzY2wgPSBtYWNoaW5lLlBpbigxNiksIHNkYT1tYWNoaW5lLlBpbigxNyksIGZyZXE9MTAwMDAwKQp4c2Vuc29yID0gbHRyNTUzYWxzLkxUUl81NTNBTFMoaTJjX2V4dGVuZCkKd2hpbGUgVHJ1ZToKICAgIOaOpei/keWAvCA9IHhzZW5zb3IucHNfbmwoKQogICAg5ruR5Yqo5LqS6KGl5YC8ID0geHNlbnNvci5hbHNfdmlzKCkKICAgIHByaW50KOaOpei/keWAvCwg5ruR5Yqo5LqS6KGl5YC8KQogICAgaWYg5o6l6L+R5YC8ID4gNTAgYW5kIOa7keWKqOS6kuihpeWAvCA8IDMwOgogICAgICAgIG9uYm9hcmRfbGVkLnNldG9ub2ZmKDEsMCkKICAgICAgICBvbmJvYXJkX2xlZC5zZXRvbm9mZigyLDEpCiAgICBlbHNlOgogICAgICAgIG9uYm9hcmRfbGVkLnNldG9ub2ZmKDEsMSkKICAgICAgICBvbmJvYXJkX2xlZC5zZXRvbm9mZigyLDApCiAgICAjIFRPRE86IOWvueeFp+WumOaWueekuuS+i+ihpeWFqOS4i+S4gOihjAogICAgcGFzcyAgIyDljp86IHRpbWUuc2xlZXAoMSkK","mixlyView":"block","design":{"devices":[{"id":"zero-main","type":"mixgo_zero","x":0,"y":0},{"id":"ltr553als-1","type":"ltr553als","x":-176,"y":-41}],"wires":[{"from":{"deviceId":"zero-main","pin":"P16"},"to":{"deviceId":"ltr553als-1","pin":"SCL"}},{"from":{"deviceId":"zero-main","pin":"P17"},"to":{"deviceId":"ltr553als-1","pin":"SDA"}},{"from":{"deviceId":"ltr553als-1","pin":"VCC"},"to":{"deviceId":"zero-main","pin":"5V0_L1"}},{"from":{"deviceId":"ltr553als-1","pin":"GND"},"to":{"deviceId":"zero-main","pin":"GND_L1"}}]}},{"title":"编程题3:从头编写","hint":"对照「1-1-1 滑动接近检测.mix」独立完成。","starter":"# 编写:完成「滑动接近检测」(参考官方示例积木/代码)\nimport machine\nimport ltr553als\nfrom mixgo_zero import onboard_led\nimport time\n\n","kind":"blank","expect_contains":["mixgo_zero","onboard_led","ltr553als"],"mixlyView":"block","mix":"","design":{"devices":[{"id":"zero-main","type":"mixgo_zero","x":0,"y":0},{"id":"ltr553als-1","type":"ltr553als","x":-176,"y":-41}],"wires":[{"from":{"deviceId":"zero-main","pin":"P16"},"to":{"deviceId":"ltr553als-1","pin":"SCL"}},{"from":{"deviceId":"zero-main","pin":"P17"},"to":{"deviceId":"ltr553als-1","pin":"SDA"}},{"from":{"deviceId":"ltr553als-1","pin":"VCC"},"to":{"deviceId":"zero-main","pin":"5V0_L1"}},{"from":{"deviceId":"ltr553als-1","pin":"GND"},"to":{"deviceId":"zero-main","pin":"GND_L1"}}]}}]"data-lab-kind="demo">1-1-1 滑动接近检测.mix。载入后运行。
正在载入编程环境
正在载入 MixGo ZERO 仿真编程环境…
八、课堂练习
先完成两道判断题,再完成选择题;全部选定后点「检查」。
判断:本课体验是用摄像头像素/二值化判断车位。
判断:只有接近>50 并且 滑动量<30 时,1 号灯才设为红色。
体验题空闲时 1 号灯应是?
完整代码里停放计时何时增加?
九、本节小结
记住:红灯要接近够近并且够暗;点阵停放计时是 1-1-2。















