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 collaborationToo 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