Теперь по поводу серверной части. Понадобится один радиомодуль NRF24L01+ и raspberry pi. У меня на малинке установлен Raspbian. Инструкцию по подключению радиомодуля взял из сети. Если коротко и по русски, то подключаем радиомодуль как на картинке (картинку было лень рисовать, взял с того же сайта):
В моем исполнении это получилось вот так:
Радиомодуль подключается к малинке по шине SPI, запитывается от 3.3V. Говорят, стабильнее работает, если на VCC-GND радиомодуля подпаять конденсатор, но я лично разницы не заметил. Если всё подключили верно, открываем консоль в raspberry PI, и подготавливаем систему для работы с радиомодулем:
# #Работаю под рутом, если зашли под другим пользователем, используйте SUDO apt-get update apt-get install python-dev apt-get install python-rpi.gpio #добавляем ручками два модуля: i2c-bcm2708 i2c-dev nano /etc/modules apt-get install python-smbus apt-get install i2c-tools #ещё нужно убрать или закомментировать строки с spi и i2c модулями nano /etc/modprobe.d/raspi-blacklist.conf
Для работы с радиомодулем я использовал библиотеку librf24 для raspberry pi отсюда: https://github.com/jonathongrigg/RF24/tree/master/raspberrypi/librf24
В этом архиве собственно библиотека, которую я использовал и программа (rfsend), которую на raspberry pi можно использовать без компиляции в готовом виде. Нужно сделать chmod +x ./rfsend , чтобы приложение можно было запустить. Саму программу набросал на основе примера из той же библиотеки (под спойлером)
//rfsend.cpp
#include <stdio.h>;
#include <stdlib.h>;
#include <unistd.h>;
#include <string.h>;
#include <string>;
#include <getopt.h>;
#include <cstdlib>;
#include <iostream>;
#include "../RF24.h";
using namespace std;
RF24 radio("/dev/spidev0.0",8000000 , 25); //spi device, speed and CSN,only CSN is NEEDED in RPI
const int role_pin = 7;
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xf0f0f0f0d2LL };
static unsigned char inBuffer[32];
static unsigned char outBuffer[32];
void setup(void){
//Подготовка радиомодуля
printf("\nPreparing interfacen");
radio.begin();
radio.setRetries( 15, 15);
radio.setChannel(0x4c);
radio.setPALevel(RF24_PA_MAX);
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate(RF24_1MBPS);
radio.setAutoAck(1);
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
radio.startListening();
radio.printDetails();
}
// функция отправки данных
char SendCommand() {
// Останавливаем прием, на всякий случай
radio.stopListening();
//Отправляем буфер
bool ok = radio.write(outBuffer,32);
//Если ошибка, то возвращаем число 255
if (!ok) return 255;
radio.startListening();
unsigned long startlist = __millis();
bool timeout = false;
while (!radio.available() && !timeout) {
__msleep(10);
if (__millis()-startlist > 5000) timeout=true;
}
//Если не пришел ответ, возвращаем 254
if (timeout) return 254;
radio.read(inBuffer,32);
return inBuffer[0];
}
int main( int argc, char ** argv){
setup();
//char sb[32];
int par = 0;
for (int i=0;i<32;i++) outBuffer[i] = 0;
// sb[0] = 0;
if (!strcmp(argv[1],"-p")) outBuffer[0] = 'p';
if (!strcmp(argv[1],"-s")) outBuffer[0] = 's';
if (argv[2]!=NULL) par = atoi(argv[2]);
printf ("par=%dn",par);
outBuffer[1] = par;
char res = SendCommand();
//outBuffer[1] = 7;
//Обработку ошибок не делал, т.к. лень
printf("result: %c n",res);
printf("status: %d n",inBuffer[1]);
return 0;
}
Чтобы программа запускалась из любого места, я ее скопировал в папку /sbin/
Для просмотра состояния подсветки можно использовать rfsend -p
root@raspberrypi:/# rfsend -p Preparing interface SPI device = /dev/spidev0.0 SPI speed = 8000000 CE GPIO = 25 STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0 RX_ADDR_P0-1 = 0xf0f0f0f0e1 0xf0f0f0f0d2 RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6 TX_ADDR = 0xf0f0f0f0e1 RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00 EN_AA = 0x3f EN_RXADDR = 0x3f RF_CH = 0x4c RF_SETUP = 0x07 CONFIG = 0x0f DYNPD/FEATURE = 0x00 0x00 Data Rate = 1MBPS Model = nRF24L01+ CRC Length = 16 bits PA Power = PA_MAX par=0 result: ^ status: 15 root@raspberrypi:/#
Сначала выводится конфиг радиомодуля, вконце result – ответ от клиента, status – состояние порта. 15 соответственно означает, что 4 первых бита включены, естественно всё светится.
Для управления подсветкой использую команду “rfsend -s n” где n – требуемое состояние порта (от 0 до 15)
0 – всё выключено, 15 – всё включено. Сответственно каждый канал включается побитно (числа 1,2,4,8 в десятичном варианте)
Если я хочу включить зеленую подсветку, пишу rfsend -s 2
Синюю соответственно rfsend -s 4
Если нужно комбинировать – складываем 4 и 2 – “rfsend -s 6” для синей и зеленой одновременно.. Мало отличается от белого:
Когда всё проверили, добавляем в планировщик нужный режим работы:
root@raspberrypi:/# nano /etc/crontab GNU nano 2.2.6 Файл: /etc/crontab # /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.d$ 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.w$ 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.m$ 00 22 * * * root rfsend -s 6 # В 22-00 свет будет синий+зеленый 30 22 * * * root rfsend -s 4 # В 22-30 свет станет синим 00 23 * * * root rfsend -s 0 # В 23-00 Выключаем подсветку 37 6 * * * root rfsend -s 6 # В 06-37 Включаем синий+зеленый 00 7 * * * root rfsend -s 15 # В 7-00 Включаем всю подсветку # #Перезапуск cron, чтобы применились изменения root@raspberrypi:/# /etc/init.d/cron restart
Практически всё. Возможно, позже добавлю про управление через веб интерфейс.





