アクチェータのストローク両端にセンサを取り付けて、
ストローク間を移動する時間をシリアルモニタへ表示する
スケッチを考えてみました。
マイコン:ESP-WROOM-02
デジタルIO:MCP23S08(8Bit I/Oエクスパンダ)
(E-温度品(動作電圧4.5〜5.5V)を3.3V動作させてます。)
・4Bitを入力、残り4Bitを出力に設定(必須はI/O0,1入力)
・入力は抵抗でプルダウン、スイッチ押すとHIGH
・デジタルI/Oポート全体(レジスタ)を読んで、
使用するI/O以外の変化に影響されない。
・micros()のオーバーフローは考慮しない。
・センサはアクチェータの両ストローク端で検出時ON
IO0 アクチェータの押し(push)側端
IO1 アクチェータの戻り(pull)側端
・Time表示数値の単位は ミリ秒(mS)

動作の説明
IO0に接続したスイッチを押して離し、IO1のスイッチを
押したとき表示される値が戻り時間(pull Time)
IO1に接続したスイッチを押して離し、IO0のスイッチを
押したとき表示される値が押し時間(push Time)
スケッチ例 StateChangDetectionをベースにしました。
コピペ後修正必要です。(修正不要な書き方わからんです)
<を半角に修正する。&を半角&に修正する。
#include <MCP23S08.h>//<を半角に直す
#define CS_PIN 16 //MCP23S08のCS PIN
MCP23S08 expander(CS_PIN, 0x20);//アドレスA0,A1 PIN-GND接続
uint8_t buttonState; //現在の入力状態
uint8_t lastButtonState = 0; //以前の入力状態
unsigned long pushStartTime;
unsigned long pullStartTime;
void setup() {
Serial.begin(115200);
//ESP本体pinModeはSPI.beginの前に置く
SPI.begin();
expander.begin();// I/O expander MCP23S08
for (uint8_t pin = 0; pin < 4; pin++) { // 0から3を入力設定
expander.pinModeIO(pin, INPUT);
}
for (uint8_t pin = 4; pin < 8; pin++) { // 4から7を出力設定
expander.pinModeIO(pin, OUTPUT);
}
}
void loop() {
// 現在の状態を読み込んでbuttonStateに入れます。
// 0x03(0b00000011)とのANDを取って、GPIO0,1以外に影響されないようにします。
buttonState = expander.getInputStates() & 0x03;
//buttonState(現在)をlastButtonState(以前)と比較して等しくない時(状態変化)
if (buttonState != lastButtonState) {
//現在0x00(0b00000000) 以前0x02(0b00000010)だったら
if ((buttonState == 0x00) && (lastButtonState == 0x02)) {
pushStartTime = millis();//millis()の値をpushStartTimeへ代入
//現在0x01(0b00000001) 以前0x00(0b00000000)だったら
} else if ((buttonState == 0x01) && (lastButtonState == 0x00)) {
//millis()の値からpushStartTimeの値を引いてpushTimeへ代入
unsigned long pushTime = millis()-pushStartTime;
Serial.print("push Time = ");Serial.println(pushTime);//pushTimeをシリアル出力
//現在0x00(0b00000000) 以前0x01(0b00000001)だったら
} else if ((buttonState == 0x00) && (lastButtonState == 0x01)) {
pullStartTime = millis();//millis()の値をpushStartTimeへ代入
//現在0x02(0b00000010) 以前0x00(0b00000000)だったら
} else if ((buttonState == 0x02) && (lastButtonState == 0x00)) {
//millis()の値からpullStartTimeの値を引いてpullTimeへ代入
unsigned long pullTime = millis()-pullStartTime;
Serial.print("pull Time = ");Serial.println(pullTime);//pullTimeをシリアル出力
}
// Delay a little bit to avoid bouncing
//バウンスを避けるために少し遅らせます。
delay(50);
}
//現在の状態を以前の状態へ保存します。
lastButtonState = buttonState;
}
シリアルモニタの表示

右スイッチがIO0、左スイッチがIO1


0