I can now stream EEG data from the ESP32 to my PC in real time (or at least without any noticeable latency) using a UDP socket. Also switched my single working channel to the visual cortex and was able to acquire very robust alpha rhythms whenever I close my eyes. I'm considering switching the micro to my Maix Duino at some point to try some embedded machine learning based detection, especially once I start looking for motor rhythms which will probably be less robust and harder to pick out with just an FFT, but I don't think I'll do that anytime soon.
I'll upload my embedded program for streaming data as well as the client program I made to filter and display the EEG in real time. Now that I'm pretty sure the EEG module is really picking up EEG signals and not just artifacts I feel a lot more confident populating the rest of the PCB and uploading my PCB files in case others are interested in playing with the boards. My first board revision had some pretty dumb mistakes which I was able to bodge and scrape some solutions to after getting them made, but the current version that I've uploaded has those mistakes fixed (but currently hasn't been manufactured). I'd certainly welcome any feedback on my layout, I'm also still thinking about how to scale up the channel count, either with stackable boards or otherwise finding ways to mount multiple boards on the openbci headset and interface them with the ESP32. They could all presumably sit on the same SPI bus, but I'd need a separate chip_select and data_ready pin for each of them which I'm guessing will be fine considering the large number of GPIOs the ESP32 has to work with. I'm more worried about the impedance sensing circuits which currently uses 1 GPIO per channel to select the channel for impedance measurement, and so would start to run into the limits of the available ESP32 GPIO pins. I'm thinking the easiest solution for that would be a simple decoder IC somewhere that'll let me only use 4 GPIOs to select from 16 channels.