#include #define hddledsensor 4 // HDD 상태 체크 (보라) #define psensor 5 // 전원 상태 체크 (검정) #define pled 6 // 전원 상태 led (green) (초록) #define msw 7 // 다기능 버튼 감지 (노랑) #define psw 8 // 전원 버튼 감지 (흰색) #define powersupplyrelay 9 // 파워서플라이 온 릴레이 (검정(흰색 쌍)) #define statusled 10 // 입력 상태 led (red) (초록) #define fanrelay 11 // 케이스 팬 릴레이 (보라(초록 쌍)) #define powerinput 12 // 전원 쇼트 릴레이 (회색) int buttonflag, buttonflag_old, shutdownflag, powerflag; boolean coolingflag, backlightflag, serialflag = 0; void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, 0); pinMode(psensor, INPUT_PULLUP); pinMode(hddledsensor, INPUT_PULLUP); pinMode(powerinput, OUTPUT); pinMode(powersupplyrelay, OUTPUT); pinMode(psw, OUTPUT); pinMode(msw, OUTPUT); pinMode(pled, OUTPUT); pinMode(statusled, OUTPUT); pinMode(fanrelay, OUTPUT); wdt_enable(WDTO_8S); } void loop() { wdt_reset(); button(); powercontrol(); } void powercontrol() { if (powerflag == 0) { // 전원 켜짐 플래그가 0 일때 if (buttonflag >= 1) { // 버튼 플래그가 1 이상 때 buttonflag = 0; powerflag = 1; poweron(); } } else if (powerflag == 1) { if (buttonflag >= 1 && buttonflag <= 2) { // 오작동 값 청소 buttonflag = 0; } else if (buttonflag >= 3 && buttonflag <= 5) { // 문제 있는 부팅 buttonflag = 0; powerrestart(); } else if (buttonflag >= 6 && buttonflag <= 10) { // 강제종료 buttonflag = 0; powerflag = 0; focus_poweroff(); } else if (buttonflag >= 11) { // 오작동 값 청소 buttonflag = 0; } if (digitalRead(psensor) == 0) { // 시스템이 종료 상태로 감지 되었을때 shutdownflag = 0; powerflag = 0; poweroff(); } } } void button() { while (digitalRead(msw) == 0 && digitalRead(psw) == 1) { // 전원 버튼 감지 시 buttonflag++; delay(200); if (buttonflag != buttonflag_old) { buttonflag_old = buttonflag; digitalWrite(statusled, 1); delay(50); digitalWrite(statusled, 0); delay(750); } } } void poweron() { digitalWrite(powersupplyrelay, 1); while (digitalRead(psensor) == 0) { digitalWrite(powerinput, 1); delay(100); digitalWrite(powerinput, 0); delay(400); } digitalWrite(powerinput, 0); digitalWrite(fanrelay, 1); digitalWrite(pled, 1); } void poweroff() { digitalWrite(powersupplyrelay, 0); digitalWrite(fanrelay, 0); digitalWrite(pled, 0); } void focus_poweroff() { while (digitalRead(psensor) == 0) { digitalWrite(powerinput, 1); delay(300); digitalWrite(powerinput, 0); delay(700); } digitalWrite(powerinput, 0); digitalWrite(powersupplyrelay, 0); digitalWrite(fanrelay, 0); digitalWrite(pled, 0); } void powerrestart() { focus_poweroff(); delay(500); poweron(); }