Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

PuzzleBox

Componenten en benodigdheden

Arduino MKR IoT-bundel
× 1

Apps en online services

Blynk

Over dit project

Opmerking:deze tutorial kan verouderd zijn, ga naar hier voor een meer actuele versie.

Uw waardevolle spullen uit de buurt van nieuwsgierige blikken houden kan soms moeilijk zijn, tenzij u ze in een grote kluis of iets dergelijks stopt... maar wie heeft daar ruimte voor?

Maak in plaats daarvan je eigen puzzeldoos met de componenten uit de MKR IoT-bundel en wat karton! We kunnen de veiligheid van uw bezittingen niet garanderen, maar het zal in ieder geval een leuk afschrikmiddel zijn voor potentiële dieven.

Natuurlijk raden we je aan om je snoep daarin te verstoppen... geen echte waardevolle spullen.

In een notendop

Om de doos, die met een servomotor gesloten wordt gehouden, te openen, moet je aan de potmeters draaien totdat je de juiste combinatie krijgt. De combinatie is in te stellen via de online app Blynk. Een LED helpt je te raden en geeft je kleurfeedback:hoe dichterbij je bent, hoe warmer de kleur.

Wanneer de juiste combinatie wordt geraden, begint de zoemer een nummer te spelen terwijl de servo de doos opent.

Om onze puzzeldoos te maken, hebben we de volgende componenten nodig:

  • Zoemer
  • RGB-LED
  • 3 potentiometers
  • LCD-scherm
  • Servomotor

Leerdoelen

  • Introductie van het Blynk-internetplatform
  • Bekabeling en gebruik van het LCD-scherm
  • Star Wars-thema spelen met de zoemer

Meer weten?

Deze tutorial maakt deel uit van een reeks experimenten die je vertrouwd maken met de MKR1000 en IoT. Alle experimenten kunnen worden gebouwd met behulp van de componenten in de MKR IoT-bundel.

  • Ik hou van je kussen
  • Puzzeldoos
  • Pavlovs kat
  • De nerd
  • Plantencommunicator

Introductie van Blynk

Blynk is een populaire mobiele app voor Internet of Things, waarmee we onze met internet verbonden Arduino gemakkelijk overal en altijd kunnen bedienen.

Het werd opgericht op Kickstarter en werd al snel een van de meest gebruikte apps op dit gebied, dankzij zowel de geweldige documentatie als de eenvoud.

Aan de slag met Blynk

Een nieuw project maken is heel eenvoudig, volg gewoon deze paar eenvoudige stappen of bekijk de officiële aan de slag door Blynk.

Nadat u met succes een nieuw project heeft aangemaakt, zou u per post ook de Auth Token moeten ontvangen. Het is een unieke identificatie die nodig is om uw hardware met uw smartphone te verbinden. Elk nieuw project dat u aanmaakt, heeft zijn eigen authenticatietoken.

Om de Arduino met de app te verbinden, moeten we de Blynk-bibliotheek installeren. Als u de Arduino Web Editor gebruikt, wordt de bibliotheek automatisch gedownload wanneer u deze in de schets opneemt, anders kunt u die downloaden vanuit de bibliotheekbeheerder.

Nu zijn we klaar om te gaan. Deze schets uploaden en speel met de schuifregelaars om het resultaat te zien:

#include  #include  const char* ssid =SECRET_SSID; // uw netwerk SSID (naam) const char* wachtwoord =SECRET_PSWD; // uw netwerkwachtwoord char auth [] =SECRET_TOKEN; // uw Blynk API-token // Variabelen om de combinatiewaarde op te slaan // Stel de initiële combinatie in op ( 1 1 1 ) int SliderValueOne =1; int SliderValueTwo =1; int SliderValueThree =1; // Blynk-functies om waarden op te halen BLYNK_WRITE (V1) { SliderValueOne =param.asInt (); // binnenkomende waarde van pin V1 toewijzen aan een variabele} BLYNK_WRITE (V2) { SliderValueTwo =param.asInt (); // binnenkomende waarde van pin V1 toewijzen aan een variabele} BLYNK_WRITE (V3) { SliderValueThree =param.asInt (); // binnenkomende waarde van pin V1 toewijzen aan een variabele } void setup () { Serial.begin (9600); Blynk.begin(auth, ssid, wachtwoord); // start Blynk-functionaliteiten en maak verbinding met WiFi} void loop () {// Variambles om de combinatie tijdelijk op te slaan int Temp_Slider_One_value =SliderValueOne; int Temp_Slider_Two_value =SliderValueTwo; int Temp_Slider_Three_value =SliderValueThree; Blynk.run(); // poll nieuwe combinatiewaarden van de online app // controleer of combinatiewaarden zijn gewijzigd en druk ze af op de console if(Temp_Slider_One_value !=SliderValueOne || Temp_Slider_Two_value !=SliderValueTwo || Temp_Slider_Three_value !=SliderValueThree("New){ combinatie:"); Serial.print (SliderValueOne); Serieel.print(" "); Serial.print (SliderValueTwo); Serieel.print(" "); Serial.println(SliderValueThree); } }  

