Close Menu
  • Articles
    • Learn Electronics
    • Product Review
    • Tech Articles
  • Electronics Circuits
    • 555 Timer Projects
    • Op-Amp Circuits
    • Power Electronics
  • Microcontrollers
    • Arduino Projects
    • STM32 Projects
    • AMB82-Mini IoT AI Camera
    • BLE Projects
  • IoT Projects
    • ESP8266 Projects
    • ESP32 Projects
    • ESP32 MicroPython
    • ESP32-CAM Projects
    • LoRa/LoRaWAN Projects
  • Raspberry Pi
    • Raspberry Pi Projects
    • Raspberry Pi Pico Projects
    • Raspberry Pi Pico W Projects
  • Electronics Calculator
Facebook X (Twitter) Instagram
  • About Us
  • Disclaimer
  • Privacy Policy
  • Contact Us
  • Advertise With Us
Facebook X (Twitter) Instagram Pinterest YouTube LinkedIn
How To Electronics
  • Articles
    • Learn Electronics
    • Product Review
    • Tech Articles
  • Electronics Circuits
    • 555 Timer Projects
    • Op-Amp Circuits
    • Power Electronics
  • Microcontrollers
    • Arduino Projects
    • STM32 Projects
    • AMB82-Mini IoT AI Camera
    • BLE Projects
  • IoT Projects
    • ESP8266 Projects
    • ESP32 Projects
    • ESP32 MicroPython
    • ESP32-CAM Projects
    • LoRa/LoRaWAN Projects
  • Raspberry Pi
    • Raspberry Pi Projects
    • Raspberry Pi Pico Projects
    • Raspberry Pi Pico W Projects
  • Electronics Calculator
How To Electronics
Home » LoRa Based Wireless Weather Station with Arduino & ESP32
Arduino Projects ESP32 Projects IoT Projects LoRa/LoRaWAN Projects

LoRa Based Wireless Weather Station with Arduino & ESP32

Mamtaz AlamBy Mamtaz AlamUpdated:August 3, 202315 Comments9 Mins Read
Share Facebook Twitter LinkedIn Telegram Reddit WhatsApp
LoRa Weather Station
Share
Facebook Twitter LinkedIn Pinterest Email Reddit Telegram WhatsApp

Overview: LoRa Based Wireless Weather Station

In this project, we will learn how to make LoRa Based Wireless Weather Station using Arduino Pro Mini & ESP32 Wifi Module. You can keep the Weather Station Node on the roof of your house or any remote location just a few kilometers away from your home. You can use the sensor like BME280 Barometric Pressure Sensor along with a BH1750 Light sensor and also a Rain Sensor. Basically, this weather station can monitor the Environment parameters like Temperature, Humidity, Pressure, Altitude, Dew Point, Rainfall & Light Intensity.

Using the LoRa Module SX1278/RFM95 you can monitor the data from a few kilometer distances (up to 5Km). The device operates on a 3.7V lithium Ion Battery Battery and power consumption is low.

The Gateway can be placed indoors inside the house or can be placed at a certain height to achieve a long distance. The gateway is made using Lora SX1278/RFM95 and ESP32 Wifi Module. The receiver collects the data from the sender or Sensor Node and uploads it to the Server.

Weather Station

The received data can be observed in multiple ways. I will demonstrate how to show the data in 3 ways. The first method is to monitor the data on Webserver. Using the local IP of the ESP32 Board, you can monitor data on the Webpage. In the second method, you can upload the data to Thingspeak Server and monitor the logged data in a graphical format. In the third method, you can monitor the data online on the Blynk Application. You can choose any of the methods to monitor the weather data. Such a great wireless weather station, you can do it by yourself.

You can check some of our previous Weather Station Projects:
1. ESP8266 Live Weather Station on WebServer: Check Here
2. ESP32 BME280 Mini Weather Station: Check Here
3. IoT Based Weather Station using OpenWeatherMap: Check Here
4. MQTT Based Weather Station with GSM: Check Here




Bill of Materials

For Making LoRa Based Weather Station we need some microcotrollers board and few sensors. All the components that is needed for making this project is given below. You can purchase the components from Amazon.

S.N.Components NameQuantityPurchase Links
1ESP32 Board1Amazon | AliExpress
2Arduino Pro Mini 3.3V, 8MHz1Amazon | AliExpress
3LoRa Module SX12782Amazon | AliExpress
4BME280 Sensor1Amazon | AliExpress
5BH1750 Light Sensor1Amazon | AliExpress
6FC-37 Analog/Digital Rain Sensor1Amazon | AliExpress
73.7V 1000mAh Lithium-Ion Battery1Amazon | AliExpress

