• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 1 głosów - średnia: 5
  • 1
  • 2
  • 3
  • 4
  • 5
Komunikacja między 2 Arduino nRF24l01+
#6
No dobra chłopaki tak mi się nie chciało ale trudno rękawicę podniosłem to trzeba powalczyć Wink
Napisałem programik do wysyłania danych w ilościach hurtowych z czujników serw co tam kto chce ,
dane zdeklarowane w strukturach jako int ale mogą być jako jakiekolwiek dane liczbowe byte , long .

poniżej 2 kody dla modułu 1 i 2 komunikacja w 2 kierunkach i wysyłanie danych w pakietach ,
dane są wysyłane po naciśnięciu przycisku na pinie 3 , pin 4 powoduje zapytanie i odpowiedź czyli
wysłanie danych na żądanie . program po drobnych przeróbkach niema ograniczenia ilości modułów
w chmurze .

Nadajnik 1

Kod:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9,10);  
const uint64_t pipe = 0xF0F0F0F0E1LL;

rf24_pa_dbm_e paLevel = RF24_PA_MAX;
 
typedef struct{ // Dane do wysłania
   
 byte X,Y; // sygnatura nadawania i odbioru
 int A,B,C,D,E,F,G,H,I;                              
}
W_t;

typedef struct{ // Dane odebrane
 
 byte X,Y; // sygnatura nadawania i odbioru
 int A,B,C,D,E,F,G,H,I;              
}
O_t;

W_t Send_data;     // Struktura danych wysłanych
O_t Recive_data;   // Struktura danych odebranych

int A_1,B_1,C_1,D_1,E_1,F_1,G_1,H_1,I_1 ;

byte state = LOW;
byte state1 = LOW;

void setup() {
 
 Serial.begin(115200);
 pinMode(3 , INPUT_PULLUP);
 pinMode(4 , INPUT_PULLUP);
 radio.begin();                
 radio.openWritingPipe(pipe);
 radio.openReadingPipe(1,pipe);
 radio.startListening();
 delay(500);
 Serial.println("gotowy NRF-1");
 Send_data.Y = 0;
}

void loop() {
 
 if ( digitalRead(3) == LOW and state == LOW ){state = HIGH;
     Send_data.X = 2;Send_data.Y = 0;Radio();}
     // Send_data.X = 2 określa nam moduł do którego wysyłamy dane
 if ( digitalRead(3) == HIGH )state = LOW;
 if ( digitalRead(4) == LOW and state1 == LOW ){state1 = HIGH;
     Send_data.Y = 1;Send_data.X = 0;Radio();}
     // Send_data.Y = 1 określa nam moduł który prosi o dane zwrotne  
 if ( digitalRead(4) == HIGH )state1 = LOW;
 
 if (radio.available()){ // Sprawy radiowe tak ma być
   bool done = false;
   while (!done){
   done = radio.read( &Recive_data, sizeof(Recive_data) );
   Radio();}
 }  
}

void Radio(){
     
 if ( Recive_data.Y > 0 ){Send_data.X = Recive_data.Y;}
    // linia powyżej ustala kto wysłał zapytanie i komu odpowiedzieć
 
 if ( Send_data.X > 0 or Send_data.Y > 0 ){
 // odpowiedz jak otrzymasz zapytanie lub wyślij do ...
   
     if (Send_data.Y > 0){Serial.print("Odpowiedz dla NRF-");Serial.println(Send_data.Y);}
     if (Send_data.X > 0){Serial.print("Wysylam do NRF-");Serial.println(Send_data.X);}
     
         
      Send_data.A = 11;    // wyślij dane od A do I na zapytanie    
      Send_data.B = 12;    // czyli inny modół wysyła X o wartości 1
      Send_data.C = 13;    // lub po naciśnięciu przycisku na pinie 4
      Send_data.D = 14;                  
      Send_data.E = 15;        
      Send_data.F = 16;          
      Send_data.G = 17;          
      Send_data.H = 18;        
      Send_data.I = 19;
      Send_data.Y ;      
         
   
    radio.stopListening();
    radio.write( &Send_data, sizeof(Send_data) );
    radio.startListening();
   
   }
   
   if ( Recive_data.X == 1 ){
   
     A_1 = Recive_data.A;       // po odebraniu wartości X = 11      
     B_1 = Recive_data.B;       // podstaw do zmiennych A_1 do I-1
     C_1 = Recive_data.C;       // wartości odebrane A - I  
     D_1 = Recive_data.D;                  
     E_1 = Recive_data.E;        
     F_1 = Recive_data.F;          
     G_1 = Recive_data.G;          
     H_1 = Recive_data.H;        
     I_1 = Recive_data.I;
     
     Print_data();              
   }
   Recive_data.X = 0 ; // Skasuj rejestr odbioru czekaj na następne połączenie
   Send_data.X = 0;
   Recive_data.Y = 0;
   Send_data.Y = 0;
 }
 
