Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Squid Games Doll-Build mit Arduino UNO

Komponenten und Verbrauchsmaterialien

RGB diffundierte gemeinsame Kathode
Augen
× 2
SparkFun 7-Segment-Serielles Display - Rot
Timer
× 1
Schieberegister von Texas Instruments - parallel zu seriell
4-stellige 7-Segment-Anzeige
× 1
Alphanumerisches LCD, 16 x 2
Menüanzeige
× 1
IR-Empfänger (generisch)
Für Fernbedienung
× 1
Arduino UNO
Das Gehirn
× 1
SG90 Micro-Servomotor
Kopf drehen
× 1
PIR-Bewegungssensor (generisch)
Bewegungserkennung
× 1
Ultraschallsensor - HC-SR04 (Generic)
Entfernungserkennung für Sieg oder Niederlage
× 1
DFRobot DFPlayer - Ein Mini-MP3-Player
Stimme
× 1
Druckschalter, kurzzeitig
Menüschaltflächen und die Startschaltfläche
× 1

Notwendige Werkzeuge und Maschinen

3D-Drucker (generisch)

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Baue eine voll funktionsfähige Tintenfischspielpuppe. Sie spielt mit dir das Rot-Licht-Grün-Licht-Spiel. Komplett mit rotierendem Kopf, farbigen Augen und sie redet! Sie verwendet Ultraschall und Bewegungserkennung, um festzustellen, ob Sie gewinnen oder verlieren. Aber keine Sorge, wenn du verlierst, fragt sie nur, ob du wieder spielen möchtest.

Sehen Sie sich das Video an und teilen Sie mir Ihre Meinung mit.

Ich habe jeden Pin auf dem Arduino UNO verwendet! Was ich noch nie gemacht habe, also war dies ein Erfolg für mich. Dieses Projekt dauerte 3 Wochen, um zu bauen, wobei 1 Woche ausschließlich dem Drucken gewidmet war! Ich habe 6 Tage gebraucht, um diese Puppe zu drucken. 1 Woche für den Build und eine weitere Woche für die Bearbeitung des Videos.

ELEGOO hat mir ein kostenloses UNO-Kit geschickt, wenn ich ein Video mache, also habe ich die Puppe gebaut. Es war entweder dies oder einen Escape Room zu bauen. Ich bin froh, dass sie sich für dieses Projekt entschieden haben. Ich hoffe, die Leute genießen es, weil es Spaß gemacht hat, das Build wirklich gut auszusehen und eine Menge Leute zu gruseln. Aber noch wichtiger, es funktioniert.

Hier sind alle Teile, die ich für diesen Build verwenden werde.

1. Druck starten

Das Drucken wird lange dauern. Ich habe 6 Tage gebraucht, um die gesamte Puppe auszudrucken. Ich habe auch andersfarbiges Filament verwendet, damit ich den Malaufwand reduzieren kann.

Ich habe ein Modell, das ich auf thingiverse.com gefunden habe, neu gemischt, die Mitte ausgehöhlt und Zugangslöcher für die Elektronik hinzugefügt. Ich habe auch die Brustplatte für die Montage von Servo und Ultra Sonic modifiziert.

2. Niemand malt gerne

Zeit zu malen. Ich habe dafür generische Sprühfarbe verwendet. Ich habe die Innenseite des Puppenkopfes bemalt (die Augen maskiert), damit die LEDs für die Augen nicht das gesamte Gesicht zum Leuchten bringen. Obwohl dies der Effekt sein könnte, den Sie suchen. Ich wollte nur, dass die Augen leuchten.

3. Magnete ziehen an, aber Klebestifte

Eine Möglichkeit, alle Gliedmaßen der Puppe zu befestigen, besteht darin, Magnete in den Kunststoff einzuschmelzen. Dies ist, wenn Sie in der Lage sein möchten, sie auseinander zu nehmen. Wenn ich dieses Projekt noch einmal machen würde, würde ich wahrscheinlich einfach alle Gliedmaßen an ihr kleben. Wie ich es jetzt sehe, ist es wenig vorteilhaft, Magnete zu verwenden, abgesehen davon, dass sie in eine kleinere Schachtel zur Aufbewahrung passen, wenn Sie möchten. Das einzige, was Sie an dieser Stelle nicht anbringen sollten, ist der Kopf.

