Table of Contents
- Project Introduction
- Getting Started
- Communication Between Two MKR WAN 1300
- LoRaWAN System Range Testing
- Assembling and Adding LCD Display to the Transmitter
- Assembling and Adding LCD Display to the Receiver
- LoRaWAN´s Field Test with a DS18B20 Sensor
- Adding Multiple Sensors: DS18B20, DHT22 and MQ-135
- Modifying Receiver Code for Multiple Sensors
- LoRaWAN´s Field Test with Multiple Sensors
- Connecting LoRaWAN to an IoT Provider through the Arduino NANO 33 IoT
- LoRaWAN and IoT Connection with a DS18B20 Sensor
- Testing LoRaWAN and IoT Connection with a DS18B20 Sensor
- LoRaWAN and IoT Connection with Multiple Sensors
- Testing LoRaWAN and IoT Connection with Multiple Sensors
- Project Report Updated
**********************************************************************************************************************
Modifying Receiver Code for Multiple Sensors
Receiver Schematic Diagram
In the figure below I show you the electrical diagram of the receiver device
As you can see, there are no hardware changes, however the code must have changes since we will receive data from three sensors and these must be separated and shown on the display. All this through code. In the figure below I show you the transmitter and the receiver.
Receiver code
There were no hardware changes on the receiving device. However, in the software there were changes, and these are shown in the code below:
LoRaReceiver_v3.ino
// AUTHOR: GUILLERMO PEREZ GUILLEN #include <SPI.h> #include <LoRa.h> #include <Wire.h> // Library for I2C communication #include <LiquidCrystal_I2C.h> // Library for LCD LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4); // Change to (0x27,16,2) for 16x2 LCD. char cadena[30]; //We create an array that will store the characters that we will write in the PC console. We assign a limit of characters, in this case 30 byte posicion=0; //Variable to change the position of the characters in the array int valor; //Integer Variable void setup() { lcd.init(); // Initiate the LCD: lcd.backlight(); pinMode(LED_BUILTIN, OUTPUT); Serial.begin(9600); Serial.println("LoRa Receiver"); if (!LoRa.begin(915E6)) { Serial.println("Starting LoRa failed!"); while (1); } } void loop() { // try to parse packet int packetSize = LoRa.parsePacket(); if (packetSize) { memset(cadena, 0,sizeof(cadena));//memset deletes the contents of the array "cadena" from position 0 to the end sizeof // received a packet Serial.print("Received packet... "); // read packet while (LoRa.available()) { char dedos= (char)LoRa.read(); Serial.print(dedos); cadena[posicion]=dedos;//Read a character from the string "cadena" from "posicion", then read the next character with "posicion++" posicion++; } posicion=0; int signal_rx = LoRa.packetRssi(); // print RSSI of packet Serial.print(" with RSSI "); Serial.println(signal_rx); int parte1 = getValue(cadena,',',0).toInt(); int parte2 = getValue(cadena,',',1).toInt(); int parte3 = getValue(cadena,',',2).toInt(); Serial.println(parte1); delay(100); Serial.println(parte2); delay(100); Serial.println(parte3); delay(100); // LCD data lcd.clear(); lcd.setCursor(0, 0); lcd.print("RSSI ="); lcd.setCursor(7, 0); lcd.print(signal_rx); lcd.setCursor(11, 0); lcd.print("dBm"); lcd.setCursor(0, 1); lcd.print("Temp ="); lcd.setCursor(8, 1); lcd.print(parte1); lcd.setCursor(11, 1); lcd.print("C"); lcd.setCursor(0, 2); lcd.print("Hum ="); lcd.setCursor(8, 2); lcd.print(parte2); lcd.setCursor(11, 2); lcd.print("%"); lcd.setCursor(0, 3); lcd.print("CO2 ="); lcd.setCursor(8, 3); lcd.print(parte3); lcd.setCursor(11, 3); lcd.print("PPM"); digitalWrite(LED_BUILTIN, HIGH); delay(2000); digitalWrite(LED_BUILTIN, LOW); } } String getValue(String data, char separator, int index) { int found = 0; int strIndex[] = {0, -1}; int maxIndex = data.length()-1; for(int i=0; i<=maxIndex && found<=index; i++){ if(data.charAt(i)==separator || i==maxIndex){ found++; strIndex[0] = strIndex[1]+1; strIndex[1] = (i == maxIndex) ? i+1 : i; } } return found>index ? data.substring(strIndex[0], strIndex[1]) : ""; }
Analysis:
First you have to receive the data in a character string.
// read packet
while (LoRa.available()) {
char dedos= (char)LoRa.read();
Serial.print(dedos);
cadena[posicion]=dedos;//Read a character from the string "cadena" from "posicion", then read the next character with "posicion++"
posicion++;
}
How did I separate the data from the three sensors? There are several methods to do it, I did it using the comma (,). The code below shows you this.
String getValue(String data, char separator, int index)
{
int found = 0;
int strIndex[] = {0, -1};
int maxIndex = data.length()-1;
for(int i=0; i<=maxIndex && found<=index; i++){
if(data.charAt(i)==separator || i==maxIndex){
found++;
strIndex[0] = strIndex[1]+1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
}
}
return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}
In the next post we will see a demonstration of how this project works.
Download section:
- You can get the code from this post below: