diff --git a/Examples/Struct_receive/Struct_receive.ino b/Examples/Struct_receive/Struct_receive.ino new file mode 100644 index 0000000..e721293 --- /dev/null +++ b/Examples/Struct_receive/Struct_receive.ino @@ -0,0 +1,137 @@ +#include +#include +#include + +#define NODEID 1 +#define NETWORKID 100 +#define FREQUENCY RF69_433MHZ //Match this with the version of your Moteino! (others: RF69_433MHZ, RF69_868MHZ) +#define KEY "thisIsEncryptKey" //has to be same 16 characters/bytes on all nodes, not more not less! +#define LED 9 +#define SERIAL_BAUD 115200 +#define ACK_TIME 30 // # of ms to wait for an ack + +RFM69 radio; +SPIFlash flash(8, 0xEF30); //EF40 for 16mbit windbond chip +bool promiscuousMode = false; //set to 'true' to sniff all packets on the same network + +typedef struct { + int nodeId; //store this nodeId + unsigned long uptime; //uptime in ms + float temp; //temperature maybe? +} Payload; +Payload theData; + +void setup() { + Serial.begin(SERIAL_BAUD); + delay(10); + radio.initialize(FREQUENCY,NODEID,NETWORKID); + //radio.setHighPower(); //uncomment only for RFM69HW! + radio.encrypt(KEY); + radio.promiscuous(promiscuousMode); + char buff[50]; + sprintf(buff, "\nListening at %d Mhz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915); + Serial.println(buff); + if (flash.initialize()) + Serial.println("SPI Flash Init OK!"); + else + Serial.println("SPI Flash Init FAIL! (is chip present?)"); +} + +byte ackCount=0; +void loop() { + //process any serial input + if (Serial.available() > 0) + { + char input = Serial.read(); + if (input == 'r') //d=dump all register values + radio.readAllRegs(); + if (input == 'E') //E=enable encryption + radio.encrypt(KEY); + if (input == 'e') //e=disable encryption + radio.encrypt(null); + if (input == 'p') + { + promiscuousMode = !promiscuousMode; + radio.promiscuous(promiscuousMode); + Serial.print("Promiscuous mode ");Serial.println(promiscuousMode ? "on" : "off"); + } + + if (input == 'd') //d=dump flash area + { + Serial.println("Flash content:"); + int counter = 0; + + while(counter<=256){ + Serial.print(flash.readByte(counter++), HEX); + Serial.print('.'); + } + while(flash.busy()); + Serial.println(); + } + if (input == 'e') + { + Serial.print("Erasing Flash chip ... "); + flash.chipErase(); + while(flash.busy()); + Serial.println("DONE"); + } + if (input == 'i') + { + Serial.print("DeviceID: "); + word jedecid = flash.readDeviceId(); + Serial.println(jedecid, HEX); + } + } + + if (radio.receiveDone()) + { + Serial.print('[');Serial.print(radio.SENDERID, DEC);Serial.print("] "); + Serial.print(" [RX_RSSI:");Serial.print(radio.readRSSI());Serial.print("]"); + if (promiscuousMode) + Serial.print("to [");Serial.print(radio.TARGETID, DEC);Serial.print("] "); + + if (radio.DATALEN != sizeof(Payload)) + Serial.print("Invalid payload received, not matching Payload struct!"); + else + { + theData = *(Payload*)radio.DATA; //assume radio.DATA actually contains our struct and not something else + Serial.print(" nodeId="); + Serial.print(theData.nodeId); + Serial.print(" uptime="); + Serial.print(theData.uptime); + Serial.print(" temp="); + Serial.print(theData.temp); + } + + if (radio.ACK_REQUESTED) + { + byte theNodeID = radio.SENDERID; + radio.sendACK(); + Serial.print(" - ACK sent."); + + // When a node requests an ACK, respond to the ACK + // and also send a packet requesting an ACK (every 3rd one only) + // This way both TX/RX NODE functions are tested on 1 end at the GATEWAY + if (ackCount++%3==0) + { + Serial.print(" Pinging node "); + Serial.print(theNodeID); + Serial.print(" - ACK..."); + delay(3); //need this when sending right after reception .. ? + if (radio.sendWithRetry(theNodeID, "ACK TEST", 8, 0)) // 0 = only 1 attempt, no retries + Serial.print("ok!"); + else Serial.print("nothing"); + } + } + Serial.println(); + Blink(LED,3); + } +} + +void Blink(byte PIN, int DELAY_MS) +{ + pinMode(PIN, OUTPUT); + digitalWrite(PIN,HIGH); + delay(DELAY_MS); + digitalWrite(PIN,LOW); +} diff --git a/Examples/Struct_send/Struct_send.ino b/Examples/Struct_send/Struct_send.ino new file mode 100644 index 0000000..703b25d --- /dev/null +++ b/Examples/Struct_send/Struct_send.ino @@ -0,0 +1,135 @@ +#include +#include +#include + +#define NODEID 99 +#define NETWORKID 100 +#define GATEWAYID 1 +#define FREQUENCY RF69_433MHZ //Match this with the version of your Moteino! (others: RF69_433MHZ, RF69_868MHZ) +#define KEY "thisIsEncryptKey" //has to be same 16 characters/bytes on all nodes, not more not less! +#define LED 9 +#define SERIAL_BAUD 115200 +#define ACK_TIME 30 // # of ms to wait for an ack + +int TRANSMITPERIOD = 300; //transmit a packet to gateway so often (in ms) +byte sendSize=0; +boolean requestACK = false; +SPIFlash flash(8, 0xEF30); //EF40 for 16mbit windbond chip +RFM69 radio; + +typedef struct { + int nodeId; //store this nodeId + unsigned long uptime; //uptime in ms + float temp; //temperature maybe? +} Payload; +Payload theData; + +void setup() { + Serial.begin(SERIAL_BAUD); + radio.initialize(FREQUENCY,NODEID,NETWORKID); + //radio.setHighPower(); //uncomment only for RFM69HW! + radio.encrypt(KEY); + char buff[50]; + sprintf(buff, "\nTransmitting at %d Mhz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915); + Serial.println(buff); + + if (flash.initialize()) + Serial.println("SPI Flash Init OK!"); + else + Serial.println("SPI Flash Init FAIL! (is chip present?)"); +} + +long lastPeriod = -1; +void loop() { + //process any serial input + if (Serial.available() > 0) + { + char input = Serial.read(); + if (input >= 48 && input <= 57) //[0,9] + { + TRANSMITPERIOD = 100 * (input-48); + if (TRANSMITPERIOD == 0) TRANSMITPERIOD = 1000; + Serial.print("\nChanging delay to "); + Serial.print(TRANSMITPERIOD); + Serial.println("ms\n"); + } + + if (input == 'r') //d=dump register values + radio.readAllRegs(); + //if (input == 'E') //E=enable encryption + // radio.encrypt(KEY); + //if (input == 'e') //e=disable encryption + // radio.encrypt(null); + + if (input == 'd') //d=dump flash area + { + Serial.println("Flash content:"); + int counter = 0; + + while(counter<=256){ + Serial.print(flash.readByte(counter++), HEX); + Serial.print('.'); + } + while(flash.busy()); + Serial.println(); + } + if (input == 'e') + { + Serial.print("Erasing Flash chip ... "); + flash.chipErase(); + while(flash.busy()); + Serial.println("DONE"); + } + if (input == 'i') + { + Serial.print("DeviceID: "); + word jedecid = flash.readDeviceId(); + Serial.println(jedecid, HEX); + } + } + + //check for any received packets + if (radio.receiveDone()) + { + Serial.print('[');Serial.print(radio.SENDERID, DEC);Serial.print("] "); + for (byte i = 0; i < radio.DATALEN; i++) + Serial.print((char)radio.DATA[i]); + Serial.print(" [RX_RSSI:");Serial.print(radio.readRSSI());Serial.print("]"); + + if (radio.ACK_REQUESTED) + { + radio.sendACK(); + Serial.print(" - ACK sent"); + delay(10); + } + Blink(LED,5); + Serial.println(); + } + + int currPeriod = millis()/TRANSMITPERIOD; + if (currPeriod != lastPeriod) + { + //fill in the struct with new values + theData.nodeId = NODEID; + theData.uptime = millis(); + theData.temp = 91.23; //it's hot! + + Serial.print("Sending struct ("); + Serial.print(sizeof(theData)); + Serial.print(" bytes) ... "); + if (radio.sendWithRetry(GATEWAYID, (const void*)(&theData), sizeof(theData))) + Serial.print(" ok!"); + else Serial.print(" nothing..."); + Serial.println(); + Blink(LED,3); + lastPeriod=currPeriod; + } +} + +void Blink(byte PIN, int DELAY_MS) +{ + pinMode(PIN, OUTPUT); + digitalWrite(PIN,HIGH); + delay(DELAY_MS); + digitalWrite(PIN,LOW); +}