kopia lustrzana https://github.com/jgromes/RadioLib
				
				
				
			[nRF24] Added interrupt-driven examples
							rodzic
							
								
									6460d566cd
								
							
						
					
					
						commit
						64faa57325
					
				|  | @ -0,0 +1,150 @@ | ||||||
|  | /*
 | ||||||
|  |    RadioLib nRF24 Receive Example | ||||||
|  | 
 | ||||||
|  |    This example listens for FSK transmissions using nRF24 2.4 GHz radio module. | ||||||
|  |    Once a packet is received, an interrupt is triggered. | ||||||
|  |    To successfully receive data, the following settings have to be the same | ||||||
|  |    on both transmitter and receiver: | ||||||
|  |     - carrier frequency | ||||||
|  |     - data rate | ||||||
|  |     - transmit pipe on transmitter must match receive pipe | ||||||
|  |       on receiver | ||||||
|  | 
 | ||||||
|  |    For default module settings, see the wiki page | ||||||
|  |    https://github.com/jgromes/RadioLib/wiki/Default-configuration#nrf24
 | ||||||
|  | 
 | ||||||
|  |    For full API reference, see the GitHub Pages | ||||||
|  |    https://jgromes.github.io/RadioLib/
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | // include the library
 | ||||||
|  | #include <RadioLib.h> | ||||||
|  | 
 | ||||||
|  | // nRF24 has the following connections:
 | ||||||
|  | // CS pin:    10
 | ||||||
|  | // IRQ pin:   2
 | ||||||
|  | // CE pin:    3
 | ||||||
|  | nRF24 radio = new Module(10, 2, 3); | ||||||
|  | 
 | ||||||
|  | // or using RadioShield
 | ||||||
|  | // https://github.com/jgromes/RadioShield
 | ||||||
|  | //nRF24 radio = RadioShield.ModuleA;
 | ||||||
|  | 
 | ||||||
|  | void setup() { | ||||||
|  |   Serial.begin(9600); | ||||||
|  | 
 | ||||||
|  |   // initialize nRF24 with default settings
 | ||||||
|  |   Serial.print(F("[nRF24] Initializing ... ")); | ||||||
|  |   int state = radio.begin(); | ||||||
|  |   if(state == ERR_NONE) { | ||||||
|  |     Serial.println(F("success!")); | ||||||
|  |   } else { | ||||||
|  |     Serial.print(F("failed, code ")); | ||||||
|  |     Serial.println(state); | ||||||
|  |     while(true); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // set receive pipe 0 address
 | ||||||
|  |   // NOTE: address width in bytes MUST be equal to the
 | ||||||
|  |   //       width set in begin() or setAddressWidth()
 | ||||||
|  |   //       methods (5 by default)
 | ||||||
|  |   Serial.print(F("[nRF24] Setting address for receive pipe 0 ... ")); | ||||||
|  |   byte addr[] = {0x01, 0x23, 0x45, 0x67, 0x89}; | ||||||
|  |   state = radio.setReceivePipe(0, addr); | ||||||
|  |   if(state == ERR_NONE) { | ||||||
|  |     Serial.println(F("success!")); | ||||||
|  |   } else { | ||||||
|  |     Serial.print(F("failed, code ")); | ||||||
|  |     Serial.println(state); | ||||||
|  |     while(true); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // set the function that will be called
 | ||||||
|  |   // when new packet is received
 | ||||||
|  |   radio.setIrqAction(setFlag); | ||||||
|  | 
 | ||||||
|  |   // start listening
 | ||||||
|  |   Serial.print(F("[nRF24] Starting to listen ... ")); | ||||||
|  |   state = radio.startReceive(); | ||||||
|  |   if (state == ERR_NONE) { | ||||||
|  |     Serial.println(F("success!")); | ||||||
|  |   } else { | ||||||
|  |     Serial.print(F("failed, code ")); | ||||||
|  |     Serial.println(state); | ||||||
|  |     while (true); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // if needed, 'listen' mode can be disabled by calling
 | ||||||
|  |   // any of the following methods:
 | ||||||
|  |   //
 | ||||||
|  |   // radio.standby()
 | ||||||
|  |   // radio.sleep()
 | ||||||
|  |   // radio.transmit();
 | ||||||
|  |   // radio.receive();
 | ||||||
|  |   // radio.readData();
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // flag to indicate that a packet was received
 | ||||||
|  | volatile bool receivedFlag = false; | ||||||
|  | 
 | ||||||
|  | // disable interrupt when it's not needed
 | ||||||
|  | volatile bool enableInterrupt = true; | ||||||
|  | 
 | ||||||
|  | // this function is called when a complete packet
 | ||||||
|  | // is received by the module
 | ||||||
|  | // IMPORTANT: this function MUST be 'void' type
 | ||||||
|  | //            and MUST NOT have any arguments!
 | ||||||
|  | void setFlag(void) { | ||||||
|  |   // check if the interrupt is enabled
 | ||||||
|  |   if(!enableInterrupt) { | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // we got a packet, set the flag
 | ||||||
|  |   receivedFlag = true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void loop() { | ||||||
|  |   // check if the flag is set
 | ||||||
|  |   if(receivedFlag) { | ||||||
|  |     // disable the interrupt service routine while
 | ||||||
|  |     // processing the data
 | ||||||
|  |     enableInterrupt = false; | ||||||
|  | 
 | ||||||
|  |     // reset flag
 | ||||||
|  |     receivedFlag = false; | ||||||
|  | 
 | ||||||
|  |     // you can read received data as an Arduino String
 | ||||||
|  |     String str; | ||||||
|  |     int state = radio.readData(str); | ||||||
|  | 
 | ||||||
|  |     // you can also read received data as byte array
 | ||||||
|  |     /*
 | ||||||
|  |       byte byteArr[8]; | ||||||
|  |       int state = radio.readData(byteArr, 8); | ||||||
|  |     */ | ||||||
|  | 
 | ||||||
|  |     if (state == ERR_NONE) { | ||||||
|  |       // packet was successfully received
 | ||||||
|  |       Serial.println(F("[nRF24] Received packet!")); | ||||||
|  | 
 | ||||||
|  |       // print data of the packet
 | ||||||
|  |       Serial.print(F("[nRF24] Data:\t\t")); | ||||||
|  |       Serial.println(str); | ||||||
|  | 
 | ||||||
|  |     } else { | ||||||
|  |       // some other error occurred
 | ||||||
|  |       Serial.print(F("[nRF24] Failed, code ")); | ||||||
|  |       Serial.println(state); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // put module back to listen mode
 | ||||||
|  |     radio.startReceive(); | ||||||
|  | 
 | ||||||
|  |     // we're ready to receive more packets,
 | ||||||
|  |     // enable interrupt service routine
 | ||||||
|  |     enableInterrupt = true; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,148 @@ | ||||||
|  | /*
 | ||||||
|  |    RadioLib nRF24 Transmit with Interrupts Example | ||||||
|  | 
 | ||||||
|  |    This example transmits packets using nRF24 2.4 GHz radio module. | ||||||
|  |    Each packet contains up to 32 bytes of data, in the form of: | ||||||
|  |     - Arduino String | ||||||
|  |     - null-terminated char array (C-string) | ||||||
|  |     - arbitrary binary data (byte array) | ||||||
|  | 
 | ||||||
|  |    Packet delivery is automatically acknowledged by the receiver. | ||||||
|  | 
 | ||||||
|  |    For default module settings, see the wiki page | ||||||
|  |    https://github.com/jgromes/RadioLib/wiki/Default-configuration#nrf24
 | ||||||
|  | 
 | ||||||
|  |    For full API reference, see the GitHub Pages | ||||||
|  |    https://jgromes.github.io/RadioLib/
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | // include the library
 | ||||||
|  | #include <RadioLib.h> | ||||||
|  | 
 | ||||||
|  | // nRF24 has the following connections:
 | ||||||
|  | // CS pin:    10
 | ||||||
|  | // IRQ pin:   2
 | ||||||
|  | // CE pin:    3
 | ||||||
|  | nRF24 radio = new Module(10, 2, 3); | ||||||
|  | 
 | ||||||
|  | // or using RadioShield
 | ||||||
|  | // https://github.com/jgromes/RadioShield
 | ||||||
|  | //nRF24 radio = RadioShield.ModuleA;
 | ||||||
|  | 
 | ||||||
|  | // save transmission state between loops
 | ||||||
|  | int transmissionState = ERR_NONE; | ||||||
|  | 
 | ||||||
|  | void setup() { | ||||||
|  |   Serial.begin(9600); | ||||||
|  | 
 | ||||||
|  |   // initialize nRF24 with default settings
 | ||||||
|  |   Serial.print(F("[nRF24] Initializing ... ")); | ||||||
|  |   int state = radio.begin(); | ||||||
|  |   if(state == ERR_NONE) { | ||||||
|  |     Serial.println(F("success!")); | ||||||
|  |   } else { | ||||||
|  |     Serial.print(F("failed, code ")); | ||||||
|  |     Serial.println(state); | ||||||
|  |     while(true); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // set transmit address
 | ||||||
|  |   // NOTE: address width in bytes MUST be equal to the
 | ||||||
|  |   //       width set in begin() or setAddressWidth()
 | ||||||
|  |   //       methods (5 by default)
 | ||||||
|  |   byte addr[] = {0x01, 0x23, 0x45, 0x67, 0x89}; | ||||||
|  |   Serial.print(F("[nRF24] Setting transmit pipe ... ")); | ||||||
|  |   state = radio.setTransmitPipe(addr); | ||||||
|  |   if(state == ERR_NONE) { | ||||||
|  |     Serial.println(F("success!")); | ||||||
|  |   } else { | ||||||
|  |     Serial.print(F("failed, code ")); | ||||||
|  |     Serial.println(state); | ||||||
|  |     while(true); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // set the function that will be called
 | ||||||
|  |   // when packet transmission is finished
 | ||||||
|  |   radio.setIrqAction(setFlag); | ||||||
|  | 
 | ||||||
|  |   // start transmitting the first packet
 | ||||||
|  |   Serial.print(F("[nRF24] Sending first packet ... ")); | ||||||
|  | 
 | ||||||
|  |   // you can transmit C-string or Arduino string up to
 | ||||||
|  |   // 256 characters long
 | ||||||
|  |   transmissionState = radio.startTransmit("Hello World!"); | ||||||
|  | 
 | ||||||
|  |   // you can also transmit byte array up to 256 bytes long
 | ||||||
|  |   /*
 | ||||||
|  |     byte byteArr[] = {0x01, 0x23, 0x45, 0x67, | ||||||
|  |                       0x89, 0xAB, 0xCD, 0xEF}; | ||||||
|  |     state = radio.startTransmit(byteArr, 8); | ||||||
|  |   */ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // flag to indicate that a packet was sent
 | ||||||
|  | volatile bool transmittedFlag = false; | ||||||
|  | 
 | ||||||
|  | // disable interrupt when it's not needed
 | ||||||
|  | volatile bool enableInterrupt = true; | ||||||
|  | 
 | ||||||
|  | // this function is called when a complete packet
 | ||||||
|  | // is transmitted by the module
 | ||||||
|  | // IMPORTANT: this function MUST be 'void' type
 | ||||||
|  | //            and MUST NOT have any arguments!
 | ||||||
|  | void setFlag(void) { | ||||||
|  |   // check if the interrupt is enabled
 | ||||||
|  |   if(!enableInterrupt) { | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // we sent a packet, set the flag
 | ||||||
|  |   transmittedFlag = true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void loop() { | ||||||
|  |   // check if the previous transmission finished
 | ||||||
|  |   if(transmittedFlag) { | ||||||
|  |     // disable the interrupt service routine while
 | ||||||
|  |     // processing the data
 | ||||||
|  |     enableInterrupt = false; | ||||||
|  | 
 | ||||||
|  |     // reset flag
 | ||||||
|  |     transmittedFlag = false; | ||||||
|  | 
 | ||||||
|  |     if (transmissionState == ERR_NONE) { | ||||||
|  |       // packet was successfully sent
 | ||||||
|  |       Serial.println(F("transmission finished!")); | ||||||
|  | 
 | ||||||
|  |       // NOTE: when using interrupt-driven transmit method,
 | ||||||
|  |       //       it is not possible to automatically measure
 | ||||||
|  |       //       transmission data rate using getDataRate()
 | ||||||
|  | 
 | ||||||
|  |     } else { | ||||||
|  |       Serial.print(F("failed, code ")); | ||||||
|  |       Serial.println(transmissionState); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // wait a second before transmitting again
 | ||||||
|  |     delay(1000); | ||||||
|  | 
 | ||||||
|  |     // send another one
 | ||||||
|  |     Serial.print(F("[nRF24] Sending another packet ... ")); | ||||||
|  | 
 | ||||||
|  |     // you can transmit C-string or Arduino string up to
 | ||||||
|  |     // 256 characters long
 | ||||||
|  |     transmissionState = radio.startTransmit("Hello World!"); | ||||||
|  | 
 | ||||||
|  |     // you can also transmit byte array up to 256 bytes long
 | ||||||
|  |     /*
 | ||||||
|  |       byte byteArr[] = {0x01, 0x23, 0x45, 0x67, | ||||||
|  |                         0x89, 0xAB, 0xCD, 0xEF}; | ||||||
|  |       int state = radio.startTransmit(byteArr, 8); | ||||||
|  |     */ | ||||||
|  | 
 | ||||||
|  |     // we're ready to send more packets,
 | ||||||
|  |     // enable interrupt service routine
 | ||||||
|  |     enableInterrupt = true; | ||||||
|  |   } | ||||||
|  | } | ||||||
		Ładowanie…
	
		Reference in New Issue
	
	 jgromes
						jgromes