Separar Caracteres y convertirlos a Int

Buenas ¡¡

a ver si me pueden ayudar diciendome la mejor manera de hacer esto :

basicamente lo que quiero es mandar un string a arduino tipo :

con 6 valores que irian cambiando podria ser ( 122,133,255,12,80,47)

estos valores tendrian que ser separados para que afectaran el cambio de pwm de los 6 pwm pines .

el problema es que no se cual es la mejor manera , he intentado por un lado esto

int pins[] = {11,10,9};
int input[3];

void setup () {
 
 Serial.begin(9600);//starts serial at 9600
 
  }

void loop () {
  
  
  if (Serial.available() >= 3)  {
 for ( int i = 0; i < 3; i++)
    analogWrite(pins[i],Serial.read());
}
  

delay(10); // wait 10 milliseconds
}

le mando los 3 valores en ascii desde vvvv , esto solo funciona si cambio los valores por separado si estan todos cambiando se vuelve loquito .

el segundo intento es usando char , aqui encontre varias dificultades : primero como separar los valores encontre este codigo http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1226107230 que lo hace :

#include <string.h>

char sz[] = "Here; is some; sample;100;data;1.414;1020";
void setup()
{
 char *p = sz;
 char *str;
 Serial.begin(9600);
 while ((str = strtok_r(p, ";", &p)) != NULL) // delimiter is the semicolon
   Serial.println(str);
}

void loop(){}

luego intente ponerlo en el void loop , pasarlo a int y printearlo el codigo carga pero no va intente de varias maneras lo cargaba simepre pero nada asi que ando perdido en este tema , este fue el ultimo intento debe de estar fatal pero ahi lo pego

#include <string.h>

char theString [] = "122;255;20;100;180;50;";

int charToInt[6];

void setup()
{

 Serial.begin(9600);
 
}

void loop(){


char *p = theString;
char *str;



while ((str = strtok_r(p, ";", &p)) != NULL) // delimiter is the semicolon

 for (int i=0; i <= 6; i++){
     
int charToInt = atoi(str);

Serial.println(charToInt,i); 

}
 
 
 }

quizas el tema de los char tampoco sea la mejor manera , vi que en el codigo de sympleMessageSystem Arduino Playground - SimpleMessageSystem usan tambien en el .cpp strtok_r para separar los valores .

saludines y gracias :slight_smile:

La verdad es que me he liado con lo que quieres hacer, ¿que es vvvv?.

Mirando por encima el primer ejemplo, que por lo que dices, casi te funciona, pienso que te falta unos pinMode en el setup.

Buenas Javier , gracia por tu respuesta ,

lo que quiero hacer es mandar 6 valores desde vvvv para cambiar el pwm de arduino sin necesidad de usar firmata simplemessage etc , normalemente intento personalizar el codigo segun necesidad normalmente son entradas y esto si es bien sencillo pero el tema de mandar de fuera y recibir en arduino lo llevo mas flojillo .

upps la verdad es que se me ha olvidado poner el modo pero parece que arduino lo ha descifrado solo , aun asi ese no es el problema .

probare algunas cosas mas uasndo el primer codigo aunque la realidad es que me gustaria saber usar en condiciones el tema de dividir el texto pasarlo a int y aplicarselo a los pines .

un saludo

¿Pero que es vvvv?

He vuelto a mirar tu código. Y veo un problema. El que estes mandado los datos separados por un delimitador indica que estas mandando caracteres ASCII. No estas haciendo conversion de ASCII a enteros, por eso no te funciona.

disculpa deberia de haber puesto algun enlace pero pensaba que ya era lo bastante conocido , http://www.arduino.cc/es/Vvvv/ArduinoVvvv , igualmente el codigo en arduino seria el mismo independientemente del software esterno . chaito

Pues no lo conocia. Pero vamos, que el problema es lo que te he dicho antes de la conversión de ASCII a int. He visto que recomiendan utilizar SimpleMessangeSystem para interactuar con vvvv.

hola de nuevo y gracias por ojearlo , en que codigo dices que no cambio a ascii , si te refieres al primero , eso lo hago desde vvvv y funciona simepre y cuando no mande mas de dos valores a la vez.

y si te refieres al tercero todavia no estoy mandando nada desde fuera solo intento saber primero como separar un texto saber cuando el texto llega completo pasarlo a int y usar esos valores , realmente lo que necesito es un tokenicer o algun objeto similar pero creo que no hay asi que creo que la manera para lo del texto es usar strtok_r decirle con (CR) o similar cuando se termina el mensaje separarlo guardarlo en algun sitio pasarlo a int y demas . el que caso es que me interesaria aprender el segundo metodo usando strtok_r .

a ver si alguien pudiera explicarmelo ?

respecto a usar simplemessagesytem es lo que intento evitar ya que prefiero como te decia personalizar cada codigo para su finalidad , y en este caso solo necesito mandar 6 valores para pwm desde vvvv .

saludos y gracias :slight_smile:

ok , la primera manera mandando bytes ya me funciona este es el codigo

int fanPin[] = {3,5,6,9,10,11}; 



int recivingValues[6]; 
 
void setup() {
 
  Serial.begin(115200);
 
  for (int i=0; i<6; i++) {
    pinMode(fanPin[i], OUTPUT);
  
  }
}
 
void loop() {
  
  if (Serial.available() >= 6) {
    
    for (int i=0; i<6; i++) {
     
      recivingValues[i] = Serial.read();
      analogWrite(fanPin[i], recivingValues[i]);
      
    }
  }
 
}

ahora me gustaria aprender como hacer la segunda manera usando strtok_r y atoi alguien por aqui sabe como ?

un saludo que pasen buen dia ;D

hola , ya he conseguido separar los caracteres convertirlos en ints y pasarselos a pwm de tres pines solo me falta la parte para leer un string por el puerto serie que vendra algo como esto "234,22,121/r"; osea tres valores y un CR al final . asi que supongo que seria leerlo hasta que llegue el CR luego quitarle el CR y pasarselo a strtok para que los separe . cual seria la mejor manera he probado varias cosas pero no me van bien .

aqui os pongo el codigo que funciona y que le falta el ultimo paso

#include <string.h>
#include <stdio.h> 
#include <stdlib.h>

int input []= {11,10,9} ;
int values []= {0,0,0} ;


void setup()
{

 Serial.begin(9600);
 
}

     void loop(){
   
  
     char signal[] = "125 0 255";    // esto es lo que tengo que cambiar por lo que venga del puerto serie 
     
     
     char separator[] = " ";         // el caracter que uso para separar los valores 
    
     char *result = NULL;
     int index = 0;
    
     result = strtok( signal, separator );   // aqui se separan los caracteres 
     while( (result != NULL) && (index < 3) ) {
     Serial.print(  result );
     Serial.println( );
     values[index++] = atoi(result);    // aqui se convierten en valores 
    
     
        for ( int i = 0; i < 3; i++){
        
        analogWrite(input[i],values[i]);

        }
     result = strtok( NULL, separator );
     }
}

segun he leido esto valdria para quitar el CR del final

string[strlen(string)] = '/0';

supongo que la manera del leer el serial para captar el string seria algo parecido a esto pero he sabido hacerlo correctamente todavia

int availableBytes = Serial.available();
for(int i=0; i<availableBytes; i++)
{
    string[i] = Serial.read();
    
}

chao :wink: