This is a demo Elecrow 32u4 with Lora RFM95 IOT Board-868MHz/915MHz client (based on one of the examples from Arduino-LoRa) that uploads telemetry data to my Windows 10 IoT Core on Raspberry PI field gateway proof of concept(PoC).
The elecrow wiki had sample code based on the RadioHead library which was useful.
Bill of materials (Prices Sep 2018)
- 32u4 with Lora RFM95 IOT Board-868MHz/915MHz USD22.50
- Seeedstudio LightLevel Sensor USD2.90
- Elecrow Crowtail to Grove 4 pin Conversion Cable USD1.00
The code is pretty basic, it reads a value from the light sensor, scales it, then packs the payload and sets the necessary RFM9X/SX127X LoRa module configuration, has no power conservation, advanced wireless configuration etc.
/* Adapted from LoRa Duplex communication with Sync Word Sends Light data from Seeedstudio https://www.seeedstudio.com/Grove-Light-Sensor-v1-2-p-2727.html To my Windows 10 IoT Core RFM 9X library https://blog.devmobile.co.nz/2018/09/03/rfm9x-iotcore-payload-addressing/ */ #include // include libraries #include const int csPin = 10; // LoRa radio chip select const int resetPin = 9; // LoRa radio reset const int irqPin = 2; // change for your board; must be a hardware interrupt pin // Field gateway configuration const char FieldGatewayAddress[] = "LoRaIoT1"; const float FieldGatewayFrequency = 915000000.0; const byte FieldGatewaySyncWord = 0x12 ; // Payload configuration const int PayloadSizeMaximum = 64 ; byte payload[PayloadSizeMaximum] = ""; const byte SensorReadingSeperator = ',' ; // Manual serial number configuration const char DeviceId[] = {"Elecrow32u4"}; const int analogInPin = A0; const int LoopSleepDelaySeconds = 60 ; void setup() { Serial.begin(9600); Serial.println("LoRa Setup"); // override the default CS, reset, and IRQ pins (optional) LoRa.setPins(csPin, resetPin, irqPin);// set CS, reset, IRQ pin if (!LoRa.begin(FieldGatewayFrequency)) { Serial.println("LoRa init failed. Check your connections."); while (true); } // Need to do this so field gateways pays attention to messages from this device LoRa.enableCrc(); LoRa.setSyncWord(FieldGatewaySyncWord); LoRa.dumpRegisters(Serial); Serial.println("LoRa Setup done."); Serial.println("Setup done"); } void loop() { int payloadLength = 0 ; int sensorValue = 0; int outputValue = 0; Serial.println("Loop called"); memset(payload, 0, sizeof(payload)); // Scale the sensor value to a % sensorValue = analogRead(analogInPin); outputValue = map(sensorValue, 0, 1023, 0, 100); // prepare the payload header with "To" Address length (top nibble) and "From" address length (bottom nibble) payload[0] = (strlen(FieldGatewayAddress) << 4) | strlen( DeviceId ) ; payloadLength += 1; // Copy the "To" address into payload memcpy(&payload[payloadLength], FieldGatewayAddress, strlen(FieldGatewayAddress)); payloadLength += strlen(FieldGatewayAddress) ; // Copy the "From" into payload memcpy(&payload[payloadLength], DeviceId, strlen(DeviceId)); payloadLength += strlen(DeviceId) ; Serial.println("Loop called 5"); Serial.print("L:"); Serial.print( outputValue ) ; Serial.println( "%" ) ; // Copy the temperature into the payload payload[ payloadLength] = 'l'; payloadLength += 1 ; payload[ payloadLength] = ' '; payloadLength += 1 ; payloadLength += strlen( itoa(outputValue, &payload[payloadLength],10 )); // display info about payload then send it (No ACK) with LoRa unlike nRF24L01 Serial.print( "RFM9X/SX127X Payload length:"); Serial.print( payloadLength ); Serial.println( " bytes" ); LoRa.beginPacket(); LoRa.write( payload, payloadLength ); LoRa.endPacket(); Serial.println("Loop done"); delay(LoopSleepDelaySeconds * 1000l); }
In the debug output window the messages from the device looked like this
14:06:38-RX From Elecrow32u4 PacketSnr 9.8 Packet RSSI -88dBm RSSI -110dBm = 4 byte message "l 85"
Sensor Elecrow32u4l Value 85
AzureIoTHubClient SendEventAsync start
AzureIoTHubClient SendEventAsync finish
The thread 0x930 has exited with code 0 (0x0).
The thread 0xb74 has exited with code 0 (0x0).
The thread 0x3c8 has exited with code 0 (0x0).
The thread 0x984 has exited with code 0 (0x0).
14:07:01-RX From IoTMCU915 PacketSnr 9.3 Packet RSSI -87dBm RSSI -110dBm = 12 byte message "t 13.7,h 113"
Sensor IoTMCU915t Value 13.7
Sensor IoTMCU915h Value 113
AzureIoTHubClient SendEventAsync start
AzureIoTHubClient SendEventAsync finish
The thread 0x6e8 has exited with code 0 (0x0).
The thread 0x7b4 has exited with code 0 (0x0).
The thread 0xe9c has exited with code 0 (0x0).
My battery is a bit of an overkill and to reduce power consumption I would disconnect/remove the light emitting diode(LED)