diff --git a/blog/AirQualityMonitor/CO2_levels.png b/blog/AirQualityMonitor/CO2_levels.png new file mode 100644 index 0000000..e3ddbab Binary files /dev/null and b/blog/AirQualityMonitor/CO2_levels.png differ diff --git a/blog/AirQualityMonitor/index.html b/blog/AirQualityMonitor/index.html new file mode 100644 index 0000000..4164be9 --- /dev/null +++ b/blog/AirQualityMonitor/index.html @@ -0,0 +1,672 @@ + + + + + + Building an Air Quality Monitor - Tech Blog + + + + + + + +
+ +
+
01
+ +

Building an Air Quality Monitor

+

+ Measuring home air quality for health and better understanding of my environment. +

+ + +
+ ESP32 + BME280 + SPS30 + SCD40 + InfluxDB + I2C +
+
+ + + + + +
+

The Inspiration

+

+ Many years ago, I watched a Tom Scott video about how air quality can affect cognitive performance. + From that point on, I felt very conscientious(paranoid) about the quality of air in my home. + To boot, I don't have centralized air, so the idea that my home might + have more carbon dioxide than necessary is a concern. +

+ +

+ Rather than let this rational concept vex me for the foreseeable future, I figured I would put my + skills to the test and actually measure my indoor air quality. +

+ +
+
+
+ +

The Solution

+

+ My solution: multiple small devices placed around my home, taking readings from the air + and aggregating data into a dashboard to show me what the problems are and in what areas. Easy + enough, surely. +

+ +

+ I bought an ESP32 dev board (DOIT v1) which would serve as a microcontroller that + could connect to the internet and relay data back to a server. I also purchased an SCD40 from + Digikey, an I2C module for detecting CO2. Since I would be taking periodic samples of the air, + the slowness of I2C was not a problem. In fact, it would allow me to add modules as needed during + the prototyping phase. +

+ +

Initial Implementation

+

+ Thankfully, there were already premade libraries by Adafruit for the SCD40. It made programming + a cinch. I could take periodic readings and send the data to a time-series database (InfluxDB) + using nothing but POST requests. No heavy lifting from the ESP32—I could do all my querying on + my homelab. +

+ +

+ The initial CO2 readings were not great, but not particularly concerning or unusual for the time + of year. There was also an issue of calibration, but I'll talk about that later. +

+ +
+
+
+ +

Expanding the Sensor Array

+

+ I wasn't quite satisfied yet. The National Weather Service measures things like Carbon Dioxide + (CO2), Ozone (O3), and many Volatile Organic Compounds (VOCs) such as smoke or exhaust from cars. + In the summer, Canada has had some wildfires which produce a lot of VOCs. It would be good to + know how much is leaking into my home. Also, any fumes or exhaust that my oven produces can have + an effect on air quality. I have a small animal, which are much more sensitive and vulnerable to these. +

+ +

+ For this, I purchased an SPS30 from Digikey, as well as a BME280 to measure things like temperature, + humidity, and air pressure. Thanks to the I2C design, it was as simple as plug and play (and code). + A real boon for prototyping. +

+ +

Testing and Validation

+ +

+ I tested the system by opening my window. There was a clear drop in temperature, CO2 levels, and + humidity levels. This is actually recommended by the manufacturers to help calibrate the sensors. +

+ +
+
+
+ +

The Calibration Challenge

+

+ This is the tricky part. These components work well and were programmed easily. Knowing that + they're accurate is the hard part, and that's the real product that actual air quality sensor + companies create. This is why I didn't show the PM (particulate matter) graphs from the SPS30—I + have no clue how accurate they are. +

+ +

+ At the very least, I can verify the humidity and temperature readings and approximate the CO2 + from the weather report. The SPS30 also takes about a week to fully calibrate internally. +

+ +
+ That's really the drawback of building your own air quality monitor. It's much cheaper and you + can configure things how you like with no worry about malicious things like data stealing, but + you have no idea how accurate it is. +
+ +

+ When you buy a pre-configured air quality monitor, what you're really buying is peace of mind. + You can be assured that the monitors are calibrated properly and to within specifications (assuming + you buy from a reputable company). Mine seems accurate, but without proper tooling, I have little + way of knowing. +

+ +
+
+
+ +

Next Steps: PCB Design

+

+ Since this is a prototype, I can't keep it forever. It's wasting my precious breakout boards. + Also, it's a liability when you have a pet who loves stringy things. I took it upon myself to + whip up a circuit design schematic. From here, I could just send the design to some PCB manufacturing + website and they would send me the board. All I would have to do is solder on the components. +

+ +

+ But before I pull the trigger on that, I want to take some time to both calibrate the parts and + decide if I think they provide enough of a picture of the quality of my air. Maybe I might want + some spectroscopy sensor to detect certain gases and their quantity. +

+ +

Outdoor Monitoring Concept

+

+ I also had the idea that I could get a pretty good indication of their calibration (and how badly + insulated my home is) if I made a monitor for outside. There are more challenges involved with this. + I need to design some sort of casing that can keep the elements off of the board while also being + able to let it breathe and actually read the air. +

+ +

+ I learned an old solder quick-fix once: you could take clear acrylic nail polish and coat traces + on boards to make them non-conductive on those spots. Dipping a whole board in nail polish might + not be the right move either, but maybe some Scotchgard might help. I'll have to do some research + and experimenting before I pull the trigger on that either. +

+ +
+
+
+ +

Future Enhancements

+

+ The last thing I would want to work on would be OTA (Over The Air) updates. It can be kind of a + pain to connect it and flash the firmware every time. If I could configure OTA, that would solve + that hassle. +

+ +

+ If I were to fully dive into this multiple monitor configuration, I might have to consider creating + a server for them to "phone home" to. I plug in a domain name and they all register in the same + little UI. This would make updating and version tracking seamless. +

+ +

+ This project demonstrates that building DIY environmental monitoring systems is accessible to + makers and engineers, but it also highlights the real value proposition of commercial products: + calibration and validation. The journey continues, with PCB design, weatherproofing, and OTA + updates on the horizon. +

+
+
+ + + + + diff --git a/blog/AirQualityMonitor/open_window.png b/blog/AirQualityMonitor/open_window.png new file mode 100644 index 0000000..e74786b Binary files /dev/null and b/blog/AirQualityMonitor/open_window.png differ diff --git a/blog/AirQualityMonitor/pcb-schematic.png b/blog/AirQualityMonitor/pcb-schematic.png new file mode 100644 index 0000000..328ddc4 Binary files /dev/null and b/blog/AirQualityMonitor/pcb-schematic.png differ diff --git a/blog/Homelab/index.html b/blog/Homelab/index.html index 40bf7ae..795e1da 100644 --- a/blog/Homelab/index.html +++ b/blog/Homelab/index.html @@ -460,8 +460,8 @@ diff --git a/blog/SteamController/index3.html b/blog/SteamController/index3.html deleted file mode 100644 index d95daee..0000000 --- a/blog/SteamController/index3.html +++ /dev/null @@ -1,620 +0,0 @@ - - - - - - Project Article - Tech Blog - - - - - - - -
- - -
-
04
- -

Steam Controller Driver for Actual Motors

-

- lorem ipsum -

-
-
React
-
Node.js
-
WebSocket
-
MongoDB
-
Redis
-
-
- - - - - -
-

Backstory

-

- I was cleaning out a closet and I discovered an old Steam Controller I bought about a decade ago. To my surprise, it still turned on. Way to go, Duracell. I remembered it being a pretty niche thing that had very little adoption and was quickly deprecated by Valve. Boy was I wrong. I turned it on and immediately remembered how amazing the haptic feedback was on the touchpads. How could I forget the grip inputs? Even a gyroscope! The design and hardware were top notch, but adoption was the problem. -

- -

- The haptic feedback touchpads made Games like Civ and XCOM playable on the couch. But I had my eyes on something much bigger target that could use a controller with fourteen buttons, six directional axes, two analog triggers, and a gryoscope: Flight Simulator. With traditional controllers, you had to have a plethora of different button configurations to make it work. Joysticks make it hard to sense and control your aircraft. Touchpads allow for refined movement with feedback to help you ramp up and down with ease. -

- -
-
-
- -

Flight Simulator

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum eget tortor massa. Sed sed nulla vitae enim accumsan pulvinar fermentum nec nunc. Phasellus scelerisque sem vel massa tempus, id lobortis arcu mattis. Donec sed lectus cursus libero auctor facilisis. Donec mattis luctus congue. Maecenas et nunc odio. Sed eu diam lectus. Phasellus sit amet mi vitae lacus rhoncus elementum. Nullam dictum justo sed dignissim placerat. Pellentesque porta velit vel luctus efficitur. -

- -