4. Schont die Augen

Beginnen Sie mit dem einfachsten Schritt, den Augen. Ich habe dreifarbige LEDs für die Augen verwendet. Wie Sie wissen, können Sie RGB-Farben mischen und anpassen, um jede gewünschte Farbe zu erhalten. Ich bin bei Primär- und Sekundärfarben geblieben, damit ich die Signale nicht PWM bearbeiten musste. Aber Sie können, wenn Sie danach suchen.

Der längste Pin ist die Masse, das ist Pin 2.

Verbinden Sie die LED wie abgebildet mit 220 Ohm Widerständen für jede Leitung außer Masse.

Zur Montage habe ich die LEDs einfach so nah wie möglich an die Mitte der Augen geklebt, aber auf der Rückseite. Achten Sie darauf, dass der Draht lang genug ist, um den Hals hinunter und in den unteren Teil ihres Körpers zu führen.

5. LCD-Menü

Die nächste einfachste Komponente ist der 16x2-LCD-Bildschirm. Sie sollten den LCD-Bildschirm mit einem I2C-Adapter verwenden. Es wird Ihr Leben viel einfacher machen und die IO-Anzahl von 6 auf 2 reduzieren. Sobald dies verbunden ist, sollte das LCD mit "Willkommen bei den Tintenfischspielen!" starten. auf dem Display.

Zur Montage habe ich einen 1mm dicken Kreis ausgedruckt. Ich mache das dünn, damit ich es mit einer Heißluftpistole an den Puppenrücken formen kann. Das ist viel einfacher, als die Konturen ihres Rückens herauszufinden (zumindest für mich). Auf der Rückseite habe ich Gewindeeinsätze für das Display mit Muttern verbaut, um das Display und die Displayhalterung an der Karosserie zu befestigen.

6. Nur Eulenköpfe drehen sich um 180 Grad

Das Servo war aus einem Hauptgrund schwierig, ich benutze die Servobibliothek nicht. Ich weiß, das klingt komisch, aber ich musste den Timer1 für das 4-stellige Display-Update verwenden und die Servobibliothek verwendet dies auch. Glücklicherweise ist das Servo entweder 0 Grad oder 180 Grad und es gibt keine dazwischen, was dies viel einfacher macht.

Timer1 ist für 0,5 ms Intervalle, 2000 Hz eingestellt. Die Servoperiode beträgt 20 ms. Bei 0 Grad muss der Pin nur für 2 Zählungen hoch und für den Rest der Periode niedrig sein. Für 180 Grad muss der Pin für 4 Zählungen hoch und die restliche Zeit niedrig sein.

Auf der Brustplatte befindet sich eine schöne Halterung für das Servo. Sie können es anschrauben oder kleben. Ich habe Epoxid verwendet, um das Servo an der Brustplatte zu befestigen, da es der Brustplatte auch Festigkeit verleiht und sie hoffentlich vor Beschädigungen schützt.

7. Klingt wie eine Fledermaus

Als nächstes installieren wir das Ultraschall-Distanzmodul. Ich habe diese Aktualisierung alle 250ms. Es hat auch eine schöne Montageposition auf der Brustplatte. Es gibt nur 2 Drähte für dieses Modul.

Ich benutzte Epoxid, um den Ultraschall an der Brustplatte zu montieren.

8. Keine Bedingungen verbunden

Der IR-Sensor für die Fernbedienung wird nur benötigt, wenn Sie das Spiel steuern möchten. Ich dachte, das würde Spaß machen, aber benutze diesen Modus nicht wirklich, das automatische Spiel macht Spaß genug.

Ich entschied mich, den IR-Sensor in einem Clip am Haar der Puppe zu montieren. Sie können es natürlich an anderer Stelle platzieren. Ich habe versucht, es zu verbergen, aber vielleicht gibt es einen besseren Ort, weil die IR nicht immer die Fernbedienung sieht, wenn sie ihren Kopf dreht und der Sensor auf der anderen Seite ist.

9. Von Zeit zu Zeit

