123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- /*
- LoRa Duplex communication wth callback
- Sends a message every half second, and uses callback
- for new incoming messages. Implements a one-byte addressing scheme,
- with 0xFF as the broadcast address.
- Note: while sending, LoRa radio is not listening for incoming messages.
- Note2: when using the callback method, you can't use any of the Stream
- functions that rely on the timeout, such as readString, parseInt(), etc.
- created 28 April 2017
- by Tom Igoe
- */
- #include <M5Stack.h>
- #include <M5LoRa.h>
- String outgoing; // outgoing message
- byte msgCount = 0; // count of outgoing messages
- byte localAddress = 0xBB; // address of this device
- byte destination = 0xFF; // destination to send to
- long lastSendTime = 0; // last send time
- int interval = 2000; // interval between sends
- void header(const char *string, uint16_t color){
- M5.Lcd.fillScreen(color);
- M5.Lcd.setTextSize(1);
- M5.Lcd.setTextColor(TFT_MAGENTA, TFT_BLUE);
- M5.Lcd.fillRect(0, 0, 320, 30, TFT_BLUE);
- M5.Lcd.setTextDatum(TC_DATUM);
- M5.Lcd.drawString(string, 160, 3, 4);
- }
- void setup() {
- M5.begin(); // initialize serial
- M5.Power.begin();
- while (!Serial);
- header("LoRa Duplex with callback", TFT_BLACK);
- M5.Lcd.setTextFont(2);
- M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
- M5.Lcd.drawString("Please use serial port to view data.",0, 35, 2);
- Serial.println("LoRa Duplex with callback");
- // override the default CS, reset, and IRQ pins (optional)
- LoRa.setPins();// set CS, reset, IRQ pin
- if (!LoRa.begin(433E6)) { // initialize ratio at 915 MHz
- Serial.println("LoRa init failed. Check your connections.");
- while (true); // if failed, do nothing
- }
- LoRa.onReceive(onReceive);
- LoRa.receive();
- Serial.println("LoRa init succeeded.");
- }
- void loop() {
- if (millis() - lastSendTime > interval) {
- String message = "HeLoRa World!"; // send a message
- sendMessage(message);
- Serial.println("Sending " + message);
- lastSendTime = millis(); // timestamp the message
- interval = random(2000) + 1000; // 2-3 seconds
- LoRa.receive(); // go back into receive mode
- }
- }
- void sendMessage(String outgoing) {
- LoRa.beginPacket(); // start packet
- LoRa.write(destination); // add destination address
- LoRa.write(localAddress); // add sender address
- LoRa.write(msgCount); // add message ID
- LoRa.write(outgoing.length()); // add payload length
- LoRa.print(outgoing); // add payload
- LoRa.endPacket(); // finish packet and send it
- msgCount++; // increment message ID
- }
- void onReceive(int packetSize) {
- if (packetSize == 0) return; // if there's no packet, return
- // read packet header bytes:
- int recipient = LoRa.read(); // recipient address
- byte sender = LoRa.read(); // sender address
- byte incomingMsgId = LoRa.read(); // incoming msg ID
- byte incomingLength = LoRa.read(); // incoming msg length
- String incoming = ""; // payload of packet
- while (LoRa.available()) { // can't use readString() in callback, so
- incoming += (char)LoRa.read(); // add bytes one by one
- }
- if (incomingLength != incoming.length()) { // check length for error
- Serial.println("error: message length does not match length");
- return; // skip rest of function
- }
- // if the recipient isn't this device or broadcast,
- if (recipient != localAddress && recipient != 0xFF) {
- Serial.println("This message is not for me.");
- return; // skip rest of function
- }
- // if message is for this device, or broadcast, print details:
- Serial.println("Received from: 0x" + String(sender, HEX));
- Serial.println("Sent to: 0x" + String(recipient, HEX));
- Serial.println("Message ID: " + String(incomingMsgId));
- Serial.println("Message length: " + String(incomingLength));
- Serial.println("Message: " + incoming);
- Serial.println("RSSI: " + String(LoRa.packetRssi()));
- Serial.println("Snr: " + String(LoRa.packetSnr()));
- Serial.println();
- }
|