lunes, 8 de abril de 2024

Ni que sí, ni que no, todo lo contrario

Primero nos dicen que como profesionales es nuestro deber decir que no, pero después nos dicen que decir que no solo nos lleva a alejarnos de los lugares donde se toman decisiones. No sabemos si decir siempre que si o siempre que no, muy probablemente tengamos que pensar un poco más.


Cuando comenzamos nuestro camino en el desarrollo de software, con mucha energía y poca experiencia, tratamos al máximo de cumplir todo lo que se nos pide, creando complicadas y a veces esotéricas soluciones, muchas veces recolectando cumplidos por nuestra habilidad de solucionar cualquier problema. Pero con el tiempo estas soluciones crean más problemas que necesitan más complejidad y los problemas escalan. Mientras ganamos más conocimientos comenzamos a reconocer la necesidad de tomarnos más tiempo en el diseño de soluciones escalables pero ya sea por la urgencia del problema a solucionar o la necesidad que comunica el negocio de aumentar la velocidad de entrega mantenemos la producción de lo que se parece más a una fábrica de bugs que a software.

 Aprendiendo del trabajo de profesionales como, Dave Farley, defendemos la postura de elevar la calidad del código ya que esto elevaría la velocidad de entrega de software, pero sin éxito. 

 En algún momento, tal vez después de leer Uncle Bob, nos transforma la idea de que desarrolladores profesionales se diferencian por la habilidad de decir que no, entonces comienza una nueva etapa donde nos volvemos paladines defensores de la calidad negándonos a aceptar requerimientos que no hayan tenido analisis, a cambios de rumbo o hasta diseños que no nos parezcan lo suficientemente buenos. Pero las cosas no mejoran, siguen apareciendo nuevos requerimientos sin aviso, las decisiones tomadas cambian y tal vez también el clima laboral empeora. Notamos que nos convertimos en “el que siempre dice que no”, que ya no estamos donde se toman las decisiones y que el compromiso de nuestros compañeros no es el mismo, muy probablemente porque sus aportes son ignorados por desarrolladores con más seniority que eligen sus propias ideas que creen de mejor calidad.

  Ahora llegamos a nuevos recursos, como el libro de Staff Engineer de Will Larson, y dejamos de creer en la negativa como mantra y tomamos la de minimizar la fricción, las cosas no son tan fáciles como elegir si decir que si o que no, tenemos que esforzaronos para incluir a todos los colaboradores para mejorar el producto y el trabajo en equipo, mantener alineación con los jefes para estar incluidos en la toma de decisiones y pensar un poco más en el si y el no. Es obvio, creo, que trabajar horas extra y/o fines de semana en detrimento de nuestra salud y relaciones familiares es algo a lo que tenemos que decirle que no, pero tambien podríamos considerar que en algunas situaciones es aceptable el esfuerzo extra, que el objetivo depende de nuestro negocio y que la tecnología es una herramienta para ese fin y no el fin en sí mismo.

Aprender a cuándo decir que no nos permite mantener el valor de la palabra y que tenga peso.

jueves, 21 de junio de 2018

Imperio Sueco - Stormaktsiden

Si, después de 2 años se me pinto por escribir algo más; bah, en realidad ya lo tenia escrito y se me ocurrió ponerlo acá en español, sí, porque soy troglodita.

Algunas consideraciones antes de empezar:
-    Stormaktsiden, literalmente, el tiempo del gran poder, se puede entender mejor como “Imperio Sueco”
-    La guerra de los 30 años fue una de las más terribles comparable con la primera guerra mundial sin necesidad de usar ametralladoras ni tecnología moderna.
-    En algunos lugares leí que dicen que la guerra de los 30 años es la real primera guerra mundial.
-    Las guerras de religión no son patrimonio oriental, la guerra de los 30 años se lucha entre católicos y protestantes.
-    Si de pronto parece una traducción china donde de un lado ven 20 palabras en sueco y del otro 1 en español, es por que no se traducir ciertas cosas y me parece que se entiende con menos.

Imperio Sueco


Suecia se define como imperio entre 1611 y 1718 cuando ejercía control territorial sobre gran parte del mar báltico y era una gran potencia en Europa.
Se suele considerar que el periodo inicia cuando Gustavo Adolfo II se corona rey de Suecia en 1611 y que termina con la perdida de territorios que se dio al final de la Gran guerra del norte, en 1721.

