Sudden problem with push buttons

Hi, I'm new and doing a college project and it is a vending machine. I have 4 servos and 4 push buttons. When a specific button is pressed, a specific motor will turn clockwise. I've wrote out the code and tested it multiple times and had work but when I tested it again today, it somehow stopped working. I've tested each motor individually and bought another set of buttons. Hope someone here could help or give advice. Thank You.

#include <Servo.h>

Servo myservoA; //Servo pin A
Servo myservoB; //Servo pin B
Servo myservoC; //Servo pin C
Servo myservoD; //Servo pin D

const int buttonPinA = 8;
const int buttonPinB = 10;
const int buttonPinC = 9;
const int buttonPinD = 11;

int buttonStateA = 0;
int buttonStateB = 0;
int buttonStateC = 0;
int buttonStateD = 0;

//LCD DEDICATED PROGRAM STARTS HERE:-
#define RST A0
#define CE  A1
#define DC  A2
#define DIN A3
#define CLK A4
static const byte ASCII[][5] =
{
 {0x00, 0x00, 0x00, 0x00, 0x00} // 20  
,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .
,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <
,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e >
,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [
,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥
,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j 
,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {
,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |
,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d }
,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e �
,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f →
};

void LcdWriteString(char *characters)
{
  while(*characters) LcdWriteCharacter(*characters++);
}

void LcdWriteCharacter(char character)
{
  for(int i=0; i<5; i++) LcdWriteData(ASCII[character - 0x20][i]);
  LcdWriteData(0x00);
}

void LcdWriteData(byte dat)
{
  digitalWrite(DC, HIGH); //DC pin is low for commands
  digitalWrite(CE, LOW);
  shiftOut(DIN, CLK, MSBFIRST, dat); //transmit serial data
  digitalWrite(CE, HIGH);
}

void LcdXY(int x, int y)
{
  LcdWriteCmd(0x80 | x);  // Column.
  LcdWriteCmd(0x40 | y);  // Row.
}

void LcdWriteCmd(byte cmd)
{
  digitalWrite(DC, LOW); //DC pin is low for commands
  digitalWrite(CE, LOW);
  shiftOut(DIN, CLK, MSBFIRST, cmd); //transmit serial data
  digitalWrite(CE, HIGH);
}
//LCD DEDICATED PROGRAM ENDS HERE:-

void setup()
{
  pinMode(buttonPinA, INPUT);
  pinMode(buttonPinB, INPUT);
  pinMode(buttonPinC, INPUT);
  pinMode(buttonPinD, INPUT);
  
  pinMode(RST, OUTPUT);
  pinMode(CE, OUTPUT);
  pinMode(DC, OUTPUT);
  pinMode(DIN, OUTPUT);
  pinMode(CLK, OUTPUT);
  digitalWrite(RST, LOW);
  digitalWrite(RST, HIGH);
  
  LcdWriteCmd(0x21);  // LCD extended commands
  LcdWriteCmd(0xB1);  // set LCD Vop (contrast)
  LcdWriteCmd(0x04);  // set temp coefficent
  LcdWriteCmd(0x12);  // LCD bias mode 1:40
  LcdWriteCmd(0x20);  // LCD basic commands
  LcdWriteCmd(0x0C);  // LCD normal video
  
  for(int i=0; i<504; i++) LcdWriteData(0x00); // clear LCD

  LcdXY(20,2);
  LcdWriteString("Welcome"); 
  delay(5000);
  LcdWriteData(0x00);
  LcdXY(20,2);
  LcdWriteString("Please");
  LcdXY(05,3);
  LcdWriteString("Insert Token");
}

void loop()
{ 
   
  //-------------------------SERVO A-------------------------
    myservoA.attach(4);
    buttonStateA = digitalRead(buttonPinA);
    if (buttonStateA == HIGH)
      {
        myservoA.writeMicroseconds(1000);
        delay(18.5);
      }
    else (buttonStateA == LOW);
      {
        myservoA.writeMicroseconds(1500);
      }
      
  //-------------------------SERVO B-------------------------
    myservoB.attach(6);
    buttonStateB = digitalRead(buttonPinB);
    if (buttonStateB == HIGH)
      {
        myservoB.writeMicroseconds(1000);
        delay(18.5);
      }
    else (buttonStateB == LOW);
      {
        myservoB.writeMicroseconds(1500);
      }
      
  //-------------------------SERVO C-------------------------
    myservoC.attach(5);
    buttonStateC = digitalRead(buttonPinC);
    if (buttonStateC == HIGH)
      {
        myservoC.writeMicroseconds(1000);
        delay(18.5);
      }
    else (buttonStateC == LOW);
      {
        myservoC.writeMicroseconds(1500);
      }
     
  //-------------------------SERVO D-------------------------
    myservoD.attach(7);
    buttonStateD = digitalRead(buttonPinD);
    if (buttonStateD == HIGH)
      {
        myservoD.writeMicroseconds(1000);
        delay(18.5);
      }
    else (buttonStateD == LOW);
      {
        myservoD.writeMicroseconds(1500);
      } 
}

"stopped working" is always a poor description. It does nothing at all? I see display stuff, also doesn't work?

And what is powering the servo's? The onboard regulator of the Arduino can NOT do that.

Aren't there simpler ways of writing stuff to your LCD? There are libraries for that.

Then "it stopped working". Explain. What does it do, what doesn't it do what it should do, what does it do different from what it should do? Any error messages anywhere?

How are the buttons etc. wired? Proper circuit diagram please, no Fritzing.

I notice the "pressed" state is HIGH. It's quite common to have the button pull the input LOW, and when open use the internal pullup to get it HIGH, saves on external components.

septillion:
"stopped working" is always a poor description. It does nothing at all? I see display stuff, also doesn't work?

And what is powering the servo's? The onboard regulator of the Arduino can NOT do that.

Sorry for not specifying, yes the button does nothing at all when its pressed but the displays are working fine.
I've been powering the servo by plugging in a 12V power supply into the arduino. I'm not sure what you meant by the on board regulator but the servo is powered by the Arduino.

bfcw1997:
I've been powering the servo by plugging in a 12V power supply into the Arduino.

THAT is the fastest way to burn the regulator :wink: Maybe it died already...

Next up, check all connections. Maybe write a test sketch to just test the buttons etc.

You can sometimes get away with powering a single servo from the arduino if there's minimal load on it. Four of them & driving some kind of vending machine mechanism? Forget it. You will need a separate power supply for the servos.

septillion:
THAT is the fastest way to burn the regulator :wink: Maybe it died already...

Next up, check all connections. Maybe write a test sketch to just test the buttons etc.

I've checked the connections as well for servos and buttons and the outcome is still the same. I've written an extra test sketch where it only consist of one servo and one push button, same outcome as well. If the regulator is fried, the Arduino would just stop working right?

bfcw1997:
I've checked the connections as well for servos and buttons and the outcome is still the same. I've written an extra test sketch where it only consist of one servo and one push button, same outcome as well. If the regulator is fried, the Arduino would just stop working right?

Not if it's plugged into USB.

Jiggy-Ninja:
Not if it's plugged into USB.

I've tried both USB and with a plug in 12V and it worked.

wildbill:
You can sometimes get away with powering a single servo from the arduino if there's minimal load on it. Four of them & driving some kind of vending machine mechanism? Forget it. You will need a separate power supply for the servos.

I had no idea that it wouldn't be able to drive the motors. What if I used a voltage regulator, and set it to 5V since i need 5V to run the motors. Will it work if I connect an external 12v power supply to the voltage regulator, then from the vout and ground, I'll connect it to the arduino.

Just get a separate regulator for the servo's alone. 3A or 5A would not be weird. (Especially if they are China ratings :p) And just feed 12V to the Arduino and the regulator and just use the external regulator to connect to the servo's.

bfcw1997:
I've written an extra test sketch where it only consist of one servo and one push button, same outcome as well.

Same outcome as no movement? Do you try to print debug data to the serial monitor as well?

And what if you just make a sketch that sends the state of the switch to the serial monitor.

Debugging is just a process of stripping it down and eliminating parts.

septillion:
Just get a separate regulator for the servo's alone. 3A or 5A would not be weird. (Especially if they are China ratings :p) And just feed 12V to the Arduino and the regulator and just use the external regulator to connect to the servo's.
Same outcome as no movement? Do you try to print debug data to the serial monitor as well?

And what if you just make a sketch that sends the state of the switch to the serial monitor.

Debugging is just a process of stripping it down and eliminating parts.

No, I have no tried any of those method you mentioned, to be honest I have no idea how to do any of them.

  1. Start a new sketch
  2. put Serial.begin() in setup()
  3. Do the stuff you do to read your switch (aka copy past it)
  4. Use Serial.print() and/or Serial.println() to send the state to the serial monitor.

If that works, try to add the servo control etc.

While writing a program it's always nice to have debug data when you run into a program. And on Arduino, printing things to the Serial monitor is the normal way to go.

septillion:

  1. Start a new sketch
  2. put Serial.begin() in setup()
  3. Do the stuff you do to read your switch (aka copy past it)
  4. Use Serial.print() and/or Serial.println() to send the state to the serial monitor.

If that works, try to add the servo control etc.

While writing a program it's always nice to have debug data when you run into a program. And on Arduino, printing things to the Serial monitor is the normal way to go.

Okay, I've tried what you recommended, I used my existing LCD to test and what I got was that the Arduino assumes the button is always "HIGH" whether its pressed or not.

bfcw1997:
Okay, I've tried what you recommended, I used my existing LCD to test and what I got was that the Arduino assumes the button is always "HIGH" whether its pressed or not.

Maybe a wiring issue. Please post schematic.

bfcw1997:
Okay, I've tried what you recommended, I used my existing LCD to test and what I got was that the Arduino assumes the button is always "HIGH" whether its pressed or not.

Assuming the test sketch is correct, something's broken. Whether it's a wire, the button, the pull resistor, or the Arduino input itself is unknown at this point.

wvmarle:
Maybe a wiring issue. Please post schematic.

Sorry, I don't have any schematics with me other than the one I found online that I'm following and its drawn using Fritzing, worst part is I don't have any software to draw the schematics with. Sorry

Jiggy-Ninja:
Assuming the test sketch is correct, something's broken. Whether it's a wire, the button, the pull resistor, or the Arduino input itself is unknown at this point.

I'll get fresh arduino tomorrow and see if its the arduino input broke, hopefully that'll shed some light as to why this is happening. I thought it was the wire at first and I've used all the wires I can find and its still the same.

Check out KiCAD, it's free software, great for drawing schematics and so.

Sound like a connection error or you're reading the buttons wrong. For that, show the (I hope) simplified debug sketch.

bfcw1997:
I don't have any software to draw the schematics with.

Nonsense, everybody has software to draw a schematic. It's called DaveCAD or in this case bfcw1997CAD. Aka, grab pen and paper :wink: