산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

퍼즐박스

구성품 및 소모품

Arduino MKR IoT 번들
× 1

앱 및 온라인 서비스

블링크

이 프로젝트 정보

참고:이 튜토리얼은 오래되었을 수 있습니다. 여기 최신 버전의 경우

귀중품을 큰 금고나 이와 유사한 곳에 넣지 않는 한 눈에 띄지 않게 보관하는 것이 때로는 어려울 수 있습니다. 하지만 누가 그럴 공간이 있겠습니까?

대신 MKR IoT 번들의 구성 요소와 카드보드를 사용하여 나만의 퍼즐 상자를 만드세요! 소지품의 안전을 보장할 수는 없지만, 적어도 잠재적인 도둑을 위한 재미있는 억지력이 될 것입니다.

물론, 우리는 당신이 거기에 사탕을 숨겨두는 것이 좋습니다. 실제 귀중품이 아닙니다.

간단히 말해서

서보 모터로 닫혀 있는 상자를 열려면 올바른 조합을 얻을 때까지 전위차계를 돌려야 합니다. 조합은 온라인 앱 Blynk를 통해 설정할 수 있습니다. LED가 추측을 도와 색상 피드백을 제공합니다. 가까울수록 색상이 따뜻해집니다.

올바른 조합이 추측되면 부저가 노래를 재생하기 시작하고 서보가 상자를 엽니다.

퍼즐 상자를 만들려면 다음 구성 요소가 필요합니다.