Gustavo Adolfo II
Gustavo fue el rey de Suecia entre 1611 y 1632. Heredo el trono de su padre, Carlos IX, también heredo 3 guerras, con Rusia, Dinamarca y Polonia.

La guerra de los 30 años
Esta guerra fue una serie de conflictos militares en Europa central entre 1611 y 1648. Fue una de los conflictos mas largos y destructivos en la historia de Europa.
Comenzó como una guerra entre estados protestantes y católicos en fragmentado sacro imperio romano, pero se transformó en una continuación de la rivalidad entre los Habsburgo y Francia.
La guerra comienza cuando Fernando II intenta forzar el catolicismo a su pueblo, esto inicio una revuelta Bohemia protestante que Vivian en los dominios Habsburgo en Austria contra sus regentes.

La fase sueco-alemana, 1630-1635
Gustavo Adolfo II fue en ayuda de los Luteranos Alemanes. Gano cada batalla hasta 1632 cuando repelieron su ataque a Alte Veste. Gustavo Adolfo muere en la batalla de Lützen, luego de su muerte el ejercito sueco no volvió a comprometerse en el conflicto.

La fase sueco-francesa, 1635-1648

Como la habilidad de Suecia de continuar la guerra se puso en duda, Francia declara la guerra a España en mayo de 1635 y al Sacro imperio romano en 1636.
Con Francia en la guerra el ejercito sueco retomo la iniciativa en la campaña alemana.
Después de 4 años de charlas de paz en 1648 la guerra termina.
En octubre de 1648 se firman dos tratados, uno entre Suecia y el emperador y otra entre el emperador y Francia, estos tratados se conocen como la paz de Westfalia.







1 Mapa de Europa año 1648, despues de la paz de Westfalia.

Cultura y desarrollo
Se fundaron Escuelas por iniciativa de Johannes Rudbeckius y la universidad de Uppsala se mejoró.
Se fundo la universidad de Tartu en 1632, la academia real de Turku en 1640 y la universidad de Lund en 1666 para promocionar la cultura sueca en las provincias de Finlandia y Skåne.
Durante la guerra de los 30 años Suecia se abrió a influencias del modo de vida de otros países de Europa y comenzó la poesía y la ciencia sueca.
A través del comercio y practicando la apertura al exterior Suecia creo profesionales y personal capacitado para desarrollarse con el empuje de Gustavo Adolfo II y la reina Kristina.
Se introdujeron nuevos métodos de producción de hierro fundo la posición de potencia que Suecia mantendría por mucho tiempo en la industria.
Comenzaron los primeros acercamientos a la industria de manufacturas, se animo el comercio y se fomentó la centralización de las ciudades, algo que beneficiaría a Estocolmo que, primer con su desarrollo y a través de la centralización del país, se transformaría realmente en la capital de la nación.

El fin del imperio, la gran guerra del norte
En 1700 Dinamarca, Polonia y Rusia declaran la guerra juntas a Suecia.
Rusia capturo varios estados del mar báltico, en vez de intentar la recaptura, Carlos XII marcho directamente a Moscú; pero las terribles condiciones climáticas, las dificultades de mantener las líneas de suministros y la estrategia de tierra quemada rusa, el ejercito sueco tuvo que dirigirse a Ucrania. En 1790 el ejercito sueco era derrotado en la batalla de Poltava.
En los años siguientes Rusia ocuparía la parte este de Suecia (Actual Finlandia).
A pesar de las adversidades, Carlos XII intento invadir Noruega, dos veces, para obligar a Dinamarca-Noruega a salir de la guerra. El 30 de noviembre de 1718 Carlos XII bajo asedio en Fredriksten muere. Con su muerte el ejercito sueco se encargo solamente de detener a Rusia que seguía acosando la población civil de las áreas costeras hasta que la paz en Nystad se firma en 1721.
Suecia se mantendría como una potencia regional hasta el siglo 19 pero la gran guerra del norte puso fin a Suecia como superpotencia.


På svenska

Stormaktsiden

Stormaktstiden är en epok i Sveriges historia mellan åren 1611 och 1718 när Sverige hade territoriella kontroll över store delar av Östersjöområdet och var en stormaktsställning i Europa.
Perioden anses ofta inledas på året 1611 med att Gustav II Adolf bestiger den svenska tronen och slutet på året 1721 när förlusten av områden hänt efter slutet av det Stora nordiska kriget.

Gustav II Adolf
Gustav II Adolf var Sveriges kung mellan åren 1611 och 1632. Gustav ärvde den svenska tronen efter sin fars, Karl IX, död, också han ärvde tre krig med Ryssland, Danmark och Polen.

Trettioåriga kriget
Trettioåriga kriget var en serie militära konflikter i Centraleuropa mellan åren 1611 och 1648. Det var en av de längsta och mest destruktiva konflikter i Europas historia.
Det börjar som ett krig mellan olika protestantiska och katolska stater i fragmenterad heliga romerska riket, så småningom utvecklas till en mer av en fortsättning på Frankrike-Habsburg rivalitet.
Kriget börjar när Ferdinand II försökte tvinga katolicism på dess folk som utlöste de protestantiska Bohemians bor i herravälde Habsburg Österrike att revoltera mot sina härskare.

Det svensk-tyska skedet, 1630–1635
Gustav Adolf kom för att hjälpa de tyska lutheran. Han vann varje strid tills 1632 när han blev tillbakaslagen, i attacken av Alte veste. På det segerrika slaget vid Lützen, Gustav II Adolf hade dött. Då, svenska armén förband de sig inte att fortsätta kriget.

Det svensk-franska skedet, 1635–1648
Eftersom Sveriges förmåga att fortsätta kriget ensam verkade tveksam, Frankrike förklarade krig mot Spanien maj 1635 och den heliga romerska riket i augusti 1636.
Med Frankrike i kriget den svenska armén återtog initiativet i den tyska kampanjen.
Efter fyra år fredsförhandlingar slöts till slut fred i oktober 1648 och efter trettio år var kriget blev slut.
I oktober 1648 var undertecknas två olika fördrag, det ena där Sverige och kejsaren var de centrala fördragsparterna och Frankrike och kejsaren i det andra. Dem fördrag kallas Westfaliska freden.


1 Karta över Europa år 1648, efter Westfaliska freden.

Den andliga och materiella kulturen
Gymnasier inrättades på Johannnes Rudbeckius initiativ, och Uppsala universitetet, till vars återställande en svag början hade gjorts 1595, fick utvecklingsmöjligheter och ekonomisk trygghet
Genom att prokansler ärkebiskop Petrus Kenicius förmådde Gustav II Adolf att göra en storartad donation 1624 från de Gustavianska arvegodsen.
Tartu universitet grundades 1632, Kungliga Akademien i Åbo 1640 och Lunds universitet 1666, för främjande av svensk odling i Finland och skånska proviserna.
Under trettioåriga kriget blev Sverige öppet för inflytande från andra europeiska länders kulturliv, sedan början svensk poesi och svensk vetenskap.
Genom åtgärder i merkantilsystemets anda och genom öppenhet mot utlänningar med större affärsvana, hantverkskunnande och yrkesskicklighet än dåtidens svenskar, uppmuntrade Gustav II Adolf och Kristinas förmyndarregering utvecklingen av Sverige.
Införandet av nya metoder i järntillverkningen grundlade den stormaktsställning Sverige skulle få och behålla länge i denna bransch.
De första ansatserna till svensk fabriksindustri gjordes, handeln fick ett stort uppsving och med den även stadsväsendet, något som i synnerhet gagnade Stockholm. Först med denna utveckling, och genom landets styrelsecentralisering, blev Stockholm nu rikets verkliga huvustad.

Stormaktsväldets undergång, det stora nordiska kriget
I 1700 Danmark, Polen och Ryssland tillsammans förklarat krig.
Ryssland hade tagit i besittning av flera städer vid Östersjön. Istället för att försöka återta städerna, Karl XII valde att marschera direkt på Moskva. Men på grund av extrema väderförhållanden, svårigheter med sina matarledningar och den ryska brända jordens strategi, var han tvungen att vända sig mot Ukraina. I 1709 var den svenska armén besegrades och fångade i slaget vid Poltava.
I följande åren, Ryssland ockuperade östra halvan av Sverige (dagens Finland).
Trots motgångar, Karl XII försökt att invadera Norge att tvinga Danmark-Norge ur kriget igen två gånger. Den 30 november 1718, Karl XII under belägringen av Fredriksten dog. Med hans död, svenska krigsansträngningarna kom främst att stanna, men Ryssland fortsatte att trakassera civilbefolkningen i de svenska kustområdena tills den avslutande Freden i Nystad undertecknades slutligen i 1721. Sverige skulle förbli en regional stormakt med varierande framgång tills 19 talet, men det stora nordiska kriget satte stopp för Sveriges tid som stormakt.