Als nächstes richten wir die Timer-Anzeige ein. Das ist viel Arbeit für eine 4-stellige Anzeige. Den Anschlussplan von ELEGOO lege ich bei. Das Spiel dauert nur bis zu 5 Minuten, daher habe ich auch die Verwendung der höchstwertigen Ziffer entfernt. Aber Sie entscheiden sich, es zu behalten, wenn Sie den IO-Pin verfügbar haben. Um die Anzeige zu aktualisieren, müssen Sie die LED sehr schnell durchlaufen, da immer nur eine Ziffer aktiv sein kann. Aus diesem Grund scheinen sie zu flackern, wenn sie durch eine Kamera betrachtet werden. Ich habe eine Bildwiederholfrequenz von 2 ms verwendet, die schnell genug ist, um das Flimmern nicht zu sehen. Bei 5 ms kann ich anfangen, es zu flimmern, wenn ich das Display in Ihrem peripheren Blickfeld betrachte. Außerdem benötigen Sie das Schieberegister 74HC595.

Display montieren, was keinen Spaß macht. Ich entschied, dass es am besten war, das Display in ihren Gürtel zu integrieren. Die Originalpuppe in Squid Games hat natürlich keinen Gürtel, aber es mussten Opfer gebracht werden, um diese Anzeige bei ihr zu bekommen. Wenn Sie auch diese Route wählen, maskieren Sie ein Quadrat in der gleichen Größe des Displays und schneiden Sie es mit einem Dremel aus. Ich habe dann Epoxidkitt verwendet, um dem Display einen allmählichen Übergang hinzuzufügen. Aber das war nicht nötig, ich dachte nur, dass es so besser aussah.

Ich habe den 74HC595 an der Prototypenabschirmung montiert, sonst werden Kabel überall herumlaufen. Eine alternative Lösung besteht darin, eine andere Timer-Anzeige zu verwenden, die eine bequemere Kommunikation mit weniger Pins bietet.

10. Ich habe gesehen, wie du dich bewegt hast

Der Bewegungsmelder ist ein komischer kleiner Kerl. Dieses Ding verwendet Infrarot, um Bewegungen zu erkennen. Eine Sache, die ich gelernt habe, ist, dass dieser Sensor Zeit zum Aufwärmen braucht. Beim Start benötigt es 1 Minute zum Aufwärmen. Aus diesem Grund hat die Puppe eine Startzeit von 1 Minute. Ein weiteres Ärgernis bei diesem Modul ist, dass es eine Bewegungserkennung am schnellsten aktualisieren kann, wenn es etwa 5 Sekunden dauert. Das letzte Ärgernis ist, wie empfindlich dieser Sensor ist. Selbst bei ganz heruntergedrehter Empfindlichkeit kann es noch kleinste Bewegungen erkennen und manchmal Bewegungen, von denen ich nicht einmal weiß, wovon sie spricht. Um diese "falschen Positiven" zu verhindern, habe ich den Sensor in einer Pferdeblindbox montiert. Die Box hat ein kleines Loch (7mm) für den Bewegungsmelder. Als Bonus verhindert dies, dass Sie diesen riesigen Sensor an der Außenseite der Puppe montieren müssen. Der Bewegungssensor hat nur eine Binärleitung für Rückmeldung, Bewegung oder nicht.

Um den Sensor zu montieren, habe ich die Pferdeblende ausgedruckt und auf die Innenseite der Puppe geklebt. Dann bohrte ich ein Loch durch den Körper. Ich habe einen Gewindeeinsatz an der Blinderbox verwendet, um den Bewegungssensor zu sichern.

11. Drücke nicht auf meine Knöpfe

Endlich sind wir bei den Knöpfen. Wenn Sie über die zusätzlichen I/O-Pins verfügen, ist es einfacher, jeden dieser Pins mit einem digitalen Eingang zu verbinden. Aber diesen Luxus hatte ich für die UNO nicht. Stattdessen musste ich einen analogen Eingang verwenden, um die Widerstandswerte zu lesen, um festzustellen, welche Taste gedrückt wurde. Die von mir verwendeten Werte waren 1K, 2K und 5K. Dann hatte ich einen 220-Ohm-Widerstand, um den analogen Eingang auf Low zu ziehen. Andernfalls wird es schweben und zufällige Tastendrücke erhalten.

