이 프로젝트 정보
태초에 하나님은 하늘과 땅을 창조하셨습니다. 그리고 인간. 그리고 인간은 이와 같은 디지털 주방 타이머를 만들었습니다.
그리고 인간은 "쿨하지만 조금 우울합니다. 더 나은 것을 만들어 봅시다!
그리고 하나님이 말씀하시기를, 나는 당신의 부름을 들었습니다. Arduinos가 있게 하십시오. 그리고 Arduinos가 온 땅에 있었고 그것은 좋았습니다.
그리고 인간은 Arduino를 사용하여 이와 같은 더 나은 주방 타이머를 만들었습니다.
그리고 신은 새 주방 타이머를 보시고 말씀하셨습니다. 새 주방 타이머를 보았는데 끔찍합니다. , 하지만 너무 많은 재미 ! 그리고 좋습니다 . :-)
필요한 것
이 모든 것이 어디에서 왔는지 알았으니 이제 자세히 살펴보겠습니다.
내가 사용한 모든 구성 요소는 Arduino 스타터 키트에서 가져왔습니다. , 사진과 비디오에서 볼 수 있는 작은 브레드보드를 포함합니다. 프로젝트를 더 큰 프로젝트로 자유롭게 수용 , 원하는 경우.
전원도 필요합니다. 게임을 하는 동안 PC의 USB 포트와 케이블이면 충분합니다.
해야 할 일
첫째:스타터 키트 또는 선호하는 구성 요소 상자에서 필요한 모든 구성 요소를 수집하십시오. 없으면 당황하지 마십시오. 많이 있습니다. 인터넷에서. 구성 요소 목록은 아래에서 찾을 수 있습니다.
그리고 코드도 필요합니다. 다시 아래 상자에 있습니다.
작동 방식
기본적으로 다른 유사한 장치와 마찬가지로 가까운 모든 상점에서 1달러에 구입할 수 있습니다. 하지만 이 당신의 . 그러면 어떻게 그 작은 장치가 실제로 작동합니다.
키워드는 현재 모드입니다. . 타이머 자체는 한 번에 네 가지 모드 중 하나만 실행할 수 있습니다.
<울> 유휴 - 현재 설정된 시간을 보여주는 타이머가 입력을 기다리고 있습니다. 이것은 전원을 켜거나 재설정한 후의 초기 모드이기도 합니다.
설정 - S4를 길게 눌러 이 모드로 들어갈 수 있습니다(코드에서는 "재설정 버튼"이라고도 함). 여기에서 S3("시작 중지 버튼")를 사용하여 나중에 카운트다운할 경과 시간을 설정하기 위해 변경할 값을 선택할 수 있습니다. 마지막으로 S2("아래로 버튼") 및 S1("위로 버튼")을 각각 사용하여 선택한 값(시, 분 또는 초)을 줄이거나 늘릴 수 있습니다.
RUNNING - S3를 눌러 이 모드에 들어갈 수 있으며, 나가면 S3 또는 S4가 모두 필요합니다(이 경우 IDLE 모드가 됨).
RINGING - 원하는 시간이 경과하면 이 모드가 자동으로 활성화됩니다. 아무 스위치나 눌러 종료할 수 있습니다.
코드
먼저 포함해야 합니다. 적절한 라이브러리:
#include
#include
아직 없는 경우 다운로드하여 설치해야 합니다.
<울> 폴 스토프레겐의 시간 라이브러리 (ZIP를 다운로드하세요. 녹색 "복제 또는 다운로드" 버튼에서)
Arduino LiquidCrystal 라이브러리
다음으로 초기화 해 보겠습니다. 멋진 LCD 모듈:
LiquidCrystal LCD(12, 11, 5, 4, 3, 2);
멋진 배선 레이아웃을 얻으려면 마음대로 핀을 스크램블하십시오. 나는 끔찍한 배선 계획을 했으므로 이것을 따르지 마십시오! :D 예를 들어, 아래 회로도에서 볼 수 있는 노란색 와이어 교차를 피하기 위해 위의 설명에서 후자의 4개 핀을 뒤집을 수 있습니다(분명히 그에 따라 버튼 핀 상수를 조정해야 합니다. 아래 참조). 놀아, 즐겨! 복사/붙여넣기 직후부터 Arduinos와 함께하는 삶이 시작됩니다!
다음 51개 코드 줄에는 정적 변수 선언 및 초기화가 포함되어 있습니다. 자유롭게 탐색하십시오. 그들의 수정처럼 맑은 이름과 흩어져 있는 주석이 전체를 이해하는 데 도움이 될 것입니다.
setup() 함수는 지금까지 모든 Arduino 스케치에서 수천만 번 본 일반적인 예비 단계를 수행합니다. 유일하게 주목할만한 명령문은 초기 LCD 디스플레이 커서의 위치를 설정하는 첫 번째 명령문입니다. 왜냐하면, 그렇습니다:이 모듈은 행과 열을 따라 위치를 설정한 다음 해당 위치에서 시작하는 무언가를 "인쇄"해야 합니다.
이제 loop() 함수로 이동합니다.
먼저 스위치 상태를 알아보겠습니다. 이를 달성하기 위해 다음 코드 블록이 거의 각각:
/*
* 시작/중지 버튼 관리
*/
startStopButtonPressed =false;
startStopButtonState =digitalRead(startStopButtonPin);
if(startStopButtonState !=startStopButtonPrevState)
{
startStopButtonPressed =startStopButtonState ==높음;
startStopButtonPrevState =startStopButtonState;
}
관련 핀에 대해 digitalRead가 실행되고 결과는 이전에 읽은 값과 비교됩니다. 무언가가 변경된 경우 새 값은 나중에 참조할 수 있도록 저장되고 버튼이 눌려지면 bool "xxxButtonPressed" 정적 변수가 true로 설정됩니다.
아래 회로도를 보면 해당 스위치를 누르고 핀 자체가 +5V에 직접 연결되어 있지 않는 한 각 입력 핀이 10k 저항에 의해 강제로 LOW가 됨을 알 수 있습니다. 상당히 고전적인 시나리오죠?
이전에는 "거의 각각 다른 버튼과 다른 방식으로 작동하는 버튼이 하나 있기 때문입니다. S4. 해당 코드 블록은 SETUP 모드로 들어가기 위해 앞서 언급한 길게 누름을 감지할 수 있습니다.
다음은 모드 관리 블록 스위치입니다. 각 경우는 버튼 상태 트리거("xxxButtonPressed")를 확인하고 흐름을 적절한 새 상태로 리디렉션하거나 적절한 작업을 수행합니다.
케이스 MODE_IDLE:
if(resetButtonPressed)
{
Reset();
}
if(resetButtonLongPressed)
{
currentMode =MODE_SETUP;
}
if(startStopButtonPressed)
{
currentMode =currentMode ==MODE_IDLE ? MODE_RUNNING :MODE_IDLE;
if(currentMode ==MODE_RUNNING)
{
// STARTING TIMER!
startTime =now();
}
}
중단;
이전 코드 스니펫은 IDLE 모드가 관리되는 방법을 보여주며 꽤 자명합니다. 다른 예는 벨이 울리는 동안 버튼을 누르면 어떻게 중지되는지 보여줍니다.
케이스 MODE_RINGING:
if(resetButtonPressed || startStopButtonPressed || downButtonPressed || upButtonPressed)
{
currentMode =MODE_IDLE;
}
break; 코드>
쉬워보이죠? :-) 그렇습니다.
다음 블록 - "시간 관리" - 실제 시차 계산을 수행하고 RINGING 모드를 트리거하며 실제로 벨이 울립니다. 시간이 되면 윙윙거립니다.
마지막 블록 - "LCD 관리" - 적절한 위치에 적절한 문자열을 인쇄하여 각 모드에 대한 LCD 디스플레이를 관리합니다.
그게 다야.
마무리하고 행동하세요!
이제 이 작은 강아지에게 더 이상 비밀이 없으므로 실제로 실행해 보겠습니다. 시청해주셔서 감사합니다. 즐거운 시간 보내세요!
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드"> 코드
<울> 아두이노스케치
ArduinoSketchArduino
<사전>/************************************************ **** * Arduino Kitchen Timer v1.0 - 2016/01/27 * By Angelo Fiorillo(Rome, IT) * 이 작업은 GNU General에 따라 배포됩니다. * Public License 버전 3 이상(GPL3+) * 이 크레딧을 포함하세요. * 이 스케치의 일부를 재사용하려면 참고하십시오. 내가 당신의 일을 하는 것처럼 나의 일을 존중하십시오. * 부담없이 연락주세요:[email protected] * ***************************************** ***********/#include #include // FIX 2018-08-12 이 수정 사항 «'지금'은 이 범위에서 선언되지 않았습니다.» errorLiquidCrystal lcd( 12, 11, 5, 4, 3, 2); const int buzzerPin =10; const int resetButtonPin =6; const int startStopButtonPin =7; const int downButtonPin =8; const int upButtonPin =9; int setupHours =0; // 시작되면 몇 시간이 카운트다운되는지 int setupMinutes =0; // 시작 시 몇 분 동안 카운트다운할지 int setupSeconds =0; // starttime_t setupTime =0;int currentHours =0;int currentMinutes =0;int currentSeconds =0;time_t currentTime =0;time_t startTime =0;time_t elapsedTime =0;int resetButtonState =LOW;long일 때 몇 초를 카운트다운할지 resetButtonLongPressCounter =0;int startStopButtonState =LOW;int upButtonState =LOW;int downButtonState =LOW;int resetButtonPrevState =LOW;int startStopButtonPrevState =LOW;int upButtonPrevState =LOW;int downButtonPrevState =falseboPolresetButton startStopButtonPressed =false, bool upButtonPressed =false, bool downButtonPressed =false, const int MODE_IDLE =0, const int MODE_SETUP =1, const int MODE_RUNNING =2, const int MODE_RINGING =3, int currentMode =MODE_IDLE; // 0=idle 1=setup 2=running 3=ringing // Power up --> idle // Reset --> idle // Start/Stop --> 카운터 시작 또는 중지 // Up / Down --> NOP // 리셋(길게 누름) --> 설정 입력 // 시작/정지 --> 데이터 선택 // Up --> 현재 데이터 값 증가 // Down --> 현재 데이터 값 감소 // 리셋 --> 설정 종료 (유휴) 정수 데이터 선택 =0; // 편집을 위해 현재 선택된 데이터(설정 모드, 시작/중지로 변경됨) // 0=시(00-99) 1=분(00-59) 2=초(00-59)void setup() { // 한 번 실행하려면 여기에 설정 코드를 입력하십시오. lcd.begin(16, 2); 핀모드(리셋버튼핀, 입력); 핀모드(startStopButtonPin, INPUT); 핀모드(upButtonPin, INPUT); 핀모드(다운버튼핀, 입력); 핀모드(부저핀, 출력); Serial.begin(9600);}void loop() { // 여기에 기본 코드를 넣어 반복적으로 실행합니다. startStopButtonPressed =false; upButtonPressed =거짓; downButtonPressed =거짓; /* * 리셋 버튼 관리 */ resetButtonPressed =false; resetButtonLongPressed =거짓; resetButtonState =digitalRead(resetButtonPin); if(resetButtonState !=resetButtonPrevState) { resetButtonPressed =resetButtonState ==HIGH; resetButtonPrevState =리셋버튼 상태; } else // 길게 누르기 관리... { if(resetButtonState ==HIGH) { resetButtonLongPressCounter++; if(resetButtonLongPressCounter ==100) { resetButtonPressed =거짓; resetButtonLongPressed =true; 리셋버튼롱프레스카운터 =0; } } 그렇지 않으면 { resetButtonLongPressCounter =0; resetButtonPressed =거짓; resetButtonLongPressed =거짓; } } /* * 시작/중지 버튼 관리 */ startStopButtonPressed =false; startStopButtonState =digitalRead(startStopButtonPin); if(startStopButtonState !=startStopButtonPrevState) { startStopButtonPressed =startStopButtonState ==높음; startStopButtonPrevState =startStopButtonState; } /* * 아래로 버튼 관리 */ downButtonPressed =false; downButtonState =digitalRead(downButtonPin); if(downButtonState !=downButtonPrevState) { downButtonPressed =downButtonState ==높음; downButtonPrevState =downButtonState; } /* * 위로 버튼 관리 */ upButtonPressed =false; upButtonState =digitalRead(upButtonPin); if(upButtonState !=upButtonPrevState) { upButtonPressed =upButtonState ==HIGH; upButtonPrevState =upButtonState; } /* * 모드 관리 */ switch(currentMode) { case MODE_IDLE:if(resetButtonPressed) { Reset(); } if(resetButtonLongPressed) { 현재 모드 =MODE_SETUP; } if(startStopButtonPressed) { currentMode =currentMode ==MODE_IDLE ? MODE_RUNNING :MODE_IDLE; if(currentMode ==MODE_RUNNING) { // 타이머 시작! 시작 시간 =지금(); } } 부서지다; case MODE_SETUP:if(resetButtonPressed) { // 설정 모드 종료 setupTime =setupSeconds + (60 * setupMinutes) + (3600 * setupHours); 현재 시간 =설정 시간; currentMinutes =setupMinutes; currentSeconds =setupSeconds; 데이터 선택 =0; 현재 모드 =MODE_IDLE; } if(startStopButtonPressed) { // 조정할 다음 데이터 선택 dataSelection++; if(데이터 선택 ==3) { 데이터 선택 =0; } } if(downButtonPressed) { switch(dataSelection) { 사례 0:// 시간 setupHours--; if(setupHours ==-1) { setupHours =99; } 부서지다; 사례 1:// 분 setupMinutes--; if(setupMinutes ==-1) { setupMinutes =59; } 부서지다; 사례 2:// 초 setupSeconds--; if(setupSeconds ==-1) { setupSeconds =59; } 부서지다; } } if(upButtonPressed) { switch(dataSelection) { 사례 0:// 시간 setupHours++; if(설정 시간 ==100) { 설정 시간 =0; } 부서지다; 사례 1:// 분 setupMinutes++; if(setupMinutes ==60) { setupMinutes =0; } 부서지다; 사례 2:// 초 setupSeconds++; if(setupSeconds ==60) { setupSeconds =0; } 부서지다; } } 부서지다; 경우 MODE_RUNNING:if(startStopButtonPressed) { currentMode =MODE_IDLE; } if(resetButtonPressed) { 재설정(); 현재 모드 =MODE_IDLE; } 부서지다; 케이스 MODE_RINGING:if(resetButtonPressed || startStopButtonPressed || downButtonPressed || upButtonPressed) { currentMode =MODE_IDLE; } 부서지다; } /* * 시간 관리 */ switch(currentMode) { case MODE_IDLE:case MODE_SETUP:// NOP break; 경우 MODE_RUNNING:currentTime =setupTime - (now() - startTime); if(현재시간 <=0) { 현재모드 =MODE_RINGING; } 부서지다; 케이스 MODE_RINGING:analogWrite(buzzerPin, 20); 지연(20); analogWrite(부저핀, 0); 지연(40); 부서지다; } /* * LCD 관리 */ //lcd.clear(); lcd.setCursor(0, 0); switch(currentMode) { case MODE_IDLE:lcd.print("타이머 준비"); lcd.setCursor(0, 1); lcd.print(현재시간); lcd.print(" "); lcd.print(현재분); lcd.print(" "); lcd.print(현재초); lcd.print(" "); 부서지다; case MODE_SETUP:lcd.print("설정 모드:"); switch(dataSelection) { 경우 0:lcd.print("HRS"); 부서지다; 사례 1:lcd.print("MINS"); 부서지다; 사례 2:lcd.print("SECS"); 부서지다; } lcd.setCursor(0, 1); lcd.print(설정 시간); lcd.print(" "); lcd.print(설정 시간); lcd.print(" "); lcd.print(setupSeconds); lcd.print(" "); 부서지다; case MODE_RUNNING:lcd.print("카운트 다운..."); lcd.setCursor(0, 1); if(시(현재시간) <10) lcd.print("0"); lcd.print(시(현재시간)); lcd.print(":"); if(분(현재시간) <10) lcd.print("0"); lcd.print(분(현재시간)); lcd.print(":"); if(초(현재시간) <10) lcd.print("0"); lcd.print(초(현재시간)); 부서지다; 케이스 MODE_RINGING:lcd.print(" 링-링! "); lcd.setCursor(0, 1); lcd.print(" "); 부서지다; } 지연(10);} 무효 재설정(){ 전류 모드 =MODE_IDLE; 현재 시간 =설정 시간; currentMinutes =setupMinutes; currentSeconds =setupSeconds;} 섹션> 회로도
여기에 표시된 것보다 작은 스타터 키트를 포함하여 모든 범용 브레드보드를 사용할 수 있습니다(부저는 노란색 와이어 아래에 배치할 수 있습니다. 비디오 및 사진 참조).