viernes, 7 de octubre de 2016

Renegación metafisica

El "lector" y amigo Martín nos envía una carta, leámosla.

<carta>

Tal vez sea que me estoy poniendo grande y me molesta todo cada día más, pero voy a tomar el riesgo de estar equivocado y expresar el siguiente pensamiento: la gente se queja por todo. A toda hora. Por todos los medios. Será que hoy con el florecimiento de las redes sociales uno accede a una opinión ajena que de otro modo quedaría reservada a entornos menos extensivos (y nótese que no uso la expresión "más privado"). La verdad no lo sé. Pero les aseguro que mi enfoque es otro, hablo del día a día. Voy a incluirme porque si hay algo que los que me conocen pueden decir de mí, es que soy un quejoso. La gente se vive quejando. Es un hecho. Se queja de todo. ¿Por qué? No sé, que me ayude un sociólogo. Me inclino a pensar en dos grandes factores determinantes. Es gratis y está de moda. ¿Cómo resistirse? Quejarse no tiene costo. No demanda un esfuerzo significativo más que hablar o escribir. (Y sabemos lo sueltas de lengua/dedos que son muchas personas) Ojo, oficialistas y opositores, no traten de llevar este arroyito para su molino pues a ambos bandos les cabe el poncho. Todos se quejan. Hacer cuesta más. Y creo que por ahí viene el asunto. Quejarse no es constructivo. No es nada. Hacer, hacer implica compromiso, cambiar lo que no nos gusta implica elaboración, esfuerzo y trabajo que parece que no estamos dispuestos a enfrentar porque estamos ocupados quejándonos o vaya alguien a saber qué. Cambiar el entorno y cambiar uno mismo requiere voluntad y decisión. Quejarse es más fácil y más exitoso, o por lo menos es más difícil fallar en la queja. "Mi jefe es un pel...ado". Nunca pasó.

Martín.
Quejoso de Facto.

</carta>

Primero te quiero pedir disculpas por lo tarde que publique esto, la verdad, me habia olvidado.
Es verdad que el quejarse implica un gasto energético mucho menor que enfrentarse a los problemas, sin ningún respaldo científico, así lo siento después de una vida de quejarme de mil cosas y solo arreglar un par.
Creo, y solo es un pensamiento, que no hay nada que hacer con esto, más que hacer introspección en nuestros propios actos para tratar de no quejarnos para pasar a arreglar lo que este mal y capaz hacer algo de nuestras vidas.

Gracias por pasar por el blog.

jueves, 6 de octubre de 2016

Arduino con AccelStepper, CNCShield y bluetooth HC-06

Estos últimos meses estuve trabajando con un Arduino uno para mover unos motores enviando información desde Android a través de bluetooth.
Me encontré con muchas dificultades, por ejemplo, que los tutoriales que conseguís por internet suponen que uno tiene cierta idea de lo que hace, que no es mi caso, así que aquí vengo a compartir mi experiencia y el producto terminado.



(el modulo bluetooth esta enchufado en cualquier lado porque estaba probando si podía usarlo con otros pines, al final se enchufa en los Rx y Tx del shield)

Terminología:
* MD - modulo bluetooth
* Pasos – los motores estos funcionan con pasos, vos le mandas una señal y estos se mueven un paso, si le mandas otra, se mueve otro paso, si le mandas las señales rápido se mueve rápido.

1.Rx y Tx no son nombres de canales.
los pines 0 y 1 (Rx y Tx), se utilizan para enviar y recibir información, pero no es simplemente un nombre, si vos unís el pin Rx del MD al Rx del Arduino no funciona, porque Rx significa que ese pin recibe información por lo tanto hay que unirlo con el Tx que envía información.

2.La información de la computadora al Arduino van por los pines Rx y Tx.
Si enchufan el MD a estos pines mientras el Arduino esta enchufado por usb a una computadora no van a poder subir el código al Arduino y tampoco va a andar la conexión entre el MD y el Arduino, esto se puede solucionar enchufando el MD a otros pines, pero yo tenía un shield enchufado al Arduino y no era tan fácil saber que pin va a qué lado así que desenchufo los Tx y Rx cuando necesito subir código. Para que el Arduino funcione con el MD la corriente se la doy enchufando el usb a la pared, con un cargador de celular.

