Ook al heb ik zelf een hekel aan Java
Misschien nog iets toevoegen om van servo/stand te wisselen?
Processing geeft je dan de mogelijkheid een deel van de teksten daarheen te verhuizen, zodat je meer ruimte overhoudt voor leukere dingen.
void setup(){...... if (digitalRead(progKnop) == 0) { .... .... digitalWrite(LED, HIGH); servoInstellen(); }
void servoInstellen(){ String tekst = ""; for (byte servoNummer = 0; servoNummer < NrServos; servoNummer++) { // local variables boolean done = false; boolean wiggel = false; // stuur commando naar processing (evt. terminal) tekst = "SS " + String(servoNummer + 1, HEX) + String(" "); Serial.println(tekst); Serial.flush(); // zet servo in de middenstand wisselServos.gotoPos(servoNummer,servoMid); wisselServos.update(); while (!done) { while (Serial.available() > 0) { // De te ontvangen string bevat altijd: "CCCCC xxx yyy zzz" en wordt afgesloten met \n // de delen worden gescheiden door een spatie // CCCCC maximaal 10 karakters, hier gebruiken we er 2 // xxx een int (10 .. 1012) voor een eindstand rood van de servo // yyy een int (10 .. 1012) voor een eindstand groen van de servo // zzz een int () voor de servosnelheid // De commando's kunnen zijn: // "SK" = skip deze servo // "SA" = save de meegestuurde waarden // en save de ingestelde snelheid // "SR" = set servo in de stand xxx // "SG" = set servo in de stand yyy // "SW" = set wiggelen servo aan // "SD" = servo speed down // "SU" = servo speed up String commando = ""; char comm[10]; int aantal; aantal = Serial.readBytesUntil(' ', comm, 10); int standGroen, standRood, val3; for (int i = 0; i < aantal; i++) { commando = commando + String(comm[i]); } // look for the 3 next valid integers in the incoming serial stream: standGroen = Serial.parseInt(); standRood = Serial.parseInt(); val3 = Serial.parseInt(); // reserved, not used in this sketch // wacht op newline, dan zijn we aan het eind van een zin if (Serial.read() == '\n') { commando.toUpperCase(); if (commando == "SG") { wisselServos.gotoPos(servoNummer, standGroen); } if (commando == "SR") { wisselServos.gotoPos(servoNummer, standRood); } if (commando == "SK") { done = true; } if (commando == "SA") { wisselServos.setEndPos(servoNummer, 0, standGroen); wisselServos.setEndPos(servoNummer, 1, standRood); //bewaar ze in EEPROM EEPROM.write(EEServoDirs + (servoNummer*2), (standGroen / 4)); EEPROM.write(EEServoDirs + (servoNummer*2) + 1, (standRood / 4)); servoSpeed_t servoSpeed = wisselServos.getSpeed(servoNummer); EEPROM.write(EEServoSpeedStep + servoNummer, servoSpeed.step); EEPROM.write(EEServoSpeedInterval + servoNummer, servoSpeed.interval); done = true; } if (commando == "SW") { wisselServos.gotoEndPos(servoNummer,0); wiggel = true; } if (commando == "SD") { wisselServos.speedDown(servoNummer); } if (commando == "SU") { wisselServos.speedUp(servoNummer); } } // end if (Serial.read() } // end while (Serial.available( if (wiggel == true) { wiggelServo(servoNummer); } wisselServos.update(); } // end while (!done) } // end for-loop 1 // We're done setting up. Let processing now. tekst = "XX " + String(255, HEX) + String(" "); Serial.println(tekst); Serial.flush(); digitalWrite(LED,LOW);} //end servoInstellen()void wiggelServo(int i){ if(!wisselServos.isActive(i)) //only change endPos after detached to wait @ endPos { if(wisselServos.isAtEndPos(i, 0)) { wisselServos.gotoEndPos(i, 1); } else if(wisselServos.isAtEndPos(i, 1)) { wisselServos.gotoEndPos(i, 0); } }}
Hoe ik dat anders/eenvoudiger kan doen ben ik niet uitgekomen.
tekst = "SS " + String(servoNummer + 1, HEX) + String(" ");
// wacht op newline, dan zijn we aan het eind van een zin if (Serial.read() == '\n')
void servoInstellen(){ for (byte servoNummer = 0; servoNummer < NrServos; servoNummer++){ bool done = false; bool wiggel = false; Serial.print(F("SS")); Serial.print(servoNummer + 1, HEX); Serial.println(" "); //<--- deze kan deze ik wel weg, de '\n' lijkt me genoeg? // zet servo in de middenstand wisselServos.gotoPos(servoNummer,servoMid); wisselServos.update(); while(!done){ //wachten op serial while(Serial.available()) { // De te ontvangen string bevat altijd: "CCCCC xxx yyy zzz" en wordt afgesloten met \n // de delen worden gescheiden door een spatie // CCCCC maximaal 10 karakters, hier gebruiken we er 2 // xxx een int (10 .. 1012) voor een eindstand rood van de servo // yyy een int (10 .. 1012) voor een eindstand groen van de servo // zzz een int () voor de servosnelheid // De commando's kunnen zijn: // "SK" = skip deze servo // "SA" = save de meegestuurde waarden // en save de ingestelde snelheid // "SR" = set servo in de stand xxx // "SG" = set servo in de stand yyy // "SW" = set wiggelen servo aan // "SD" = servo speed down // "SU" = servo speed up char command[11]; //een plaats extra voor een '\n' byte aantalBytes = Serial.readBytesUntil('', command, 10); command[aantalBytes] = '\n'; //altijd eindigen met een '\n' int standGroen = Serial.parseInt(); int standRood = Serial.parseInt(); int servoSpeed = Serial.parseInt(); toUpper(command); //laten staan omdat je het nu eenmaal stuurt if (Serial.read() == '\n') { if (!strcmp(command, F("SG"))) { wisselServos.gotoPos(servoNummer, standGroen); } //else if, want als het SG was kunnen we gewoon stoppen met zoeken else if (!strcmp(command, F("SR"))) { wisselServos.gotoPos(servoNummer, standRood); } else if (!strcmp(command, F("SK"))) { done = true; } else if (!strcmp(command, F("SA"))) { wisselServos.setEndPos(servoNummer, 0, standGroen); wisselServos.setEndPos(servoNummer, 1, standRood); //bewaar ze in EEPROM EEPROM.write(EEServoDirs + (servoNummer*2), (standGroen / 4)); EEPROM.write(EEServoDirs + (servoNummer*2) + 1, (standRood / 4)); servoSpeed_t servoSpeed = wisselServos.getSpeed(servoNummer); EEPROM.write(EEServoSpeedStep + servoNummer, servoSpeed.step); EEPROM.write(EEServoSpeedInterval + servoNummer, servoSpeed.interval); done = true; } else if (!strcmp(command, F("SW"))) { wisselServos.gotoEndPos(servoNummer,0); wiggel = true; } else if (!strcmp(command, F("SD"))) { wisselServos.speedDown(servoNummer); } else if (!strcmp(command, F("SU"))) { wisselServos.speedUp(servoNummer); } } // end if (Serial.read() } // end while (Serial.available( if (wiggel == true) { wiggelServo(servoNummer); } wisselServos.update(); } // end while (!done) } // end for-loop 1 // We're done setting up. Let processing know. Serial.println(F("XX FF")); digitalWrite(LED,LOW);} //end servoInstellen()//Hele string naar uppercasevoid toUpper(&in){ for(unsigned int i = 0; i < strlen(in); i++){ in[i] = toupper(in[i]); } }