Sensors for Weather Station

BME280 Barometric Pressure Sensor

The BME280 is Barometric Pressure Sensor that can measure temperature, Humidity & Atmospheric Pressure. The Sensor has an I2C Bus and operates on 3.3V power Supply. The unit combines high linearity and high accuracy sensors and is perfectly feasible for low current consumption, long-term stability, and high EMC robustness.

The sensor is best for measuring humidity with ±3% accuracy, barometric pressure with ±1 hPa absolute accuracy, and temperature with ±1.0°C accuracy. Because pressure changes with altitude and the pressure measurements are so good, you can also use it as an altimeter with ±1 meter or better accuracy!.


Rain Sensor

Rain sensors are used in the detection of water beyond what a humidity sensor can detect.

Rain Sensor

The rain sensor detects water that completes the circuits on its sensor boards’ printed leads. The sensor board acts as a variable resistor that will change from 100k ohms when wet to 2M ohms when dry. In short, the wetter the board the more current that will be conducted.


BH1750 Ambient Light Sensor

The BH1750 light intensity sensor is a digital Ambient Light Sensor with an I2C bus interface. This sensor is best suited to get the ambient light data. This sensor can accurately measure the LUX value of light up to 65535. It consumes a very low amount of current & uses a photodiode to sense the light.

The Sensor works on 3.3V & using its I2C Pins you easily interface it with any microcontroller. To learn more about this sensor you can check this post: Light Meter using BH1750 & Arduino


Apart from all these sensors, you can also add Anemometer Sensor to this project. The Anemometer measures the wind speed and tells you the condition about the air moving speed.


LoRa Weather Station Node & Gateway Circuit

The Wireless Weather Station requires Sender and Receiver circuit to communicate wirelessly. So the Sender Circuit is called as Sensor Node and the Receiver Circuit is called as Gateway.

Sensor Node Circuit

We need to select a low power Arduino Board. So, Arduino Pro Mini is the best board that works on 3.3V & runs on 8 MHz Clock Frequency. We can use the LoRa Module SX1278 from Ai-Thinker. The BH1750 & BME280 Sensor works on I2C Protocol. The LoRa Module SX1278 works on SPI Protocol. The device is powered by 3.7V Lithium-Ion Battery & is connected to the RAW pin of Pro Mini.

Lora Arduino Based Weather Station

The Rain Sensor, BH1750 Ambient Light Sensor, BME280 Barometric Sensor & LoRa Module is connected to the 3.3V of Arduino Pro Mini. You can use an additional TP4056 Battery charging Module to charge the Battery. Apart from this adding a Solar Panel and harvesting Solar energy to the Circuit would be the best option.

Wireless Weather Station

The circuit is assembled on a breadboard but you can design a custom PCB for this project. Alright, all the sensors can be placed in a small waterproof box except the rain sensor that needs to be placed outside to monitor the rainfall. The Sensor Node operates on very small power and putting the device to sleep mode will increase battery life. Also removing the unnecessary voltage regulator and using low power LDO or buck converter IC can lower down the power further.

The LoRa Module operates on frequency 433Mhz, but you can select the 868MHz or 915MHz frequency according to your region. You can use any other Lora module with a different antenna as per the availability in your region. Remember the LoRa Based Weather Station is not a waterproof device, so place it inside the waterproof casing.



Wifi Gateway Circuit

On the Gateway side, we only have LoRa Module SX1278 & ESP32 Wifi Module. The LoRa is connected via SPI Pins to ESP32 Board. And this unit is powered through USB Cable.

ESP32 Lora Gateway

The Gateway unit can be placed inside the room or outside but near to the WiFi Network. The ESP32 Wifi module connects to the local wifi network. And the LoRa receives the data from the sensor node. Using the esp32 wifi module the data is uploaded to the server.


Library Installation on Arduino IDE

Before moving to the programming part, you need to install Libraries to the Arduino IDE. The following are the list of Libraries that is used in the code below.

1. LoRa Library

The LoRa library is used for sending and receiving data using LoRa radios. This library exposes the LoRa radio directly and allows you to send data to any radios in range with the same radio parameters. All data is broadcasted and there is no addressing.

Download: LoRa Library

2. BME280 Library

The Adafruit BME280 Library from the Adafruit makes an I2C Interface with Arduino or any other microcontroller and reads the temperature, humidity and Pressure Value from the Sensor.

Download: BME280 Library

3. BH1750 Library

This package contains an Arduino library for digital light sensor breakout boards containing the BH1750FVI IC. Configuring the I2C bus must be done in user code helps to communicate between Arduino & the sensor.

Download: BH1750 Library

4. Blynk Library

Blynk is the most popular Internet of Things platform for connecting any hardware to the cloud, designing apps to control them, and managing your deployed products at scale. With Blynk Library you can connect over 400 hardware models including ESP8266, ESP32, NodeMCU & Arduino to the Blynk Cloud.

Download: Blynk Library


Source Code/Program for Sensor Node

The program or code for the LoRa Weather Station Sensor Node is given below. You can copy the code and upload it to the Arduino Pro Mini Board. In case if you are using the multiple sensor nodes make sure to change the device ID from the code.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <Wire.h>
#include <SPI.h>
#include <LoRa.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <BH1750.h>       // adds BH1750 library file
 
//#define SS 10
//#define RST 9
//#define DI0 2
 
//#define TX_P 17
//#define ENCRYPT 0x78
 
#define BAND 433E6
#define rain_sensor A0
 
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;
 
BH1750 lightMeter;
 
String LoRaMessage = "";
char device_id[12] = "MyDevice123";
 
 
void setup()
{
  Serial.begin(115200);
  Wire.begin();
  lightMeter.begin();
 
  pinMode (rain_sensor, INPUT);
  while (!Serial);
 
  Serial.println(F("LoRa Sender"));
 
  //LoRa.setPins(SS, RST, DI0);
  //LoRa.setTxPower(TX_P);
  //LoRa.setSyncWord(ENCRYPT);
 
  if (!LoRa.begin(BAND))
  {
    Serial.println(F("Starting LoRa failed!"));
    while (1);
  }
  if (!bme.begin(0x76))
  {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
}
 
void loop()
{
  float temperature = bme.readTemperature();
  float pressure = bme.readPressure() / 100.0F;
  float altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);
  float humidity = bme.readHumidity();
 
  double dewPoint = dewPointFast(temperature, humidity);
 
  int rainfall = map(analogRead(rain_sensor), 780, 0, 0, 100);
  if (rainfall >= 100)
  {
    rainfall = 100;
  }
  if (rainfall <= 0)
  {
    rainfall = 0;
  }
 
  float lux = lightMeter.readLightLevel();
 
  Serial.print(F("Device ID: "));
  Serial.println(device_id);
 
  Serial.print(F("Temperature = "));
  Serial.print(temperature);
  Serial.println(F("*C"));
 
  Serial.print(F("Pressure = "));
  Serial.print(pressure);
  Serial.println(F("hPa"));
 
  Serial.print(F("Approx. Altitude = "));
  Serial.print(altitude);
  Serial.println(F("m"));
 
  Serial.print(F("Humidity = "));
  Serial.print(humidity);
  Serial.println(F("%"));
 
  Serial.print(F("Dew point = "));
  Serial.print(dewPoint);
  Serial.println(F(" *C"));
 
  Serial.print(F("Rainfall = "));
  Serial.print(rainfall);
  Serial.println(F("%"));
 
  Serial.print(F("Light = "));
  Serial.print(lux);
  Serial.println(F(" lx"));
 
 
  Serial.println();
 
  LoRaMessage = String(device_id) + "/" + String(temperature) + "&" + String(pressure)
                + "#" + String(altitude) + "@" + String(humidity) + "$" + String(dewPoint)
                + "^" + String(rainfall) + "!" + String(lux);
 
  // send packet
  LoRa.beginPacket();
  LoRa.print(LoRaMessage);
  LoRa.endPacket();
  delay(10000);
}
 
 
double dewPointFast(double celsius, double humidity)
{
  double a = 17.271;
  double b = 237.7;
  double temp = (a * celsius) / (b + celsius) + log(humidity * 0.01);
  double Td = (b * temp) / (a - temp);
  return Td;
}



Source Code/Program for Gateway: WebServer

Here is a Gateway Code for ESP32 Board. Using this code you can view the weather station data on Web Browser. The ESP32 Webserver creates a webpage where all the data related to Weather Station is logged on.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#include <SPI.h>
#include <LoRa.h>
#include <WiFi.h>
#include <WebServer.h>
 
 
#define SS 5
#define RST 14
#define DI0 2
 
//#define TX_P 17
#define BAND 433E6
//#define ENCRYPT 0x78
 
String device_id;
String temperature;
String pressure;
String altitude;
String humidity;
String dewPoint;
String rainfall;
String lux;
 
const char* ssid = "Bynark_Airtel";
const char* password = "bynark@123";
 
WebServer server(80);
 