Het LCD-scherm gebruiken

Tijd om het scherm aan te sluiten!

Het LCD-scherm is gemakkelijk te gebruiken, maar vereist veel kabels, dus wees klaar om je geduld te bewijzen.

Merk op dat we de 5V-voeding en een 220 Ohm-weerstand gebruiken.

De helderheid kan worden geregeld door de uitgangswaarde van de analoge pin 3 te wijzigen van 0 tot 255, waarbij 0 de maximale waarde is.

analogWrite(A3, 0);  

Nu kunnen we de voorbeeldschets uploaden en kijken of alles goed werkt.

// voeg de bibliotheekcode toe:#include  // initialiseer de bibliotheek door de benodigde LCD-interfacepin // te koppelen aan het arduino-pinnummer waarmee deze is verbonden const int rs =12, en =11, d4 =2, d5 =3, d6 =4, d7 =5; LiquidCrystal lcd (rs, en, d4, d5, d6, d7); void setup () { analogWrite (A3, 0); // Stel de helderheid in op de maximale waarde // stel het aantal kolommen en rijen van het LCD-scherm in:lcd.begin (16, 2); // Druk een bericht af op het LCD-scherm. lcd.print("hallo wereld!"); } void loop() { // zet de cursor op kolom 0, regel 1 // (let op:regel 1 is de tweede rij, aangezien het tellen begint met 0):lcd.setCursor(0, 1); // print het aantal seconden sinds reset:lcd.print(millis() / 1000); }  

Potentiometers toevoegen

Om de waarde van de potentiometers te lezen, hebben we alleen een analogRead() nodig op de juiste pin. We verbinden ze met analoge pin 0 , 1 , 2.

Merk op dat de waarde van een potentiometer zich uitstrekt van 0 tot 1023, waardoor de combinatie onmogelijk te raden is. Om die waarden van 0 tot 9 toe te wijzen, gebruiken we de map() functie,

 int PotOne =map(analogRead(A0), 0, 1023, 0, 9);  

U kunt deze voorbeeldcode gebruiken om de waarden van de potentiometers op het LCD-scherm af te drukken.

#include  // LCD-schermpinnen const int rs =12, en =11, d4 =2, d5 =3, d6 =4, d7 =5; LiquidCrystal lcd (rs, en, d4, d5, d6, d7); void setup () { analogWrite (A3, 0); // stel de helderheid van het LCD-scherm in op de maximale waarde Serial.begin (9600); lcd.begin (16, 2); // begin LCD-scherm met 16 kolommen en 2 rijen} void loop () {int PotOne =map (analogRead (A0), 0, 1023, 0, 9); int PotTwo =kaart (analogRead (A1), 0, 1023, 0, 9); int PotThree =map(analogRead(A2), 0, 1023, 0, 9); lcd.setCursor(0, 0); lcd.print (PotOne); lcd.setCursor(2, 0); lcd.print(PotTwo); lcd.setCursor(4, 0); lcd.print(PotThree); }  

Voeg de RGB-LED toe

We zullen de RGB-LED gebruiken als feedback om mensen te helpen de combinatie te raden. Hoe dichter ze bij de juiste waarde komen, hoe warmer de kleur van de LED, variërend van blauw, aqua, geel en rood.

U kunt deze voorbeeldschets gebruiken om de RGB in actie te zien!

// RGB LED-pinnen int redPin =6; int groenePin =8; int bluePin =7; void setup () { pinMode (redPin, OUTPUT); pinMode (groene pin, UITGANG); pinMode (bluePin, UITGANG); Serieel.begin(9600); } void loop() { setColor (0, 0, 255); // blauwe vertraging (1000); setColor (0, 255, 255); // aqua vertraging (1000); setColor (255, 255, 0); // gele vertraging (1000); setColor (255, 0, 0); // Rode vertraging (1000); } // Stuur RGB-waarden naar de LED-pinnen void setColor (int rood, int groen, int blauw) {analogeWrite (redPin, rood); analogWrite(greenPin, groen); analogWrite(bluePin, blauw); }  

Verbind het met Blynk

