Проблемы с NRF24L01 и W5100.
- Войдите на сайт для отправки комментариев
Пт, 29/04/2016 - 16:32
Собственно вот что залито на передатчик Nano:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9,10);
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
// создаём структуру для передачи значений
typedef struct
{ // значение параметра
int value[8] = {7,6,5,4,3,2,1,0}; // Можно и просто массив
}
Message;
Message sensor;
volatile boolean flag_tx, flag_rx, flag_fail;
void TurnOn()
{
int relay = 4;
Serial.println('RELAY_ON');
radio.stopListening();
delay(10);
bool okey = radio.write(&relay,sizeof(relay));
delay(10);
radio.startListening();
}
void Hum()
{
Serial.println('SENSOR_ON');
radio.stopListening();
delay(10);
bool ok = radio.write(&sensor.value,sizeof(sensor.value));
delay(10);
radio.startListening();
}
void Change()
{
bool tx,fail,rx;
radio.whatHappened(tx,fail,rx);
flag_rx = rx; //принимаем
flag_fail = fail; //ошибка
flag_tx = tx; //отправляем
}
void setup(void)
{
attachInterrupt(digitalPinToInterrupt(2), Change, FALLING); //FALLING или CHANGE?
radio.begin();
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
radio.startListening(); //Слушаем
}
void loop(void)
{
if(flag_rx)
{
int getdata;
radio.read(&getdata,sizeof(getdata));
if (getdata == 1)
{//Если отправить данные с датчиков
Serial.println('SENSOR');
Hum();
}
else if(getdata == 2)
{//Если вкл. реле
Serial.println('RELAY');
TurnOn();
}
flag_rx = 0;
}
if (flag_fail)
{
flag_fail = 0;
}
if (flag_tx)
{
flag_tx = 0;
}
}
А это на приемнике Uno:
#include <SPI.h>
#include <Wire.h>
#include <Ethernet.h>
#include <BlynkSimpleEthernet.h>
#include <SimpleTimer.h>
#include <LiquidCrystal_I2C.h>
#include <nRF24L01.h>
#include <RF24.h>
typedef struct{
int value[8];
}
Message;
Message sensor;
int counter = 0;
int VarNum = 0;
char auth[] = " ";
SimpleTimer timer;
byte arduino_mac[] = { 0xDE, 0xAD, 0x7E, 0xFE, 0xDE, 0xED };
char server[] = " ";
volatile boolean flag_tx, flag_rx, flag_fail;
RF24 radio(7,8);
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
IPAddress arduino_ip ( 192, 168, 1, 7);
IPAddress dns_ip ( 212, 154, 163, 162);
IPAddress gateway_ip ( 192, 168, 1, 1);
IPAddress subnet_mask( 255, 255, 255, 0);
WidgetLED led(V2);
WidgetTerminal terminal(V3);
LiquidCrystal_I2C lcd(0x3F, 16, 2);
void sendUptime()
{
Blynk.virtualWrite(V0, 4);
Blynk.virtualWrite(V1, 5);
GetSenData(VarNum);
if( ++VarNum >= 3 ) VarNum = 0;
}
void checkPin()
{
bool tx,fail,rx;
radio.whatHappened(tx,fail,rx);
flag_rx = rx; //принимаем
flag_fail = fail; //ошибка
flag_tx = tx; //отправляем
if (digitalRead(2))
{
counter++;
Blynk.virtualWrite(V4, counter);
led.on();
} else
led.off();
}
void GetSenData(int varNumber)
{
Serial.println('GETSENDATA');
byte rxr = 1;
radio.stopListening();
bool ok = radio.write(&rxr,sizeof(rxr));
delay(100);
radio.startListening();
radio.read(&sensor.value,sizeof(sensor.value));
delay(2000);
Serial.println(sensor.value[1]);
switch(varNumber)
{
case 0: Blynk.virtualWrite(V5, sensor.value[0]); break;//датчик 0
case 1: Blynk.virtualWrite(V5, sensor.value[1]); break;//датчик 1
case 2: Blynk.virtualWrite(V5, sensor.value[2]); break;//датчик 2
case 3: Blynk.virtualWrite(V5, sensor.value[3]); break;//датчик 3 ...
}
}
void setup()
{
Serial.begin(9600);
dht.begin();
pinMode(4,INPUT);
lcd.begin();
lcd.setCursor(1, 0);
Blynk.begin(auth, " ", 8442, arduino_ip, dns_ip, gateway_ip, subnet_mask, arduino_mac);
attachInterrupt(digitalPinToInterrupt(2), checkPin, FALLING);
radio.begin();
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1,pipes[0]);
delay(10);
terminal.flush();
lcd.clear();
timer.setInterval(1000L, sendUptime);
}
BLYNK_WRITE(V3)
{
const char* a;
if (a != param.asStr())
lcd.clear();
lcd.print(param.asStr());
delay(100);
a = param.asStr();
terminal.flush();
if (counter >= 100)
{
lcd.print('OK!');
counter = 0;
}
else if (counter > 110)
{
lcd.clear();
}
}
void loop()
{
Blynk.run();
timer.run();
}
На Nano отправляем запрос, что нужно обновить информацию о датчиках и прислать нам отве на Uno или по нажатию на кнопку отправляем запросы, чтобы включить реле и обратно принимаем ответ, что реле было включено и благополучно выключилось. Все отлично работало по отдельности, но когда я решил это все совместить, понял, что 11,12,13 пины заняты W5100. Почитал про SPI, но так и не смог настроить nrf24l01. Может кто уже сталкивался с такой проблемой и поможет с кодом?
Ну так nrf24l01, который на UNO будет конфликтовать с W5100 шилдом ведь они на одном SPI, или я не прав?
в гугле забанили, читаем про SPI интерфейс, и сколько устройств можно на него повесить
Не знаю, не хочет передавать данные. Может быть как-то можно отключить w5100, в этот момент обменяться данными и затем вновь восстановить соединение? Потому что практически везде на зарубежных форумах пишут, что W5100 блокирует вот эти 11,12,13 пины. Не знаю что и делать, посмотрите мой код, пожалуйста.
Не знаю, не хочет передавать данные. Может быть как-то можно отключить w5100, в этот момент обменяться данными и затем вновь восстановить соединение? Потому что практически везде на зарубежных форумах пишут, что W5100 блокирует вот эти 11,12,13 пины. Не знаю что и делать, посмотрите мой код, пожалуйста.
Замутите софтовый SPI на других ногах, или смотрите сигнал CE, который как раз включает/выключает пользователей SPI.
Как я понял, можно же еще повесить w5100 и nrf24l01 на пины 11,12,13, но общаться с ними через CS (для W5100 это 10 пин, а для nrf24l01 можно выбрать любой?), но как это реализовать?