The Self-Pleasuring Plant

by YuxingLiu in Circuits > Arduino

43 Views, 0 Favorites, 0 Comments

The Self-Pleasuring Plant

main project image.png

Are you tired of cleaning pet hair off the floor? Do you want a companion that reacts to you, plays with you, and does not require walks, litter boxes, or constant attention? Your plant has probably been sitting quietly for years, adding a little green to your room and asking almost nothing in return. It is easy to care for, peaceful to look at, and definitely less chaotic than a cat.


But what if your relationship with your plant did not have to be so one-sided? What if your leafy friend had a private life of its own? What if your touch could trigger not just a response, but a tiny ritual of movement, feedback, and self-interaction?


Meet Self-Pleasuring Plant: a playful interactive plant that transforms human touch into a cycle of botanical self-stimulation.


Instead of simply sitting still and looking pretty, this plant senses touch, responds with motion, and redirects that interaction back onto itself. Plants are often seen as silent and passive, but they are constantly responding to their surroundings through subtle biological signals and reactions to stimuli such as wind, water, light, sound, and touch.


This project reimagines that hidden sensitivity as a mechanical feedback loop. When the plant is touched, it detects the interaction, converts it into movement, and performs a three-round cycle of leaf motion and self-contact. Once the ritual is complete, it resets and waits patiently for the next touch.


Your plant may never fetch a ball, shed on your carpet, or beg for attention, but maybe it is time to let it enjoy its own company. Put down the lint roller, gather your materials, and follow along to make one for yourself!


This project was developed by Julia Richard and Yuxing Liu as a part of the Computational Design and Digital Fabrication seminar in the ITECH master program.

Supplies

Screenshot 2026-05-11 at 22.39.33.png

Snake Plant (Sansevieria)

Arduino UNO: 1 (The Brain)

Servo Motor FS5109S: 1 (The Actuator)

LCD1602 Module: 1 (I2C Visual Feedback)

Sound Sensor Modules: 2 (Only used as Signal Amplifiers.The microphone part is physically disabled.)

Silver Electrodes: 3 (Haptic Interface)

External Power: 1 (The Force)

Snake Plant: 1 (Sansevieria)


Others: 2 yellow sponge (for physical disabling the spealer module), 1 white cardboard (for customization of wheel and housing), electrical tape,transparent strings, 1 breadboard

General Logic

Gemini_Generated_Image_98dztk98dztk98dz.png

The strategy follows a four-stage interaction loop: Touch (Excitement), Searching (Motion), Self-Touch (Contact), and Expression (Output). This loop is repeated three times before resetting to an idle state.


1.2 Searching (motion): transferring electrical changes into mechanical movements


Once the initial touch signal is validated, the Arduino triggers a mechanical response via a servo motor. This stage represents the plant's "searching" behavior, where the motor drives multiple transparent strings attached to various leaves toward a second point of contact. The movement is designed to be smooth and controlled, using specific microsecond pulses to maintain a steady speed.


In state 1, the motor is set to pullSpeed. The system records the start time to calculate the exact duration of travel, ensuring the return motion (releasing) is symmetrical.

Touching (excitement) - Receiving the First Bio-signal and Converting It Into an Electrical One

touch.png
Gemini_Generated_Image_ss24axss24axss24.png
reference electrode.png

There are 3 electrodes in total: one for sensing human touch, one for sensing contacting between 2 leaves, one for creating a closed circuit for the plant itself. The process of capturing a plant's internal communication involves using silver electrodes placed directly on the leaf's surface to monitor biochemical potential shifts. These electrodes detect variations in voltage difference triggered by external interactions, such as human touch, which alters the plant's electrical resistance and creates a signal spike.

Because these biological signals are inherently weak, the system utilizes sound sensor modules to act as signal amplifiers before the data is processed by an Arduino UNO.

In terms of calibration, we manually tuned the golden screw on the sound sensor module so that the baseline of 2 leaves could be approximaetly kept as the same value, which largely secured the subsequent activation.


The code monitors sensorPin1 (A0). When the absolute difference (deltaA0) between the current reading and the calibrated baseline exceeds the deviationThreshold (50), the machine wakes from its Idle state.

// Triggering movement from Idle
if (currentState == 0 && deltaA0 >= deviationThreshold) {
currentState = 1;
pullStartTime = millis();
myServo.writeMicroseconds(pullSpeed); // pullSpeed = 1560
}


Optional: about the amplifier module, AD620 microvolt voltage amplifier module is also acceptable. Before connecting the sound sensor with electrodes, physically disabling the speaker is necessary so that the deviation from the environmental sound can be effectively reduced. That's why the sponge and tape are listed in the suppliers.

Searching (motion) - Transferring Electrical Changes Into Mechanical Movements

pulling.png
Screenshot 2026-05-11 at 23.11.00.png

