제조공정
| × | 1 |
|
참고:이 튜토리얼은 오래되었을 수 있습니다. 여기 최신 버전의 경우
귀중품을 큰 금고나 이와 유사한 곳에 넣지 않는 한 눈에 띄지 않게 보관하는 것이 때로는 어려울 수 있습니다. 하지만 누가 그럴 공간이 있겠습니까?
대신 MKR IoT 번들의 구성 요소와 카드보드를 사용하여 나만의 퍼즐 상자를 만드세요! 소지품의 안전을 보장할 수는 없지만, 적어도 잠재적인 도둑을 위한 재미있는 억지력이 될 것입니다.
물론, 우리는 당신이 거기에 사탕을 숨겨두는 것이 좋습니다. 실제 귀중품이 아닙니다.
간단히 말해서
서보 모터로 닫혀 있는 상자를 열려면 올바른 조합을 얻을 때까지 전위차계를 돌려야 합니다. 조합은 온라인 앱 Blynk를 통해 설정할 수 있습니다. LED가 추측을 도와 색상 피드백을 제공합니다. 가까울수록 색상이 따뜻해집니다.
올바른 조합이 추측되면 부저가 노래를 재생하기 시작하고 서보가 상자를 엽니다.
퍼즐 상자를 만들려면 다음 구성 요소가 필요합니다.
<울>
학습 목표 <울>
더 알고 싶으십니까?
이 자습서는 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()
을 사용합니다. 기능,
이 예제 코드를 사용하여 전위차계의 값을 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="코드">제조공정
구성품 및 소모품 Arduino UNO 기본 구성요소 중 하나입니다. × 1 초음파 센서 - HC-SR04(일반) 기본 구성요소 중 하나입니다. × 1 리튬 이온 배터리 1000mAh 기본 구성요소 중 하나입니다. × 2 RGB 확산 공통 음극 기본 구성요소 중 하나입니다. × 1 부저 필요한 용품 중 하나 × 1 저항 330옴 필요한 용품 중 하나 × 3 USB-A-B 케이블 필요한 용품 중 하나 × 1
구성품 및 소모품 Arduino MKR IoT 번들 × 1 앱 및 온라인 서비스 자피어 ThingSpeak API 이 프로젝트 정보 참고:이 튜토리얼은 오래되었을 수 있습니다. 여기 최신 버전의 경우 소개 영국 시인 윌리엄 워즈워스가 한 번 말했듯이 당신의 마음은 정원이고, 당신의 생각은 씨앗이며, 수확은 꽃이나 잡초가 될 수 있습니다. 당신의 식물을 살아있게 유지하는 것은 의사 소통이 매우 나쁘기 때문에 꽤 어려울 수 있습