void setup()
{
  Serial.begin(115200);
  Serial.println("LoRa Receiver");
  //LoRa.setTxPower(TX_P);
  //LoRa.setSyncWord(ENCRYPT);
 
  LoRa.setPins(SS, RST, DI0);
  if (!LoRa.begin(BAND))
  {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
  
  Serial.println("Connecting to ");
  Serial.println(ssid);
 
  //Connect to your local wi-fi network
  WiFi.begin(ssid, password);
 
  //check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");  Serial.println(WiFi.localIP());
 
  server.on("/", handle_OnConnect);
  server.onNotFound(handle_NotFound);
 
  server.begin();
  Serial.println("HTTP server started");
}
 
void loop()
{
  // try to parse packet
  int pos1, pos2, pos3, pos4, pos5, pos6, pos7;
 
  int packetSize = LoRa.parsePacket();
  if (packetSize)
  {
    // received a packet
    Serial.print("Received packet:  ");
    String LoRaData = LoRa.readString();
    Serial.print(LoRaData);
    // read packet
    while (LoRa.available()) {
      Serial.print((char)LoRa.read());
    }
    // print RSSI of packet
    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
 
    pos1 = LoRaData.indexOf('/');
    pos2 = LoRaData.indexOf('&');
    pos3 = LoRaData.indexOf('#');
    pos4 = LoRaData.indexOf('@');
    pos5 = LoRaData.indexOf('$');
    pos6 = LoRaData.indexOf('^');
    pos7 = LoRaData.indexOf('!');
 
    device_id = LoRaData.substring(0, pos1);
    temperature = LoRaData.substring(pos1 + 1, pos2);
    pressure = LoRaData.substring(pos2 + 1, pos3);
    altitude = LoRaData.substring(pos3 + 1, pos4);
    humidity = LoRaData.substring(pos4 + 1, pos5);
    dewPoint = LoRaData.substring(pos5 + 1, pos6);
    rainfall = LoRaData.substring(pos6 + 1, pos7);
    lux = LoRaData.substring(pos7 + 1, LoRaData.length());
 
    Serial.print(F("Device ID = "));
    Serial.println(device_id);
 
    Serial.print(F("Temperature = "));
    Serial.print(temperature);
    Serial.println(F("*C"));
 
    Serial.print(F("Pressure = "));
    Serial.print(pressure);
    Serial.println(F("hPa"));
 
    Serial.print(F("Approx. Altitude = "));
    Serial.print(altitude);
    Serial.println(F("m"));
 
    Serial.print(F("Humidity = "));
    Serial.print(humidity);
    Serial.println(F("%"));
 
    Serial.print("Dew point = ");
    Serial.print(dewPoint);
    Serial.println(" *C");
 
    Serial.print(F("Rainfall = "));
    Serial.print(rainfall);
    Serial.println(F("%"));
 
    Serial.print(F("Light = "));
    Serial.print(lux);
    Serial.println(F(" lx"));
 
    Serial.println();
    
    server.handleClient();
  }
}
 
void handle_OnConnect()
{
  server.send(200, "text/html", SendHTML(temperature.toFloat(), humidity.toFloat(), pressure.toFloat(), altitude.toFloat(), dewPoint.toFloat(), rainfall.toFloat(), lux.toFloat()));
}
 
 
void handle_NotFound()
{
  server.send(404, "text/plain", "Not found");
}
 
String SendHTML(float temperature, float humidity, float pressure, float altitude, float dewPoint, float rainfall, float lux)
{
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr += "<title>Wireless Weather Station</title>\n";
  ptr += "<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  ptr += "body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
  ptr += "p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
  ptr += "</style>\n";
  ptr += "</head>\n";
  ptr += "<body>\n";
  ptr += "<div id=\"webpage\">\n";
  ptr += "<h1>Wireless Weather Station</h1>\n";
 
  ptr += "<p>Temperature: ";
  ptr += temperature;
  ptr += "&deg;C</p>";
 
  ptr += "<p>Humidity: ";
  ptr += humidity;
  ptr += "%</p>";
 
  ptr += "<p>Pressure: ";
  ptr += pressure;
  ptr += "hPa</p>";
 
  ptr += "<p>Altitude: ";
  ptr += altitude;
  ptr += "m</p>";
 
  ptr += "<p>Dew Point: ";
  ptr += dewPoint;
  ptr += "&deg;C</p>";
 
  ptr += "<p>Rainfall: ";
  ptr += rainfall;
  ptr += "%</p>";
 
  ptr += "<p>Light: ";
  ptr += lux;
  ptr += "lx</p>";
 
  ptr += "</div>\n";
  ptr += "</body>\n";
  ptr += "</html>\n";
  return ptr;
}

Now you can upload the code to the Arduino Pro Mini & ESP32 Board. Once the code is uploaded, open the serial monitor for both the transmitter and then a receiver part. If every connection is correct the sender will initialize and starts sending the data. On the receiver side, the receiver will connect to the network and will print the IP Address.

Copy the IP address and paste it on the Web Browser. You can paste and hit enter in the Chrome Browser of your Computer or simply on the Smartphone.

LoRa Weather Station WebServer

The weather station data will be simply displayed in a web browser. You can reload the page to refresh the weather data. Or simply using the AJAX function in code you can refresh the data without reloading the page.


Source Code/Program for Gateway: Thingspeak Server

Now let’s monitor the LoRa Weather Station data on Thingspeak Server. For that create an account on Thingspeak Server or simply log in if you have created the account earlier. Then create a new channel with the following details like temperature, humidity, pressure, altitude, dew point, rainfall, and light intensity.

Then go to the API Key and copy the write API Key. In the below Code change the API Key, WiFi SSID & Password.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include <SPI.h>
#include <LoRa.h>
#include <WiFi.h>
 
String apiKey = "************"; // Enter your Write API key from ThingSpeak
const char* ssid = "************";
const char* password = "************";
const char* server = "api.thingspeak.com";
 
#define SS 5
#define RST 14
#define DI0 2
 
//#define TX_P 17
#define BAND 433E6
//#define ENCRYPT 0x78
 
String device_id;
String temperature;
String pressure;
String altitude;
String humidity;
String dewPoint;
String rainfall;
String lux;
 
WiFiClient client;
 
 
void setup()
{
  Serial.begin(115200);
  Serial.println("LoRa Receiver");
  //LoRa.setTxPower(TX_P);
  //LoRa.setSyncWord(ENCRYPT);
 
  LoRa.setPins(SS, RST, DI0);
  if (!LoRa.begin(BAND))
  {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
 
  Serial.println("Connecting to ");
  Serial.println(ssid);
 
  //connect to your local wi-fi network
  WiFi.begin(ssid, password);
 
  //check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");
  Serial.println(WiFi.localIP());
 
}
 
void loop()
{
  // try to parse packet
  int pos1, pos2, pos3, pos4, pos5, pos6, pos7;
 
  int packetSize = LoRa.parsePacket();
  if (packetSize)
  {
    // received a packet
    Serial.print("Received packet:  ");
    String LoRaData = LoRa.readString();
    Serial.print(LoRaData);
    // read packet
    while (LoRa.available())
    {
      Serial.print((char)LoRa.read());
    }
    // print RSSI of packet
    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
 
    pos1 = LoRaData.indexOf('/');
    pos2 = LoRaData.indexOf('&');
    pos3 = LoRaData.indexOf('#');
    pos4 = LoRaData.indexOf('@');
    pos5 = LoRaData.indexOf('$');
    pos6 = LoRaData.indexOf('^');
    pos7 = LoRaData.indexOf('!');
 
    device_id = LoRaData.substring(0, pos1);
    temperature = LoRaData.substring(pos1 + 1, pos2);
    pressure = LoRaData.substring(pos2 + 1, pos3);
    altitude = LoRaData.substring(pos3 + 1, pos4);
    humidity = LoRaData.substring(pos4 + 1, pos5);
    dewPoint = LoRaData.substring(pos5 + 1, pos6);
    rainfall = LoRaData.substring(pos6 + 1, pos7);
    lux = LoRaData.substring(pos7 + 1, LoRaData.length());
 
    Serial.print(F("Device ID = "));
    Serial.println(device_id);
 
    Serial.print(F("Temperature = "));
    Serial.print(temperature);
    Serial.println(F("*C"));
 
    Serial.print(F("Pressure = "));
    Serial.print(pressure);
    Serial.println(F("hPa"));
 
    Serial.print(F("Approx. Altitude = "));
    Serial.print(altitude);
    Serial.println(F("m"));
 
    Serial.print(F("Humidity = "));
    Serial.print(humidity);
    Serial.println(F("%"));
 
    Serial.print("Dew point = ");
    Serial.print(dewPoint);
    Serial.println(" *C");
 
    Serial.print(F("Rainfall = "));
    Serial.print(rainfall);
    Serial.println(F("%"));
 
    Serial.print(F("Light = "));
    Serial.print(lux);
    Serial.println(F(" lx"));
 
    Serial.println();
 
    if (client.connect(server, 80)) // "184.106.153.149" or api.thingspeak.com
    {
      String postStr = apiKey;
      postStr += "&field1=";
      postStr += String(temperature);
      postStr += "&field2=";
      postStr += String(pressure);
      postStr += "&field3=";
      postStr += String(altitude);
      postStr += "&field4=";
      postStr += String(humidity);
      postStr += "&field5=";
      postStr += String(dewPoint);
      postStr += "&field6=";
      postStr += String(rainfall);
      postStr += "&field7=";
      postStr += String(lux);
      postStr += "r\n";
 
      client.print("POST /update HTTP/1.1\n");
      client.print("Host: api.thingspeak.com\n");
      client.print("Connection: close\n");
      client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n");
      client.print("Content-Type: application/x-www-form-urlencoded\n");
      client.print("Content-Length: ");
      client.print(postStr.length());
      client.print("\n\n");
      client.print(postStr);
 
      Serial.println("Data Send to Thingspeak");
      delay(500);
    }
    client.stop();
    Serial.println("Waiting...");
 
  }
}


Now again open the Serial Monitor. So if you see the data is sent and received means your node and gateway both are working fine.

Now go to the Thingspeak Private view. Here you will see the data logged in the graphical format. The data is received after an interval of 15 seconds.


Source Code/Program for Gateway: Blynk Application

Here is a Blynk Code for monitoring Wireless Weather Station data is Blynk Application. The data from the ESP32 LoRa Gateway will be logged to Blynk Cloud Server.

In the following code change the Blynk Authentication Token that is generated by your Blynk Application. Also change the WiFi SSID & Password.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#define BLYNK_PRINT Serial
#include <SPI.h>
#include <LoRa.h>
#include <WiFi.h>
#include <Blynk.h>
#include <BlynkSimpleEsp32.h>
 
char auth[] = "**********************";       // You should get Auth Token in the Blynk App.
char ssid[] = "************";                 // Your WiFi credentials.
char pass[] = "************";
 
#define SS 5
#define RST 14
#define DI0 2
 
//#define TX_P 17
#define BAND 433E6
//#define ENCRYPT 0x78
 
String device_id;
String temperature;
String pressure;
String altitude;
String humidity;
String dewPoint;
String rainfall;
String lux;
 
void setup()
{
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  Serial.println("LoRa Receiver");
  //LoRa.setTxPower(TX_P);
  //LoRa.setSyncWord(ENCRYPT);
 
  LoRa.setPins(SS, RST, DI0);
  if (!LoRa.begin(BAND))
  {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
 
  Serial.println("Connecting to ");
  Serial.println(ssid);
 
  //connect to your local wi-fi network
  WiFi.begin(ssid, pass);
 
  //check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");
  Serial.println(WiFi.localIP());
 
}
 
void loop()
{
  // try to parse packet
  int pos1, pos2, pos3, pos4, pos5, pos6, pos7;
 
  int packetSize = LoRa.parsePacket();
  if (packetSize)
  {
    Blynk.run();
    // received a packet
    Serial.print("Received packet:  ");
    String LoRaData = LoRa.readString();
    Serial.print(LoRaData);
    // read packet
    while (LoRa.available())
    {
      Serial.print((char)LoRa.read());
    }
    // print RSSI of packet
    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
 
    pos1 = LoRaData.indexOf('/');
    pos2 = LoRaData.indexOf('&');
    pos3 = LoRaData.indexOf('#');
    pos4 = LoRaData.indexOf('@');
    pos5 = LoRaData.indexOf('$');
    pos6 = LoRaData.indexOf('^');
    pos7 = LoRaData.indexOf('!');
 
    device_id = LoRaData.substring(0, pos1);
    temperature = LoRaData.substring(pos1 + 1, pos2);
    pressure = LoRaData.substring(pos2 + 1, pos3);
    altitude = LoRaData.substring(pos3 + 1, pos4);
    humidity = LoRaData.substring(pos4 + 1, pos5);
    dewPoint = LoRaData.substring(pos5 + 1, pos6);
    rainfall = LoRaData.substring(pos6 + 1, pos7);
    lux = LoRaData.substring(pos7 + 1, LoRaData.length());
 
    Serial.print(F("Device ID = "));
    Serial.println(device_id);
 
    Serial.print(F("Temperature = "));
    Serial.print(temperature);
    Serial.println(F("*C"));
 
    Serial.print(F("Pressure = "));
    Serial.print(pressure);
    Serial.println(F("hPa"));
 
    Serial.print(F("Approx. Altitude = "));
    Serial.print(altitude);
    Serial.println(F("m"));
 
    Serial.print(F("Humidity = "));
    Serial.print(humidity);
    Serial.println(F("%"));
 
    Serial.print("Dew point = ");
    Serial.print(dewPoint);
    Serial.println(" *C");
 
    Serial.print(F("Rainfall = "));
    Serial.print(rainfall);
    Serial.println(F("%"));
 
    Serial.print(F("Light = "));
    Serial.print(lux);
    Serial.println(F(" lx"));
 
    Serial.println();
 
    Blynk.virtualWrite(V1, temperature);
    Blynk.virtualWrite(V2, humidity);
    Blynk.virtualWrite(V3, pressure);
    Blynk.virtualWrite(V4, altitude);
    Blynk.virtualWrite(V5, dewPoint);
    Blynk.virtualWrite(V6, rainfall);
    Blynk.virtualWrite(V7, lux);
 
  }
}



So when the code is uploaded, the ESP32 will connect to the Blynk server. Now you can check the Blynk Application on your mobile phone. The mobile phone will receive the Wireless LoRa Weather Station data.


Video Tutorial & Guide: Wireless LoRa Weather Station

LoRa Based Wireless Weather Station Monitoring System
Watch this video on YouTube.

You can also send the data to the server using the MQTT protocol, which is a lightweight protocol. You can check one of the such examples here: BME680 MQTT Weather Station.

Share. Facebook Twitter Pinterest LinkedIn Tumblr Email Reddit Telegram WhatsApp
Previous ArticleGPS+GSM Based Vehicle Tracking System using Arduino
Next Article D.O. Meter using Analog Dissolved Oxygen Sensor & Arduino

Related Posts

ESP32 Fingerprint Attendance System with Live Web Dashboard

ESP32 Fingerprint Attendance System with Live Web Dashboard

Updated:June 21, 2026
IoT Based PM & Air Quality Monitoring System using ESP32

IoT Based PM & Air Quality Monitoring System using ESP32

Updated:June 14, 2026
DIY ESP32 MLX90640 IR Thermal Camera with Live Web Display

DIY ESP32 MLX90640 IR Thermal Camera with Live Web Display

Updated:May 10, 20262K
IoT Activity Tracker with ESP32 & Accelerometer Gyroscope

IoT Activity Tracker with ESP32 & Accelerometer/Gyroscope

Updated:May 2, 2026

ESP32 IoT Vehicle Motion Analyzer with MPU6050 & LIS3MDL

Updated:April 27, 20261K
High-Accuracy Pitch, Roll, Yaw with ESP32 & BNO08x IMU

High-Accuracy Pitch, Roll, Yaw with ESP32 & BNO08x IMU

Updated:April 27, 20262K
View 15 Comments

15 Comments

  1. Seli on August 4, 2021 2:26 AM

    Hi, Is the “TP4050 Battery Charging Module” a typo error. Is it not the TP4056 ?

    Reply
    • Admin on August 4, 2021 10:55 AM

      Thanks for the correction. Its TP4056.

      Reply
  2. anna on August 24, 2021 11:00 PM

    can i ask for pcb / dps

    Reply
  3. Aman on December 31, 2021 4:45 PM

    i am having error with WebServer.h as i cannot find the library can you please provide me the link to library so i can integrate it

    Reply
  4. Fory on January 23, 2022 3:11 PM

    Excellent work! Thank you!

    Reply
  5. JJ on January 24, 2022 6:48 PM

    Thanks for interesting tutorial but is there not some code required to put the Arduino into a deep sleep to conserve the battery?

    Reply
  6. Konrad Ash on February 4, 2022 9:36 PM

    The code about Source Code/Program for Gateway: WebServer get followed error on line 59 and 60 : expected unqualified-id before ‘.’ token . And the in the line 136 Coud you help me ? .

    Reply
  7. Konrad Ash on February 5, 2022 10:48 PM

    The code about Source Code/Program for Gateway: WebServer get followed error on line 58-59 and 135 -141-147 : expected unqualified-id before ‘.’ token . And the in the line 136 Coud you help me ? .

    Reply
  8. pierre on December 28, 2022 12:37 PM

    Hello
    Thank you for this example , very interesting but very very unstable. after a very long month of testing and many modifications, I think I have finally found the source of the problem. The ESP wifi modem is near the antenna LoRA and interferes with reception. I tried the espwifistop commands but had problems waking up. In the end I connect to the wifi after having received my data LORA and I close right after i send to Thingspeak. the result is not bad

    Reply
    • Admin on December 28, 2022 12:40 PM

      Thanks for testing and clear explanation. I tried finding the problem and fixing the issues for many months and never realized why esp32 hangs and stops working. Now you have provided solution. Thanks a lot.

      Reply
  9. Isaac Olsen on March 10, 2023 11:45 AM

    Is it possible to add wind speed/direction to this? If so what hardware would I need?

    Reply
    • Admin on March 10, 2023 1:33 PM

      You need an anemometer to measure wind speed. We have some tutorial posted about Anemometer.

      Reply
  10. ID on April 11, 2023 11:57 AM

    Hi, this this is a really cool project, i saw u say: “In case if you are using the multiple sensor nodes make sure to change the device ID from the code”, but how can i manage multiple nodes and get the data from it into thinkspeak server?

    Reply
  11. Abubakar on October 1, 2023 4:47 AM

    Lovely, this has helped my programming works

    Reply
  12. Shashank on February 6, 2024 11:16 AM

    Can you please let me know where the PCB gerber of this project is?

    Reply

CommentsCancel reply

Latest Posts
ESP32 Fingerprint Attendance System with Live Web Dashboard

ESP32 Fingerprint Attendance System with Live Web Dashboard

June 21, 2026
IoT Based PM & Air Quality Monitoring System using ESP32

IoT Based PM & Air Quality Monitoring System using ESP32

June 14, 2026
DIY ESP32 MLX90640 IR Thermal Camera with Live Web Display

DIY ESP32 MLX90640 IR Thermal Camera with Live Web Display

May 10, 2026
IoT Activity Tracker with ESP32 & Accelerometer Gyroscope

IoT Activity Tracker with ESP32 & Accelerometer/Gyroscope

May 2, 2026
A Guide to Sourcing Obsolete ICs for Vintage Projects

Beyond AliExpress: A Guide to Sourcing Obsolete ICs for Vintage Projects

April 21, 2026

ESP32 IoT Vehicle Motion Analyzer with MPU6050 & LIS3MDL

April 27, 2026
Building a Smart Sensor Node with a BLE Microcontroller

Building a Smart Sensor Node with a BLE Microcontroller

February 26, 2026
High-Accuracy Pitch, Roll, Yaw with ESP32 & BNO08x IMU

High-Accuracy Pitch, Roll, Yaw with ESP32 & BNO08x IMU

April 27, 2026
Top Posts & Pages
  • ESP32 Fingerprint Attendance System with Live Web Dashboard
    ESP32 Fingerprint Attendance System with Live Web Dashboard
  • IoT AC Energy Meter with PZEM-004T & ESP32 WebServer
    IoT AC Energy Meter with PZEM-004T & ESP32 WebServer
  • 12V DC to 220V AC Inverter Circuit & PCB
    12V DC to 220V AC Inverter Circuit & PCB
  • ESP32 CAN Bus Tutorial | Interfacing MCP2515 CAN Module with ESP32
    ESP32 CAN Bus Tutorial | Interfacing MCP2515 CAN Module with ESP32
  • How to use Modbus RTU with ESP32 to read Sensor Data
    How to use Modbus RTU with ESP32 to read Sensor Data
  • IoT Based ECG Monitoring with AD8232 ECG Sensor & ESP32
    IoT Based ECG Monitoring with AD8232 ECG Sensor & ESP32
  • Half Wave Rectifier Basics, Circuit, Working & Applications
    Half Wave Rectifier Basics, Circuit, Working & Applications
  • How to use INA226 DC Current Sensor with Arduino
    How to use INA226 DC Current Sensor with Arduino
Categories
  • Arduino Projects (197)
  • Articles (60)
    • Learn Electronics (19)
    • Product Review (15)
    • Tech Articles (28)
  • Electronics Circuits (46)
    • 555 Timer Projects (21)
    • Op-Amp Circuits (7)
    • Power Electronics (13)
  • IoT Projects (205)
    • ESP32 MicroPython (7)
    • ESP32 Projects (82)
    • ESP32-CAM Projects (15)
    • ESP8266 Projects (76)
    • LoRa/LoRaWAN Projects (22)
  • Microcontrollers (38)
    • AMB82-Mini IoT AI Camera (4)
    • BLE Projects (18)
    • STM32 Projects (19)
  • Raspberry Pi (93)
    • Raspberry Pi Pico Projects (57)
    • Raspberry Pi Pico W Projects (12)
    • Raspberry Pi Projects (24)
Follow Us
  • Facebook
  • Twitter
  • Pinterest
  • Instagram
  • YouTube
About Us

“‘How to Electronics’ is a vibrant community for electronics enthusiasts and professionals. We deliver latest insights in areas such as Embedded Systems, Power Electronics, AI, IoT, and Robotics. Our goal is to stimulate innovation and provide practical solutions for students, organizations, and industries. Join us to transform learning into a joyful journey of discovery and innovation.

Copyright © How To Electronics. All rights reserved.
  • About Us
  • Disclaimer
  • Privacy Policy
  • Contact Us
  • Advertise With Us

Type above and press Enter to search. Press Esc to cancel.

Ad Blocker Enabled!
Ad Blocker Enabled!
Looks like you're using an ad blocker. Please allow ads on our site. We rely on advertising to help fund our site.