Nu zijn we klaar om dingen in elkaar te zetten:sluit het bord aan op Blynk, de potentiometer op het LCD-scherm en laat de LED groen knipperen als de combinatie correct is.

  • Merk op dat we de functie giveColorFeedback() . zullen gebruiken om de kleur van de LED in te stellen wanneer de absolute waarde van elke potentiometer dichter dan een bepaalde drempel bij de juiste combinatie ligt.
void giveColorFeedback(int PotOne, int PotTwo, int PotThree){...} 
  • We zullen deze variabele ook gebruiken om de waarden op te slaan die door de app zijn verzonden en dus de combinatie.
int SliderValueOne =1; int SliderValueTwo =1; int SliderValueThree =1;  

Merk op dat de beginwaarde is ingesteld op 1, deze verandert alleen als u de waarden van de schuifregelaars in de app wijzigt. Als je het bord reset, wordt de combinatie teruggezet naar de standaardwaarde.

  • Een booleaanse variabele bool start =true; wordt gebruikt om te detecteren wanneer de combinatie al is geraden, om te voorkomen dat de box bij elke lus opnieuw wordt geopend.

Upload deze voorbeeldschets om hem in actie te zien:

#include  #include  #include  #include  // RGB LED-pinnen int redPin =6; int groenePin =8; int bluePin =7; const char* ssid =SECRET_SSID; // uw netwerk SSID (naam) const char* wachtwoord =SECRET_PSWD; // uw netwerkwachtwoord char auth [] =SECRET_TOKEN; // uw Blynk API-token // LCD-schermpinnen const int rs =12, en =11, d4 =2, d5 =3, d6 =4, d7 =5; bool start =waar; // Variabelen om de combinatiewaarde op te slaan // Stel de initiële combinatie in op ( 1 1 1 ) int SliderValueOne =1; int SliderValueTwo =1; int SliderValueThree =1; // Blynk-functies om waarden op te halen BLYNK_WRITE (V1) { SliderValueOne =param.asInt (); // binnenkomende waarde van pin V1 toewijzen aan een variabele} BLYNK_WRITE (V2) { SliderValueTwo =param.asInt (); // binnenkomende waarde van pin V1 toewijzen aan een variabele} BLYNK_WRITE (V3) { SliderValueThree =param.asInt (); // binnenkomende waarde van pin V1 toewijzen aan een variabele } LiquidCrystal lcd (rs, en, d4, d5, d6, d7); void setup () { pinMode (redPin, OUTPUT); pinMode (groene pin, UITGANG); pinMode (bluePin, UITGANG); analoogWrite(A3, 0); // stel de helderheid van het LCD-scherm in op de maximale waarde Serial.begin (9600); lcd.begin (16, 2); // begin LCD-scherm met 16 kolommen en 2 rijen Blynk.begin (auth, ssid, wachtwoord); // start Blynk-functionaliteiten} void loop() {// Variambles om de combinatie tijdelijk op te slaan int Temp_Slider_One_value =SliderValueOne; int Temp_Slider_Two_value =SliderValueTwo; int Temp_Slider_Three_value =SliderValueThree; Blynk.run(); // poll nieuwe combinatiewaarden van de online app // controleer of combinatiewaarden zijn gewijzigd en druk ze af op de console if(Temp_Slider_One_value !=SliderValueOne || Temp_Slider_Two_value !=SliderValueTwo || Temp_Slider_Three_value !=SliderValueThree("New){ combinatie:"); Serial.print (SliderValueOne); Serieel.print(" "); Serial.print (SliderValueTwo); Serieel.print(" "); Serial.println(SliderValueThree); } int PotOne =map(analogRead(A0), 0, 1023, 0, 9); int PotTwo =kaart (analogRead (A1), 0, 1023, 0, 9); int PotThree =map(analogRead(A2), 0, 1023, 0, 9); lcd.setCursor(0, 0); lcd.print (PotOne); lcd.setCursor(2, 0); lcd.print(PotTwo); lcd.setCursor(4, 0); lcd.print(PotThree); if (start) { giveColorFeedback (PotOne, PotTwo, PotThree); if (PotOne ==SliderValueOne &&PotTwo ==SliderValueTwo &&PotThree ==SliderValueThree) { blinkGreenLed(); begin =onwaar; } } if(!start) { if(PotOne ==0 &&PotTwo ==0 &&PotThree ==0){ start =true; } } } // Geef feedback op basis van hoe dicht de potentiometer bij de combinatiewaarde staat // Hoe meer deze dichtbij is, hoe warmer de kleur van de LED leegte giveColorFeedback(int PotOne, int PotTwo, int PotThree) { if (abs(PotOne - SliderValueOne) <=1 &&abs(PotTwo - SliderValueTwo) <=1 &&abs(PotThree - SliderValueThree) <=1 ) { // Rode setColor (255, 0, 0); } else if (abs(PotOne - SliderValueOne) <=3 &&abs(PotTwo - SliderValueTwo) <=3 &&abs(PotThree - SliderValueThree) <=3 ) { // gele setColor (255, 255, 0); } else if (abs(PotOne - SliderValueOne) <=4 &&abs(PotTwo - SliderValueTwo) <=4 &&abs(PotThree - SliderValueThree) <=4 ) { // aqua setColor (0, 255, 255); } else { // blauwe setColor (0, 0, 255); } } void blinkGreenLed() { for (int a =0; a <2; a++) { for (int b =0; b <=255; b +=5) { setColor (0, b, 0); vertraging (5); } voor (int b =255; b>=0; b -=5) { setColor (0, b, 0); vertraging (5); } } voor (int b =0; b <=255; b +=5) { setColor (0, b, 0); vertraging (5); } } // Stuur RGB-waarden naar de LED-pinnen void setColor (int rood, int groen, int blauw) {analogeWrite (redPin, rood); analogWrite(greenPin, groen); analogWrite(bluePin, blauw); }  

