云天 发表于 2020-5-8 10:36:40

【智控万物】CodeLab Adapter控制树莓派GPIO

【前言】操作树莓派 GPIO 的工具里,gpiozero尤为出色,因其具有很好的可理解性。
【准备】
参考:https://adapter.codelab.club/extension_guide/rpi_gpio/
【查看引脚】
gpio用的mode是wPi,而gpiozero用的是BCM,所以pin17对应wpi的pin0



【查看代码】
node_raspberrypi.py
'''
pip install gpiozero pigpio --user
# docs: https://gpiozero.readthedocs.io/en/stable/remote_gpio.html
'''
from io import StringIO
import contextlib
import sys
import time
import os# env

from loguru import logger
from codelab_adapter_client import AdapterNode
from codelab_adapter_client.utils import get_or_create_node_logger_dir

#ERO_PIN_FACTORY=pigpio PIGPIO_ADDR= "raspberrypi.local"# 192.168.1.3
#os.environ["GPIOZERO_PIN_FACTORY"] = "pigpio"
#os.environ["PIGPIO_ADDR"] = "raspberrypi.local"

from gpiozero import LED
from gpiozero.pins.pigpio import PiGPIOFactory
from time import sleep

node_logger_dir = get_or_create_node_logger_dir()
debug_log = str(node_logger_dir / "debug.log")
logger.add(debug_log, rotation="1 MB", level="DEBUG")


class RPINode(AdapterNode):
    def __init__(self):
      super().__init__(logger=logger)
      self.NODE_ID = self.generate_node_id(__file__)
      #self.factory = PiGPIOFactory(host='127.0.0.1')# 192.168.1.3
      self.factory = PiGPIOFactory(host='raspberrypi.local')# 192.168.1.3
      # 反馈 连接成功, 与失败
      self.led = LED(17, pin_factory=self.factory)

    def run_python_code(self, code):
      try:
            output = eval(code, {"__builtins__": None}, {
                "led": self.led,
                "factory": self.factory
            })
      except Exception as e:
            output = e
      return output

    def extension_message_handle(self, topic, payload):
      self.logger.info(f'code: {payload["content"]}')
      message_id = payload.get("message_id")
      python_code = payload["content"]
      output = self.run_python_code(python_code)
      payload["content"] = str(output)
      message = {"payload": payload}
      self.publish(message)

    def run(self):
      "避免插件结束退出"
      while self._running:
            time.sleep(0.5)


if __name__ == "__main__":
    try:
      node = RPINode()
      node.receive_loop_as_thread()
      node.run()
    except KeyboardInterrupt:
      # node.logger.debug("KeyboardInterrupt") # work mac
      if node._running:
            node.terminate()# Clean up before exiting.
Adapter Node,可参考:https://adapter.codelab.club/dev_guide/Adapter-Node/
【CodeLab Scratch代码】

【验证】
也是用gpio验证



个人学习备注(一):Node RED 树莓派物联网
1、Node-RED安装与使用
https://blog.csdn.net/fnFenNuDManMan/article/details/104834919?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1

    1.1Node-Red在windows上的安装和运行
         https://www.jianshu.com/p/185242483016
      如出现如下错误:
      
       这样的问题 经过搜索得出
       1.管理员身份打开powerShell
       2.输入set-ExecutionPolicy RemoteSigned
      
      浏览器地址栏中输入:http://127.0.0.1:1880/
      
2、node-red教程2 第一条数据流
https://blog.csdn.net/geek_monkey/article/details/80736954?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1

3、node-red教程3.1 inject介绍
https://blog.csdn.net/geek_monkey/article/details/80737818

4、node-red教程 3.4 switch控件介绍
https://blog.csdn.net/geek_monkey/article/details/80738104
个人学习备注(二):python3控制树莓派的GPIO端口
https://blog.csdn.net/qq_36958104/article/details/83447224?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1










DFrJ5KYVQaH 发表于 2020-5-8 11:58:37

好文章,认真学习
页: [1]
查看完整版本: 【智控万物】CodeLab Adapter控制树莓派GPIO