/* ============================================ PROJECT: Useless Frog Box (Full Movements) AUTHOR: MxEngineer WEBSITE: mxengineer.com TIKTOK: @mxengineercom ============================================ PINS: - Button → Pin 2 - Servo Signal → Pin 9 - Servo VCC → 5V - Servo GND + Button GND → GND ============================================ FULL MOVEMENTS (8 STEPS): ============================================ */ #include Servo frogServo; const int buttonPin = 2; int lastButtonState = HIGH; bool isPlaying = false; void setup() { frogServo.attach(9); pinMode(buttonPin, INPUT_PULLUP); frogServo.write(0); } void loop() { int buttonState = digitalRead(buttonPin); if (buttonState == LOW && lastButtonState == HIGH && !isPlaying) { isPlaying = true; // ======== Step 1: Mouth opens slowly to 20° ======== for (int ang = 0; ang <= 20; ang++) { frogServo.write(ang); delay(20); } delay(300); // ======== Step 2: Closes back to 0° ======== for (int ang = 20; ang >= 0; ang--) { frogServo.write(ang); delay(20); } delay(300); // ======== Step 3: Mouth opens fully to 50° (tongue out) ======== for (int ang = 0; ang <= 50; ang++) { frogServo.write(ang); delay(15); } delay(200); // ======== Step 4: Tongue shaking intense (10 times) ======== for (int i = 0; i < 10; i++) { frogServo.write(25); delay(40); frogServo.write(45); delay(40); } delay(200); // ======== Step 5: Partial close to 20° ======== for (int ang = 50; ang >= 20; ang--) { frogServo.write(ang); delay(12); } delay(200); // ======== Step 6: Open/Close twice (20° ↔ 50°) ======== // First open for (int ang = 20; ang <= 50; ang++) { frogServo.write(ang); delay(10); } delay(100); // First close for (int ang = 50; ang >= 20; ang--) { frogServo.write(ang); delay(10); } delay(100); // Second open for (int ang = 20; ang <= 50; ang++) { frogServo.write(ang); delay(10); } delay(100); // Second close for (int ang = 50; ang >= 20; ang--) { frogServo.write(ang); delay(10); } delay(150); // ======== Step 7: More shaking (15 times, faster and wider) ======== for (int i = 0; i < 15; i++) { frogServo.write(22); delay(30); frogServo.write(48); delay(30); } delay(100); // ======== Step 8: Fast emergency close to 0° ======== for (int ang = 50; ang >= 0; ang--) { frogServo.write(ang); delay(5); } isPlaying = false; } lastButtonState = buttonState; } /* ============================================ ANGLE SUMMARY: ============================================ Step 1: 0° → 20° (slow) Step 2: 20° → 0° (slow) Step 3: 0° → 50° (medium - tongue fully out) Step 4: 25° ↔ 45° (shaking x10) Step 5: 50° → 20° (partial close) Step 6: 20° ↔ 50° (open/close x2) Step 7: 22° ↔ 48° (shaking x15, faster) Step 8: 50° → 0° (fast emergency close) Max angle: 50° Min angle: 0° ============================================ FROG DESIGN NOTES: ============================================ - Paint box GREEN - Cut mouth shape on the door - Glue RED PAPER TONGUE inside the mouth - Attach two big paper eyes on top - Tongue moves with the door (servo controls jaw) ============================================ HASHTAGS: ============================================ #frog #uselessbox #themostuselessmachine #arduino #diy #jumpscare #scarybox #servo #mxengineer #shorts #fyp ============================================ FOLLOW MxEngineer: ============================================ 🌐 Website: mxengineer.com 📱 TikTok: @mxengineercom ▶️ YouTube: @MxEngineer ============================================ */