I have made a can crusher. It is design with a chute to crush the cans that are entered into the chute. The can is droped throught two gates and entre a chamber where a motor is driven forward to crush the can and then reverses to load the next can. But i keeping having the same issue of the code gets unstable. It works really well when only one can is placed in the chute and sometimes when two cans are loaded but then gets unstable and keeps driving forward or reverse to far. I have tried every thing i can but can not work out where i am going wrong. I was hoping somebody here may be able to help.
#define MRELAY1 13 //relay for top gate
#define MRELAY2 12 //relay for bottom gate
#define MRELAY3 11 //earth relay
#define MRELAY4 10 //forward and reverse relay(de-energised forward)
#define MRELAY5 9 //forward and reverse relay(as above)
#define SWITCH1 8 //top ir sensor
#define SWITCH2 7 //forward cutoff switch
#define SWITCH3 6 //reverse cutoff switch
#define SWITCH4 5 //bottom ir sensor
int val1 = 1; //top ir switch
int val2 = 1; //forward cutoff switch
int val3 = 0; //reverse cutoff switch
int val4 = 1; //bottom ir switch
void setup() {
pinMode(MRELAY1, OUTPUT);
pinMode(MRELAY2, OUTPUT);
pinMode(MRELAY3, OUTPUT);
pinMode(MRELAY4, OUTPUT);
pinMode(MRELAY5, OUTPUT);
pinMode(SWITCH1, INPUT);
pinMode(SWITCH2, INPUT);
pinMode(SWITCH3, INPUT);
pinMode(SWITCH4, INPUT);
}
void loop() {
val2 = digitalRead(SWITCH2); //forward cutoff switch
val3 = digitalRead(SWITCH3); //reverse cutoff switch
val4 = digitalRead(SWITCH4); //bottom ir sensor
if (val4 == LOW && val2 == HIGH && val3 == LOW) {
delay(1000);
digitalWrite(MRELAY2, HIGH); //open bottom gate
delay(2000);
digitalWrite(MRELAY2, LOW); //close bottom gate
delay(2000);
digitalWrite(MRELAY3,HIGH); //energise earth relay drive forward
delay(4000);
}
val2 = digitalRead(SWITCH2);
val3 = digitalRead(SWITCH3);
if(val2 == LOW && val3 == HIGH){
delay(100);
digitalWrite(MRELAY3,LOW); //de-energise earth relay stop driving forward
delay(5000);
digitalWrite(MRELAY5,HIGH); //energise relay to drive reverse
digitalWrite(MRELAY4,HIGH); //energise relay to drive reverse
digitalWrite(MRELAY3,HIGH); //energise earth relay to drive reverse
delay(2000);
}
val2 = digitalRead(SWITCH2);
val3 = digitalRead(SWITCH3);
if(val2 == HIGH && val3 == LOW){
delay(100);
digitalWrite(MRELAY5,LOW); //de-energise earth relay off
digitalWrite(MRELAY4,LOW); //de-energise reverse relay off
digitalWrite(MRELAY3,LOW); //de-energise reverse relay off
delay(2000);
}
val1 = digitalRead(SWITCH1);
val2 = digitalRead(SWITCH2);
val3 = digitalRead(SWITCH3);
val4 = digitalRead(SWITCH4);
if(val3 == LOW && val1 == LOW && val2 == HIGH && val4 == HIGH){
delay(1000);
digitalWrite(MRELAY1, HIGH); //energise top gate relay open
delay(2000);
digitalWrite(MRELAY1, LOW); //de-energise top gate relay close
delay(2000);
}else{
digitalWrite(MRELAY1, LOW);
}
}
Moderator edit:
</mark> <mark>[code]</mark> <mark>
</mark> <mark>[/code]</mark> <mark>
tags added.