제조공정
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
|
손 씻기는 질병 예방과 전반적인 건강에서 항상 중요한 무기였으나 COVID-19 전염병의 확산을 억제하기 위한 예방 조치로 손 씻기가 새로운 중요성을 갖게 되었습니다.
좋은 손 씻기를 위한 CDC 지침에는 20초 동안 손을 이상적으로 문질러야 한다고 명시되어 있습니다. https://www.cdc.gov/handwashing/when-how-handwashing.html
🤓📚** 추가 항목 ** 🤓📚 관심있는 분들을 위해 손 씻기의 과학을 소개합니다! - https://www.cdc.gov/handwashing/show-me-the-science-handwashing.html
손 씻기 타이머의 이 리덕스에서 우리의 음악적 손 씻기 타이머는 초음파 센서 앞에서 손을 흔들면 활성화되고 7-세그먼트 디스플레이에 카운트다운을 표시합니다. 더 흥미롭게 만들기 위해 사전 프로그래밍된 징글 목록에서 20초 징글을 차례로 선택하여 재생합니다. 가지고 있는 악보를 옮겨 적으면 쉽게 자신의 음악을 추가할 수 있습니다!
터치리스 뮤지컬을 살펴보세요. 손 씻기 타이머 내가 프로그래밍한 4개의 징글을 모두 표시합니다.
<울>이봐, 내 손은 정말 대단했어 그것의 끝으로 청소! 😊
🤓📚** 추가 항목 ** 🤓📚 이제 우리 모두는 "Happy Birthday to You"를 두 번 부르는 데 약 20초가 걸린다는 것을 알고 있으며, 저스틴 트뤼도 캐나다 총리도 노래하는 손 씻기 타이밍의 사실상 표준이 되었습니다! 캐나다의 최고 공중 보건 책임자인 Dr. Theresa Tam은 We Will We Will Wash You와 같은 자신의 즐겨찾기를 가지고 있습니다. ! 😊CBC Kids News 기고자 Arjun Ram의 흥미로운 인터뷰를 아래에서 시청하세요.
터치리스 뮤지컬 핸드 워시 타이머에 두 곡을 모두 소개합니다. , 그리고 몇 가지 더! 😊
1단계 - 도식
이 프로젝트는 Arduino Uno, 7-Segment LED Backpack(I2C), HC-SR04 초음파 센서 및 Piezo Buzzer를 사용합니다. 아래 회로도를 참조하십시오.
2단계 - 계획 및 설정
회로도와 프로그래밍 외에도 "완성된 제품"과 그것을 사용할 수 있게 만드는 방법에 대해 생각하고 싶었습니다.
ProtoStax 인클로저를 사용했습니다. 쌓을 수 있고 Arduino, Raspberry Pi 및 Breadboard를 지원합니다. 브레드보드 회로가 있는 Arduino를 사용했기 때문에 Arduino용 ProtoStax 인클로저와 Breadboard/Custom Boards용 ProtoStax 인클로저를 선택했습니다. 나는 또한 초음파 센서가 외부에서 접근할 수 있고 따라서 인클로저에 고정되기를 원했습니다. 나는 초음파 센서 HC-SR04용 ProtoStax 키트를 사용했습니다.
프로토타이핑을 용이하게 하기 위해 수평 스태킹 커넥터를 사용하여 Arduino 및 Breadboard 기본 플랫폼을 수평으로 스태킹하는 것으로 시작했습니다.
프로토타이핑 플랫폼이 있으면 회로도에 따라 구성 요소를 채울 수 있습니다. 프로토타입이 완성된 후 인클로저가 조립된 후 접근할 수 있도록 초음파 센서 HC-SR04용 ProtoStax 키트의 측벽에 HC-SR04 초음파 센서를 부착했습니다. 센서가 있는 측벽은 그림과 같이 기본 플랫폼의 슬롯에 들어갑니다.
그림>
3단계 - 프로그래밍 및 테스트
이제 작동하는 프로토타이핑 플랫폼이 있으므로 이를 위한 코드를 개발할 수 있습니다. 아래의 별도 섹션에서 코드 기능과 레이아웃에 대해 더 자세히 알아볼 것입니다. 다음은 테스트 동영상입니다. 비디오 녹화에 사용한 iPhone 11이 실제로 초음파 센서의 뚜렷한 수중 음파 탐지기 핑을 포착했다는 것은 미친 짓입니다. 아래 비디오에서 매우 명확하게들을 수 있습니다(초음파 펄스는 무해한 클릭으로 거의 등록할 수 없지만). 클릭 클릭) ! 😊
모든 것이 작동하는 것으로 확인되면 측벽과 나머지 커넥터 및 상단을 추가하여 인클로저를 완성했습니다.
상단의 영상은 최종 사용중인 "제품"을 보여줍니다! 😊
강령 이해
구성 요소 초기화:
LED Backpack 라이브러리의 Adafruit_7segment 클래스를 사용하여 7-세그먼트 디스플레이를 초기화하고 통신합니다.
Adafruit_7segment 행렬 =Adafruit_7segment();
또한 HC-SR04의 trig 및 echo 핀을 각각 출력 및 입력으로 초기화합니다.
<사전><코드> pinMode(trigPin, OUTPUT); 핀모드(에코핀, 입력); matrix.begin(0x70);메인 루프에서 높은 수준에서 수행되는 작업은 다음과 같습니다.
1) 초음파 센서 거리 판독값을 확인하여 손 세척 타이머가 작동되었는지 확인합니다.
2) 그렇다면 현재 시간을 기록하고 countDown 타이머를 초기화하고(20초 동안 20으로 설정) 재생할 다음 음악 징글도 선택합니다. 처음에 random()을 사용하여 임의의 멜로디를 선택했지만 멜로디 배열에 대해 "라운드 로빈"으로 변경하고(첫 번째로 다시 순환) startMusic을 1로 설정했습니다(카운트다운 및 음악 재생을 설정하기 위해 .
if (distance <10 &&!startMusic) { startMusic =1; // initializeTimer1(); 카운트다운 =20; 현재 시간 =밀리(); 멜로디Num =(멜로디넘+1)%(NUM_MELODIES(멜로디)); }코드>
봐 마 노 딜레이()!
여기에서는 두 가지 작업을 동시에 수행하고 있습니다. 손을 씻을 시간이 몇 초 남았는지 주기적으로 카운트다운 시계를 업데이트하려고 합니다. 우리는 또한 징글을 처리하고 제 시간에 올바르게 재생하기를 원합니다.
우리는 할 수 없습니다. 따라서 delay()를 사용하십시오.
음악을 재생하는 일반적인 예는 Tone 라이브러리의 tone() 함수를 사용하고 다음 음을 재생하기 전에 적절한 지연을 기다립니다. 아직 카운트다운 시계를 업데이트해야 하므로 작동하지 않습니다.
tone()은 비차단 호출입니다. Timer2를 사용하여 지정된 시간 동안 신호를 보냅니다. 즉, 그 동안에는 다른 처리를 자유롭게 할 수 있습니다.
우리는 delay()를 사용하는 대신 millis() 및 지역 변수를 사용하여 경과 시간을 파악하고 그 동안 다른 검사를 진행하고 다른 작업을 수행할 수 있습니다. 정확한 코드는 조금 더 아래에서 살펴보겠습니다.
음악을 쉽게 옮겨 적기 - 전체 음표, 4분 음표 등
우리는 주어진 멜로디를 연주하고 싶고 더 많은 멜로디를 쉽게 필사할 수 있도록 하고 싶습니다. Arduino 음악 예제는 일반적으로 두 개의 다른 배열을 저장합니다. 하나는 음표용이고 다른 하나는 음표 지속 시간(밀리초)입니다.
일을 단순화하기 위해 메모와 해당 기간을 연결하는 구조체를 만들었습니다. 그리고 절대 기간을 사용하는 대신
에 대해 #defines를 만든 상대 기간을 사용했습니다.typedef struct 참고 { int frequency; 부동 기간; } 참고;#define NOTE_WHOLE 1#define NOTE_HALF 0.5f#define NOTE_QUARTER 0.25f#define NOTE_EIGHTH 0.125f#define NOTE_SIXTEENTH 0.0625f#define DOTTED(X) (X * 1.5f)
생일 축하의 예를 들어 보겠습니다.
이것은 다음과 같이 필사할 수 있습니다. 악보를 읽을 수 없다면 사용할 실제 음표를 찾으십시오. 🤓📚그러나 악보 읽는 법을 배우는 것은 항상 가지고 있으면 좋은 기술이며 아주 잘할 필요는 없습니다. 음표가 무엇인지 아는 것만으로 악보를 자신의 악보로 바꾸는 데 필요한 작업을 수행할 수 있습니다. 아두이노! 🤓📚
// 생일 축하합니다 멜로디[] ={ {NOTE_G6, DOTTED(NOTE_EIGHTH)}, {NOTE_G6, NOTE_SIXTEENTH}, {NOTE_A6, NOTE_QUARTER}, {NOTE_G6, NOTE_QUARTER}, {NOTE_C7, NOTE_QUARTER}, {NOTE_C7, NOTE_QUARTER} , NOTE_HALF}, {NOTE_G6, DOTTED(NOTE_EIGHTH)}, {NOTE_G6, NOTE_SIXTEENTH}, {NOTE_A6, NOTE_QUARTER}, {NOTE_G6, NOTE_QUARTER}, {NOTE_D7, NOTE_QUARTER}, {NOTEIGHT_C7, NOTE_HALF }, {NOTE_G6, NOTE_SIXTEENTH}, {NOTE_E7, NOTE_QUARTER}, {NOTE_D7, NOTE_QUARTER}, {NOTE_C7, NOTE_QUARTER}, {NOTE_B6, NOTE_QUARTER}, {NOTE_A6, NOTE_HALF}, {NOIGHTTED_F7, DOTH NOTE_SIXTEENTH}, {NOTE_E7, NOTE_QUARTER}, {NOTE_C7, NOTE_QUARTER}, {NOTE_D7, NOTE_QUARTER}, {NOTE_C7, NOTE_HALF}, };
여기서 실제 지속 시간을 사용하지 않았다는 점에 유의하십시오. 음표의 상대적 지속 시간을 4분 음표, 8분 음표, 16분 음표 등으로 지정했습니다. 점으로 구분된 음표를 나타내는 DOTTED() 매크로도 있습니다. (1.5 x 앞에 오는 음표의 길이).
멜로디 자체는 이 배열과 전체 음표가 나타내는 길이에 대한 추가 정보로 구성됩니다.
typedef struct Melody { 참고 *notes; int numNotes; int wholeNoteDurationMs; } 멜로디;
C 배열은 배열에 대한 포인터를 사용하여 크기를 조정할 수 없으므로 numNotes를 Note 배열의 크기로 추가합니다. 이것은 MELODY_LENGTH 매크로를 사용하여 쉽게 초기화할 수 있으므로 좋아하는 노래를 필사할 때 메모 배열에 만든 메모 수에 대해 걱정할 필요가 없습니다!
그런 다음 내 프로그램에서 사용할 멜로디 배열을 정의합니다.
멜로디 멜로디[] ={ {멜로디, MELODY_LENGTH(멜로디), 1250}, {멜로디3, MELODY_LENGTH(멜로디3), 1000}, {멜로디4, MELODY_LENGTH(멜로디4), 1000}};
루프에서 countDown 타이머와 음악을 시작할 때 위의 음표 정보, 상대적 지속 시간 및 전체 음표의 실제 지속 시간을 사용하여 음악을 재생하는 방법을 알아냅니다. 음악 재생 사이에도 카운트다운 타이머를 확인 및 업데이트하고 7세그먼트 디스플레이에 숫자를 표시합니다.
사람들이 징글 전체를 다 듣고 싶어할 것 같아서 20초가 다 되어도(노래가 끝날 때까지 카운트다운은 음수로 바뀝니다) 끝날 때까지 계속 징글을 연주합니다. 징글이 끝나면 초음파 센서 앞에서 다시 한 번 손을 흔들어 더 트리거 될 때까지 멈 춥니 다. 징글이 너무 짧으면 20초가 경과하고 음악 재생이 끝날 때까지 다시 한 번 재생됩니다! 단순한.
if (startMusic) { // 재생할 멜로디 선택 Melody mel =melodies[melodyNum]; 참고 *m =mel.notes; int mSize =mel.numNotes; // speedUp은 음표 연주 속도를 높이는 쉬운 방법입니다. 가장 좋은 방법은 // wholeNoteDurationMs를 적절하게 설정하는 것입니다. int speedUp =1; 노톤(TONE_PIN); // 깨끗한 슬레이트로 시작 for (int thisNote =0; thisNote
전체 코드는 GitHub에서 찾을 수 있으며 저장소에 대한 링크가 포함되어 있습니다. 여기에서 코드를 복사하여 붙여넣는 것보다 거기에서 코드를 가져오는 것이 좋습니다.
프로젝트 진행
코드 샘플을 가지고 놀고 코드를 이해하는 데 익숙해지면 더 많은 작업을 수행하여 학습을 확장하는 것이 좋습니다.
다음은 이 프로젝트를 발전시킬 수 있는 방법에 대한 몇 가지 제안입니다.
1) 좋아하는 곡을 찾은 다음 참고를 사용하여 필사할 수 있습니다. 및 참고 기간 위에서 설명한 매크로. 메모리 사용량을 줄이기 위해 이미 정의된 다른 징글 중 하나 이상을 주석 처리하는 것을 잊지 마십시오(아래 설명에 따라 Note 및 Melody 배열을 PROGMEM으로 성공적으로 이동하지 않는 한! 😊)
2) 멜로디는 SRAM의 공간을 차지하며 사용 가능한 메모리를 매우 빠르게 소모할 수 있습니다. 예를 들어 4개의 멜로디(생일 축하해, 도레미, We Will Rock You, Jeopardy!)를 녹음했습니다. 그러나 이로 인해 SRAM 사용량이 96%로 증가하여 7-세그먼트 디스플레이 라이브러리의 기능에 충분하지 않았고 제대로 업데이트되지 않았습니다! 모든 것이 제대로 작동하려면 멜로디 어레이에서 멜로디 중 하나를 제외해야 했습니다.
Arduino Uno는 2k의 SRAM과 함께 제공되지만 32k의 플래시 메모리(프로그램이 있는 위치)와 함께 제공됩니다. 전역 변수 중 일부를 플래시 메모리로 이동할 수 있다면 나머지 프로그램을 위해 SRAM을 확보할 수 있을 뿐만 아니라 더 많은 노래를 저장할 수 있는 공간도 더 많이 확보할 수 있습니다! Note 및 Melody 어레이를 PROGMEM으로 정의하여 Flash로 이동하십시오. [참고:이것은 고급 작업이며 사소한 일이 아닙니다. 당신 할 될 강등 그 배열 의 구조체 ~으로 PROGMEM 그리고 그럼 가지고 ~으로 읽기 그 프로그램 ~으로 액세스 그 데이터.]
차이점에 대한 이해를 돕기 위해 이 프로그램(3개의 멜로디 포함)은 Uno에서 프로그램 저장 공간의 31%와 동적 메모리의 76%를 차지했습니다. PROGMEM에 정의된 위의 변수를 사용하면 프로그램 공간의 32%(Flash 메모리 사용량이 약간 증가하고 더 많이 사용할 수 있음)와 동적 메모리의 22%(76%에서 감소)를 차지했습니다! 즉, 많이 쉽게 추가할 수 있습니다. 이 터치리스 뮤지컬 손 씻기 타이머에 대한 노래 PROGMEM으로 물건을 옮기면! 😊
이 프로젝트를 확장할 다른 방법을 생각할 수 있습니까? 아래에서 우리와 공유하십시오! 😊
해피 메이킹! 😊
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">
제조공정
구성품 및 소모품 Arduino UNO × 1 초음파 센서 - HC-SR04(일반) × 2 점퍼 와이어(일반) × 1 앱 및 온라인 서비스 Arduino IDE Python IDLE PySerial 라이브러리 Pyautogui 라이브러리 이 프로젝트 정보 이 프로젝트에서 우리는 제스처로 제어되는 랩탑이나 컴퓨터를 만드는 방법을 배울 것입니다. Arduino와 Python의 조합
구성품 및 소모품 Arduino UNO × 1 Adafruit Standard LCD - 파란색 바탕에 16x2 흰색 × 1 SparkFun 푸시버튼 스위치 12mm × 4 저항 10k 옴 × 4 저항 221옴 음, 220옴... × 2 단일 회전 전위차계 - 100,000옴 × 1 부저 × 1 브레드보드(일반) × 1 점퍼 와이어(일반) × 1