Ich habe die Tasten auf der gleichen Montageplatte wie das LCD montiert. Das war nicht einfach, aber ich hatte keinen besseren Weg. Wenn Sie die Drähte auf diese Knöpfe löten und sie dann durch kleine Löcher führen, die in den Kunststoff gebohrt wurden, werden Ihre Patienten auf die Probe gestellt.

12. Kannst du mich jetzt hören?

Der letzte und wahrscheinlich wichtigste Schritt ist das Soundmodul. Dadurch wird der serielle Port des UNO verwendet, sodass Sie den Tx- und Rx-Pins 1K-Ohm-Widerstände hinzufügen müssen. Andernfalls werden Sie nach dem Herstellen dieser Verbindung von der Programmierung des UNO blockiert. Außerdem müssen Sie den "busy"-Pin verwenden, damit die UNO weiß, dass bereits ein Sound abgespielt wird. Dies ist sehr wichtig, wenn Sie MP3s nacheinander abspielen lassen.

Ich habe das MP3-Player-Modul auf dem Prototypenschild montiert. Diese Abschirmung macht die Montage solcher Komponenten sehr bequem, da sie dann einfach in die UNO eingesteckt wird. Dieses Modul benötigt einen 8-Ohm-Lautsprecher und hat eine Leistung von 3 W. Der Lautsprecher wurde nur auf die Basis der Puppe geklebt. Ich habe kleine Löcher unter den Lautsprecher gebohrt, damit der Ton besser herauskommt.

13. Montieren Sie die UNO

Installieren Sie die UNO auf der Plattform und stecken Sie die Prototypabschirmung auf die UNO. Stellen Sie sicher, dass Sie alle Drähte beschriftet haben, wenn nicht, wissen Sie wahrscheinlich nicht, wohin sie gehen. Mit ein wenig Verhandlung können Sie die montierte UNO mit allen angeschlossenen Drähten in die Puppe bekommen.

Ich habe Gewindeeinsätze verwendet, um die Plattform an der Unterseite der Puppe zu montieren.

14. Test Fix Test

Dies ist, wenn Sie Ihren Debugging-Hut aufsetzen können. Ich kann Ihnen sagen, dass die Software auf GitHub funktioniert, also ist zumindest eine Sache weniger zu debuggen. Aber fahren Sie trotzdem fort, wenn Sie Zweifel haben, und senden Sie mir alle Updates, die Sie finden.

15. Lass uns spielen

Zeit, sie auszuprobieren und ein Spiel zu spielen. So ist das Spiel programmiert.

Beim Start dreht sie ihren Kopf nach vorne.

Der Bewegungssensor braucht eine volle Minute zum Starten. Es gibt also einen Timer, wenn es startet. Auf halbem Weg kichert sie und dreht den Kopf herum. Dann kündigt sie an, wenn sie bereit ist.

Je nachdem, ob das Spiel auf Fernbedienung eingestellt ist, sagt sie verschiedene Dinge. Im Auto-Modus fordert sie Sie auf, die Play-Taste zu drücken. In meinem Fall ist dies der ganz rechte Knopf. Im Remote-Modus fordert sie Sie auf, den Netzschalter zu drücken, wenn Sie bereit sind. Then press the play button to toggle to red light or green light.

So when you are ready, press the go button and she will give you 10 seconds to get in place. Usually someone else nearby will press this button.

Then the game begins. She will start with Green light. For green light you have to get within 50cm to trigger a win. If you are within 100cm she will say indicate that you are getting closer. Green light is only using the sonar.

For red light the motion sensor and the distance sensor is being used. If you move enough for the motion sensor to trip or if you move more than 10cm forward, you will loose the game. You will also loose the game if time runs out. She will remind you that time is almost out at 5 seconds left.

The last cool feature is that she will also speak in the Korean voice for the red light. This is a menu feature. Press the far left button to toggle the menu item, and the center button to toggle the item options.

16. Watch Video

This video took me a long time to edit. I have probably 30 hours in just editing. But it was fun making it. I think it came out good and is funny but want you to see for yourself. Please let me know what you think and if you have any questions.

