Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. void setup(){
  3.   Serial.begin(9600);
  4.   button_Setup();
  5. }
  6. void loop(){
  7.   button_Loop();
  8.   printPushes();
  9. }
  10.  
  11. // Module ButtonControl
  12.  
  13. // --- Configuration -----------
  14. const byte NR_OF_BUTTONS = 3;
  15.  
  16. // --- States -----------
  17. const byte BUTTON_STATE_RELEASED = 1;
  18. const byte BUTTON_STATE_CHECK_PRESSED = 2;
  19. const byte BUTTON_STATE_PRESSED = 3;
  20. const byte BUTTON_STATE_CHECK_RELEASED = 4;
  21.  
  22. // Current state
  23. byte button_State[NR_OF_BUTTONS];
  24.  
  25. // Timer
  26. const int BUTTON_INTERVAL = 10;
  27. unsigned long buttonPreviousMillis[NR_OF_BUTTONS];
  28.  
  29. // Boolean
  30. boolean boolButtonPressed[NR_OF_BUTTONS];
  31.  
  32. // --- Setup -------------------
  33. void button_Setup() {
  34.   // Hardware
  35.   buttonHardware_Setup(NR_OF_BUTTONS);
  36.  
  37.   for (byte buttonNumber = 0; buttonNumber < NR_OF_BUTTONS; buttonNumber++) {
  38.     // Timer
  39.     buttonPreviousMillis[buttonNumber] = 0 - BUTTON_INTERVAL;
  40.  
  41.     // Boolean
  42.     boolButtonPressed[buttonNumber] = false;
  43.  
  44.     // Start state
  45.     button_State[buttonNumber] = BUTTON_STATE_RELEASED;
  46.     button_Released_Entry(buttonNumber);
  47.   }
  48. }
  49.  
  50. // --- Loop --------------------
  51. void button_Loop() {
  52.   for (byte buttonNumber = 0; buttonNumber < NR_OF_BUTTONS; buttonNumber++) {
  53.     button_Switch(buttonNumber);
  54.   }
  55. }
  56.  
  57. // --- Switch --------------------
  58. void button_Switch(byte buttonNumber) {
  59.   switch (button_State[buttonNumber])
  60.   {
  61.     case BUTTON_STATE_RELEASED:
  62.       {
  63.         button_Released_Do(buttonNumber);
  64.         if (getButtonHardwareDown(buttonNumber)) { // Button down
  65.           button_Released_Exit(buttonNumber);
  66.           button_State[buttonNumber] = BUTTON_STATE_CHECK_PRESSED;
  67.           button_Check_Pressed_Entry(buttonNumber);
  68.         }
  69.         break;
  70.       }
  71.     case BUTTON_STATE_CHECK_PRESSED:
  72.       {
  73.         button_Check_Pressed_Do(buttonNumber);
  74.         if (getButtonHardwareUp(buttonNumber)) {
  75.           button_Check_Pressed_Exit(buttonNumber);
  76.           button_State[buttonNumber] = BUTTON_STATE_RELEASED;
  77.           button_Released_Entry(buttonNumber);
  78.         }
  79.         else if ((getButtonHardwareDown(buttonNumber)) && (millis() - BUTTON_INTERVAL >= buttonPreviousMillis[buttonNumber])) { // Button down && interval over
  80.           button_Check_Pressed_Exit(buttonNumber);
  81.           button_State[buttonNumber] = BUTTON_STATE_PRESSED;
  82.           button_Pressed_Entry(buttonNumber);
  83.         }
  84.         break;
  85.       }
  86.     case BUTTON_STATE_PRESSED:
  87.       {
  88.         button_Pressed_Do(buttonNumber);
  89.         if (getButtonHardwareUp(buttonNumber)) { // Button up
  90.           button_Pressed_Exit(buttonNumber);
  91.           button_State[buttonNumber] = BUTTON_STATE_CHECK_RELEASED;
  92.           button_Check_Released_Entry(buttonNumber);
  93.         }
  94.         break;
  95.       }
  96.     case BUTTON_STATE_CHECK_RELEASED:
  97.       {
  98.         button_Check_Released_Do(buttonNumber);
  99.         if (getButtonHardwareDown(buttonNumber)) {
  100.           button_Check_Released_Exit(buttonNumber);
  101.           button_State[buttonNumber] = BUTTON_STATE_PRESSED;
  102.           button_Pressed_Entry(buttonNumber);
  103.         }
  104.         else if ((getButtonHardwareUp(buttonNumber)) && (millis() - BUTTON_INTERVAL >= buttonPreviousMillis[buttonNumber])) { // Button up && interval over
  105.           button_Check_Released_Exit(buttonNumber);
  106.           button_State[buttonNumber] = BUTTON_STATE_RELEASED;
  107.           button_Released_Entry(buttonNumber);
  108.         }
  109.         break;
  110.       }
  111.   }
  112. }
  113.  
  114. // --- BUTTON_STATE_RELEASED -----------
  115. void button_Released_Entry(byte buttonNumber) {
  116.   // <nothing>
  117. }
  118.  
  119. void button_Released_Do(byte buttonNumber) {
  120.   // <nothing>
  121. }
  122.  
  123. void button_Released_Exit(byte buttonNumber) {
  124.   // <nothing>
  125. }
  126.  
  127. // --- BUTTON_STATE_CHECK_PRESSED -----------
  128. void button_Check_Pressed_Entry(byte buttonNumber) {
  129.   buttonPreviousMillis[buttonNumber] = millis(); // Reset button timer
  130. }
  131.  
  132. void button_Check_Pressed_Do(byte buttonNumber) {
  133.   // <nothing>
  134. }
  135.  
  136. void button_Check_Pressed_Exit(byte buttonNumber) {
  137.   // <nothing>
  138. }
  139.  
  140. // --- BUTTON_STATE_PRESSED -----------
  141. void button_Pressed_Entry(byte buttonNumber) {
  142.   // <nothing>
  143. }
  144.  
  145. void button_Pressed_Do(byte buttonNumber) {
  146.   // <nothing>
  147. }
  148.  
  149. void button_Pressed_Exit(byte buttonNumber) {
  150.   // <nothing>
  151. }
  152.  
  153. // --- BUTTON_STATE_CHECK_RELEASED -----------
  154. void button_Check_Released_Entry(byte buttonNumber) {
  155.   buttonPreviousMillis[buttonNumber] = millis(); // Reset button timer
  156. }
  157.  
  158. void button_Check_Released_Do(byte buttonNumber) {
  159.   // <nothing>
  160. }
  161.  
  162. void button_Check_Released_Exit(byte buttonNumber) {
  163.   boolButtonPressed[buttonNumber] = true; // Button is pressed
  164. }
  165.  
  166. // --- Event -----------
  167. boolean buttonPressed(byte buttonNumber) { // Returns true if button is pressed && resets button
  168.   if (boolButtonPressed[buttonNumber]) {
  169.     boolButtonPressed[buttonNumber] = false;
  170.     return true;
  171.   }
  172.   else return false;
  173. }
  174.  
  175. const int BUTTON_PINS[] = {A5, A4, A3};
  176. const int MAX_AANTAL = 3;
  177. int aantalKnoppen = 0;
  178.  
  179. void buttonHardware_Setup(int aantal) {
  180.   if (aantal <= MAX_AANTAL) {
  181.     for(int knopNummer = 0; knopNummer < aantal; knopNummer++){
  182.       pinMode(BUTTON_PINS[knopNummer], INPUT);
  183.     }
  184.     aantalKnoppen = aantal;
  185.   }
  186. }
  187.  
  188. bool getButtonHardwareDown(int buttonNumber) {
  189.   if (buttonNumber >= 0 && buttonNumber < aantalKnoppen) {
  190.     return (digitalRead(BUTTON_PINS[buttonNumber]) == LOW);
  191.   }
  192. }
  193.  
  194. bool getButtonHardwareUp(int buttonNumber) {
  195.   if (buttonNumber >= 0 && buttonNumber < aantalKnoppen) {
  196.     return !getButtonHardwareDown(buttonNumber);
  197.   }
  198. }
  199.  
  200. void printPushes() {
  201.   if (buttonPressed(0)==true)
  202.     Serial.println("RIGHT");
  203.   if (buttonPressed(1)==true)
  204.     Serial.println("LEFT");
  205.   if (buttonPressed(2)==true)
  206.     Serial.println("MIDDLE");
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement