Version: v1 (E1.1.0-V3)
Phase: Phase 1
Focus: Electrical response to salt (NaCl)
Status: Superseded March 2026 (see Protocols)
Contents
1. Overview
This protocol records the electrical response of a colonised Pleurotus ostreatus block to a salt (NaCl) solution, using low-cost, off-the-shelf hardware that anyone can build.
Andrew Adamatzky and others have recorded electrical responses of fungal networks to external stimuli, using laboratory equipment in controlled conditions. The aim here is a repeatable, open-source protocol that can be run outside a lab.
Why salt
Biologically, salt alters electrical gradients and stresses cellular structures. In my recordings it produced a clear, measurable change in the signal. That makes it a practical first test. It is cheap and available anywhere, easy to control and repeat, does not destroy the network, and should produce a visible change if the rig is working.
2. Hardware setup
2.1. Component list (BOM)
These parts were used to build the working rig. All are easily available online.
| Component | Notes | Link (example) |
|---|---|---|
| ESP32 Dev Board (DOIT ESP32-WROOM-32) | Must have USB and 3.3V support | Amazon |
| Breadboards (x2) | Use side-by-side with tongue-and-groove connection | Link |
| ADS1115 (Pre-soldered) | 16-bit ADC for signal capture | Link |
| MicroSD Card Module | Optional, for logging | Link |
| (Optional) SanDisk MicroSD Card (FAT32, 32GB) | Class 10 or better | Link |
| (Optional) DHT22 Sensor | For temperature + humidity tracking | Link |
| Jumper Wires (male–male) | Multiple colors for clarity | Link |
| Micro USB Cable (Data+Charge) | To power ESP32. Must support data transfer | — |
| (Optional) USB-C to USB-A Adapter | For laptops with USB-C only | — |
| Colonized Mushroom Block (*Pleurotus ostreatus*) | Sterilized hardwood-based substrate, nutrient-rich, inoculated with oyster mushroom mycelium | — |
| Acupuncture Needle | Stainless Steel Premium Sterile Needles | Link |
Note: This experiment used a sterilized hardwood block pre-colonized with Pleurotus ostreatus (oyster mushroom).
The block size does not matter (we will only cut 2 small sections)
If you use a different substrate or species, that's acceptable, but you must document it clearly in your experiment log. This helps compare signal consistency across replications and future protocols.
2.2. Breadboard assembly
- Use two breadboards, connected side-by-side using their built-in slits.
- Keep power rails intact unless clearance issues occur.
- Mount the ESP32 across the inner edges, with the USB port facing outward for access.
- Label power rails with color-coded wires early (3.3V = red, GND = black).
2.3. ESP32 placement and core wiring
| ESP32 Pin | Use | Breadboard Position (Example) |
|---|---|---|
| 3V3 | Power source for ADS/DHT | → red rail |
| GND | Ground reference | → black rail |
| GPIO21 | SDA (ADS1115) | → ADS SDA |
| GPIO22 | SCL (ADS1115) | → ADS SCL |
| GPIO4 | DHT22 data | → DHT OUT |
| GPIO5 | SD card CS (if used) | → SD CS |
| GPIO2 | LED indicator | wired onboard |
| VIN | SD module VCC | → 5V line |
Note: GPIO5 (CS) is hardcoded in firmware. Don't change without editing the sketch.
2.4. Sensor wiring
ADS1115 (differential + single-ended)
| ADS1115 Pin | Connects To | Purpose |
|---|---|---|
| VDD | ESP32 3V3 | Power |
| GND | ESP32 GND | Ground |
| SDA | GPIO21 | I²C data |
| SCL | GPIO22 | I²C clock |
| A0–A3 | Electrodes | Signal input |
| ADDR | GND | I²C Address = 0x48 |
- ∆01 = A0 vs A1 (differential)
- ∆23 = A2 vs A3 (differential)
- All 4 channels also available individually in log file
DHT22 (optional)
| DHT Pin | Connects To |
|---|---|
| VCC | ESP32 3V3 |
| GND | ESP32 GND |
| OUT | GPIO4 |
2.5. SD card module (optional)
If logging is enabled, wire the SD card module as follows:
| SD Module Pin | ESP32 Pin | Notes |
|---|---|---|
| GND | GND | Common ground |
| VCC | VIN | 5V input |
| MISO | GPIO19 | SPI MISO |
| MOSI | GPIO23 | SPI MOSI |
| SCK | GPIO18 | SPI Clock |
| CS | GPIO5 | Chip Select |
Note: Be sure your SD card is formatted as FAT32 before use.
Final notes
- All sensors share the same GND and should pull from ESP32's 3V3 (not VIN).
- Keep wire lengths short where possible to avoid noise.
- Label and test each wire before powering on.
- The SD card module, DHT22 and ADS1115 can run at the same time without conflicts.
3. Software setup
3.1. Install Arduino IDE + ESP32 board support
- Download Arduino IDE from:
https://www.arduino.cc/en/software - Open Arduino IDE → Go to
File > Preferences - In the field "Additional Board Manager URLs", paste this:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json - Go to
Tools > Board > Board Manager- Search for "ESP32"
- Install the package by Espressif Systems (not Arduino)
- Once installed, select your board:
Tools > Board > ESP32 Arduino > ESP32 Dev Module - Plug in the ESP32 via Micro USB.
Then select the correct COM port viaTools > Port
If no port appears or it says "ESP32 Dev Module (Not Connected)", install the CP210x USB to UART driver:
https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers
3.2. Install required libraries
In the Arduino IDE, go to:
Sketch > Include Library > Manage Libraries...
Install the following:
Adafruit ADS1X15DHT sensor library(by Adafruit)SDSPIFFS(built-in with ESP32)ESPAsyncWebServerAsyncTCPWiFiClientSecure
If any of these fail to install, you can download them as ZIP files from GitHub and add them via:
Sketch > Include Library > Add .ZIP Library…
3.3. Install EarthTalk firmware
You can install the firmware in two ways. Choose the one that fits your experience level:
Option 1: Manual ZIP download (beginner-friendly)
- Download EarthTalk_Firmware_V3.zip
- Unzip the file. It creates a folder named
EarthTalk_Firmware_V3/ - Inside, you should see:
EarthTalk_Firmware_V3/ ├── EarthTalk_Firmware_V3.ino └── data/ └── dashboard.html - Open the
.inofile in the Arduino IDE. - In the Arduino file, scroll to the Wi-Fi Configuration section and replace the parameters below with your own values:
const char* ssid = "YOUR_SSID"; const char* password = "YOUR_PASSWORD"; IPAddress local_IP(192, 168, 1, 111); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); IPAddress DNS(8, 8, 8, 8); // Google DNS - Once you've updated your Wi-Fi and IP settings, click the Upload button in the Arduino IDE to flash the firmware onto your ESP32.
After upload completes:
- Your ESP32 will automatically reboot.
- Open the Serial Monitor (baud rate
115200) to verify a successful boot.
Option 2: Git clone (advanced)
If you're comfortable with Git:
git clone https://github.com/earthtalk-internal/earthtalk-protocol.git
cd earthtalk-protocol/firmware
- Open
EarthTalk_Firmware_V3.inoin the Arduino IDE. - Modify the same Wi-Fi and IP parameters listed above.
Note: The Arduino IDE requires the folder name to match the .ino filename exactly.
3. Once you've updated your Wi-Fi and IP settings, click the Upload button in the Arduino IDE to flash the firmware onto your ESP32.
Upload SPIFFS data folder (dashboard)
After uploading the .ino sketch, you also need to upload the data/ folder to the ESP32 using the SPIFFS Upload Tool:
- Make sure the folder named
datais inside the same directory as your.inofile. - Confirm it contains
dashboard.html. - In Arduino IDE, go to:
Tools → ESP32 Sketch Data Upload - Wait for confirmation that SPIFFS has been uploaded.
If you don't see this option, install the ESP32 filesystem uploader tool.
Successful boot indicators
Once both the firmware and dashboard are uploaded:
- Open the Serial Monitor (baud rate:
115200) - Look for the following checks:
- ✅ Wi-Fi connection established
- ✅ SD card mounted
- ✅ SPIFFS mounted
- ✅ DHT sensor initialized
- ✅ WebSocket server started
If all systems pass, the BLUE LED stays OFF.
Note: If you are not using the SD card or have not connected the DHT sensor, those checks will show ❌ in the log. This is normal and does not affect core functionality, but the blue LED will stay on.
Access the dashboard
If the ESP32 booted successfully:
- Open your browser and go to:
http://192.168.100.112/
(or your custom IP if you changed it) - You should see:
- Live signal charting
- Raw data stream
- Status indicators
If not, double-check:
- You uploaded both
.inoand SPIFFS - IP matches your network
- Console logs show no errors
4. Dashboard and logging
Live dashboard
Once your ESP32 is powered and successfully booted:
- Open a browser and visit
http://192.168.1.111/(or the static IP you configured). - Local HTTP access is enough; HTTPS is not needed.
- You'll see:
WebSocket connectedmessage- A live chart plotting ∆01 and ∆23 values every second
- Raw log output updating in real time
Notes:
- WebSocket ensures real-time data transfer from ESP32 to browser.
- If nothing loads, check that
dashboard.htmlwas correctly uploaded to SPIFFS.
Data logging and cloud upload
Your firmware logs sensor readings in two parallel ways:
Local SD logging (optional)
- Files are saved to the SD card as:
/YYYYMMDD_<DEVICE_ID>.csv - Example:
20250728_ESP32ABC123.csv - Format includes timestamps and all sensor values
Cloud upload (optional)
- Upload target is defined in the
uploadToCloud()function - Requires a valid HTTP/HTTPS endpoint (e.g., your own server or API)
- If upload fails:
- Console shows
Upload failedmessage - Blue LED turns ON as an error signal
- Console shows
Filename logic (getFilename())
- Based on current date and chip ID
- Ensures unique daily file per device
Troubleshooting
| Problem | Solution |
|---|---|
| SPIFFS not mounting | Use the ESP32 Sketch Data Upload tool in Arduino IDE |
| Dashboard doesn't load | Ensure dashboard.html is uploaded via SPIFFS |
| SD write fails | Confirm SD_CS = 5 and format SD card to FAT32 |
| DHT returns NaN | Double-check wiring and that sensor is connected to GPIO 4 |
| WebSocket not connecting | Verify IP matches and no firewall is blocking port 80 |
| Blue LED turns ON | Boot or upload error. Check the serial log. |
5. Preparing the mycelium sample
I used pre-colonized grey/blue oyster mushroom (Pleurotus ostreatus) blocks grown on hardwood sawdust substrate.
According to the supplier, the substrate includes a high proportion of local hardwood species, along with small amounts of gypsum and wheat bran to support colonization.
If you use a different substrate, I would still expect a reaction, though it may look different.
Sample extraction
From a larger fruiting block, I cut two sub-blocks with approximate dimensions:
5 cm (height)×7 cm (width)×5 cm (depth)
These blocks preserved the dense mycelial mat at the top and included a portion of the underlying substrate beneath it.
Electrode insertion
I inserted two pairs of acupuncture needle electrodes into each block:
top pair (`∆01`)
- Inserted near the top, ~1–2 cm apart
- Threaded shallowly into the dense surface mycelium like a sewing needle
- Intended to stay embedded within the most biologically active fungal tissue
bottom pair (`∆23`)
- Inserted fully into the lower block region
- Still spaced ~1–2 cm apart
- Goes into the less dense sawdust substrate, which is likely less colonized but may still carry fungal signals
Note: I do not verify internal colonization levels, so ∆23 signals may vary depending on unseen fungal growth patterns inside the substrate.
6. Misting and signal measurement protocol
Materials
- Filtered (preferably deionized) water
- Himalayan kitchen salt (or equivalent)
- Syringe (no needle)
- Ziploc bag
- Pre-colonized mycelium block with electrodes inserted
- EarthTalk firmware + live dashboard
Step-by-step
- Prepare the solution:
Mix 100ml of water with ¼ teaspoon of Himalayan salt. Stir well and let sit for 10 minutes to stabilize. - Target area for misting:
Use a syringe to apply the solution to the side of the mycelium block, where the substrate is visible.
Do not apply it to the top white mesh layer, which acts like a waterproof membrane and absorbs very little. - Maintain moisture environment:
Place the block in a Ziploc bag with only a small cutout where the solution is applied. This minimizes evaporation during the 20-minute observation window. if possible make the window like a flap so it can be "closed" during the rest time. - Logging window:
Before misting, log 10 minutes of baseline signal.
After misting, log 10 minutes of post-stimulus signal.
You can export this log using the dashboard'sExport CSVbutton or copy the log manually. - Electrodes remain in place:
Electrodes should already be inserted before starting the misting protocol. No need to adjust or touch them during the experiment. - Repeat protocol:
Perform the experiment 5 times, using the same block if possible.
Wait at least 4 hours between mistings to avoid potential habituation effects.
Adamatzky reported possible habituation when stimuli were repeated too often, so allow at least 4 hours between applications.
Notes
- The syringe used was highly sensitive, so the exact misting volume may vary slightly each time. Approximate dosing is acceptable.
- In practice, responses appear within a few seconds and remain detectable for 3–10 minutes.
- Signal shifts are usually visible on the live chart.
7. Results: electrical response to NaCl mist
This figure shows the electrical response of a single mycelium block to three consecutive NaCl misting events, spaced roughly 4 hours apart. Each mist is denoted by a red dashed line (T=0). Voltage was recorded from two differential electrode pairs (∆01 and ∆23), and plotted for all three mist events.
Observations
- Across all three trials, the ∆01 pair inserted in the mycelium-dense top layer showed a stronger voltage deviation than the ∆23 pair in the less colonized substrate layer.
- In each case, the electrical signal began shifting within seconds of mist application, followed by a sustained deviation lasting 3–10 minutes.
- The ∆23 traces showed smaller shifts, which may reflect weaker or delayed propagation into the lower substrate layer.
9. Safety considerations
General safety
- Work in well-ventilated areas
Electrical safety
- Ensure all electrical equipment is properly grounded
- Use low-voltage systems to minimize risk
- Inspect wiring and connections before operation
- Follow manufacturer guidelines for ESP32 and sensor operation
Biological safety
- Dispose of samples and materials appropriately
- Clean work surfaces and equipment after use
Version history
| Version | Date | Changes |
|---|---|---|
| E1.1.0-V3 | 2026-03 | Superseded; see Protocols page for current stack |
Protocol versioning follows format: Experiment.Sequence-Version