エンコーダは卓上旋盤で削り出した樹脂ベースにネジ切りをしたものに固定して、ワイパーレバーの先端ダイヤルからTripスイッチを取り外した穴を同じく卓上旋盤で拡大加工して、そこにうまくハマるように加工しました。
M5ATOMのソースもそれほど長くないので載せてしまえ~。
(著作権は放棄しないので、これで商売しないように! 責任持てませんので)
--------
/*
設定値はフラッシュメモリに保持
設定Min/Max時ビープ
10段階(msec)
2000,2520,3175,4000,5040,6360,8000,10079,12699,16000
*/
#include <M5Atom.h>
#include <EEPROM.h>
#include <RotaryEncoder.h> //
https://github.com/mathertel/RotaryEncoder
#define Buzzer 33
#define Relay 32
#define Tmax 10
int pos = 1;
int newPos;
static unsigned long ts[Tmax] = {2000,2520,3175,4000,5040,6360,8000,10079,12699,16000};
// Setup a RoraryEncoder
RotaryEncoder encoder(19, 23);
CRGB dispColor(uint8_t r, uint8_t g, uint8_t b) {
return (CRGB)((r << 16) | (g << 8) | b);
}
void setup()
{
M5.begin(true, false, true);
//Serial.begin(115200);
pinMode(Relay ,OUTPUT);
pinMode(Buzzer,OUTPUT);
if(!EEPROM.begin(32)){
pos = 2;
} else{
pos = (int)EEPROM.read(0);
}
M5.dis.drawpix(0, dispColor(0, 64, 0)); //LED(指定色)
delay(300);
}
void loop()
{
unsigned long dt,tr;
tr = millis();
newPos = pos;
encoder.setPosition(newPos);
while(1){
encoder.tick();
newPos = encoder.getPosition();
if (pos != newPos) {
if(newPos < 0){ // 下限値処理
newPos = 0;
digitalWrite(Buzzer,1);
delay(200);
digitalWrite(Buzzer,0);
} else if(newPos > Tmax - 1){ // 上限値処理
newPos = Tmax - 1;
digitalWrite(Buzzer,1);
delay(200);
digitalWrite(Buzzer,0);
} else{ // 間隔変更処理
digitalWrite(Buzzer,1);
delay(3);
digitalWrite(Buzzer,0);
}
if(pos != newPos){ // 設定値の記録
EEPROM.write(0,(byte)pos);
EEPROM.commit();
}
pos = newPos;
encoder.setPosition(newPos);
// Serial.print("pos:");
// Serial.println(pos);
}
dt = millis() - tr;
if(dt < 500){
digitalWrite(Relay,1);
M5.dis.drawpix(0, dispColor( 0, 0, 255)); //LED(指定色)
} else{
digitalWrite(Relay,0);
M5.dis.drawpix(0, dispColor( 0, 64, 0)); //LED(指定色)
}
if(dt >= ts[pos]){
tr = millis();
}
M5.update();
delay(1);
}
}