Once the initial touch signal is validated, the Arduino triggers a mechanical response via a servo motor. This stage represents the plant's "searching" behavior, where the motor drives multiple transparent strings attached to various leaves toward a second point of contact. The movement is designed to be smooth and controlled, using specific microsecond pulses to maintain a steady speed.


In state 1, the motor is set to pullSpeed. The system records the start time to calculate the exact duration of travel, ensuring the return motion (releasing) is symmetrical.

// Movement Logic (State 1)
myServo.writeMicroseconds(pullSpeed);
// System remains in State 1 until Leaf 2 (sensorPin2) is triggered

Self-touch (contact) - Receiving the Second Bio-signal and Triggering the Motor to Rotate Back

contact.png

The interaction reaches its peak when the moving leaves make physical contact with a second leaf on the same plant. This "self-touch" generates a second signal spike. Upon detecting this contact, the system recognizes the completion of the narrative loop and triggers the motor to reverse its direction, returning the plant to its original state.


The code watches deltaA1 from the second sensor. When it crosses contactThreshold (45), the motor stops. Once contact is released, it enters state 3 to reverse the motor at releaseSpeed (1440) for the previously recorded pullDuration.

// Detection of contact and return motion
if (currentState == 1 && deltaA1 >= contactThreshold) {
pullDuration = millis() - pullStartTime;
myServo.writeMicroseconds(stopUs); // stopUs = 1500
currentState = 2;
}

if (currentState == 2 && deltaA1 < (contactThreshold - 15)) {
currentState = 3;
pullStartTime = millis();
myServo.writeMicroseconds(releaseSpeed); // releaseSpeed = 1440
}

Expression (output) - 3-rounds As the End of the Narrative

Gemini_Generated_Image_bejrygbejrygbejr.png
Gemini_Generated_Image_b8xai2b8xai2b8xa.png

The interaction loop repeats exactly three times. The three-round loop gives the plant a sense of agency. Your touch only triggers the beginning; after that, the plant continues the interaction by itself, transforming external contact into an autonomous act of self-stimulation.

During contact, the LCD displays "woo~, ah~". After the third round, the plant enters a 15-second "Sleep" state. During this fatigue period, any attempt to touch the plant results in a "no, later" message on the screen, indicating the plant is resting.


The cycleCount is incremented after each full pull-release cycle. Once it hits maxCycles (3), the currentState is set to 5 (Sleep/Fatigue), where a 15000ms timer prevents the system from returning to state 0 (Idle).

// Cycle counting and Fatigue (State 5)
if (currentState == 3 && (millis() - pullStartTime >= pullDuration)) {
myServo.writeMicroseconds(stopUs);
cycleCount++;
if (cycleCount >= maxCycles) {
currentState = 5;
sleepStartTime = millis();
cycleCount = 0;
}
}

// Fatigue message logic
if (currentState == 5 && deltaA0 >= deviationThreshold) {
lcd.print("no, later");
}

Wiring

useless machine schematic_bb (1).png

The wiring diagram connects the Analog pins to the plant sensors and the Digital PWM pins to the Servo. The LCD displays real-time status updates.


Step-by-step process:


For electrodes:

1. Cut the wire originally attached on the electrode

2. Insert a jumper wire and use electrical tape to protect the connection

3. Connect the other end of jumper wire to the top left naked metal wire near to the speaker


For amplifiers:

1. For the leaf that needs to sense human touch: connect AO to the analogue input A0

2. For the leaf that needs to sense the contact between 2 leaves: connect AO to the analogue input A1

3. Connect G to the negative part (GND) on the breadboard

4. Connect + to the positive part (5V) on the breadboard


For motor:

1. Connect the brown wire to the - on the external battery

2. Connect the red wire to the + on the external battery

3. Connect the yellow wire to the digital input 9 on the Arduino uno board


For LCD screen (from left to right in the image):

1. Connect LCD Pin 1 (VSS) to Arduino GND

2. Connect LCD Pin 2 (VDD) to Arduino 5V

3. Connect LCD Pin 3 (V0) to the middle pin of potentiometer

4. Connect LCD Pin 4 (RS) to Arduino digital input 12

5. Connect LCD Pin 5 (RW) to GND

6. Connect LCD Pin 6 (E) to Arduino digital input 11

7. Connect LCD Pin 11 (D4) to Arduino digital input 5

8. Connect LCD Pin 12 (D5) to Arduino digital input 4

8. Connect LCD Pin 13 (D6) to Arduino digital input 3

9. Connect LCD Pin 14 (D7) to Arduino digital input 2

10. Connect LCD Pin 15 (A) / LED+ to Arduino 5V

11. Connect LCD Pin 16 (K) / LED- to Arduino GND


For potentiometer:

1. Connect one side pin to the positive part on the breadboard

2. Connect the other side pin to the negative part on the breadboard

3. Conenct the middle pin to LCD Pin 3 / V0

Final Prototype

Video Project 6

Arduino code is attached here.

Try it and share your experience with us!