Created
March 23, 2020 11:29
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define PIN_LED_GND 2 | |
#define PIN_CLK 3 | |
#define PIN_AB 4 | |
#define PIN_SIG_1 A0 | |
#define PIN_SIG_2 A1 | |
#define PIN_SIG_3 A2 | |
#define PIN_SIG_4 A3 | |
#define PIN_SIG_5 10 | |
#define PIN_SIG_6 11 | |
#define PIN_SIG_7 12 | |
#define PIN_SIG_8 13 | |
#define PIN_POWER_NORMAL 8 | |
#define PIN_POWER_OIL 7 | |
#define PIN_POWER_UP 6 | |
#define PIN_POWER_DOWN 5 | |
#define PIN_ANALOG_THERMISTOR 6 // analog pin | |
#define BUFFER_MS_TO_DETECT_OFF 1000UL | |
#define ANALOG_MAX 1023 | |
#define VOLT_100C 0.7 | |
#define VOLT_20C 0.12 | |
class PowerState { | |
public: | |
unsigned long changedAt; | |
bool powerNormal = false; | |
bool powerOil = false; | |
bool isError = false; | |
unsigned long readErrorAt; | |
int level = 0; | |
PowerState() { | |
changedAt = 0; | |
powerNormal = 0; | |
powerOil = false; | |
readErrorAt = 0; | |
level = 0; | |
}; | |
void updateChangedAt() { | |
changedAt = millis(); | |
} | |
void updateByReadingPins() { | |
bool level1 = digitalRead(PIN_SIG_1); | |
bool level2 = digitalRead(PIN_SIG_2); | |
bool level3 = digitalRead(PIN_SIG_3); | |
bool level4 = digitalRead(PIN_SIG_4); | |
bool level5 = digitalRead(PIN_SIG_5); | |
bool level6 = digitalRead(PIN_SIG_6); | |
bool powerNormal = digitalRead(PIN_SIG_7); | |
bool powerOil = digitalRead(PIN_SIG_8); | |
int level = 0; | |
if (level6 && !level5) level = 0; // check 5 to detect error | |
else if (level6) level = 6; | |
else if (level5) level = 5; | |
else if (level4) level = 4; | |
else if (level3) level = 3; | |
else if (level2) level = 2; | |
else if (level1) level = 1; | |
if (level1 && !level2 && level6) { | |
this->readErrorAt = millis(); | |
if (!this->isError) { | |
this->isError = true; | |
this->updateChangedAt(); | |
} | |
} else if (powerOil) { | |
if (!this->powerOil || this->level != level) { | |
this->powerOil = true; | |
this->powerNormal = false; | |
this->level = level; | |
this->updateChangedAt(); | |
} | |
} else if (powerNormal) { | |
if (!this->powerNormal || this->level != level) { | |
this->powerOil = false; | |
this->powerNormal = true; | |
this->level = level; | |
this->updateChangedAt(); | |
} | |
} else { | |
// LEDが消えていてもエラー時の点滅の場合があるので、一定時間LEDが消えていたら電源OFFと判定する | |
if ((this->powerNormal || this->powerOil) && (!this->isError || millis() - this->readErrorAt > BUFFER_MS_TO_DETECT_OFF)) { | |
this->powerOil = false; | |
this->powerNormal = false; | |
this->isError = false; | |
this->updateChangedAt(); | |
} | |
} | |
} | |
void printInfo(HardwareSerial *serial) { | |
String powerStr = "power: "; | |
powerStr += powerNormal ? "on normal" : powerOil ? "on oil" : "off"; | |
serial->println(powerStr); | |
serial->println("level: " + String(level)); | |
String errorStr = "isError: "; | |
errorStr += isError ? "true" : "false"; | |
serial->println(errorStr); | |
serial->println("changedAt: " + String(this->changedAt)); | |
} | |
}; | |
PowerState powerState = PowerState(); | |
void onFallingLedGnd() { | |
powerState.updateByReadingPins(); | |
} | |
void setup() { | |
pinMode(PIN_CLK, INPUT); | |
pinMode(PIN_AB, INPUT); | |
pinMode(PIN_LED_GND, INPUT); | |
pinMode(PIN_SIG_1, INPUT); | |
pinMode(PIN_SIG_2, INPUT); | |
pinMode(PIN_SIG_3, INPUT); | |
pinMode(PIN_SIG_4, INPUT); | |
pinMode(PIN_SIG_5, INPUT); | |
pinMode(PIN_SIG_6, INPUT); | |
pinMode(PIN_SIG_7, INPUT); | |
pinMode(PIN_SIG_8, INPUT); | |
pinMode(PIN_POWER_NORMAL, OUTPUT); | |
pinMode(PIN_POWER_OIL, OUTPUT); | |
pinMode(PIN_POWER_DOWN, OUTPUT); | |
pinMode(PIN_POWER_UP, OUTPUT); | |
attachInterrupt(digitalPinToInterrupt(PIN_LED_GND), onFallingLedGnd, FALLING); | |
Serial.begin(9600); | |
} | |
void switchPower(int pin) { | |
digitalWrite(pin, HIGH); | |
delay(100); | |
digitalWrite(pin, LOW); | |
delay(10); | |
} | |
float readVolt() { | |
return (float) analogRead(PIN_ANALOG_THERMISTOR) * 5 / ANALOG_MAX; | |
} | |
float voltToTemperature(float v) { | |
float c = (((v - VOLT_20C) / (VOLT_100C - VOLT_20C)) * (100 - 20)) + 20; | |
return c; | |
} | |
void printInfo() { | |
powerState.printInfo(&Serial); | |
float v = readVolt(); | |
float c = voltToTemperature(v); | |
Serial.println("Thermistor volt: " + String(v) + "v"); | |
Serial.println("Temperature: " + String(c) + "C"); | |
Serial.println("at " + String(millis())); | |
Serial.println(); | |
} | |
void loop() { | |
switchPower(PIN_POWER_NORMAL); | |
printInfo(); | |
delay(500); | |
switchPower(PIN_POWER_DOWN); | |
printInfo(); | |
delay(500); | |
switchPower(PIN_POWER_DOWN); | |
printInfo(); | |
delay(1000); | |
switchPower(PIN_POWER_UP); | |
printInfo(); | |
delay(500); | |
switchPower(PIN_POWER_UP); | |
printInfo(); | |
delay(500); | |
switchPower(PIN_POWER_UP); | |
printInfo(); | |
delay(500); | |
switchPower(PIN_POWER_UP); | |
printInfo(); | |
delay(500); | |
switchPower(PIN_POWER_UP); | |
printInfo(); | |
delay(500); | |
switchPower(PIN_POWER_NORMAL); | |
printInfo(); | |
delay(10000); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment