Advertisement
bitwise_gamgee

Bed Controller

Oct 10th, 2023
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.96 KB | Fixit | 0 0
  1. enum ProjectConfig {
  2.     POWER_HEAD    = A4,
  3.     POWER_FEET    = A0,
  4.     RELAY_HEAD    = 4,
  5.     RELAY_FEET    = 5,
  6.     BTN_HEAD_UP   = 6,
  7.     BTN_HEAD_DOWN = 7,
  8.     BTN_FEET_UP   = 8,
  9.     BTN_FEET_DOWN = 9,
  10.     LED_PIN       = 13,
  11.     MinPressTime  = 34,
  12.     MaxMotorTime  = 45000,
  13.     MinRelayTime  = 1
  14. };
  15.  
  16. enum MotorDirection { NoMotors, HeadDown, HeadUp, FeetDown, FeetUp };
  17. enum FaultState { NoFault, MotorFault, RelayFault, ButtonFault };
  18.  
  19. FaultState currentFault = NoFault;
  20.  
  21. // Function prototypes
  22. void setPinState(int pin, int state);
  23. bool checkButton(int const pin);
  24. void engageMotor(MotorDirection const whichMotor, bool (* const continueFunc)());
  25. void initializePins();
  26. void ledHeartbeat(MotorDirection const state = NoMotors);
  27. void failClosed();
  28.  
  29. void setup() {
  30.     initializePins();
  31. }
  32.  
  33. void loop() {
  34.     if (currentFault != NoFault) {
  35.         failClosed();
  36.         return;
  37.     }
  38.    
  39.     ledHeartbeat();
  40.    
  41.     if (checkButton(BTN_HEAD_DOWN)) {
  42.         engageMotor(HeadDown, [](){ return checkButton(BTN_HEAD_DOWN); });
  43.     }
  44.     else if (checkButton(BTN_HEAD_UP)) {
  45.         engageMotor(HeadUp, [](){ return checkButton(BTN_HEAD_UP); });
  46.     }
  47.     else if (checkButton(BTN_FEET_DOWN)) {
  48.         engageMotor(FeetDown, [](){ return checkButton(BTN_FEET_DOWN); });
  49.     }
  50.     else if (checkButton(BTN_FEET_UP)) {
  51.         engageMotor(FeetUp, [](){ return checkButton(BTN_FEET_UP); });
  52.     }
  53. }
  54.  
  55. void failClosed() {
  56.     setPinState(POWER_HEAD, LOW);
  57.     setPinState(POWER_FEET, LOW);
  58.     setPinState(RELAY_HEAD, LOW);
  59.     setPinState(RELAY_FEET, LOW);
  60.     ledHeartbeat(NoMotors);
  61. }
  62.  
  63. void setPinState(int pin, int state) {
  64.     digitalWrite(pin, state);
  65. }
  66.  
  67. void initializePins() {
  68.     pinMode(LED_PIN, OUTPUT);
  69.     setPinState(LED_PIN, LOW);
  70.  
  71.     pinMode(POWER_HEAD, OUTPUT);
  72.     setPinState(POWER_HEAD, LOW);
  73.  
  74.     pinMode(POWER_FEET, OUTPUT);
  75.     setPinState(POWER_FEET, LOW);
  76.  
  77.     pinMode(RELAY_HEAD, OUTPUT);
  78.     setPinState(RELAY_HEAD, LOW);
  79.  
  80.     pinMode(RELAY_FEET, OUTPUT);
  81.     setPinState(RELAY_FEET, LOW);
  82.  
  83.     pinMode(BTN_HEAD_UP, INPUT_PULLUP);
  84.     pinMode(BTN_HEAD_DOWN, INPUT_PULLUP);
  85.     pinMode(BTN_FEET_UP, INPUT_PULLUP);
  86.     pinMode(BTN_FEET_DOWN, INPUT_PULLUP);
  87. }
  88.  
  89. bool checkButton(int const pin) {
  90.     if (digitalRead(pin)) return false;
  91.  
  92.     unsigned long const start = millis();
  93.     while (millis() - start < MinPressTime) {
  94.         if (digitalRead(pin)) {
  95.             currentFault = ButtonFault;
  96.             return false;
  97.         }
  98.         ledHeartbeat();
  99.     }
  100.     return true;
  101. }
  102.  
  103. void ledHeartbeat(MotorDirection const state /* = NoMotors */) {
  104.     int ledState = (state == NoMotors) ? (millis() % 1500 >= 1350) : (millis() % 300 >= 150);
  105.     setPinState(LED_PIN, ledState);
  106. }
  107.  
  108. void engageMotor(MotorDirection const whichMotor, bool (* const continueFunc)()) {
  109.     setPinState(POWER_HEAD, LOW);
  110.     setPinState(POWER_FEET, LOW);
  111.     setPinState(RELAY_HEAD, LOW);
  112.     setPinState(RELAY_FEET, LOW);
  113.  
  114.     switch (whichMotor) {
  115.         case HeadDown:
  116.             setPinState(RELAY_HEAD, LOW);
  117.             delay(MinRelayTime);
  118.             setPinState(POWER_HEAD, HIGH);
  119.             break;
  120.         case HeadUp:
  121.             setPinState(RELAY_HEAD, HIGH);
  122.             delay(MinRelayTime);
  123.             setPinState(POWER_HEAD, HIGH);
  124.             break;
  125.         case FeetDown:
  126.             setPinState(RELAY_FEET, LOW);
  127.             delay(MinRelayTime);
  128.             setPinState(POWER_FEET, HIGH);
  129.             break;
  130.         case FeetUp:
  131.             setPinState(RELAY_FEET, HIGH);
  132.             delay(MinRelayTime);
  133.             setPinState(POWER_FEET, HIGH);
  134.             break;
  135.         default:
  136.             currentFault = MotorFault;
  137.             return;
  138.     }
  139.  
  140.     unsigned long const start = millis();
  141.     while (continueFunc()) {
  142.         if (millis() - start >= MaxMotorTime) {
  143.             currentFault = MotorFault;
  144.             break;
  145.         }
  146.         ledHeartbeat(whichMotor);
  147.     }
  148. }
  149.  
Tags: bed
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement