Подсветка для аквариума с радиоуправлением через Raspberry pi (Часть вторая)

Аквариум в зеленом свете

Теперь по поводу серверной части. Понадобится один радиомодуль NRF24L01+ и raspberry pi. У меня на малинке установлен Raspbian. Инструкцию по подключению радиомодуля взял из сети. Если коротко и по русски, то подключаем радиомодуль как на картинке (картинку было лень рисовать, взял с того же сайта):

Схема приемника

В моем исполнении это получилось вот так:

Малинка с подключенным модулем NRF24L01+

Радиомодуль подключается к малинке по шине 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


Практически всё. Возможно, позже добавлю про управление через веб интерфейс.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>