RF 433 MHZ

      Geen reacties op RF 433 MHZ

Met 433MHz zend- en ontvangstmodules kun je in je home automation verschillende apparaten automatiseren die normaal met een RF 433 MHz draadloze afstandsbediening werken.

Het bekendste voorbeeld zijn de klikaanklikuit stopcontactsetjes die je overal kunt kopen. Ze worden vooral gebruikt voor het op afstand bedienen van traditionele schemerlampen.

zend- en ontvangstmodule

Zendmodule (links) en ontvangstmodule voor de 433MHz UHF-band.

Aansluitschema voor de 433MHz send- (links) en receiver-modules op de Raspberry Pi.

Verschillende goedkope varianten van die setjes kun je ook met de Raspberry Pi bedienen in je domotica-systeem. Je hebt daarvoor twee elektronische schakelingen nodig: een zendmodule en een ontvangstmodule voor de 433MHz UHF-band (LPD433, low power device 433 MHz).

Online wordt op verschillende plaatsen goed uitgelegd hoe het een en ander werkt en hoe je een klikaanklikuit-setje met de Pi kunt automatiseren. Daar vind je ook de Python-scripts Links hieronder:
https://pypi.org/project/rpi-rf/
https://www.piddlerintheroot.com/rf-433-mhz/
https://www.instructables.com/Super-Simple-Raspberry-Pi-433MHz-Home-Automation/

Hoe het werkt

Kopieer de twee scripts receive.py en send.py naar de home-directory van gebruiker pi.
Start eerst receive.py. Dit script scan automatisch alle apparaten die op 433MHz zenden in de directe omgeving. Gebruik de afstandsbediening van je klikaanklikuit-setje om codes te genereren. Elk ontvangen signaal verschijnt op een nieuwe regel. Schrijf het codecijfer, de pulslengte en het protocolnummer op. Die heb je nodig als input voor het script send.py.

output_receiver

Voorbeeld van de output van het script receive.py.

Stop het script receive.py met Ctrl+C en start het script send.py. Je kunt dan een foutmelding en uitleg. Dit script verwacht namelijk drie parameters: pulselength (-p) , protocol (-t) en CODE. Dit laatste is de cijferreeks die bij receive als eerste achter de dubbele punt staat. Een voorbeeld:

python3 send.py -p 396 -t 1 32

 

output_sender

Voorbeeld in- en output van het script send.py.

Voorbereidingen

sudo apt-get install python3-pip
sudo pip3 install rpi-rf

Scripts

receive.py:

#!/usr/bin/env python3
# receive.py

import argparse
import signal
import sys
import time
import logging

from rpi_rf import RFDevice

rfdevice = None

# pylint: disable=unused-argument
def exithandler(signal, frame):
rfdevice.cleanup()
sys.exit(0)

logging.basicConfig(level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S',
format='%(asctime)-15s - [%(levelname)s] %(module)s: %(message)s', )

parser = argparse.ArgumentParser(description='Receives a decimal code via a 433/315MHz GPIO device')
parser.add_argument('-g', dest='gpio', type=int, default=27,
help="GPIO pin (Default: 27)")
args = parser.parse_args()

signal.signal(signal.SIGINT, exithandler)
rfdevice = RFDevice(args.gpio)
rfdevice.enable_rx()
timestamp = None
logging.info("Listening for codes on GPIO " + str(args.gpio))
while True:
if rfdevice.rx_code_timestamp != timestamp:
timestamp = rfdevice.rx_code_timestamp
logging.info(str(rfdevice.rx_code) +
" [pulselength " + str(rfdevice.rx_pulselength) +
", protocol " + str(rfdevice.rx_proto) + "]")
time.sleep(0.01)
rfdevice.cleanup()

send.py:

#!/usr/bin/env python3
#send.py

import argparse
import logging

from rpi_rf import RFDevice

logging.basicConfig(level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S',
format='%(asctime)-15s - [%(levelname)s] %(module)s: %(message)s',)

parser = argparse.ArgumentParser(description='Sends a decimal code via a 433/315MHz GPIO device')
parser.add_argument('code', metavar='CODE', type=int,
help="Decimal code to send")
parser.add_argument('-g', dest='gpio', type=int, default=17,
help="GPIO pin (Default: 17)")
parser.add_argument('-p', dest='pulselength', type=int, default=None,
help="Pulselength (Default: 350)")
parser.add_argument('-t', dest='protocol', type=int, default=None,
help="Protocol (Default: 1)")
args = parser.parse_args()

rfdevice = RFDevice(args.gpio)
rfdevice.enable_tx()

if args.protocol:
protocol = args.protocol
else:
protocol = "default"
if args.pulselength:
pulselength = args.pulselength
else:
pulselength = "default"
logging.info(str(args.code) +
" [protocol: " + str(protocol) +
", pulselength: " + str(pulselength) + "]")

rfdevice.tx_code(args.code, args.protocol, args.pulselength)
rfdevice.cleanup()