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

간단한 Arduino 크로노미터

구성품 및 소모품

Arduino UNO
모든 arduino.. 때로는 그뿐만 아니라
× 1
버튼(래칭 아님)
풀다운 저항 포함(1kohm 사용)
× 1
저항 10k 옴
× 1

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

저는 재미있는 프로젝트를 진행 중이며 버튼을 누를 때마다 작동하는 Arduino 크로노미터가 필요했습니다. 복잡한 것은 아니지만 이 코드가 다른 사람들의 프로젝트에 유용할 것이라고 생각했습니다.

코딩 시간을 1시간이나 절약할 수 있었습니다.

EEPROM:

전원을 차단하거나 보드를 재설정해도 정보를 잃지 않는 Arduino의 메모리.(정보). #include 를 사용하고 있습니다. 기본적으로 모든 작업을 수행하고 기본적으로 이미 설치되어 있는 라이브러리입니다.

인터럽트:

Arduino 내부에서 일이 일어나고 있지만, 예를 들어 일부 핀이 HIGH로 당겨질 때 진행 중인 모든 작업을 중단하고 ISR 기능에 주의를 기울이기를 원합니다. 여기에 추가 라이브러리가 필요하지 않습니다.

프로젝트 코드:

<울>
  • 정의 및 포함:
  • #include  #define interruptPin 2 #define eeAddress 0 // ARDUINO의 EEPROM용 주소(내부 비휘발성 메모리) float starttime =0; // 수학을 수행할 변수 float endtime=0; 부동 결과 시간 =0, 이전 결과 시간 =0;  

    여기에 EEPROM 라이브러리가 포함된 새로운 것은 없으며 버튼이 (pin2)에 부착될 위치를 결정합니다.

    그런 다음 EEPROM 메모리의 주소 0을 사용하여 시간을 저장하기로 결정했습니다(float=4bytes). 아두이노 UNO는 1024바이트(칩 ATmega328)를 가지고 있지만, 저는 일생에 한 번 정리하려고 했기 때문에 주소 0을 선택했습니다.

    <울>
  • 설정()
  • void setup() { Serial.begin(9600); 동안 (! 직렬) {; // 직렬 포트가 연결될 때까지 기다립니다. 기본 USB 포트에만 필요 } Serial.println("직렬 통신이 준비되었습니다!:.. bip bip"); attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);}  

    일반적으로 Arduino와 PC 사이에 직렬 통신을 시작합니다(9600 보드):

    attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE); 

    InterruptPin의 논리 수준이 다음과 같이 변경되면 Attachinterrupt가 기능을 활성화합니다:(____________-HERE--------------------HERE____________).

    이렇게 하면 누르기 시작과 끝에서 두 번 트리거됩니다. 아무 일도 일어나지 않으면 풀다운 저항이 "강제로" 낮게 유지되기 때문에 interruptPin 값이 LOW로 유지됩니다.

    <울>
  • 루프()
  • 무효 루프() { }  

    아무것도. 거기에 물건을 넣으세요!

    <울>
  • 기타 기능:
  • <사전><코드> 무효 refreshTime(){ if(digitalRead(interruptPin)){ starttime=millis(); Serial.print("시작 시간:"); Serial.println(시작 시간); }else if(digitalRead(interruptPin)==낮음){ endtime=millis(); 결과시간=종료시간-시작시간; Serial.print("종료시간:"); Serial.println(종료시간); Serial.print("결과 시간:"); Serial.println(결과 시간); WhatsNewEeprom();//eeprom 저장 }

    핀(interruptPin)에 인터럽트가 발생했을 때 실행될 함수입니다.

    인터럽트는 interruptPin의 상태가 HIGH에서 LOW로 또는 LOW에서 HIGH로 변경될 때마다 트리거되며, if(...)는 HIGH->LOW 또는 LOW->높은 변경 여부를 감지하기 위한 것입니다.

    Arduino millis()의 내부 시계에 의해 기록된 시간을 저장하고 결과 시간을 준비하는 데 차이가 있습니다. 마지막에 eeprom에 새 정보를 저장합니다.

    무효 WhatsNewEeprom(){ Serial.println("-------------eeprom 확인 중"); EEPROM.get( eeAddress, oldresulttime ); Serial.print("oldresulttime");Serial.println(oldresulttime); Serial.print("결과시간");Serial.println(결과시간); if(resulttime!=oldresulttime){ EEPROM.put( eeAddress, 결과 시간); Serial.print("-----Ding! eeprom에 기록된 새 시간:");Serial.println(resulttime); }else{ Serial.println("새 시간을 찾을 수 없습니다. eeprom이 방해받지 않았습니다."); }  

    이것은 eeprom에 저장된 시간 값이 "resulttime" 변수에 있는 것과 동일한지 확인합니다. 그렇다면 변경하지 않았으므로 아무 것도 하지 마십시오.

    추가의! 버튼 디바운싱:

    우리 인간은 Arduino 처리 시간에 대해 매우 느립니다. 버튼을 한 번만 누르면 우리에게는 빠른 것처럼 보이지만 Arduino의 경우 정말 느려서 신호가 실제 상태에 정착하기 전에 highlowhighlowhighlow를 두 번 전환하는 것과 같이 신호 "바운스"를 만듭니다.

    우리가 원할 경우(저는 그렇지 않았습니다) 하드웨어나 소프트웨어를 통해 수정할 수 있습니다.

    <울>
  • 소프트웨어를 통한 디바운스
  • <울>
  • 하드웨어를 통한 디바운스, 커패시터 사용!!! :D
  • 220nF를 병렬로 추가하겠습니다(sensepin에서 GND로)

    커패시터는 전압의 빠른 변화를 "먹습니다".

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

    코드

    <울>
  • arduino 크로노미터
  • arduino 크로노미터Arduino
    eeprom 및 중단을 사용하고, 쉽게 해킹할 수 있습니다.
    //Javier Muñoz 23/10/2017//questions 및 단일 전보를 [email protected]으로 전송합니다.#include #define interruptPin 2#define eeAddress 0 // ARDUINO의 EEPROM에 대한 주소(내부 비휘발성 메모리) float 시작 시간 =0; // 수학을 수행할 변수 float endtime=0; 부동 결과 시간 =0, 이전 결과 시간 =0; 무효 설정() { Serial.begin(9600); 동안 (! 직렬) {; // 직렬 포트가 연결될 때까지 기다립니다. 기본 USB 포트에만 필요 } Serial.println("직렬 통신이 준비되었습니다!:.. bip bip"); attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);//interruptPin의 논리 수준이 다음과 같이 변경될 때 함수를 활성화합니다. (__-HERE--------------------_HERE____) 이렇게 하면 손가락이 버튼을 누른 시간을 저장}void loop() {//your stuff here//(eeprom stored) 밀리초로 측정된 마지막 시간 "float resulttime"}void refreshTime(){ if(digitalRead(interruptPin) ){ 시작시간=밀리(); Serial.print("시작 시간:"); Serial.println(시작 시간); }else if(digitalRead(interruptPin)==낮음){ endtime=millis(); 결과시간=종료시간-시작시간; Serial.print("종료시간:"); Serial.println(종료시간); Serial.print("결과 시간:"); Serial.println(결과 시간);WhatsNewEeprom(); }}무효 WhatsNewEeprom(){ Serial.println("-------------eeprom 확인 중"); EEPROM.get( eeAddress, oldresulttime ); Serial.print("oldresulttime");Serial.println(oldresulttime); Serial.print("결과시간");Serial.println(결과시간); if(resulttime!=oldresulttime){ EEPROM.put( eeAddress, 결과 시간); Serial.print("-----Ding! eeprom에 기록된 새 시간:");Serial.println(resulttime); }else{ Serial.println("새 시간을 찾을 수 없습니다. eeprom이 방해받지 않았습니다."); }}

    회로도

    풀다운 저항이 있는 버튼의 간단한 연결 크로노미터_APM32Y9FoM.fzz

    제조공정

    1. Adafruit 1/4 60 Ring Neopixel을 사용한 간단한 벽시계
    2. 단순 워드 클럭(Arduino)
    3. Nokia 5110 LCD의 DIY Simple 20kHz Arduino 오실로스코프
    4. Arduino 스파이봇
    5. FlickMote
    6. 수제 TV B-Gone
    7. 마스터 시계
    8. Arduino를 사용한 간단한 장애물 센서
    9. 나를 찾기
    10. DS1302 RTC가 있는 간단한 알람 시계