Проблемы с 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 можно выбрать любой?), но как это реализовать?