Till problemet! Det hade varit enkelt att bara slå av/på allting direkt men det är lite fränare att tajma så att gasventilen slår på nån halv sekund innan kontaktor och motorstyrning, vice versa när man släpper knappen. Har knyckt lite kod av en som gjort samma operation på youtube och försökt anpassa det till mitt projekt. Och det fungerar dugligt, koden gör det den ska men jag har problem med att den ibland studsar tillbaka till "steg ett". Det är lättast å se på seriella monitorn hur den beter sig. (Knappen är kopplad på ingång 2 med en 10k resistor.) Det gör den ostabil och det vill man inte ha. Ett annat problem jag har är att "postflow"-funktionen fungerar inte som jag vill. Kontaktor och motorstyrning ska stänga av innan magnetventilen när knappen släppts. Men den gör inte det när någon av de två kommenterade raderna i IF-sektionerna för stegTvå och StegTre inte är med i koden. Avkommenterar jag någon av de så fungerar det som det ska.
Om det finns andra lösningar på problemet eller tips på förbättringar på min kod så är all konstruktiv kritik välkommet. Har försökt kommentera och göra det tydligt så gott det går. Försöker framtidsäkra koden genom att använda millis(), med delay hade jag varit klar längesen, men det är ju inte det bästa att använda om man vill göra flera saker samtidigt senare.
// E Hansson
Kod: Markera allt
/*Styrsystem för svets. Eller prototyp till en iaf.
På utgångarna kan det enkelt kopplas in optokopplare som styr relän osv.
*/
const int pKnappIn = 2; //Konstanter till in/utgångar på mikrokontroller
const int magnetVentil = 13;
const int kontaktor = 12;
const int motorstyrning = 11;
unsigned int preflow = 1000; //Tider som bestämmer timingen
unsigned int tidKontaktor = 250;
unsigned int tidMotorstyrning = 2500;
unsigned int postflow = 2500;
unsigned long CurrentMillis; //Variabler som lagrar tiden som används för timingen
unsigned long magnetventilAvMillis;
unsigned long motorstyrningAvMillis;
unsigned long kontaktorTillMillis;
unsigned long kontaktorAvMillis;
bool pKnapp = false; //Olika logiska argument
bool lastpKnapp;
bool stegEtt = false;
bool stegTva = false;
bool stegTre = false;
void setup() {
pinMode(magnetVentil, OUTPUT); //Definiering av ingångar/utgångar
pinMode(kontaktor, OUTPUT);
pinMode(motorstyrning, OUTPUT);
pinMode(pKnappIn, INPUT);
Serial.begin(9600);
}
void loop() {
styrsystem();
}
void styrsystem () {
CurrentMillis = millis();
pKnapp = digitalRead(pKnappIn);
if ((pKnapp == false && pKnapp != lastpKnapp)) { //Beskriver vad som händer när knappen släppts
stegTva = true;
stegTre = true;
lastpKnapp = false;
kontaktorAvMillis = CurrentMillis + tidKontaktor;
magnetventilAvMillis = CurrentMillis + postflow;
Serial.print("Släpp knapp");
}
if (pKnapp == true && pKnapp != lastpKnapp) { //Beskriver vad som händer när knappen trycks in
stegEtt = true;
stegTva = false;
stegTre = false;
lastpKnapp = true;
digitalWrite (magnetVentil, HIGH);
kontaktorTillMillis = CurrentMillis + preflow;
Serial.print("Trycker in knapp");
}
if (stegEtt && CurrentMillis > kontaktorTillMillis) { //Steg ett är när knappen trycks in och vad som ska klicka igång då.
stegEtt = false; //
digitalWrite(motorstyrning, HIGH);
digitalWrite(kontaktor, HIGH);
Serial.print("Steg Ett");
}
if (stegTva && CurrentMillis > kontaktorAvMillis) { //Steg två används när knappen släppts. Fortfarande oklart om motorstyrningen ska
stegTva = false; //vara low här
digitalWrite(kontaktor, HIGH);
//digitalWrite(motorstyrning, LOW);
Serial.print("Steg Två");
}
if (stegTre && CurrentMillis > magnetventilAvMillis) { //Steg tre stänger av allting, styr även hur länge magnetventilen ska vara på efter
stegTre = false; //det att knappen släppts
digitalWrite(motorstyrning, LOW);
digitalWrite(kontaktor, LOW);
//delay (800);
digitalWrite(magnetVentil, LOW);
Serial.print("Steg Tre");
}
}