3.El cable marcado de los transformadores es el positivo.
Eso, el shield toma la alimentación desde un transformador de, tene4 que pelar los cables y enchufarlo, si lo ponen al revés queman el fusible (creo, se me rompió y me lo arreglaron cambiando algo).

4.GRBL es demasiado extensa.
la librería GRBL es muy buena, vos la subís al Arduino y funciona, le pasas comandos y los ejecuta y si querés pasarle los comandos por MD solo tenés que enchufarlo y mandárselos con un '\n' al final y si la transmisión serial de datos del MD es diferente a la que tiene el GRBL por defecto hay que cambiarla en config.h y listo. Pero es muy difícil de entender y no pude extenderla, de fábrica podés usar 3 motores, 4 con un poco de trabajo creo pero yo necesitaba 5, así que tuve que cambiar a AccelStepper que es más simple y no tiene restricciones de cantidad.

5.No es tan fácil.
Para hacer funcionar algo necesitas mínimo saber a qué pines se conecta para mandar la señal, pero si tenés un shield que te acomoda los pines no sabes cuál es cual. ¿la solución? que alguien que sepa te ayude; o estudiar, no sé. pero yo tuve que ir a un proveedor de Arduinos para que me ayude a saber que pines iban a los motores para usarlos en el código y el con un tester fue siguiendo los pines y me dio los números.

Abajo les paso el código terminado, pero antes les explico algunas cosas.
AccelStepper es una librería que te enmascara la cosa rara de Arduino y te lo presenta como objetos, pero el Arduino no tiene hilos, no pod´es decirle a un motor que corra y listo, lo que Arduino te provee es un método que se llama constantemente, ahí ponemos nuestra lógica y ahí llamamos al método run de cada motor, este método moverá el motor si fuese necesario pero hay que llamarlo lo más posible porque si no los motores se podrían perder pasos funcionando mal, cosa que me paso al querer llamar a GetLine(), que esperaba comandos y los motores no recibían las señales con la rapidez necesaria, así que cree una variable working para que no se llamara a GetLine() si algún  motor estaba corriendo. Pero al hacer esto descubrí que el Arduino tiene un buffer, así que, si vos le mandabas dos veces el movimiento de un motor, al terminar de moverse comenzaría de vuelta y yo lo que quería es que si mandas un comando mientras otro esta en ejecución devuelva un error, así que cuando esta working leemos desde MD, pero no hacemos nada, salvo que llegue un '\n' entonces mandamos un error ya que significa que alguien mando un comando.


#include <AccelStepper.h>
#include <SoftwareSerial.h>


AccelStepper Xaxis(1, 2, 5); // pin 2 = step, pin 5 = direction
AccelStepper Yaxis(1, 3, 6); // pin 3 = step, pin 6 = direction
AccelStepper Zaxis(1, 4, 7); // pin 4 = step, pin 7 = direction
AccelStepper Aaxis(1, 12, 13); // pin 12 = step, pin 13 = direction
bool working = false;
char separator = ':';
char valueSeparator = ',';
SoftwareSerial BT1(0,1);

void setup() {
  BT1.begin(9600);
  Xaxis.setMaxSpeed(1200);
  Yaxis.setMaxSpeed(1200);
  Zaxis.setMaxSpeed(1200);
  Aaxis.setMaxSpeed(1200);
  Xaxis.setAcceleration(400);
  Yaxis.setAcceleration(400);
  Zaxis.setAcceleration(400);
  Aaxis.setAcceleration(400);
  Xaxis.setEnablePin(8);
  Yaxis.setEnablePin(8);
  Zaxis.setEnablePin(8);
  Aaxis.setEnablePin(8);
  Xaxis.setPinsInverted(false, false, true);
  Zaxis.setPinsInverted(false, false, true);
  Yaxis.setPinsInverted(false, false, true);
  Aaxis.setPinsInverted(false, false, true);
  Xaxis.enableOutputs();
  Zaxis.enableOutputs();
  Yaxis.enableOutputs();
  Aaxis.enableOutputs();
}
//multiple(m)||simple(s):motors(x|x,y,...):steps:velocity:acceleration
void loop() {

  if (BT1.available())
  {
    if(!working){
//si no hay motores en movimiento, esperamos a que el comando entre
      String S = GetLine();
      working=true;
      motorsParse(S);
    }
    else{
      char c = BT1.read();//tiramos a la mierda el buffer
      if(c == '\n'){
        //alguien mando un comando, le decimos que estamos ocupados
        BT1.println("busy");
      }
    }
  }

    Xaxis.run();
    Zaxis.run();
    Yaxis.run();
    Aaxis.run();
    if(Xaxis.distanceToGo()==0&&Yaxis.distanceToGo()==0&&Zaxis.distanceToGo()==0&&Aaxis.distanceToGo()==0){
//ya ningun motor se mueve, ponemos working en false para que espere al proximo comando
      working = false;
      Xaxis.disableOutputs();
      Zaxis.disableOutputs();
      Yaxis.disableOutputs();
      Aaxis.disableOutputs();
    }
     
}
void motorsParse(String input){
  int sepIndex = input.indexOf(separator);
  int secondSepIndex = input.indexOf(separator, sepIndex+1);
  int thirdSepIndex = input.indexOf(separator, secondSepIndex+1);
  int fourthSepIndex = input.indexOf(separator, thirdSepIndex+1);
 
  char moveType = input.substring(0, sepIndex).charAt(0);
  String motors = input.substring(sepIndex+1, secondSepIndex);
  long steps = input.substring(secondSepIndex+1, thirdSepIndex).toInt();
  long velocityx100 = input.substring(thirdSepIndex+1, fourthSepIndex).toInt();
  long accelerationx100 = input.substring(fourthSepIndex+1).toInt();

  if(moveMotors(moveType, motors, steps, velocityx100, accelerationx100)){
    BT1.println("ok");
  }else{
    BT1.println("error");
  }
}

bool moveMotors(char moveType, String motors, long steps, long velocityx100, long accelerationx100){
  if(steps == 0 || velocityx100 == 0 || accelerationx100 == 0){
    return false;
  }
  char motorArray[5]  = {motors.charAt(0), separator, separator, separator, separator};// como mucho son 4 motores y el : para marcar el fin
  if(moveType == 's'){
    //ya esta inicializado arrba el array de motores si es para un solo motor
  }else{
    if(moveType == 'm'){
      int i = 0;
      String value = getValue(motors, valueSeparator, i);
      while(value != ""){
        motorArray[i] = value.charAt(0);
        i++;
        value = getValue(motors, valueSeparator, i);
      }
    }
  }
  int j = 0;
  bool terminar = false;
  while (!terminar){
    char currentMotor = motorArray[j];  
    j++;
    terminar =  (motorArray[j] == separator);
    if(currentMotor == 'x'){
      Xaxis.enableOutputs();
      Xaxis.setMaxSpeed(velocityx100/100);
//mando los numeros multiplicados x 100 para no andar con decimales
      Xaxis.setAcceleration(accelerationx100/100);
      Xaxis.move(steps);
    }else{
      if(currentMotor == 'z'){
        Zaxis.enableOutputs();
        Zaxis.setMaxSpeed(velocityx100/100);
        Zaxis.setAcceleration(accelerationx100/100);
        Zaxis.move(steps);
      }else{
        if(currentMotor == 'y'){
          Yaxis.enableOutputs();
          Yaxis.setMaxSpeed(velocityx100/100);
          Yaxis.setAcceleration(accelerationx100/100);
          Yaxis.move(steps);
        }else{
          if(currentMotor == 'a'){
            Aaxis.enableOutputs();
            Aaxis.setMaxSpeed(velocityx100/100);
            Aaxis.setAcceleration(accelerationx100/100);
            Aaxis.move(steps);
          }else{
            // ningun motor conocido
            return false;
          }
        }
      }
    }
  }
  return true;
}

String GetLine()
{  
  String S = "" ;
  if (BT1.available())
  {
    char c = BT1.read(); ;
    while ( c != '\n')            //Hasta que el caracter sea intro
    {
      S = S + c ;
      delay(25) ;
      c = BT1.read();
    }
    return(S) ;
  }
}

String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {
    0, -1  };
  int maxIndex = data.length()-1;
  for(int i=0; i<=maxIndex && found<=index; i++){
    if(data.charAt(i)==separator || i==maxIndex){
      found++;
      strIndex[0] = strIndex[1]+1;
      strIndex[1] = (i == maxIndex) ? i+1 : i;
    }
  }
  return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}