一、传感妙用

第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. 1明确任务「滑动接近检测」:外接 LTR553:接近用 ps_nl(),滑动互补值用 als_vis(),再开关指示灯。
  2. 2写出占用条件:接近>50 并且 滑动量<30。
  3. 3占用则灯2亮(禁行),否则灯1亮(放行);每轮 sleep 1 秒。
  4. 4完整代码用「开始停放」打开定时器累加,离开则计时清零。

流程示意(可对照左侧文字)

任务:滑动接近检测搭出主循环,让程序一直运行…判断传感或变量是否达到阈值…把计算结果映射到可观察输出…加入延时(约1秒/单位),…

五、图形块功能讲解

下面只列出本课首次出现的 Mixly 图形块(真积木截图)。已在前面课讲过的不再重复;先认新块,再点「载入」对照拖搭。

图形块分类作用本课用法
重复执行
控制按条件反复执行内部积木;条件为「真」时相当于 while True 无限循环。载入后可在工具箱对照本课用法。
赋值
变量给变量写入新值。载入后可在工具箱对照本课用法。
外接 LTR553 接近
外设LTR553 红外接近计数 ps_nl()。体验:接近值 = xsensor.ps_nl()。
外接 LTR553 光强
外设LTR553 可见光 als_vis()。体验:滑动互补值 = xsensor.als_vis()。
打印多项
串口一次打印多个值。体验:print(接近值, 滑动互补值)。
取变量
变量读取变量当前值。载入后可在工具箱对照本课用法。
如果…那么…
控制满足条件时执行对应分支,用于按键、传感阈值的判断。载入后可在工具箱对照本课用法。
并且/或者
逻辑组合多个条件。载入后可在工具箱对照本课用法。
比较
逻辑比较两个值(大于/等于/小于等),得到真或假。载入后可在工具箱对照本课用法。
板载指示灯开关
板载执行设置板载状态灯开关(setonoff)。体验:占用红(1),空闲绿(2)。
延时
控制暂停指定时间,常用于动画节奏或等待。载入后可在工具箱对照本课用法。
设置定时器
控制按固定周期触发回调,适合节拍、采样。完整代码:Timer 0、period=1000,回调里累加停放计时。
显示图案或文字
板载显示按设定时间显示图案或字符串。完整代码:占用时点阵显示停放计时。
定义函数
函数封装一段可重复调用的积木。载入后可在工具箱对照本课用法。
全局变量
变量声明在函数内外都能用的变量。载入后可在工具箱对照本课用法。
math selfcalcu
数学对变量做 +=、-= 等自身运算。完整代码:停放计时 += 1。

六、知识点讲解

本课核心是双条件占用:接近够近、环境够暗,两件事同时成立才把 1 号灯设成红。不是图像识别。

接近值

ps_nl() 越大越像有物体靠近。体验阈值是 50。

滑动互补值

als_vis() 越小越暗。体验阈值是 30。只用滑动量会把阴天当成「有车」。

停放计时

完整代码在占用期间让定时器每秒 +1,离开就把计时和「开始停放」清掉。

  • 改接近阈值或滑动量阈值再运行,红灯难易会变。
  • 过关:能口述「为什么必须用并且,不能只看接近」。

先对灯色,再对照完整代码的点阵秒数。

七、编程练习

点「载入」打开 MixVM(board=mixgo_zero_design)。在 Mixly 工具栏点「运行 / 停止」,「检查」做关键字核对。请先读本页「四、解题思路」与「五、图形块功能讲解」,再点载入。

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 time.sleep(1)\n\""data-lab-options="[{"title":"编程体验","hint":"1-1-1 滑动接近检测.mix。载入后运行。","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 time.sleep(1)\n","kind":"demo","expect_contains":["mixgo_zero","onboard_led","ltr553als","ps_nl","setonoff","random"],"mix":"i2c_extend1617100000LTR553ALSi2c_extendxsensorWHILETRUE接近值PS_NLxsensor滑动互补值ALX_VISxsensor接近值滑动互补值ANDGT接近值50LT滑动互补值3010211120s1{}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":"timi2c_extend1617100000LTR553ALSi2c_extendxsensorPERIODICtim01000tim_callback停放计时0开始停放FALSEWHILETRUE接近值PS_NLxsensor滑动互补值ALX_VISxsensor接近值滑动互补值ANDGT接近值50LT滑动互补值30开始停放TRUE1021TrueMixly停放计时01120停放计时0开始停放FALSEtim_callback停放计时开始停放开始停放ADDa停放计时1{}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":"i2c_extend1617100000LTR553ALSi2c_extendxsensorWHILETRUE接近值PS_NLxsensor滑动互补值ALX_VISxsensor接近值滑动互补值ANDGT接近值50LT滑动互补值3010211120s1{}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。载入后运行。

八、课堂练习

先完成两道判断题,再完成选择题;全部选定后点「检查」。

  1. 判断:本课体验是用摄像头像素/二值化判断车位。

  2. 判断:只有接近>50 并且 滑动量<30 时,1 号灯才设为红色。

  3. 体验题空闲时 1 号灯应是?

  4. 完整代码里停放计时何时增加?

九、本节小结

记住:红灯要接近够近并且够暗;点阵停放计时是 1-1-2。