на 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+---+------+----------+-----+-----+
Код: Выделить всё
git clone --recursive git://github.com/ninjablocks/433Utils.git
cd 433Utils/RPi_utils
правим файлы: 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
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);
}
при получении кода он запускает bash скрипт с именем sendmd который должен находиться вместе с программой RFSniffer
у меня sendmd запускает стандартный сценарий RCSwitch и передает ему код, можно заменить на свой
curl "http://192.168.1.2/objects/?script=RCSw ... switch="$1
Код: Выделить всё
make
Код: Выделить всё
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
Код: Выделить всё
git clone https://github.com/lexruee/pi-switch-python.git
cd pi-switch-python
sudo python setup.py install
Код: Выделить всё
#!/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)
если питон 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");
}
Для отправки кода через передатчик копируем из папки 433Utils/RPi_utils файл codesend
вставляем в место откуда надо отправлять код:
Код: Выделить всё
exec ("/var/www/codesend 777777");
При чем Вы можете подключить и 315 МГц и 433 МГц приемники и передатчики одновременно на разные порты.
Скомпилированные rfswitch и codesend, а так же исходник RFSniffer.cpp и sendmd в приложенном файле.
архив содержит следующие файлы:
codesend433 - передатчик на GPIO1
codesend315 - передатчик на GPIO3
rfsniffer315 - приемник на GPIO4 (пауза 0,5 сек)
rfsniffer433 - приемник на GPIO7 (пауза 0,5 сек)
RFSniffer.cpp
sendmd