<울>
  • 부저
  • <울>
  • RGB LED
  • <울>
  • 3개의 전위차계
  • <울>
  • LCD 화면
  • <울>
  • 서보 모터
  • 학습 목표

    <울>
  • Blynk 인터넷 플랫폼 소개
  • <울>
  • LCD 화면 배선 및 사용
  • <울>
  • 부저로 스타워즈 테마 재생
  • 더 알고 싶으십니까?

    이 자습서는 MKR1000 및 IoT에 익숙해지는 일련의 실험 중 일부입니다. 모든 실험은 MKR IoT 번들에 포함된 구성 요소를 사용하여 구축할 수 있습니다.

    <울>
  • 사랑해요 베개
  • <울>
  • 퍼즐 상자
  • <울>
  • 파블로프의 고양이
  • <울>
  • 너드
  • <울>
  • 식물 커뮤니케이터
  • Blynk 소개

    Blynk는 사물 인터넷을 위한 인기 있는 모바일 앱으로, 언제 어디서나 인터넷에 연결된 Arduino를 쉽게 제어할 수 있습니다.

    Kickstarter를 기반으로 설립되었으며 멋진 문서와 단순성 덕분에 이 분야에서 가장 많이 사용되는 앱 중 하나가 되었습니다.

    Blynk 시작하기

    새 프로젝트를 만드는 것은 정말 쉽습니다. 이 몇 가지 간단한 단계를 따르거나 Blynk의 공식 시작하기를 살펴보세요.

    새 프로젝트를 성공적으로 만든 후에는 인증 토큰도 메일로 받아야 합니다. 하드웨어를 스마트폰에 연결하는 데 필요한 고유 식별자입니다. 생성하는 모든 새 프로젝트에는 고유한 인증 토큰이 있습니다.

    Arduino를 앱에 연결하려면 Blynk 라이브러리를 설치해야 합니다. 아두이노 웹에디터를 사용하는 경우 스케치에 포함시키면 라이브러리가 자동으로 다운로드되며, 그렇지 않은 경우 라이브러리 관리자에서 다운로드할 수 있습니다.

    이제 갈 준비가 되었습니다. 이 스케치 업로드 슬라이더를 사용하여 결과를 확인합니다.

    #include  #include  const char* ssid =SECRET_SSID; // 네트워크 SSID(이름) const char* 암호 =SECRET_PSWD; // 네트워크 비밀번호 char auth[] =SECRET_TOKEN; // Blynk API 토큰 // 조합 값을 저장할 변수 // 초기 조합을 ( 1 1 1 )로 설정 int SliderValueOne =1; 정수 SliderValueTwo =1; 정수 SliderValueThree =1; // 값 검색을 위한 Blynk 함수 BLYNK_WRITE(V1) { SliderValueOne =param.asInt(); // 핀 V1에서 들어오는 값을 변수에 할당 } BLYNK_WRITE(V2) { SliderValueTwo =param.asInt(); // 핀 V1에서 들어오는 값을 변수에 할당 } BLYNK_WRITE(V3) { SliderValueThree =param.asInt(); // 핀 V1에서 들어오는 값을 변수에 할당 } void setup() { Serial.begin(9600); Blynk.begin(인증, ssid, 암호); // Blynk 기능을 시작하고 WiFi에 연결} void loop() { // 조합을 임시로 저장하기 위한 변수 int Temp_Slider_One_value =SliderValueOne; 정수 Temp_Slider_Two_value =SliderValueTwo; 정수 Temp_Slider_Three_value =SliderValueThree; Blynk.run(); // 온라인 앱에서 새로운 조합 값을 폴링합니다. // 조합 값이 변경되었는지 확인하고 콘솔에 출력 if(Temp_Slider_One_value !=SliderValueOne || Temp_Slider_Two_value !=SliderValueTwo || Temp_Slider_Three_value !=SliderValueThree){ Serial.print("New 조합:"); Serial.print(SliderValueOne); Serial.print(" "); Serial.print(SliderValueTwo); Serial.print(" "); Serial.println(SliderValueThree); } }  

    LCD 화면 사용

    화면을 연결할 시간입니다!

    LCD 화면은 사용하기 쉽지만 많은 전선이 필요하므로 인내심을 증명할 준비를 하십시오.

    5V 전원 공급 장치와 220옴 저항을 사용하고 있습니다.

    밝기는 아날로그 핀 3의 출력 값을 0에서 255까지 변경하여 조절할 수 있으며 0이 최대값입니다.

    <사전><코드>analogWrite(A3, 0);

    이제 예제 스케치를 업로드하고 모든 것이 제대로 작동하는지 확인할 수 있습니다.

    // 라이브러리 코드 포함:#include  // 필요한 LCD 인터페이스 핀을 연결하여 라이브러리를 초기화합니다. // const int rs =12, en에 연결된 arduino 핀 번호와 연결합니다. =11, d4 =2, d5 =3, d6 =4, d7 =5; 액정 액정(rs, en, d4, d5, d6, d7); 무효 설정() { analogWrite(A3, 0); // 밝기를 최대값으로 설정 // LCD의 열과 행 수 설정:lcd.begin(16, 2); // LCD에 메시지를 인쇄합니다. lcd.print("안녕하세요, 세계입니다!"); } void loop() { // 커서를 열 0, 줄 1로 설정합니다. // (참고:줄 1은 두 번째 행입니다. 계산이 0으로 시작하기 때문입니다.):lcd.setCursor(0, 1); // 재설정 이후의 초 수를 출력합니다. lcd.print(millis() / 1000); }  

    전위차계 추가

    전위차계의 값을 읽으려면 analogRead() 만 있으면 됩니다. 올바른 핀에. 우리는 그것들을 아날로그 핀 0, 1, 2에 연결하고 있습니다.

    전위차계의 값은 0에서 1023까지이므로 조합을 추측할 수 없습니다. 0에서 9까지의 값을 매핑하려면 map()을 사용합니다. 기능,

    <사전><코드> int PotOne =map(analogRead(A0), 0, 1023, 0, 9);

    이 예제 코드를 사용하여 전위차계의 값을 LCD 화면에 인쇄할 수 있습니다.

    #include  // LCD 화면 핀 const int rs =12, en =11, d4 =2, d5 =3, d6 =4, d7 =5; 액정 액정(rs, en, d4, d5, d6, d7); 무효 설정() { analogWrite(A3, 0); // LCD 화면의 밝기를 최대값으로 설정 Serial.begin(9600); lcd.begin(16, 2); // 16열 2행으로 LCD 화면 시작 } void loop() { int PotOne =map(analogRead(A0), 0, 1023, 0, 9); int PotTwo =map(analogRead(A1), 0, 1023, 0, 9); int PotThree =map(analogRead(A2), 0, 1023, 0, 9); lcd.setCursor(0, 0); lcd.print(팟원); lcd.setCursor(2, 0); lcd.print(팟투); lcd.setCursor(4, 0); lcd.print(PotThree); }  

    RGB LED 추가

    RGB LED를 피드백으로 사용하여 사람들이 조합을 추측하는 데 도움이 될 것입니다. 올바른 값에 가까울수록 파란색, 물색, 노란색 및 빨간색에 이르는 LED 색상이 더 따뜻해집니다.

    이 예제 스케치를 사용하여 RGB가 작동하는 것을 볼 수 있습니다!

    // RGB LED 핀 int redPin =6; 정수 그린핀 =8; 정수 블루핀 =7; 무효 설정() { pinMode(redPin, OUTPUT); 핀모드(그린핀, 출력); 핀모드(블루핀, 출력); Serial.begin(9600); } 무효 루프() { setColor(0, 0, 255); // 블루 딜레이(1000); 세트색상(0, 255, 255); // 아쿠아 딜레이(1000); 색상 세트(255, 255, 0); // 노란색 지연(1000); setColor(255, 0, 0); // 레드 딜레이(1000); } // RGB 값을 LED 핀으로 보냅니다. void setColor(int red, int green, int blue){ analogWrite(redPin, red); analogWrite(녹색핀, 녹색); analogWrite(블루핀, 블루); }  

    Blynk에 연결

    이제 모든 것을 결합할 준비가 되었습니다. 보드를 Blynk에 연결하고 전위차계를 LCD 화면에 연결하고 조합이 올바르면 LED가 녹색으로 깜박이도록 합니다.

    <울>
  • giveColorFeedback() 함수를 사용할 것입니다. 각 전위차계의 절대값이 올바른 조합에 대한 특정 임계값보다 가까울 때 LED의 색상을 설정합니다.
  • void GiveColorFeedback(int PotOne, int PotTwo, int PotThree){...} 
    <울>
  • 또한 이 변수를 사용하여 앱에서 전송된 값과 조합을 저장합니다.
  • int SliderValueOne =1; 정수 SliderValueTwo =1; 정수 SliderValueThree =1;  

    초기 값은 1로 설정되어 있으며 앱에서 슬라이더 값을 수정하는 경우에만 변경됩니다. 보드를 재설정하면 조합이 기본값으로 돌아갑니다.

    <울>
  • 부울 변수 bool start =true; 조합이 이미 추측된 시점을 감지하여 모든 루프에서 상자를 다시 열지 않도록 하는 데 사용됩니다.
  • 이 예제 스케치를 업로드하여 작동하는 모습을 확인하세요.

    #include  #include  #include  #include  // RGB LED 핀 int redPin =6; 정수 그린핀 =8; 정수 블루핀 =7; const char* ssid =SECRET_SSID; // 네트워크 SSID(이름) const char* 암호 =SECRET_PSWD; // 네트워크 비밀번호 char auth[] =SECRET_TOKEN; // Blynk API 토큰 // LCD 화면 핀 const int rs =12, en =11, d4 =2, d5 =3, d6 =4, d7 =5; 부울 시작 =true; // 조합 값을 저장할 변수 // 초기 조합을 ( 1 1 1 )로 설정 int SliderValueOne =1; 정수 SliderValueTwo =1; 정수 SliderValueThree =1; // 값 검색을 위한 Blynk 함수 BLYNK_WRITE(V1) { SliderValueOne =param.asInt(); // 핀 V1에서 들어오는 값을 변수에 할당 } BLYNK_WRITE(V2) { SliderValueTwo =param.asInt(); // 핀 V1에서 들어오는 값을 변수에 할당 } BLYNK_WRITE(V3) { SliderValueThree =param.asInt(); // 핀 V1에서 들어오는 값을 변수에 할당 } LiquidCrystal lcd(rs, en, d4, d5, d6, d7); 무효 설정() { pinMode(redPin, OUTPUT); 핀모드(그린핀, 출력); 핀모드(블루핀, 출력); analogWrite(A3, 0); // LCD 화면의 밝기를 최대값으로 설정 Serial.begin(9600); lcd.begin(16, 2); // 16열 2행으로 LCD 화면 시작 Blynk.begin(auth, ssid, password); // Blynk 기능 시작 } void loop() { // 조합을 임시로 저장하기 위한 변수 int Temp_Slider_One_value =SliderValueOne; 정수 Temp_Slider_Two_value =SliderValueTwo; 정수 Temp_Slider_Three_value =SliderValueThree; Blynk.run(); // 온라인 앱에서 새로운 조합 값을 폴링합니다. // 조합 값이 변경되었는지 확인하고 콘솔에 출력 if(Temp_Slider_One_value !=SliderValueOne || Temp_Slider_Two_value !=SliderValueTwo || Temp_Slider_Three_value !=SliderValueThree){ Serial.print("New 조합:"); Serial.print(SliderValueOne); Serial.print(" "); Serial.print(SliderValueTwo); Serial.print(" "); Serial.println(SliderValueThree); } int PotOne =map(analogRead(A0), 0, 1023, 0, 9); int PotTwo =map(analogRead(A1), 0, 1023, 0, 9); int PotThree =map(analogRead(A2), 0, 1023, 0, 9); lcd.setCursor(0, 0); lcd.print(팟원); lcd.setCursor(2, 0); lcd.print(팟투); lcd.setCursor(4, 0); lcd.print(PotThree); if (start) { GiveColorFeedback(PotOne, PotTwo, PotThree); if (PotOne ==SliderValueOne &&PotTwo ==SliderValueTwo &&PotThree ==SliderValueThree) { 깜박임GreenLed(); 시작 =거짓; } } if(!start) { if(PotOne ==0 &&PotTwo ==0 &&PotThree ==0){ 시작 =true; } } } // 전위차계가 조합 값에 얼마나 가까운지에 따라 피드백을 제공합니다. // 가까울수록 LED의 색상이 따뜻해집니다. void GiveColorFeedback(int PotOne, int PotTwo, int PotThree) { if (abs(PotOne) - SliderValueOne) <=1 &&abs(PotTwo - SliderValueTwo) <=1 &&abs(PotThree - SliderValueThree) <=1 ) { // 빨간색 setColor(255, 0, 0); } else if (abs(PotOne - SliderValueOne) <=3 &&abs(PotTwo - SliderValueTwo) <=3 &&abs(PotThree - SliderValueThree) <=3 ) { // 노란색 setColor(255, 255, 0); } else if (abs(PotOne - SliderValueOne) <=4 &&abs(PotTwo - SliderValueTwo) <=4 &&abs(PotThree - SliderValueThree) <=4 ) { // 아쿠아 setColor(0, 255, 255); } else { // 파란색 setColor(0, 0, 255); } } 무효 깜박임GreenLed() { for (int a =0; a <2; a++) { for (int b =0; b <=255; b +=5) { setColor(0, b, 0); 지연(5); } for (int b =255; b>=0; b -=5) { setColor(0, b, 0); 지연(5); } } for (int b =0; b <=255; b +=5) { setColor(0, b, 0); 지연(5); } } // RGB 값을 LED 핀으로 전송 void setColor(int red, int green, int blue){ analogWrite(redPin, red); analogWrite(녹색핀, 녹색); analogWrite(블루핀, 블루); }  

    부저 추가

    상자가 열리면 부저를 사용하여 멜로디를 연주합니다. 보다 정확하게는 스타워즈 주제가를 연주합니다.

    버저를 연결하는 방법은 간단합니다.

    이 예제 코드를 업로드하고 들어보세요:

    <사전><코드> const int c =261; 상수 정수 d =294; 상수 정수 e =329; 상수 정수 f =349; 상수 정수 g =391; const int gS =415; 상수 정수 =440; const int as =455; 상수 정수 b =466; const int CH =523; const int cSH =554; const int dH =587; 상수 정수 dSH =622; const int eH =659; 상수 정수 fH =698; 상수 정수 fSH =740; const int gH =784; const int gSH =830; const int AH =880; 정수 카운터 =0; #define BuzzerPin 1 void setup() { pinMode(buzzerPin, OUTPUT); Serial.begin(9600); } 무효 루프() { play_jingle(); 지연(3000); } 무효 play_jingle() { beep(a, 500); 경고음(a, 500); 경고음(a, 500); 경고음(f, 350); 경고음(CH, 150); 경고음(a, 500); 경고음(f, 350); 경고음(CH, 150); 경고음(a, 650); 지연(500); 경고음(eH, 500); 경고음(eH, 500); 경고음(eH, 500); 경고음(fH, 350); 경고음(CH, 150); 경고음(gS, 500); 경고음(f, 350); 경고음(CH, 150); 경고음(a, 650); 지연(500); } void beep(int note, int duration) { //buzzerPin tone에서 톤 재생(buzzerPin, note, duration); //buzzerPin에서 정지음 noTone(buzzerPin); 지연(50); // 카운터 카운터 증분++; }

    서보 모터 추가

    서보 모터는 상자의 잠금 장치입니다. 조합이 올바르면 상자가 열리도록 90도 회전해야 합니다.

    서보 연결에는 세 개의 와이어만 필요합니다.

    90도 회전하기 위해 다음 기능을 사용합니다:

    #include  int pos =0; // 서보 위치를 저장할 변수 Servo myservo; // 서보 제어를 위한 서보 객체 생성 void setup() { myservo.attach(9); // 9번 핀의 서보를 서보 객체에 연결합니다. myservo.write(pos); // 서보를 위치 0에 설정 } void loop() { open_the_box(); 지연(2000); close_the_box(); 지연(2000); } void open_the_box(){ for (pos =0; pos <=90; pos +=1) { // 0도에서 90도로 이동합니다. myservo.write(pos); // 서보에 변수 'pos'의 위치로 이동하도록 지시합니다. delay(15); // 서보가 위치에 도달할 때까지 15ms 기다림 } } void close_the_box(){ for (pos =90; pos>=0; pos -=1) { // 90도에서 0도로 이동 myservo.write(pos); // 서보에 변수 'pos'의 위치로 이동하도록 지시합니다. delay(15); // 서보가 위치에 도달할 때까지 15ms 기다림 } }  

    서보를 되돌리고 상자를 닫으려면 모든 전위차계를 0으로 돌리기만 하면 됩니다.

    퍼즐 상자 만들기

    상자가 없으면 상자가 아니므로 아래의 케이스 파일을 다운로드하여 나만의 케이스를 구축하는 데 참고하세요.

    2mm 판지를 사용했습니다.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    전체 스케치

    맞춤형 부품 및 인클로저

    2mm 판지 box_E5j7tnFdNC.dxf

    회로도


    제조공정

    1. 회로 구성요소
    2. 집적 회로
    3. Node-RED를 사용하여 Blynk하는 SensorTag
    4. Arduino 디지털 주사위
    5. 다중 온도 센서
    6. Arduino 게임 컨트롤러
    7. MOSMusic
    8. 마이크로일렉트로닉스란 무엇입니까?
    9. 드릴링 머신의 구성 요소
    10. 내연 기관의 구성 요소