Страница 1 из 1

OrangePi PC + 315/433 МГц приемник/передатчик

Добавлено: Пн окт 02, 2017 10:49 pm
immortal
Настроил приемник и передатчик 315/433 МГц на OrangePiPC
на RaspberryPi аналогично, только вместо WiringOP надо WiringPi

подключение:
приемник на ногу 7 (GPIO7) 15 (GPIO3)
передатчик на ногу 12 (GPIO1) 16 (GPIO4)
Можно изменить на другие.

1. Устанавливаем WiringOP

Код: Выделить всё

git clone https://github.com/zhaolei/WiringOP.git -b h3 
cd WiringOP
chmod +x ./build
sudo ./build
проверяем работу

Код: Выделить всё

gpio readall
СпойлерПоказать

Код: Выделить всё

+-----+-----+----------+------+---+-Orange Pi+---+---+------+---------+-----+--+
 | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
 +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
 |     |     |     3.3v |      |   |  1 || 2  |   |      | 5v       |     |     |
 |  12 |   8 |    SDA.0 | ALT5 | 0 |  3 || 4  |   |      | 5V       |     |     |
 |  11 |   9 |    SCL.0 | ALT5 | 0 |  5 || 6  |   |      | 0v       |     |     |
 |   6 |   7 |   GPIO.7 | ALT2 | 0 |  7 || 8  | 1 | OUT  | TxD3     | 15  | 13  |
 |     |     |       0v |      |   |  9 || 10 | 0 | ALT4 | RxD3     | 16  | 14  |
 |   1 |   0 |     RxD2 | ALT5 | 0 | 11 || 12 | 0 | ALT3 | GPIO.1   | 1   | 110 |
 |   0 |   2 |     TxD2 | ALT5 | 1 | 13 || 14 |   |      | 0v       |     |     |
 |   3 |   3 |     CTS2 | ALT3 | 0 | 15 || 16 | 0 | ALT3 | GPIO.4   | 4   | 68  |
 |     |     |     3.3v |      |   | 17 || 18 | 0 | ALT3 | GPIO.5   | 5   | 71  |
 |  64 |  12 |     MOSI | ALT4 | 0 | 19 || 20 |   |      | 0v       |     |     |
 |  65 |  13 |     MISO | ALT4 | 0 | 21 || 22 | 0 | OUT  | RTS2     | 6   | 2   |
 |  66 |  14 |     SCLK | ALT4 | 0 | 23 || 24 | 0 | ALT4 | CE0      | 10  | 67  |
 |     |     |       0v |      |   | 25 || 26 | 0 | ALT3 | GPIO.11  | 11  | 21  |
 |  19 |  30 |    SDA.1 | ALT4 | 0 | 27 || 28 | 0 | ALT4 | SCL.1    | 31  | 18  |
 |   7 |  21 |  GPIO.21 | ALT3 | 0 | 29 || 30 |   |      | 0v       |     |     |
 |   8 |  22 |  GPIO.22 | ALT3 | 0 | 31 || 32 | 0 | ALT3 | RTS1     | 26  | 200 |
 |   9 |  23 |  GPIO.23 | ALT3 | 0 | 33 || 34 |   |      | 0v       |     |     |
 |  10 |  24 |  GPIO.24 | ALT3 | 0 | 35 || 36 | 0 | ALT3 | CTS1     | 27  | 201 |
 |  20 |  25 |  GPIO.25 | ALT3 | 0 | 37 || 38 | 0 | ALT5 | TxD1     | 28  | 198 |
 |     |     |       0v |      |   | 39 || 40 | 0 | ALT5 | RxD1     | 29  | 199 |
 +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
 | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
 +-----+-----+----------+------+---+-Orange Pi+---+------+----------+-----+-----+
2. Устанавливаем 433Utils

Код: Выделить всё

git clone --recursive git://github.com/ninjablocks/433Utils.git
cd 433Utils/RPi_utils
перед тем как делать make надо поменять порты к которым подключены приемник и передатчик
правим файлы: RFSniffer.cpp, codesend.cpp и send.cpp
находим там строчку в которой задается порт
int PIN = 0;
для RFSniffer.cpp порт 7 (3)
для codesend.cpp и send.cpp порт 1 (4)
Так же нам надо чтобы RFSniffer отправлял код в MajorDomo, поскольку в си мудрено отправляются http запросы я сделал из программы запуск bash скрипта, RFSniffer.cpp должен иметь следующий вид
RFSniffer.cppПоказать

