3D Printed Fish Monitor

by DhruvAlya in Circuits > Electronics

233 Views, 2 Favorites, 0 Comments

3D Printed Fish Monitor

Screenshot 2026-06-03 at 9.23.38 AM.png

Technology has advanced considerably over the last century, and the average person can now access weather forecasts at the click of a button. But for the fisherman, and especially small-scale commercial fisheries, these general insights are not enough to determine whether it's actually a good day to fish. Large-scale devices for these purposes can also be very expensive to access.

As part of a science project, I built a $150 device that integrates four sensors — a TDS sensor, a water temperature sensor, a barometric pressure sensor, and a camera — to generate real-time, fishing-specific insights. The TDS sensor measures water quality, the temperature sensor helps predict fish positioning in the water column, and the barometric pressure sensor tracks feeding behaviour patterns. Rapidly falling pressure signals an incoming front and triggers aggressive feeding, while rising pressure pushes fish deep for up to 48 hours. These feeding patters are predicted using a database that saves results from the barometric sensor, and python code that scans for patterns. The camera feeds into a custom-trained AI model that identifies five bass species and tracks their concentration over time.

The device runs on an Arduino UNO Q, chosen for its dual-board architecture. The MCU side handles AI fish classification using NCNN, while the MPU side runs the sensor stack and hosts a Flask web server that broadcasts all readings and insights to any device on the local WiFi network.

The fish classification model was trained on Kaggle using Roboflow datasets. Together, these components produce something no standard weather app offers: a unified, lake-specific monitoring system purpose-built for the fisherman.

Supplies

Electronics used from Amazon:

  1. TDS sensor
  2. Temperature sensor
  3. Camera
  4. Barometric Pressure sensor
  5. Arduino Uno Q
  6. USB-C hub
  7. M4 Threaded Inserts
  8. M3 Screw assortment
  9. M4 Screw assortment

3D prints:

  1. Please print the attached parts
  2. Part 3 is the bottom plate, Part 4 is the "center" section of the body, and part 5 is the top plate
  3. Additionally, print: Logitech Camera Casing(On Makerworld), and Arduino Uno Q casing(also on Makerworld)

Obtain Necessary Materials

IMG_5904.jpeg

Please print the parts attached, along with obtaining the attached products off Amazon or Aliexpress.

Part 3 might have issues with the standoffs breaking off. I recommend either using slicer modifiers or breaking off the standoffs and attach them manually.

Insert Metal Inserts

How to Install Heat Set Inserts into your 3D Prints | Markforged Reinforced
IMG_5892.jpeg

For this step, a soldering iron is required.

For part 4 attached above, all of the larger holes require metal inserts. Set your soldering iron to 400 degrees. Press the insert into the hole gently by hand. Afterwards, use the tip of the soldering iron to push the insert into the hole. A video(not mine) is attached to guide you.

Attach the Components

Gemini_Generated_Image_wxyybuwxyybuwxyy.png
IMG_5902.jpeg
IMG_5897.jpeg
IMG_5900.jpeg

NOTE: Wiring Diagram was AI generated.

Screw on the components as shown above with m3 screws, and a nut at the end.

Press in the camera, Arduino uno q, and the usb-c hub.


Please use the wiring diagram to wire your components appropriately. Unlike what the diagram says, the barometric sensor should be on 3.3v.

Different microcontrollers require different connections, so please check for your individual microcontroller. I used the Arduino Uno Q.

Upload the Code

Gemini_Generated_Image_xtiub7xtiub7xtiu.png
Screenshot 2026-06-08 at 6.14.23 PM.png

PS: I did use Claude to generate the code. I trained the AI model on my own without using AI. Code structure image was AI generated.

Code structure

The project is structured as an Arduino App for the Arduino UNO Q, with an MCU running C++ and an MPU running Python, plus a custom App Brick library for vision.

  1. sketch.ino — runs on the MCU, interfaces with all physical sensors, and passes data to the MPU via the RouterBridge. Portable to Python for more widely supported microcontrollers.
  2. main.py — the core of the system. Runs a Flask web server, logs barometric pressure to a SQLite database, analyses pressure trends over 1h and 3h windows to classify fishing conditions, fetches live weather from the Open-Meteo API to generate a combined fishing score, and runs a centroid tracker to build an accurate daily fish tally without double-counting.
  3. best_ncnn_model/ — the fish classification model in NCNN format. Currently targets five bass species for Lake St. George, but the model and class names can be swapped for any compatible NCNN model.
  4. __init__.py — the App Brick library containing all vision methods for inference, camera management, and detection processing.


school-fish-tracker/

├── app.yaml ← port 5000 exposed

├── sketch/

│ └── sketch.ino ← DS18B20 + TDS + BMP180

├── python/

│ ├── main.py ← Flask + SQLite pressure tracking

│ ├── requirements.txt ← flask, opencv, ncnn, numpy

│ └── static/

│ └── index.html ← dashboard

└── bricks/

└── ncnn_model_loader/

├── __init__.py ← NCNN vision brick

└── brick_config ← brick metadata

The code has its files(no folders sorry) hosted at here. If you have any questions about how I connected something for the code, feel free to comment!

Test It Out

Screenshot 2026-06-01 at 11.05.16 PM.png
Screenshot 2026-06-08 at 18-57-20 Lake St. George Monitor.png

Just a video of me showcasing the website and rest! It should give you a comprehensive preview of the website. I even have the corresponding school presentation for this product(I only built the device) if you want to take a look at it.


Video is below as an mp4

Conclusion

IMG_5903.jpeg

Conclusion

This project demonstrates that meaningful environmental monitoring does not have to be expensive or inaccessible. For around $150 in hardware, this device brings together water quality sensing, thermal monitoring, barometric pressure trend analysis, and live AI-powered fish detection into a single, self-hosted dashboard — insights that no standard weather app provides.

The barometric pressure component in particular has real practical value. By tracking pressure patterns over time rather than just reading a snapshot, the device can give fishermen advance warning of feeding windows and warn them off the water when conditions are poor.

This project is designed to be adaptable. The fish classification model can be retrained on any dataset and swapped in by replacing the model files and updating the class names in main.py. The MCU sensor code can be ported to Python for use with more widely supported microcontrollers like a Raspberry Pi. The Open-Meteo API coordinates can be updated to any location in the world, and the pressure and water quality thresholds in main.py can be tuned to match the typical conditions of any body of water. For deployments outside a local network, Tailscale can be used to securely access the dashboard from anywhere.

Beyond fishing, the broader vision is to make this kind of hyperlocal environmental intelligence accessible to anyone. Small-scale fisheries in developing regions, conservation groups monitoring freshwater ecosystems, or community science projects tracking lake health over time could all benefit from a low-cost, deployable device like this. As climate change continues to alter water temperatures, pressure patterns, and fish behaviour, tools that make environmental data readable and actionable at the local level become increasingly important — not just for fishermen, but for the communities and ecosystems that depend on healthy waterways.