void Print_data(){
 
 Serial.println("NRF-1 odebralem");
 Serial.println(A_1);  // wydrukuj nasze odebrane dane
 Serial.println(B_1);
 Serial.println(C_1);
 Serial.println(D_1);
 Serial.println(E_1);
 Serial.println(F_1);
 Serial.println(G_1);
 Serial.println(H_1);
 Serial.println(I_1);

}

Nadajnik 2

Kod:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9,10);  
const uint64_t pipe = 0xF0F0F0F0E1LL;

rf24_pa_dbm_e paLevel = RF24_PA_MAX;
 
typedef struct{ // Dane do wysłania
   
 byte X,Y; // sygnatura nadawania i odbioru
 int A,B,C,D,E,F,G,H,I;                              
}
W_t;

typedef struct{ // Dane odebrane
 
 byte X,Y; // sygnatura nadawania i odbioru
 int A,B,C,D,E,F,G,H,I;              
}
O_t;

W_t Send_data;     // Struktura danych wysłanych
O_t Recive_data;   // Struktura danych odebranych

int A_1,B_1,C_1,D_1,E_1,F_1,G_1,H_1,I_1 ;

byte state = LOW;
byte state1 = LOW;

void setup() {
 
 Serial.begin(115200);
 pinMode(3 , INPUT_PULLUP);
 pinMode(4 , INPUT_PULLUP);
 radio.begin();                
 radio.openWritingPipe(pipe);
 radio.openReadingPipe(1,pipe);
 radio.startListening();
 delay(500);
 Serial.println("gotowy NRF-2");
 Send_data.Y = 0;
}

void loop() {
 
  if ( digitalRead(3) == LOW and state == LOW ){state = HIGH;
     Send_data.X = 1;Send_data.Y = 0;Radio();}
     // Send_data.X = 1 określa nam moduł do którego wysyłamy dane
 if ( digitalRead(3) == HIGH )state = LOW;
 if ( digitalRead(4) == LOW and state1 == LOW ){state1 = HIGH;
     Send_data.Y = 2;Send_data.X = 0;Radio();}
     // Send_data.Y = 2 określa nam moduł który prosi o dane zwrotne  
 if ( digitalRead(4) == HIGH )state1 = LOW;
 
 if (radio.available()){ // Sprawy radiowe tak ma być
   bool done = false;
   while (!done){
   done = radio.read( &Recive_data, sizeof(Recive_data) );
   Radio();}
 }  
}

void Radio(){
 
 if ( Recive_data.Y > 0 ){Send_data.X = Recive_data.Y;}
    // linia powyżej ustala kto wysłał zapytanie i komu odpowiedzieć
     
 if ( Send_data.X > 0 or Send_data.Y > 0 ){
   // odpowiedz jak otrzymasz zapytanie lub wyślij do ...
   
     if (Send_data.Y > 0){Serial.print("Odpowiedz dla NRF-");Serial.println(Send_data.Y);}
     if (Send_data.X > 0){Serial.print("Wysylam do NRF-");Serial.println(Send_data.X);}
     
      Send_data.A = 21;    // wyślij dane od A do I na zapytanie    
      Send_data.B = 22;    // czyli inny modół wysyła X o wartości 1
      Send_data.C = 23;    // lub po naciśnięciu przycisku na pinie 4
      Send_data.D = 24;                  
      Send_data.E = 25;        
      Send_data.F = 26;          
      Send_data.G = 27;          
      Send_data.H = 28;        
      Send_data.I = 29;            
      Send_data.Y ;
   
    radio.stopListening();
    radio.write( &Send_data, sizeof(Send_data) );
    radio.startListening();
         
   }
   
    if ( Recive_data.X == 2 ){
   
     A_1 = Recive_data.A;       // po odebraniu wartości X = 11      
     B_1 = Recive_data.B;       // podstaw do zmiennych A_1 do I-1
     C_1 = Recive_data.C;       // wartości odebrane A - I  
     D_1 = Recive_data.D;                  
     E_1 = Recive_data.E;        
     F_1 = Recive_data.F;          
     G_1 = Recive_data.G;          
     H_1 = Recive_data.H;        
     I_1 = Recive_data.I;
     
     Print_data();              
   }
   Recive_data.X = 0 ; // Skasuj rejestr odbioru czekaj na następne połączenie
   Send_data.X = 0;
   Recive_data.Y = 0;
   Send_data.Y = 0;
 }
 
void Print_data(){
 
 Serial.println("NRF-2 odebralem");
 Serial.println(A_1);  // wydrukuj nasze odebrane dane
 Serial.println(B_1);
 Serial.println(C_1);
 Serial.println(D_1);
 Serial.println(E_1);
 Serial.println(F_1);
 Serial.println(G_1);
 Serial.println(H_1);
 Serial.println(I_1);

}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Komunikacja między 2 Arduino nRF24l01+ - przez JasQ - 21-12-2015, 15:28

Skocz do:


Przeglądający: 1 gości