Here is the code I am using in school to run a model elevator using a DC motor. I have a potentiometer to select floors, and then a push button switch to confirm the floor. Then an H bridge made from four transistors is used to power the DC motor. When I go from a lower floor to a higher floor, the LEDs light up to show motion, but the motor won't run. Further inspection shows that the PNP transistors also heat up A LOT. Then if I try to go back down, the motor runs fine, LEDs light up, and the transistors don't heat up. The H bridge works both way fine in a debugging code I wrote for it. So I am guessing it is a software problem, not the H bridge. Attached is my code. Any suggestions are welcome. Thanks.
int potvalue = 0;
int potmap = 0;
int butval = 0;
int butprev = 0;
int currentfloor = 1;
int destfloor = 0;
int runtime = 0;
boolean press = false;
void setup () {
pinMode (A0, INPUT);
pinMode (A1, INPUT);
pinMode (2, OUTPUT);
pinMode (4, OUTPUT);
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
pinMode (11, OUTPUT);
Serial.begin (9600);
}
void loop () {
potvalue = analogRead (A0);
potvalue = map (potvalue, 0, 1023, 1, 6);
butval = analogRead (A1);
if (press == false) {
switch (potvalue) {
case 1:
digitalWrite (2, HIGH);
digitalWrite (4, LOW);
digitalWrite (6, LOW);
break;
case 2:
digitalWrite (2, LOW);
digitalWrite (4, HIGH);
digitalWrite (6, LOW);
break;
case 3:
digitalWrite (2, HIGH);
digitalWrite (4, HIGH);
digitalWrite (6, LOW);
break;
case 4:
digitalWrite (2, LOW);
digitalWrite (4, LOW);
digitalWrite (6, HIGH);
break;
case 5:
digitalWrite (2, HIGH);
digitalWrite (4, LOW);
digitalWrite (6, HIGH);
break;
case 6:
digitalWrite (2, LOW);
digitalWrite (4, HIGH);
digitalWrite (6, HIGH);
break;
default:
digitalWrite (2, LOW);
digitalWrite (4, LOW);
digitalWrite (6, LOW);
}
if (((butval - butprev) > 30) && (butprev != 0)) {
press = true;
destfloor = potvalue;
digitalWrite (2, HIGH);
digitalWrite (4, HIGH);
digitalWrite (6, HIGH);
}
butprev = butval;
} else if (press == true) {
runtime = (destfloor)-(currentfloor);
if (runtime < 0) {
for (int i = 0; i < abs(runtime); i++) {
digitalWrite (9, HIGH);
digitalWrite (11, LOW);
digitalWrite (2, HIGH);
digitalWrite (4, LOW);
digitalWrite (6, LOW);
delay (250);
digitalWrite (2, LOW);
digitalWrite (4, HIGH);
digitalWrite (6, LOW);
delay (250);
digitalWrite (2, LOW);
digitalWrite (4, LOW);
digitalWrite (6, HIGH);
delay (250);
digitalWrite (2, HIGH);
digitalWrite (4, HIGH);
digitalWrite (6, HIGH);
delay (250);
}
currentfloor = destfloor;
} else if (runtime > 0) {
for (int i = 0; i < abs(runtime); i++) {
digitalWrite (9, LOW);
digitalWrite (11, HIGH);
digitalWrite (2, HIGH);
digitalWrite (4, LOW);
digitalWrite (6, LOW);
delay (250);
digitalWrite (2, LOW);
digitalWrite (4, HIGH);
digitalWrite (6, LOW);
delay (250);
digitalWrite (2, LOW);
digitalWrite (4, LOW);
digitalWrite (6, HIGH);
delay (250);
digitalWrite (2, HIGH);
digitalWrite (4, HIGH);
digitalWrite (6, HIGH);
delay (250);
}
currentfloor = destfloor;
} else {
digitalWrite (9, LOW);
digitalWrite (11, LOW);
press = false;
}
}
}