|
Environmental
and Climate Data Station
+
Cam - support
using
standard mechanical components for replication
Idea:
This
open environmental and climate monitoring station was developed
to collect local environmental data over the long term and to
make the design freely available to others for replication. The
goal is to enable a growing network of independent monitoring
stations.
Climate
protection is
very important to me, and to be able to make concrete statements,
it is first necessary to collect as much data as possible at
different locations. Weather stations already exist in all
variations, but few have the capability to also measure
CO2,
particulate matter, and radioactivity ( ionizing radiation,
especially alpha, beta, and gamma radiation
).
These professional weather stations are, however, very expensive.
Since this data is particularly important to me, I have found a
way to build or replicate such a professional weather station
using standard
mechanical components from
hardware stores and even household items. One version can be seen
in the following image ( Environmental
Station 1 ).
The second version ( Environmental
Station 2 )
is largely identical, but the wind and water setup with the WS3
combination sensor module is omitted and replaced, among other
things, by the BME680 sensor module. My flexible concept with
various software
extensions
is also very important. It is very
easy
to add a new/different sensor, eg, a VOC or UV sensor; details
with examples can be found in the Extensions
chapter .
I implemented it with a Geiger counter that runs autonomously on
its own Raspberry Pi PICO W and with its own power supply. There
are no limits to its expansion potential, and given the price of
environmental sensors, and especially a Raspberry Pi PICO W, it's
simply ideal. Measure, measure, and collect data again and again.
The more measurements taken at different locations and published,
the greater the awareness and the more attention drawn to climate
change. On a personal note: the particulate matter and CO2 levels
here on the outskirts of Munich are truly concerning!
This
project
originated
as a private, long-term experiment to collect environmental and
climate data using inexpensive microcontrollers and was supported
by AI during its development.
|
|
Station-1
(background
changed by AI)
|
|
Mechanical
design
For
the mechanical assembly, I used white air duct components (from
OBI) for the sensor section: OBI System 100, 2x item no. 367222
and 1x item no. 367216. For more information, contact
info@obisourcing.de. For the electronics, I used a standard TUBA
box, available in any well-stocked household goods store. All
components are very inexpensive and perfectly suited for outdoor
use, as they are 100% waterproof. The TUBA box is shown in the
overview image. The entire setup was mounted on a parasol stand.
I operate the Geiger counter (version 2) for measuring
radioactivity and UV radiation in a separate, light-transmitting
housing for the UV sensor, which serves as the radiation station.
|
|
Electronic
components
I used the following electrical components:
- Three generations of APRS WS1 WS3
modules for wind, water, air and temperature
- BME680 sensor for air and temperature
- CO2 MH-Z19C-PH, infrared CO2 sensor
- SDS011 , Fine dust sensor Nova Fitness
- 3 times Raspberry
Pi Pico 2 W
- 3
times OLED
display SSD1306
- In server/client operation, with software
version 2, one server system per weather station is
recommended:
I opted for the Raspberry Pi Zero 2W.
The
RadiationD-V1.1
(CAJOE) Geiger counter requires
an additional pico module with an OLED display and its own +5V
power supply. Further components are also needed for level
adjustment. In version 1, I implemented this using a 74ALS00:
74ALS00 Pin 1 -> LED D23, 74ALS00
Pin 2 -> +5V, 74ALS00 Pin 3 -> GP16. Details, including the
interface schematic, are in the file Hardware.pdf.
|
|
Elektronics:
Sensor Modul-1
Left: Particulate matter, Bottom right: CO2, Top right: WS3
|
|
Elektronics:
Sensor Modul-2
Left:
Particulate
matter, Bottom right: CO2, Top right: BME680
|
|
Electronics:
Geiger counter RadiationD-V1.1
(CAJOE)
The
Geiger counter, on the left in the image, type: RadiationD-V1.1
(CAJOE), is controlled
by
a separate Raspberry Pi Pico 2W. The unit of measurement is µSv/h
,
which stands for
microsieverts per hour
Version
1:
I
replaced the
original, additional DHT11 sensor with a BMP280
to
also measure air pressure (and temperature). There might be a
correlation between air pressure/CO2 and radioactivity, and
that's what I want to find out. The data is transmitted to both
servers . Hardware details can be found in the file Hardware.pdf.
Client software module: Client-RadiationD_BMP280-V4_2.py.
|
|
Version
2 :
Construction
of a radiation
station with
a
Geiger counter and
UV
sensor ,
additionally also with the BMP280 air sensor from Version 1. The
UV sensor used is an LTR390UV
.
The measuring unit is mW/cm²
and
stands for milliwatts
per square centimeter .
This sensor combination could potentially reveal correlations and
needs to be measured during continuous operation. An open
question (for me) is a weatherproof housing for outdoor use with
a UV-permeable glass pane/cover for the UV sensor. All the
software is located in the "Radiation Station" folder.
|
|
Elektronics:
Control module
Since
almost all the sensors I use have a serial interface, the wiring
is very simple and there are no issues with cable length at 9600
baud:
Sensor: TX
-> PICO: GP1 / PIN2;
Sensor: RX -> PICO: GP0 / PIN1;
OLED connection (for all modules): SDA -> GP14 / PIN19,
SCL -> GP15 / PIN20.
Additionally, I implemented a RESET
button on PIN 30/Run to Ground on each PICO. This pin forces a
restart if necessary.
Exception
:
Since my environmental
station -
2
didn't require wind and water measurements, I replaced the WS3
module
with a BME680
sensor.
However, this sensor doesn't have a UART but an I2C interface.
This can lead to transmission problems with longer data cables.
It still runs stably at a lower frequency and with a cable length
of approximately 60 cm. The wiring is also very simple: Sensor:
BME680,SDA --> PICO GP0 / PIN 1 Sensor: BME680,SCL --> PICO
GP1 / PIN 2 I couldn't find an equivalent, working sensor module
with a UART interface, only the SEN0501. This didn't work at all
in UART mode, and in I2C mode it was unsuitable and didn't behave
as described in the datasheet. To me, it seemed more like a
"fake".
|
|
Software
The
software
,
versions
1 to
4
,
is available as a complete zip file.
The
programs were (currently) developed entirely in the Python
programming language .
Well, what more can I say? AI at work. Additional information can
be found in the file Hardware.pdf. To prevent any interference
issues, I distributed the sensors and their associated software
across four Raspberry Pi Pico 2W units . There are three program
variations for each sensor: one for reading the sensor data only,
one with display on the OLED screen, and one with data
transmission via Wi-Fi.
|
|
Software
Version 1
Folder:
Version-1
.
This version is ideal for beginners and for testing purposes. The
data from each sensor is displayed directly on the mini-OLED
display. With a Wi-Fi connection, each Raspberry Pi Pico 2W
essentially acts as a "mini web server."
The
RadiationD-V1.1
(CAJOE) Geiger counter is not yet Wi-Fi enabled.
However,
this software version has many disadvantages and is not suitable
for continuous operation because:
Multiple
Picos acting as "mini web servers" on the Wi-Fi network
→ unstable during continuous operation. Each Pico = its own
web server; the browser accesses each Pico directly. Each Pico
has Wi-Fi + socket + HTML
– ->
connection drops and timeouts. For
further information, here is an example of how the data appears
in the browser:
|
|
Software
Version 2
Folder:
Version-2
A client/server architecture is required for
stable,
continuous operation .
An additional server system is now necessary. I opted for the
Raspberry
Pi Zero 2W system
for the weather station. Here are the individual installation
steps:
- The operating system can be easily downloaded using
the Raspberry Pi Imager and installed on the microSD card. I
chose Raspberry Pi OS Lite (64-bit). Please remember to enable
SSH support. -
I
temporarily connected a monitor and created a user (pi) with a
password. In my case, it was pi, and I had to permanently enable
SSH with: `sudo systemctl enable ssh` and `sudo systemctl start
ssh`. Query the IP address with `ifconfig -a`. From now on, my
server was accessible via SSH (even from Windows), e.g., `ssh
pi@192.168.178.72`
.
- To
avoid SSH hangs: edit the `/etc/ssh/sshd_config` file with `sudo
nano /etc/ssh/sshd_config`. At the very bottom, add the line `
IPQoS
cs0 cs0` and
then restart the SSH service with: `sudo systemctl restart ssh`.
- Install Python 3 and Flask software with: `sudo apt
update` and `sudo apt install python3-pip -y pip3 install flask`.
If
there's an error: `sudo apt install python3-flask -y`.
All
client/server software is located in the `Version-2`
folder. Copy
the weather station server software, `server.py`,
to the server system. The
weather station can now be started: with python3
server.py. Now
copy the software for the sensors to the corresponding PICOs:
Beforehand, the Wi-Fi ID and password must be set in the Python
program, as well as the IP address of the server system, e.g.,
for the CO2 sensor: Weather_V2/MH-Z19C-Client_V1.py : SERVER = "
http://192.168.178.72:5000
/data".
Now, copy ( save as ) the program, named main.py
to
the target PICO. Once all clients are started, the data can be
viewed in a browser at the address http://192.168.178.72:5000
as follows:
The
limit values for
CO2
and particulate matter are represented by green
/
orange
/
red
.
For
info: I won't go into further detail about
adjustments/optimizations in the Raspberry Pi operating system
here, as this is already extensively documented elsewhere. The
problems with the simultaneous startup of the PICO devices,
especially the CO2 sensor, are guaranteed
to be fixed .
Issues such as "system hangs" occurred specifically
when connecting to the Wi-Fi network and were resolved by using
appropriate watchdog timers. All status messages are displayed on
the OLED display at startup.
|
|
Software
Version
3
Folder:
Version
3 weather
station accessible outside of WLAN, SSD disk
for data
storage and integration of the Geiger counter module.
Implemented using the open-source reverse proxy service
ngrok
.
Installation is simple:
wget
https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-arm.zip
unzip
ngrok-v3-stable-linux-arm.zip
sudo mv ngrok
/usr/local/bin
Next, open your browser and go to:
https://dashboard.ngrok.com/signup.
You
will receive your token here:
https://dashboard.ngrok.com/get-started/your-authtoken
.
Activate the token with: `ngrok config add-authtoken TOKEN`.
Start
the token with: `ngrok http 5000` .
You will then receive the following message:
Forwarding:
https://stony-outlying-unaltered.ngrok-free.dev ->
http://localhost:5000.
You can also control access to the
data with a password. I have included the server program `
server(_V3).py`
as
an example in the `/Version-3` folder. For password protection,
the line `@requires_auth` at the end of the server program is
crucial . I implemented auto-start using systemctl. My stations
are now accessible from outside the network.
External
SSD Disk
The
Raspberry Pi Zero 2W exhibited strange behavior when implemented
with an external SSD. Ultimately, it depends on the quality of
the power supply. For me, adding the entry `
program_usb_boot_timeout=2`
to
the file ` /boot/firmware/config.txt`
resolved
the issue.
The actual setup/installation of an external
drive is described in detail elsewhere. In my case, I created the
folders `/mnt/ssd/data`, `/mnt/ssd/logs`, and `/mnt/ssd/cam`.
Don't forget the following command: `sudo chown -R pi:pi /mnt/ssd
.`
To enable data logging, the following must be added to
the `server.py` program (it's already included in the example
`server.py` program):
`DATA_PATH = "/mnt/ssd/data/"`
and `DATA_FILE = DATA_PATH + "data.json"`
Geiger
counter RadiationD-V1.1 (CAJOE)
This
sensor module now also has WLAN connectivity, together with a
BMP280 sensor to determine a possible correlation with air
pressure/humidity.
|
|
Software
Version
4
Folder:
Version-4
:
Full
configuration with
both
weather
stations, Station-1 and Station-2. The primary SERVER1
is
located in Station-1
.
In my case, it's equipped with a 520GB SSD, accessible from
outside via ngrok, and receives and stores all data from the
sensors, including those in Station-2. The respective sensor
programs, along with the server program version 4 (server_V4.py),
are located in the Station-1 subfolder. Server2 in
Station
-2
,
in my case, uses server version V2 (server_V2.py) and contains
customized sensor programs in version V4, also located in the
Station-2 subfolder. Each station uses three Raspberry Pi 2W
microcontrollers. Station-1 always stores all data on SERVER1.
SERVER2 in Station-2 checks if SERVER1 in Station-1 is online and
then sends the sensor data to Station-1, while also storing the
data on Station-2, which is equipped with a 128GB SSD. The Geiger
counter always attempts to send data to both stations.
This
concept is very flexible and can be expanded and extended at any
time by adding another station or additional/different sensors,
each with a Raspberry Pi Pico 2W.
|
|
Version
4_2
Setting
the storage location(=SSD) and path
SSD-path:
/mnt/ssd/data/
Partitionierung(15-JUN-2026):
2026_KW24 / 2026-06-15 /
daten.json
Server
versionen: server_V4_2.py und server_V2_2.py
|
|
Version
4_3
Implementation
of the radiation station, additionally with UV sensor.
Server
versions: server_V4_3.py and server_V2_3.py
|
|
Version
4_4
Camera
support, implementation:
A
" Camera
"
button is implemented in server/Station-1. and Station-2. This
button opens a new tab in the browser and displays an image taken
with the camera on the Raspberry Pi Zero W. This image is updated
every 5 minutes, and one image is saved daily at 2 PM to:
/mnt/ssd/cam/
(e.g.,
2026-07-13_1400.jpg).
The
rpicam software must be installed for this to work: `sudo
apt install rpicam-apps`
Furthermore,
password prompts should be disabled. A key must be generated for
this, e.g., on Windows: `ssh-keygen
-t ed25519` (press
return several times). The key will then be located in
C:\Users\<username>\.ssh\
.
Add this key: ` mkdir
-p ~/.ssh ,
nano
~/.ssh/authorized_keys .`
Finally, change the access rights: chmod
700 ~/.ssh ,
chmod
600 ~/.ssh/authorized_keys
Finally:
Two more
entries are needed in the crontab , created with crontab -e
:
*/5
* * * * /usr/bin/rpicam-still --nopreview -o
/mnt/ssd/cam/bild.jpg >/dev/null 2>&1
0 14 * * *
/bin/cp /mnt/ssd/cam/bild.jpg /mnt/ssd/cam/$(/bin/date
+\%Y-\%m-\%d_\%H\%M).jpg
Server
Versionen: server_V4_4.py und server_V2_4.py
The
following image shows the output of version 4_4 with
remote access via ngrok, also possible on mobile phones from
anywhere in the world.
|
|
Further
software versions
planned/in
progress:
Graphical
analysis ,
e.g., with Python libraries like matplotlib and plotly. There are
many
options
for graphical analysis, including ready-made programs and
complete tools. I take a rather neutral view of the topic but
would be very happy to receive
suggestions/recommendations.
However, for now, I have opted
for the open-source product matplotlib
.
An example is available in the " Diagrams
"
folder; see the file Diagram-Example.pdf.
To
be able to read/copy data , I use a Windows network
drive . For this, Samba must be
installed on the Raspberry Pi server using `sudo
apt install samba` and configured
in the file `/etc/samba/smb.conf` .
In
my case, this allows me to analyze and display the data much
faster. A detailed graphical analysis can only be performed after
a longer measurement period.
Prepared with server
versions: server_V4_5.py
and
server_V2_5.py
Clicking
the diagram button displays the following image: :
So
far (Jul-2026) I have unfortunately
received
no messages/contacts regarding expansion/suggestions and
collaboration
… Too
bad.
|
|
Attempt:
Dedicated
sensor
network with
hostapd/dnsmasq to " relieve" the home network: I
abandoned this idea because it would ultimately require a second
Wi-Fi interface on the server, e.g., a Wi-Fi/USB adapter. This
isn't possible in my case, as I'm using a Raspberry Pi Zero 2 W.
It would be feasible with a Raspberry Pi 4/5 and would be very
easy with the newer operating systems, e.g., `ip addr add
192.168.50.1/24 dev wlan1`. Further information available upon
request. IMPORTANT
: Ultimately, in
my opinion, a separate sensor
network is n't necessary,
as a FRITZ!Box (e.g., 7530) can easily handle the data volume .
|
|
Extensions
As
mentioned before, expanding my concept is very easy. In
this example, an LTR390 ALS+UV sensor is mounted on a breadboard,
connected to a Raspberry Pi Pico 2W and an OLED SSD1306 display,
following the principle that each sensor gets its own
Raspberry Pi Pico . The setup takes about 15 minutes. For the
software, most of the Wi-Fi connectivity can be adapted from
other sensors (e.g., the BME680), and then the necessary
adjustments/modifications can be made. That's all there is to it,
and it's relatively easy to accomplish. For me, the most
difficult part is the mechanical setup for the UV sensor.
For
your information: The image on the right also shows a Pico 2
RP2350 Zero, because I had the idea of
iplementing
an I2C connection with the Raspberry Pi, but there were too many
problems/bugs, so I'm sticking with my concept: Each sensor
gets its own Raspberry Pi Pico. At
prices of around €7, it's no longer an issue for me.
|
|
Here's another example of a test
extension; the total effort was about 2 hours.
LTR390
UV sensor and SGP30 MOX gas sensor. I will now use
the
LTR390 sensor together with the Geiger counter,
essentially as a radiation measuring station. The SGP30 sensor
isn't relevant for me, but it's meant to demonstrate how quickly
the sensor data is available on my phone.
Details in the
Extensions/UV+GAS folder .
|
|
References
I
was inspired by the following page:
https://learn.pimoroni.com/article/enviro-plus-and-luftdaten-air-quality-station
. However,
the lifespan of the PMS5003 I used at the time was always limited
to just one year. The Raspberry Pi 3 I used also gave up the
ghost after three years. I really liked the idea of registering
the sensor data. The link published there,
https://meine.luftdaten.info/register,
no
longer works (for me) and seems to have been replaced by the
following link:
https://devices.sensor.community/login?next=%2Fmy-sensors.
Unfortunately, I can't find out what data format this page
expects. I
think the idea of using a lot of sensor data to
highlight climate
change is fantastic
.
Perhaps this idea could be revived.
The
project originated as a private long-term experiment to collect
environmental and climate data using cost-effective
microcontrollers and was accompanied by AI support during its
development.
Please
send your suggestions and comments. I would be very happy to hear
from you.
Please
email info@pdp11gy.com
|