シンプルなArduinoクロノメーター
コンポーネントと消耗品
> ![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 1 |
アプリとオンラインサービス
> ![]() |
|
このプロジェクトについて
私は楽しいプロジェクトを進めているところですが、ボタンを押すたびに機能するArduinoクロノメーターが必要でした。複雑なことではありませんが、このコードは他の人のプロジェクトに役立つと思いました。
私はおそらくあなたの人生のコーディングの1時間を節約しました。
EEPROM: <図>

電源を切ったりボードをリセットしたりしても情報が失われないArduinoのメモリ(情報)。 #include
を使用しています 基本的にすべてを実行するライブラリであり、デフォルトですでにインストールされています。
割り込み: <図>

Arduinoの内部で何かが起こっていますが、たとえば、ピンがHIGHに引っ張られた場合は、Arduinoが何をしているのかを停止し、ISR機能に対応する必要があります。ここに追加のライブラリは必要ありません:
<図>

プロジェクトのコード:
- 定義と内容:
#include #define InterruptPin 2 #define eeAddress 0 // ARDUINOのEEPROM(内部不揮発性メモリ)のアドレスfloat starttime =0; //数学を実行する変数floatendtime =0; float resulttime =0、oldresulttime =0;
ここでは、EEPROMライブラリを含めて新しいものは何もありません。ボタンをどこに取り付けるかを決定します(ピン2)。
次に、EEPROMメモリのアドレス0を使用して時間を保存することにしました(float =4bytes)。 Arduino UNOには1024バイト(チップATmega328)がありますが、人生で一度だけ整理しようとしていたので、アドレス0を選択しました。
- setup()
void setup(){Serial.begin(9600); while(!Serial){; //シリアルポートが接続するのを待ちます。ネイティブUSBポートにのみ必要} Serial.println( "シリアル通信の準備ができています!:.. bip bip"); attachInterrupt(digitalPinToInterrupt(interruptPin)、refreshTime、CHANGE);}
通常は、ArduinoとPCの間でシリアル通信を開始します(9600ボー):
attachInterrupt(digitalPinToInterrupt(interruptPin)、refreshTime、CHANGE);
Attachinterruptは、interruptPinのロジックレベルが変更されたときに関数をアクティブにします。(____________- HERE ------------------_ HERE ____________)。
このようにして、プレスの開始時と終了時に2回トリガーされます。何も起こらない場合は、プルダウン抵抗が「強制的に」ローのままになるため、interruptPin値はローのままになります。
- loop()
void loop(){}
何もない。そこにあなたのものを入れてください!
- その他の機能:
void refreshTime(){if(digitalRead(interruptPin)){starttime =millis(); Serial.print( "開始時間:"); Serial.println(starttime); } else if(digitalRead(interruptPin)==LOW){endtime =millis(); resulttime =endtime-starttime; Serial.print( "終了時間:"); Serial.println(endtime); Serial.print( "結果時間:"); Serial.println(resulttime); WhatsNewEeprom(); // eepromを格納します}
これは、ピンの中断(interruptPin)が発生したときに実行される関数です。
割り込みは、interruptPinのステータスが変化するたびにトリガーされます(HIGHからLOWまたはLOWからHIGH)。if(...)は、HIGH-> LOWまたはLOW-> highの変化を検出するためのものです。
Arduinommillis()の内部クロックによって記録された時間を保存し、結果時間を準備するための違いを実行します。最後に、新しい情報をeepromに保存します:
void WhatsNewEeprom(){Serial.println( "----------- checking eeprom"); EEPROM.get(eeAddress、oldresulttime); Serial.print( "oldresulttime"); Serial.println(oldresulttime); Serial.print( "resulttime"); Serial.println(resulttime); if(resulttime!=oldresulttime){EEPROM.put(eeAddress、resulttime); Serial.print( "----- Ding!eepromに記録された新しい時刻:"); Serial.println(resulttime); } else {Serial.println( "新しい時刻は見つかりませんでした。EEPROMは妨害されませんでした"); }
これは、eepromに格納されている時間値が、変数「resulttime」に格納されている時間値と同じであるかどうかをチェックします。同じである場合は、変更しなかったため、何もしません。
追加!ボタンのデバウンス: <図>

私たち人間はArduinoの処理時間は非常に遅く、ボタンを1回押すだけでは速いように見えますが、Arduinoの場合は非常に遅いため、真のステータスを確定する前に、信号が「バウンス」します。>>
必要に応じて(私はしませんでした)、ハードウェアまたはソフトウェアを介して修正できます:
- ソフトウェアによるデバウンス
- ハードウェアを介してデバウンスし、コンデンサを使用してください!!! :D
<図>


並列に220nFを追加します(センスピンからGNDまで)
コンデンサは、電圧の急激な変化を「食い尽くします」。
コード
- arduinoクロノメーター
arduinoクロノメーター Arduino
eepromと割り込みを使用し、簡単にハッキング可能//ハビエルムニョスによってコード化23/10/2017 //質問と歌われた電報を[email protected]#include#define InterruptPin 2#define eeAddress 0 // ARDUINOのEEPROM(内部不揮発性メモリ)のアドレスfloat starttime =0; //数学を実行する変数floatendtime =0; float resulttime =0、oldresulttime =0; void setup(){Serial.begin(9600); while(!Serial){; //シリアルポートが接続するのを待ちます。ネイティブUSBポートにのみ必要} Serial.println( "シリアル通信の準備ができています!:.. bip bip"); attachInterrupt(digitalPinToInterrupt(interruptPin)、refreshTime、CHANGE); // interruptPinのロジックレベルが変更されたときに関数をアクティブ化する:(__- HERE ------------------_ HERE ____)このようにして、指がボタンを押していた時間を保存します} void loop(){//ここにあるもの//(eepromが保存されます)最後にミリ秒単位で測定された時間 "float resulttime"} void refreshTime(){if(digitalRead(interruptPin) ){starttime =millis(); Serial.print( "開始時間:"); Serial.println(starttime); } else if(digitalRead(interruptPin)==LOW){endtime =millis(); resulttime =endtime-starttime; Serial.print( "終了時間:"); Serial.println(endtime); Serial.print( "結果時間:"); Serial.println(resulttime); WhatsNewEeprom(); }} void WhatsNewEeprom(){Serial.println( "----------- eepromのチェック"); EEPROM.get(eeAddress、oldresulttime); Serial.print( "oldresulttime"); Serial.println(oldresulttime); Serial.print( "resulttime"); Serial.println(resulttime); if(resulttime!=oldresulttime){EEPROM.put(eeAddress、resulttime); Serial.print( "----- Ding!eepromに記録された新しい時刻:"); Serial.println(resulttime); } else {Serial.println( "新しい時刻は見つかりませんでした。EEPROMは妨害されませんでした"); }}
回路図
プルダウン抵抗を備えたボタンの単純な接続
製造プロセス