Skip to content

Instantly share code, notes, and snippets.

@asukiaaa
Created March 23, 2020 11:29
#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