Voeg de zoemer toe

We zullen de zoemer gebruiken om een ​​melodie te spelen wanneer de doos wordt geopend. Om precies te zijn zullen we het Star Wars-themalied spelen!

De zoemer aansluiten is eenvoudig:

Upload deze voorbeeldcode en luister:

const int c =261; const int d =294; const int e =329; const int f =349; const int g =391; const int gS =415; const int a =440; const int aS =455; const int b =466; const int cH =523; const int cSH =554; const int dH =587; const int dSH =622; const int eH =659; const int fH =698; const int fSH =740; const int gH =784; const int gSH =830; const int aH =880; int-teller =0; #define buzzerPin 1 void setup() { pinMode(buzzerPin, OUTPUT); Serieel.begin(9600); } void loop() { play_jingle(); vertraging (3000); } void play_jingle() {piep(a, 500); piep (a, 500); piep (a, 500); piep (f, 350); piep (cH, 150); piep (a, 500); piep (f, 350); piep (cH, 150); piep (a, 650); vertraging (500); piep (eH, 500); piep (eH, 500); piep (eH, 500); piep (fH, 350); piep (cH, 150); piep (gS, 500); piep (f, 350); piep (cH, 150); piep (a, 650); vertraging (500); } void beep (int note, int duration) { // Play tone op buzzerPin tone (buzzerPin, note, duur); //Stop toon op buzzerPin noTone (buzzerPin); vertraging (50); // Verhogen teller ++; }  

Voeg de servomotor toe

De servomotor is het slot van onze kist, we hebben hem nodig om 90 graden te draaien als de combinatie correct is, zodat de kist opengaat.

Voor het aansluiten van de servo zijn slechts drie draden nodig.

Om het 90 graden te draaien, gebruiken we de volgende functies:

#include  int pos =0; // variabele om de servopositie op te slaan Servo myservo; // maak een servo-object om een ​​servo leegte setup () { myservo.attach (9) te besturen; // hecht de servo op pin 9 aan het servo-object myservo.write (pos); // zet de servo in positie 0} void loop () { open_the_box (); vertraging (2000); close_the_box(); vertraging (2000); } void open_the_box(){ for (pos =0; pos <=90; pos +=1) { // gaat van 0 graden naar 90 graden myservo.write (pos); // vertel servo om naar positie te gaan in variabele 'pos' vertraging (15); // wacht 15 ms totdat de servo de positie bereikt}} void close_the_box(){ for (pos =90; pos>=0; pos -=1) {// gaat van 90 graden naar 0 graden myservo.write(pos); // vertel servo om naar positie te gaan in variabele 'pos' vertraging (15); // wacht 15 ms totdat de servo de positie bereikt } }  

Merk op dat om de servo terug te draaien en de doos te sluiten, alles wat je hoeft te doen is alle potentiometers op 0 te zetten.

Bouw je puzzeldoos

Het zou geen doos zijn zonder een doos, dus download het onderstaande dossier en gebruik het als gids om uw eigen dossier te bouwen.

Merk op dat we een karton van 2 mm hebben gebruikt.

Code

Volledige schets

Aangepaste onderdelen en behuizingen

2 mm karton box_E5j7tnFdNC.dxf

Schema's


Productieproces

  1. Circuitcomponenten
  2. Geïntegreerd circuit
  3. SensorTag naar Blynk met Node-RED
  4. Arduino digitale dobbelstenen
  5. Multitemperatuursensor
  6. Arduino-gamecontroller
  7. MotionSense
  8. MOSMusic
  9. Wat is micro-elektronica?
  10. Onderdelen van boormachine:
  11. Onderdelen van verbrandingsmotor