Bemásolom az alábbi programot és alatta felteszem a jelenséget és a kérdésemet. Próbáltam egy nagyobb programot most lebutítani lehet maradt benne 1-2 felesleges dolog.
Kód: Egész kijelölése
int downPin = 8; //Redony lefele
int upPin = 10; //Redony felfele
int dir = 0; //0 all - 1 fel - 2 le
int menu = 0;
double menetIdo = 25; //menetido mp-ben
double menetIdoMillis = menetIdo * 1000; //menetido millis-be
long startTime = 0; //mikor inditottuk a motort
long endTime = 0; //mikor kell leallitani a motort
long diffTime = 0; //inditas utan mennyi ido telt el a leallitasig
boolean motorState = false;
boolean debug = false;
void setup() {
Serial.begin(9600);
//PIN-ek beallitasa
pinMode(downPin, OUTPUT);
pinMode(upPin, OUTPUT);
Serial.println("Redonyvezerles V0.2");
//startMotor(upPin, 5000);
showFirstMenu();
//showMessage("Motor all");
}
void loop() {
checkMotor();
if(Serial.available() > 0) {
menu = Serial.read(); //mit irt be a felhasznalo
if(menu == 49) { //ha egyet irt be
startMotor(upPin, menetIdoMillis);
} else if(menu == 50) { //ha kettot ir be
startMotor(upPin, menetIdoMillis);
} else if(menu == 51) { //ha harmat ir be
startMotor(downPin, menetIdoMillis);
} else if(menu == 57) { //ha kilencet ir be
stopMotor();
}
}
}
void checkMotor() {
if(motorState == true) {
if(millis() >= endTime) {
stopMotor();
}
}
}
void startMotor(int pin, double time) {
if(motorState == false) {
setDir(pin); //Irany beallitasa a valtozoba
motorState = true;
startTime = millis();
endTime = startTime + time;
digitalWrite(pin, HIGH);
if(debug == true) {
Serial.println("Motor Start");
} else {
showMessage("| A motor elindult");
showMessage("| 9. STOP");
}
}
else {
stopMotor();
startMotor(pin, time);
}
}
void stopMotor() {
if(dir == 2) {
digitalWrite(downPin, LOW);
dir = 0;
if(debug == true) {
Serial.println("downPIN OFF");
}
}
else if(dir == 1) {
digitalWrite(upPin, LOW);
dir = 0;
if(debug == true) {
Serial.println("upPIN OFF");
}
}
motorState = false;
if(debug == true) {
Serial.println("motorState false");
}
delay(1000);
if(debug == true) {
Serial.println("Motor OFF delay 1000");
} else {
showMessage("| A motor kikapcsolva");
showFirstMenu();
}
}
void setDir(int pin) {
if(pin == downPin) {
dir = 2;
}
else if(pin == upPin) {
dir = 1;
}
}
void showFirstMenu() {
Serial.println("");
Serial.println("*-------------------------------*");
Serial.println("| 1. Alaphelyzetbe |");
Serial.println("| 2. FEL |");
Serial.println("| 3. LE |");
Serial.println("*-------------------------------*");
}
void showMessage(String message) {
Serial.println("");
Serial.println("*-------------------------------*");
Serial.println(message);
Serial.println("*-------------------------------*");
}
Kiadom a 3-as menüpontot redőny teljesen lehúzódik. Ezután elindítom a kettessel felfele és el is indul majd megállítom a 9-el. Lehet még 1-2 lépést tudok csinálni de utána a soros monitor teljesen megáll nem tudok új utasítást kiadni újraindítom az arduino-t nem történik semmi az arduino ezt az üzenetet küldi vissza nekem:
A COM8 soros port haszálatban van. A programból kilépés után próbálja újra.
Windows alatt bármit tehetek csak egy restart (PC) segít. Linux alatt elég az arduino-t resetelnem és újra kapok menüt és újra irányíthatom. Még egy jelenség linux alatt, hogy a soros monitoron már nem kapok vissza semmilyen üzenetet de a bevitt adatot még 1-2 utasításig észleli arduino és cselekszik is.
Ez a hiba csak akkor jött elő amikor belevettem a soros porton való irányíthatóságot. Előtte kapcsolóval teljesen jól működött illetve időzítve is (egyszerre több redőnyt is tudok úgy mozgatni teljesen jól). Most egy C++ program MySQL-ből fogja majd adni az utasításokat az arduino-nak így bármilyen mobil tablet segítségével könnyedén tudom irányítani (jQuery Mobile szolgáltatja a megjelenítést). A NAS szerver egy linux szerver szóval ha csak linuxos sikerül megoldani nem gond a NAS éjjel-nappal megy és jelenleg az arduino onnan van működtetve.
Amit még tudni kell:
8 PIN -> RELÉ
10 PIN -> RELÉ
GND <- a két reléből közösítve
