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

Arduino 주방 타이머

구성품 및 소모품

Arduino UNO
× 1
Adafruit Standard LCD - 파란색 바탕에 16x2 흰색
× 1
SparkFun 푸시버튼 스위치 12mm
× 4
저항 10k 옴
× 4
저항 221옴
음, 220옴...
× 2
단일 회전 전위차계 - 100,000옴
× 1
부저
× 1
브레드보드(일반)
× 1
점퍼 와이어(일반)
× 1

이 프로젝트 정보

태초에 하나님은 하늘과 땅을 창조하셨습니다. 그리고 인간. 그리고 인간은 이와 같은 디지털 주방 타이머를 만들었습니다.

그리고 인간은 "쿨하지만 조금 우울합니다. 더 나은 것을 만들어 봅시다!

그리고 하나님이 말씀하시기를, 나는 당신의 부름을 들었습니다. 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;}

    회로도

    여기에 표시된 것보다 작은 스타터 키트를 포함하여 모든 범용 브레드보드를 ​​사용할 수 있습니다(부저는 노란색 와이어 아래에 배치할 수 있습니다. 비디오 및 사진 참조).

    제조공정

    1. 갈증 경보 식물 알람
    2. Nokia 5110 LCD의 DIY Simple 20kHz Arduino 오실로스코프
    3. 스마트 블라인드
    4. 이탈리아어 단어 시계
    5. Arduino 카운트다운 타이머
    6. Sigfox kWh 미터
    7. 블루투스 온도 모니터
    8. 제스처 제어 잠금
    9. Arduino용 절연 아날로그 입력
    10. 반응 시간 측정