Код: Выделить всё

/*
  RFSniffer

  Usage: ./RFSniffer [<pulseLength>]
  [] = optional

  Hacked from http://code.google.com/p/rc-switch/
  by @justy to provide a handy RF code sniffer
*/

#include "../rc-switch/RCSwitch.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

     
     
RCSwitch mySwitch;
int rfcode;
char sendrf;
char sendrf2[30];


int main(int argc, char *argv[]) {
  
     // This pin is not the first pin on the RPi GPIO header!
     // Consult https://projects.drogon.net/raspberry-pi/wiringpi/pins/
     // for more information.
     int PIN = 3;
     
     if(wiringPiSetup() == -1) {
       printf("wiringPiSetup failed, exiting...");
       return 0;
     }

     int pulseLength = 0;
     if (argv[1] != NULL) pulseLength = atoi(argv[1]);

     mySwitch = RCSwitch();
     if (pulseLength != 0) mySwitch.setPulseLength(pulseLength);
     mySwitch.enableReceive(PIN);  // Receiver on interrupt 0 => that is pin #2
     
    
     while(1) {
  
      if (mySwitch.available()) {
    
        int value = mySwitch.getReceivedValue();
    
        if (value == 0) {
          printf("Unknown encoding\n");
        } else {    

      rfcode = mySwitch.getReceivedValue();
          //printf("Received %i\n", rfcode );

char sendrf[10] = "./sendmd ";
sprintf(sendrf2, "%u",rfcode );
strcat (sendrf, sendrf2);
//printf ("%s",sendrf);
popen (sendrf, "r");

        }
    
        mySwitch.resetAvailable();
    
      }
sleep (1);
  }
  exit(0);
}
обязательно необходимо указывать параметр sleep (); можно его установить 0.5 секунды, если убрать то программа будет сильно грузить процессор и могут быть двойные срабатывания.
при получении кода он запускает bash скрипт с именем sendmd который должен находиться вместе с программой RFSniffer
у меня sendmd запускает стандартный сценарий RCSwitch и передает ему код, можно заменить на свой
sendmdПоказать
теперь можно делать:
если не компилируется и выдает ошибкиПоказать
ошибка:

Код: Выделить всё

make: *** Нет правила для сборки цели «../rc-switch/RCSwitch.o», требуемой для «send». Останов.
решение:

Код: Выделить всё

cd 433Utils
git submodule init
git submodule update
cd RPi_utils
make
ошибка:

Код: Выделить всё

g++ -DRPI   -c -o ../rc-switch/RCSwitch.o ../rc-switch/RCSwitch.cpp
g++ -DRPI   -c -o send.o send.cpp
g++ -DRPI  ../rc-switch/RCSwitch.o send.o -o send -lwiringPi
//usr/local/lib/libwiringPi.so: undefined reference to `pthread_join'
//usr/local/lib/libwiringPi.so: undefined reference to `pthread_create'
//usr/local/lib/libwiringPi.so: undefined reference to `pthread_cancel'
collect2: error: ld returned 1 exit status
Makefile:8: recipe for target 'send' failed
make: *** [send] Error 1
решение:
в файле /433Utils/RPi_utils/Makefile
в трех строках после
-lwiringPi добавить через пробел параметр -lpthread
теперь в консоли можно получать данные и и отправлять, но нам надо это делать в МД
3. Устанавливаем pi-switch-python
ставим необходимые пакеты

Код: Выделить всё

sudo apt-get install python-dev libboost-python-dev python-pip
устанавливаем pi-switch-python

Код: Выделить всё

git clone https://github.com/lexruee/pi-switch-python.git
cd pi-switch-python
sudo python setup.py install
Теперь нам надо чтобы код отсылал в МД данные, для этого надо модифицировать файл resiever, пользователь devoff модифицировал файл но у него под питон 3, у меня был питон 2.7 по этому мой файл выглядит так:
СпойлерПоказать

Код: Выделить всё

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
@author     Alexander Rüedlinger <a.rueedlinger@gmail.com>
@date       30.07.2015

