Breadboard Weather Station - LoRa + GPS + DHT11

by lucascreator in Circuits > Arduino

96 Views, 2 Favorites, 0 Comments

Breadboard Weather Station - LoRa + GPS + DHT11

photo-1.jpg

Most weather station tutorials show you how to log data to an SD card or send it over Wi-Fi. This one does something different.

I built a wireless weather station where two Arduino boards communicate entirely over LoRa - no internet, no cloud, no subscription fees.

One unit collects temperature, humidity, and GPS coordinates. The other displays that data on an LCD screen from up to several kilometers away.

The build uses RYLR993 LoRa modules, a DHT11 sensor, a NEO-6M GPS receiver, and an I2C LCD.

I've included wiring details, open-source code, and the one lesson I learned the hard way: cheap GPS modules will not work indoors. Save yourself the frustration and go outside from the start.

Whether you're prototyping an IoT device or just want to understand long-range wireless communication, this project is a practical starting point. No fluff. Just a messy breadboard that actually works.

Supplies

For this project, you'll need:

  1. 1 x Arduino UNO
  2. 1 x Arduino Nano
  3. 2 x RYLR993 Lite
  4. 1 x DHT11 sensor
  5. 1 x NEO-6M GPS
  6. 1 x I2C LCD
  7. 1 x I/O expansion shield
  8. 1 x Push button
  9. 2 x 5kΩ resistor
  10. 2 x 10kΩ resistor
  11. 2 x Battery
  12. 2 x Breadboard
  13. Jumper wires

YouTube Tutorial

Trying to Build My First Hardware Product

I've recently posted a tutorial about this project on YouTube explaining everything you can read on this article. You can watch it right above.

A Mess of Wires That Actually Works

photo-2.jpg
photo-3.jpg

At first glance, this project looks like a chaos of jumper wires, sensors, and breakout boards spread across a breadboard. And honestly? That's exactly what it is.

But underneath that mess is a fully functional wireless weather station capable of transmitting temperature, humidity, and GPS coordinates over long distances using LoRa technology.

I built this prototype over a single weekend to test the wireless communication backbone of a larger idea.

The goal was simple: prove that two Arduino boards could talk to each other using LoRa modules, with one acting as a remote weather sensor and the other as a receiving display unit.

Everything else - the sensors, the GPS, the LCD screen - was just proving that the link could carry real, useful data.

Why LoRa?

LoRa stands for Long Range, and it's a wireless modulation technique designed specifically for Internet of Things applications.

Unlike Wi-Fi or Bluetooth, which trade range for bandwidth, LoRa is built for low-power, long-distance communication.

You're not going to stream video over it, but you can send small packets of sensor data for kilometers while running on battery power for a very long time.

For a weather station that needs to sit outside, possibly far from the receiver, LoRa is an ideal choice. In this project, I used the RYLR993 Lite modules from REYAX.

These modules handle all the LoRa complexity internally and communicate with the Arduino over simple serial UART. That means you don't need to be an RF engineer to get started. You just send commands and read responses.

If you want to learn more about LoRa, I highly recommend you check out this article.

Sponsor

photo-13.png

Before moving on, I would like to talk a bit about Reyax, who kindly provided the RYLR993 Lite modules and is the sponsor of this tutorial.

If you don't know them yet, REYAX is a Taiwanese company that focuses on wireless solutions for IoT applications.

I have to say that I'm pretty satisfied with the results I got. But I'll talk more about that later.

If you're working on a project that needs wireless communication - like LoRa, GPS, Bluetooth, 4G, etc. - I highly recommend you check out their products. You can find them on Amazon, DigiKey, and other global distributors.

Thanks REYAX for sponsoring this content. Now let's get back to the project.

Wiring

photo-4.png
photo-5.png

Transmitter

The transmitter unit is built around an Arduino Nano board.

Connected to it are three components: a DHT11 sensor for temperature and humidity, a NEO-6M GPS module for location data, and a RYLR993 LoRa module for wireless transmission.

The Arduino reads the sensors, packages the data into a simple string, and sends it out through the LoRa module.

The wiring is straightforward because all components are running at 5V logic levels, which matches the Arduino Nano.

The RYLR993 module communicates over serial. I connected its TX pin to Arduino pin 5, its RX pin to pin 4, and NRST (reset) to pin 6.

This uses SoftwareSerial, leaving the hardware serial port (pins 0 and 1) free for debugging. The module's VCC goes to 3.3V and GND to ground.

Note that the RX is connected through a voltage divider (resistors). We need that because Arduino outputs 5V signals but the module pins are 3.3V tolerant. Without the divider, the LoRa module could easily be damaged.

The DHT11 has three pins. I connected VCC to 5V, GND to ground, and the data pin to digital pin 7.

The NEO-6M GPS module also communicates over serial. I connected its TX pin to Arduino pin 3 and its RX pin to pin 2. Again, VCC to 5V and GND to ground.

You can refer to the diagram above to wire the transmitter.

Receiver

The receiver unit is another Arduino board paired with a second RYLR993 module.

Instead of sensors, it has a 16x2 LCD screen with an I2C backpack (which reduces the wiring to just two data lines) and a single push button.

The receiver listens for incoming LoRa transmissions, parses the data, and displays it on the screen. The button toggles the temperature display between Celsius and Fahrenheit.

The receiver has fewer components, but the LCD requires attention.

The RYLR993 module connects exactly the same way: TX to pin 5, RX to pin 4 (via divider), NRST to pin 6, VCC to 3.3V, and GND to ground.

The I2C LCD only needs four wires. VCC to 5V, GND to ground, SDA to Arduino A4, and SCL to A5.

The I2C address for my module used 0x60. You can run an I2C scanner sketch to confirm yours.

The push button connects between digital pin 3 and ground. I enabled the internal pull-up resistor in software, so no external resistor is needed. When the button is pressed, the pin reads LOW.

You can refer to the diagram above to wire the receiver.

Code

code-transmitter.png
code-receiver.png

I wrote two separate Arduino sketches: one for the transmitter and one for the receiver. Both are open source and available in this GitHub repository.

The transmitter sketch runs in a continuous loop. It reads temperature and humidity from the DHT11, then reads the latest GPS data from the NEO-6M.

The GPS module streams NMEA sentences continuously, so the sketch parses those sentences using the TinyGPS++ library.

Once valid data is available - including latitude, longitude, and fix status - the sketch builds a string containing all the values.

It then sends that string over the serial connection to the RYLR993 module using a simple send command. The LoRa module handles the rest.

The receiver sketch does the opposite. It listens for incoming LoRa messages through its own RYLR993 module.

When a message arrives, it parses the string back into individual values: temperature, humidity, latitude, and longitude.

It then updates the LCD display. The sketch also monitors the push button on pin 3. Each time the button is pressed, it flips a boolean flag that determines whether to show Celsius or Fahrenheit and even GPS coordinates.

The conversion from Celsius to Fahrenheit happens on the receiver side using the standard formula: F = (C * 9/5) + 32.

Results

photo-14.jpg
photo-11.jpg
photo-12.jpg

GPS

I ran the first test inside my house. The transmitter was sitting on my desk. The receiver was right next to it. The LoRa link worked immediately and the receiver showed temperature and humidity accordingly.

However, the GPS module showed no signal. No satellites. No coordinates. Nothing.

I rebooted the transmitter. I moved it to different rooms and placed it next to a window. Still nothing.

After searching online, I found the answer. The NEO-6M is a very basic GPS receiver. It has no assisted GPS, no cellular assistance, and no external antenna (unless you buy the version with one).

It needs a clear, unobstructed view of the sky to lock onto satellite signals. Roofs, walls, and even energy-efficient windows with metallic coatings block the weak signals coming from space.

This is a fundamental limitation of cheap GPS modules. They work beautifully outdoors. They fail consistently indoors.

So I took the transmitter outside to a nearby public square. I powered it on and waited.

After about five minutes - which felt like an eternity - the GPS module locked onto enough satellites to get a fix. The receiver immediately started showing latitude and longitude coordinates on the LCD.

I checked those coordinates against Google Map and the location was pretty accurate. If the transmitter were ever lost outdoors, those coordinates would be enough to find it.

Weather Data

The DHT11 sensor performed reliably throughout testing. Its accuracy is modest, about ±2°C for temperature and ±5% for humidity, but that's perfectly fine for a weather station prototype. The readings were consistent and updated every few seconds.

Pressing the button on the receiver toggled the temperature display between Celsius and Fahrenheit instantly.

I implemented this entirely on the receiver side, so the transmitter doesn't need to know or care which unit the user prefers. That keeps the transmitter code simpler and leaves more room for future features.

Range Test

I did not perform a full range test during this initial prototype phase, but I plan to do so.

The RYLR993 modules are rated for impressive distances. In open field conditions - clear weather, good antenna placement, no obstacles - some creators have reported reliable communication up to 20 kilometers (about 12.4 miles).

But open fields are not where most LoRa applications live.

I am more interested in testing this system in a city environment. Cars, trees, buildings, and general urban clutter will all affect LoRa performance differently.

A city test would give a much more realistic picture of what to expect in everyday use. That's what I want to pursue in future projects.

Conclusion

photo-10.jpg

This prototype taught me two important lessons.

First, LoRa is surprisingly easy to work with. The RYLR993 modules abstract away almost all the complexity. If you can write to a serial port, you can send data over LoRa.

The range is excellent, the power consumption is low, and the setup is minimal.

Second, cheap GPS modules are not indoor devices. The NEO-6M needs a clear view of the sky.

If you are testing a project that includes GPS, save yourself the frustration and take it outside immediately.

That five-minute wait for a satellite lock is normal. That is not a bug. That is just how basic GPS receivers work.

Thanks for reading this article. And if you enjoyed this one, I'll probably like this another tutorial in which I teach you how to make PCBs at home.