Raspberry Pi 및 BleuIO를 사용한 스마트폰 제어 홈 자동화

홈 오토메이션은 가정용 환경 장비를 자동화하는 것입니다. 이를 달성하기 위해 스마트 폰 앱을 사용하여 원격으로 제어할 수 있는 스마트 전구를 만들었습니다. 이 프로젝트의 목표는 집에서 스마트폰을 사용하여 다양한 가전 제품을 제어하는 ​​것입니다.

소개



이 예제는 스마트폰(또는 다른 BleuIO Dongle)에서 원격으로 RaspberryPi의 GPIO 핀을 제어하는 ​​방법을 보여줍니다.

이 예에서는 다음이 필요합니다.
  • 라즈베리파이
  • A BleuIO Bluetooth USB Dongle ( https://www.bleuio.com/ )
  • Python 스크립트 예제( https://github.com/smart-sensor-devices-ab/bleuio_rpi_switch_example )
  • GPIO 핀에 연결하는 방법(5V 릴레이 및 전구처럼)

  • 경고 – 이 프로젝트에는 심각한 부상이나 사망을 초래할 수 있는 고전압이 포함되어 있습니다. 필요한 모든 예방 조치를 취하고 작업하기 전에 회로의 모든 전원을 끄십시오.

    릴레이 연결



    주의:
    AC를 실험할 때는 항상 매우 조심하십시오. 감전으로 인해 심각한 부상을 입을 수 있습니다! 위험 고지, 책임 부인




    bleuio_rpi_switch_example.py에 대한 지침


  • BleuIO 동글을 RaspberryPi에 연결합니다.
  • 스크립트에서 변수 'switch'를 사용하려는 GPIO 핀으로 편집합니다. (pinout 명령을 사용하여 보드의 GPIO 핀을 보여주는 그래픽 보기를 얻을 수 있습니다.)


  • 마지막으로 Python 스크립트를 실행하고 휴대폰을 사용하여 BleuIO Dongle에 연결하고 온/오프 메시지를 보내 GPIO를 제어하십시오!

    모바일에서 BleuIO에 연결하기 위한 지침


  • 장치에 연결하고 읽고 쓸 수 있는 BLE 스캐닝 앱을 다운로드하십시오. (nRFConnect 또는 BLEScanner와 유사)
  • 동글을 찾으면 'BleuIO'로 광고됩니다.


  • BleuIO 동글에 연결합니다.
  • BleuIO가 명령을 수신하도록 하려면 먼저 흐름 제어 특성(UUID: 0783b03e-8535-b5a0-7140-a304d2495cb9)에 0x01을 작성해야 합니다.


  • 이제 서버 RX 데이터 특성(UUID: 0783b03e-8535-b5a0-7140-a304d2495cba)에 기록하여 GPIO를 제어할 수 있습니다.
    |CMD|효과|
    |–|–|
    |"SW=1"| 켜짐|
    |"SW=0"| 끄기|


    스크립트



    다음은 스마트폰 앱에서 메시지를 수신하고 조명을 제어하는 ​​데 도움이 되는 Python 스크립트입니다.

    #!/usr/bin/python3
    # Copyright 2022 Smart Sensor Devices in Sweden AB
    #
    # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
    # to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
    # and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
    # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
    #
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
    # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    
    import time
    import serial.tools.list_ports
    import serial
    import RPi.GPIO as io
    
    
    switch = 7  # Edit this to suit your setup! (7 = GPIO 04), use command pinout to graphically show you the GPIO pins for the board
    io.setmode(io.BOARD)
    io.setup(switch, io.OUT)
    
    master_array = []
    index = 1
    dongle_port = ""
    
    print("\nWelcome to BleuIO RaspberryPi Switch Example!\n")
    
    print("\nPlease insert dongle...")
    try:
        while len(master_array) == 0:
            m_ports = serial.tools.list_ports.comports(include_links=False)
            for port in m_ports:
                if str(port.hwid).__contains__("VID:PID=2DCF"):
                    master = port.device + " " + port.hwid
                    if master.__contains__("VID:PID=2DCF:6002"):
                        print("Found dongle in port: %s" % port.device)
                        master_array.append(master)
                        dongle_port = port
                        break
    
        for dongle in master_array:
            print("\nConnecting to BleuIO @ %s\n" % dongle)
    
        time.sleep(0.5)
        dongle_conn = serial.Serial(
            dongle_port.device,
            115200,
            timeout=1,
        )
    
        if not dongle_conn.is_open:
            dongle_conn.open()
    
        print("Starting Advertising...")
        dongle_conn.write("AT+GAPDISCONNECTALL\rAT+DUAL\rAT+ADVSTART\rATI\r".encode())
        read_tries = 0
        dongle_resp = ""
        while read_tries < 20:
            dongle_resp = dongle_conn.readline().decode()
            if "Not Advertising" in dongle_resp:
                dongle_conn.write("AT+ADVSTART\r")
            if b"Advertising\r\n" in dongle_resp.encode():
                break
            read_tries += 1
            time.sleep(0.01)
    
        if dongle_resp:
            print("BleuIO is %s" % dongle_resp)
        else:
            print("ERROR! No response...")
            exit()
    
        print(
            "Going into loop, waiting for signal to turn switch on/off...\n(Press Ctrl+C to abort)"
        )
        while True:
            try:
                dongle_resp = dongle_conn.readline().decode()
                if "SW=0" in dongle_resp:
                    print("Turn Switch off!")
                    io.output(switch, io.LOW)
                if "SW=1" in dongle_resp:
                    print("Turn Switch on!")
                    io.output(switch, io.HIGH)
            except KeyboardInterrupt:
                if dongle_conn.is_open:
                    dongle_conn.write("AT+GAPDISCONNECTALL\rAT+ADVSTOP\r".encode())
                    dongle_conn.close()
                    io.cleanup()
                print("\nBye!")
                exit()
    
    except Exception as e:
        print("(ERROR: %s)" % (e))
    


    산출



    우리는 전구를 켜고 끄기 위해 IOS 및 Android 전화 모두에서 nRFConnect 앱을 사용하여 스크립트를 테스트했습니다. 다음은 이 프로젝트의 출력입니다.

    좋은 웹페이지 즐겨찾기