WebSocket Server

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum eget tortor massa. Sed sed nulla vitae enim accumsan pulvinar fermentum nec nunc. Phasellus scelerisque sem vel massa tempus, id lobortis arcu mattis. Donec sed lectus cursus libero auctor facilisis. Donec mattis luctus congue. Maecenas et nunc odio. Sed eu diam lectus. Phasellus sit amet mi vitae lacus rhoncus elementum. Nullam dictum justo sed dignissim placerat. Pellentesque porta velit vel luctus efficitur. -

- - - -
-
-
-

Physical Applications

-

Parsing the Byte Stream

-

- If I want to make a driver for this controller, I need to see what the output is. Controllers are just like a keyboard: character devices. When you type an "a" character into your keyboard, the keyboard sends data for an "a" key to the computer. When you press an "a" button on your controller, it does just about the same thing. It sends data, which in this case is 41 in hex or 01000010 in binary, to the computer and it is handled by the OS, which monitors for any special inputs, before sending it to the application you're using. This happens so quickly, we don't even think about it. It's a little more complicated than that, but I'll explain later. What I need to do is reverse engineer what data the inputs on my controller output and write a driver to turn those inputs into actions. -

-

- Knowing my controller is a character device, I can "read" it just like a file, but I have to jump through a couple hoops first. I don't know what that actual file is yet. I'm going to have to check around. When you plug a device into a computer running an OS, it has to decide what to do with it. Devices that already have their firmware configured will tell the OS what to do with it, usually through the Human Interface Device (HID) standard. So I need to ask the OS where it put the file. -

-
$ lsusb
-Bus 003 Device 022: ID 28de:1102 Valve Software Wired Controller
-

- This gives us the Bus number, Device number, and both the Device ID and Vendor ID. The bus and device number are abstractions for userspace created by udev. In this instance they seem very redundant and abstract away from what I'm trying to accomplish. What I am trying to do is take the raw input from the device at a kernel level, so I need to ask udev where it's getting this device from. -

$ udevadm info -q path -n /dev/bus/usb/003/022
-/sys/devices/pci0000:00/0000:00:14.0/usb3/3-7
- This shows us where the kernel has put the device. We can go into this series of directories and find it. Problem solved! Almost. -

- -

- In this case, with the steam controller, it actually has 3 subdevices, each with their own hidraw file. As it turns out, the controller can also be used in place of a mouse and keyboard. One could poke around the files some more to differentiate them, but I found a better solution. -

sudo usbhid-dump -m 28de:1102 -ed > descriptor.txt
-grep -A 10 "DESCRIPTOR" descriptor.txt | grep -v "DESCRIPTOR" | grep -v "STREAM" | tr -d ' \n' > descriptor_hex.txt
-rexx rd.rex -d --hex "$(cat descriptor_hex.txt)"
-
=== /dev/hidraw6 ===
-Name:             Valve Software Wired Controller
-Vendor:Product:   0x28de:0x1102
-Bus type:         3
-Physical:         usb-0000:00:14.0-7/input0
-Descriptor size:  65 bytes
-Descriptor (first 32 bytes): 05 01 09 06 95 01 A1 01 05 07 19 E0 29 E7 15 00 25 01 75 01 95 08 81 02 95 01 75 08 81 01 95 05 
-Type hints:       [KEYBOARD] 
-
-=== /dev/hidraw7 ===
-Name:             Valve Software Wired Controller
-Vendor:Product:   0x28de:0x1102
-Bus type:         3
-Physical:         usb-0000:00:14.0-7/input1
-Descriptor size:  52 bytes
-Descriptor (first 32 bytes): 05 01 09 02 A1 01 09 01 A1 00 05 09 19 01 29 05 15 00 25 01 95 05 75 01 81 02 95 01 75 03 81 01 
-Type hints:       [MOUSE] 
-
-=== /dev/hidraw8 ===
-Name:             Valve Software Wired Controller
-Vendor:Product:   0x28de:0x1102
-Bus type:         3
-Physical:         usb-0000:00:14.0-7/input2
-Descriptor size:  33 bytes
-Descriptor (first 32 bytes): 06 00 FF 09 01 A1 01 15 00 26 FF 00 75 08 95 40 09 01 81 02 95 40 09 01 91 02 95 40 09 01 B1 02 
-

- -

- I found a tool called RDD! HID Report Descriptor Decoder on github by abend0c1. It takes the data from usbhid-dump and performs lookups on all the devices given. It's a very comprehensive tool that gave much more output than I listed. -

-

- -

-

- -

- - - - - -
-
- - - - -