"""
#for python3:
#import requests
#for python2.7
import urllib
#---------------
from pi_switch import RCSwitchReceiver
import time

receiver = RCSwitchReceiver()
#порт приемника
receiver.enableReceive(7)

num = 0


while True:
#      receiver.enableReceive(2)

#      print "Start : %s" % time.ctime()
      time.sleep( 0.1 )
#      print "End : %s" % time.ctime()
      
      if receiver.available():
         received_value = receiver.getReceivedValue()

         if received_value:
            num += 1
            #for python3
            #url = 'http://192.168.1.20/objects/?object=RCSwitch&op=set&p=code'
            #payload = {'v':received_value }
            #r = requests.get(url, params=payload)
            #print(r.url)
            #for python2.7
            rec_code = str(received_value)
            url = "http://localhost/objects/?script=RCSwitch&rcswitch=" + rec_code
            page = urllib.urlopen(url)
            text = page.read()
            page.close()
            #------------------

            print("Received[%s]:" % num)
            print(received_value)
            print("%s / %s bit" % (received_value, receiver.getReceivedBitlength()))
            print("Protocol: %s" % receiver.getReceivedProtocol())
            print("")
 
            receiver.resetAvailable()
time.sleep (0.2)
 
измените строку МД на свою, в данном примере используется стандартный сценарий RCSwitch который идет по умолчанию в МД
если питон 3 то раскоментируйте строки для питона 3 и закоментируйте для питона 2.7

сохраняем файл с названием pi_receiver.py
добавляем в загрузку этот файл под root, например rc.local
sudo python /root/pi_receiver.py
теперь код будет посылаться в МД.
В МД сценарий делаем например так

Код: Выделить всё

$id=$params['rcswitch'];
if ($id=='12345') {
 //sensor 1
callMethod("Switch1.switch");
}
if ($id=='12346') {
 //sensor 1
callMethod("Switch2.switch");
}
 
включение/выключение кнопок Switch

Для отправки кода через передатчик копируем из папки 433Utils/RPi_utils файл codesend
вставляем в место откуда надо отправлять код:

Код: Выделить всё

exec ("/var/www/codesend 777777"); 
где 777777 заменяем на свой код.

При чем Вы можете подключить и 315 МГц и 433 МГц приемники и передатчики одновременно на разные порты.

Скомпилированные rfswitch и codesend, а так же исходник RFSniffer.cpp и sendmd в приложенном файле.
архив содержит следующие файлы:
codesend433 - передатчик на GPIO1
codesend315 - передатчик на GPIO3
rfsniffer315 - приемник на GPIO4 (пауза 0,5 сек)
rfsniffer433 - приемник на GPIO7 (пауза 0,5 сек)
RFSniffer.cpp
sendmd

Re: OrangePi PC + 315/433 МГц приемник/передатчик

Добавлено: Ср фев 07, 2018 10:53 am
immortal
внес изменения в инструкцию, добавил скомпилированные файлы и сделал запуск снифера не через питон

Re: OrangePi PC + 315/433 МГц приемник/передатчик

Добавлено: Ср фев 07, 2018 11:52 am
VooDooN
А как дела с нагрузкой на проц? Я подобную штуку делал на RPi3 и там температура проца поднималась больше 70 градусов при включенном снифере. Хотя в обычном режиме была температура 50 градусов.

Re: OrangePi PC + 315/433 МГц приемник/передатчик

Добавлено: Сб фев 17, 2018 9:08 pm
burano
Автору огромный респект за код на питоне. Поставил модуль, подправил скрипт, сделал событие(не было стандартного). Теперь все радиовыключатели, датчики открытия, движения в чат Телеграмм отправляются.
VooDooN писал(а):А как дела с нагрузкой на проц?
Нагрузка на проц 17-18 % общая. Сам питон во время приема кода грузит проц на 1-3% остальное время менее 1%
Ложные получения кода есть, но я их в сценарии фильтрую.

Re: OrangePi PC + 315/433 МГц приемник/передатчик

Добавлено: Пн мар 12, 2018 12:37 pm
2xk
Подскажите как приёмо-передатчик который описан в инструкции должен выглядеть?
так?
Изображение

Re: OrangePi PC + 315/433 МГц приемник/передатчик

Добавлено: Вт мар 13, 2018 9:06 am
Берендей
Да, именно так может выглядеть.
Это самый простой и дешевый вариант, но вполне рабочий.