Проблемы с NRF24L01 и W5100.

egor-kartop
Offline
Зарегистрирован: 30.01.2016

Собственно вот что залито на передатчик 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. Может кто уже сталкивался с такой проблемой и поможет с кодом? 
 
Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
RF24 radio(9,10);
можно перенести с 9 и 10 на 7 и 8 вывод
RF24 radio(7,8);
выводы 11, 12, 13 общие для всех устройств

 

egor-kartop
Offline
Зарегистрирован: 30.01.2016

Ну так nrf24l01, который на UNO будет конфликтовать с W5100 шилдом ведь они на одном SPI, или я не прав? 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

в гугле забанили, читаем про SPI интерфейс, и сколько устройств можно на него повесить

egor-kartop
Offline
Зарегистрирован: 30.01.2016

Не знаю, не хочет передавать данные. Может быть как-то можно отключить w5100, в этот момент обменяться данными и затем вновь восстановить соединение? Потому что практически везде на зарубежных форумах пишут, что W5100 блокирует вот эти 11,12,13 пины. Не знаю что и делать, посмотрите мой код, пожалуйста. 

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

egor-kartop пишет:

Не знаю, не хочет передавать данные. Может быть как-то можно отключить w5100, в этот момент обменяться данными и затем вновь восстановить соединение? Потому что практически везде на зарубежных форумах пишут, что W5100 блокирует вот эти 11,12,13 пины. Не знаю что и делать, посмотрите мой код, пожалуйста. 

Замутите софтовый SPI на других ногах, или смотрите сигнал CE, который как раз включает/выключает пользователей SPI. 

egor-kartop
Offline
Зарегистрирован: 30.01.2016

Как я понял, можно же еще повесить w5100 и nrf24l01 на пины 11,12,13, но общаться с ними через CS (для W5100 это 10 пин, а для nrf24l01 можно выбрать любой?), но как это реализовать?