https://youtu.be/jd_4a4x3uCw

Thank You!

Code

  • Squid Game Doll Sketch
Squid Game Doll SketchC/C++
This will control all of the sensor and the game logic.
/// CodeMakesItGo Dec 2021#include #include #include #include #include #include #include /*-----( Analog Pins )-----*/#define BUTTONS_IN A0#define SONAR_TRIG_PIN A1#define SONAR_ECHO_PIN A2#define MOTION_IN A3/*-----( Digital Pins )-----*/#define LED_BLUE 13#define LED_GREEN 12#define LED_RED 11#define SEGMENT_DATA 10 // DS#define SEGMENT_CLOCK 9 // SHCP#define SEGMENT_LATCH 8 // STCP#define SEGMENT_1_OUT 7#define SEGMENT_2_OUT 6#define SEGMENT_3_OUT 5#define IR_DIGITAL_IN 4 // IR Remote#define SERVO_OUT 3#define DFPLAYER_BUSY_IN 2/*-----( Configuration )-----*/#define TIMER_FREQUENCY 2000#define TIMER_MATCH (int)(((16E+6) / (TIMER_FREQUENCY * 64.0)) - 1)#define TIMER_2MS ((TIMER_FREQUENCY / 1000) * 2)#define VOLUME 30 // 0-30#define BETTER_HURRY_S 5 // play clip at 5 seconds left#define WIN_PROXIMITY_CM 50 // cm distance for w inner#define CLOSE_PROXIMITY_CM 100 // cm distance for close to winning#define GREEN_LIGHT_MS 3000 // 3 seconds on for green light#define RED_LIGHT_MS 5000 // 5 seconds on for green light#define WAIT_FOR_STOP_MOTION_MS 5000 // 5 seconds to wait for motion detection to stop/*-----( Global Variables )-----*/static unsigned int timer_1000ms =0;static unsigned int timer_2ms =0;static unsigned char digit =0; // digit for 4 segment displaystatic int countDown =60; // Start 1 minute countdown on startupstatic const int sonarVariance =10; // detect movement if greater than thisstatic bool gameInPlay =false;static bool faceTree =false;static bool remotePlay =false;// 0 , 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, NULLconst unsigned char numbers[] ={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};const char *MenuItems[] ={"Language", "Play Time", "Play Type"};typedef enum{ LANGUAGE, PLAYTIME, PLAYTYPE, MENUITEM_COUNT} MenuItemTypes;const char *Languages[] ={"English", "Korean"};typedef enum{ ENGLISH, KOREAN, LANUAGE_COUNT} LanguageTypes;static int language =0;const char *PlayTime[] ={"300", "240", "180", "120", "60", "30", "15"};typedef enum{ PT300, PT240, PT180, PT120, PT60, PT30, PT15, PLAYTIME_COUNT} PlayTimeTypes;const int playTimes[] ={300, 240, 180, 120, 60, 30, 15};static int playTime =0;const char *PlayType[] ={"Auto", "Remote"};typedef enum{ AUTO, REMOTE, PLAYTYPE_COUNT} PlayTypeTypes;static int playType =0;typedef enum{ BLACK, RED, GREEN, BLUE, WHITE, YELLOW, PURPLE} EyeColors;EyeColors eyeColor =BLACK;typedef enum{ WARMUP, WAIT, READY, GREENLIGHT, REDLIGHT, WIN, LOSE} GameStates;static GameStates gameState =WARMUP;/*-----( Class Objects )-----*/FireTimer task_50ms;FireTimer task_250ms;DFPlayerMini_Fast dfPlayer;SR04 sonar =SR04(SONAR_ECHO_PIN, SONAR_TRIG_PIN);IRrecv irRecv(IR_DIGITAL_IN);decode_results irResults;LiquidCrystal_I2C lcdDisplay(0x27, 16, 2); // 16x2 LCD display/*-----( Functions )-----*/void translateIR() // takes action based on IR code received{ switch (irResults.value) { case 0xFFA25D:Serial.println("POWER"); if (gameState ==WAIT) { gameInPlay =true; } break; case 0xFFE21D:Serial.println("FUNC/STOP"); brechen; case 0xFF629D:Serial.println("VOL+"); brechen; case 0xFF22DD:Serial.println("FAST BACK"); brechen; case 0xFF02FD:Serial.println("PAUSE"); remotePlay =!remotePlay; brechen; case 0xFFC23D:Serial.println("FAST FORWARD"); brechen; case 0xFFE01F:Serial.println("DOWN"); brechen; case 0xFFA857:Serial.println("VOL-"); brechen; case 0xFF906F:Serial.println("UP"); brechen; case 0xFF9867:Serial.println("EQ"); brechen; case 0xFFB04F:Serial.println("ST/REPT"); brechen; case 0xFF6897:Serial.println("0"); brechen; case 0xFF30CF:Serial.println("1"); brechen; case 0xFF18E7:Serial.println("2"); brechen; case 0xFF7A85:Serial.println("3"); brechen; case 0xFF10EF:Serial.println("4"); brechen; case 0xFF38C7:Serial.println("5"); brechen; case 0xFF5AA5:Serial.println("6"); brechen; case 0xFF42BD:Serial.println("7"); brechen; case 0xFF4AB5:Serial.println("8"); brechen; case 0xFF52AD:Serial.println("9"); brechen; case 0xFFFFFFFF:Serial.println(" REPEAT"); brechen; default:Serial.println(" other button "); }}bool isPlayingSound(){ return (digitalRead(DFPLAYER_BUSY_IN) ==LOW);}void updateTimeDisplay(unsigned char digit, unsigned char num){ digitalWrite(SEGMENT_LATCH, LOW); shiftOut(SEGMENT_DATA, SEGMENT_CLOCK, MSBFIRST, numbers[num]); // Active LOW digitalWrite(SEGMENT_1_OUT, digit ==1 ? LOW :HIGH); digitalWrite(SEGMENT_2_OUT, digit ==2 ? LOW :HIGH); digitalWrite(SEGMENT_3_OUT, digit ==3 ? LOW :HIGH); digitalWrite(SEGMENT_LATCH, HIGH);}void updateServoPosition(){ static int servoPulseCount =0; static bool lastPosition =false; // Only get new value at start of period if (servoPulseCount ==0) lastPosition =faceTree; if (!lastPosition) // 180 degrees { digitalWrite(SERVO_OUT, servoPulseCount <5 ? HIGH :LOW); } else // 0 degrees { digitalWrite(SERVO_OUT, servoPulseCount <1 ? HIGH :LOW); } servoPulseCount =(servoPulseCount + 1) % 40; // 20ms period}void updateMenuDisplay(const int button){ static int menuItem =0; static int menuOption =0; switch (button) { case 1:menuItem =(menuItem + 1) % MENUITEM_COUNT; if (menuItem ==LANGUAGE) { menuOption =language; } else if (menuItem ==PLAYTIME) { menuOption =playTime; } else if (menuItem ==PLAYTYPE) { menuOption =playType; } else { menuOption =0; } break; case 2:if (menuItem ==LANGUAGE) { menuOption =(menuOption + 1) % LANUAGE_COUNT; language =menuOption; } else if (menuItem ==PLAYTIME) { menuOption =(menuOption + 1) % PLAYTIME_COUNT; playTime =menuOption; } else if (menuItem ==PLAYTYPE) { menuOption =(menuOption + 1) % PLAYTYPE_COUNT; playType =menuOption; } else { menuOption =0; } break; case 3:if (gameState ==WAIT) { gameInPlay =true; } if (gameState ==GREENLIGHT || gameState ==REDLIGHT) { gameInPlay =false; } default:break; } if (menuOption !=-1) { lcdDisplay.clear(); lcdDisplay.setCursor(0, 0); lcdDisplay.print(MenuItems[menuItem]); lcdDisplay.setCursor(0, 1); if (menuItem ==LANGUAGE) { lcdDisplay.print(Languages[menuOption]); } else if (menuItem ==PLAYTIME) { lcdDisplay.print(PlayTime[menuOption]); } else if (menuItem ==PLAYTYPE) { lcdDisplay.print(PlayType[menuOption]); } else { lcdDisplay.print("unknown option"); } } else { menuItem =0; menuOption =0; }}void handleButtons(){ static int buttonPressed =0; int value =analogRead(BUTTONS_IN); if (value <600) // buttons released { if (buttonPressed !=0) updateMenuDisplay(buttonPressed); buttonPressed =0; return; } else if (value <700) { Serial.println("button 1"); buttonPressed =1; } else if (value <900) { Serial.println("button 2"); buttonPressed =2; } else if (value <1000) { Serial.println("button 3"); buttonPressed =3; } else { Serial.println(value); buttonPressed =0; }}static int lastSonarValue =0;void handleSonar(){ int value =sonar.Distance(); if (value> lastSonarValue + sonarVariance || value  30000 || sequence ==0) { internalTimer =millis(); if(playType ==AUTO) { // press the go button when you are ready Serial.println("Press the go button when you are ready"); dfPlayer.playFolder(1, 5); } else { Serial.println("Press the power button on the remote when you are ready"); dfPlayer.playFolder(1, 6); } // eyes are blue eyeColor =BLUE; // facing players faceTree =false; gameInPlay =false; sequence++; } } else if (gameState ==READY) { currentTimer =millis(); if (sequence ==0) { // get in position, game will start in 10 seconds Serial.println("Get in position."); dfPlayer.playFolder(1, 7); countDown =10; // eyes are green eyeColor =WHITE; // facing players faceTree =false; sequence++; internalTimer =millis(); } else if (sequence ==1) { if (playType ==REMOTE) { if (remotePlay) sequence++; } else sequence++; } else if (sequence ==2) { // at 0 seconds, here we go! if (countDown ==0) { countDown =playTimes[playTime]; Serial.print("play time set to "); Serial.println(countDown); Serial.println("Here we go!"); dfPlayer.playFolder(1, 8); gameState =GREENLIGHT; sequence =0; } } } else if (gameState ==GREENLIGHT) { currentTimer =millis(); if (sequence ==0) { // eyes are green eyeColor =GREEN; // play green light Serial.println("Green Light!"); dfPlayer.playFolder(1, 9); sequence++; } else if(sequence ==1) { // play motor sound dfPlayer.playFolder(1, 19); // facing tree faceTree =true; sequence++; internalTimer =millis(); } else if (sequence ==2) { // wait 3 seconds or until remote // switch to red light if (playType ==AUTO &¤tTimer - internalTimer> GREEN_LIGHT_MS) { sequence =0; gameState =REDLIGHT; } else if (playType ==REMOTE &&remotePlay ==false) { sequence =0; gameState =REDLIGHT; } else { // look for winner button or distance if (gameInPlay ==false || lastSonarValue  WAIT_FOR_STOP_MOTION_MS) { internalTimer =millis(); sequence++; Serial.println("Done settling"); } Serial.println("Waiting to settle"); } else if (sequence ==3) { // back to green after 5 seconds if (playType ==AUTO &¤tTimer - internalTimer> RED_LIGHT_MS) { sequence =0; gameState =GREENLIGHT; } else if (playType ==REMOTE &&remotePlay ==true) { sequence =0; gameState =GREENLIGHT; } else { // can't push the button while red light // detect movement // detect distance change if (gameInPlay ==false || lastMotion ==1 || lastSonarValue  
Project files
All of the files for this buildhttps://github.com/CodeMakesItGo/SquidGamesDoll

Schematics

This is how I connected all of the components to the UNO.
The project repo
All of the files for this build are stored here. https://github.com/CodeMakesItGo/SquidGamesDoll

Herstellungsprozess

  1. Erstellen von Monitor-Ambilight mit Arduino
  2. Arduino Pong-Spiel - OLED-Display
  3. Robotersystem zur Erkennung von Menschen mit Arduino Uno
  4. DIY-Voltmeter mit Arduino und Smartphone
  5. Herzfrequenzmesser mit IoT
  6. WebServerBlink mit Arduino Uno WiFi
  7. Einfacher UNO-Rechner
  8. Sonar mit Arduino und Anzeige bei der Verarbeitung von IDE
  9. Beharrlichkeit der Vision
  10. Arduino-Schulungsplattform