Como converter int em string no Arduino?


90

Como faço para converter um int,, nem uma string para que, quando eu enviar pela serial, ele seja enviado como uma string?

Isso é o que eu tenho até agora:

int ledPin=13;
int testerPin=8;
int n=1;

char buf[10];

void setup()
{
    pinMode(ledPin, OUTPUT);
    pinMode(testerPin, OUTPUT);
    Serial.begin(115200);
}

void loop()
{
    digitalWrite(ledPin, HIGH);
    sprintf(buf, "Hello!%d", n);
    Serial.println(buf);
    delay(500);
    digitalWrite(ledPin, LOW);
    delay(500);

    n++;
}

3
@Pubby "printf () torna seu objeto executável ~ 1000 bytes maior, então você pode não querer usá-lo se o tamanho for um problema." playground.arduino.cc/Main/Printf
Marcello Romani

Respostas:


129

Use assim:

String myString = String(n);

Você pode encontrar mais exemplos aqui .


2
Você não precisa usar um objeto String, Serial.print ou println já os converte!
Alexis Paques

Estou procurando uma maneira de converter 97 em 'um' caractere ou 65 em 'A'. Quero dizer número ASCII para caractere. Descobri que esta forma não funciona.
Oki Erie Rinaldi

@OkiErieRinaldi: Você pode usar - char bar = 97; vai funcionar.
Cassio

25

use a itoa()função incluída emstdlib.h

char buffer[7];         //the ASCII of the integer will be stored in this char array
itoa(-31596,buffer,10); //(integer, yourBuffer, base)


13

Você só precisa envolvê-lo em um objeto String como este:

String numberString = String(n);

Você também pode fazer:

String stringOne = "Hello String";                     // using a constant String
String stringOne =  String('a');                       // converting a constant char into a String
String stringTwo =  String("This is a string");        // converting a constant string into a String object
String stringOne =  String(stringTwo + " with more");  // concatenating two strings
String stringOne =  String(13);                        // using a constant integer
String stringOne =  String(analogRead(0), DEC);        // using an int and a base
String stringOne =  String(45, HEX);                   // using an int and a base (hexadecimal)
String stringOne =  String(255, BIN);                  // using an int and a base (binary)
String stringOne =  String(millis(), DEC);             // using a long and a base

9

Esta é uma solução com velocidade otimizada para converter int (inteiro de 16 bits com sinal) em string.

Essa implementação evita o uso de divisão, já que o AVR de 8 bits usado para Arduino não tem instrução DIV de hardware, o compilador traduz a divisão em subtrações repetitivas demoradas. Portanto, a solução mais rápida é usar ramificações condicionais para construir a string.

Um buffer fixo de 7 bytes preparado desde o início na RAM para evitar a alocação dinâmica. Como tem apenas 7 bytes, o custo do uso fixo de RAM é considerado mínimo. Para ajudar o compilador, adicionamos o modificador de registro na declaração da variável para acelerar a execução.

char _int2str[7];
char* int2str( register int i ) {
  register unsigned char L = 1;
  register char c;
  register boolean m = false;
  register char b;  // lower-byte of i
  // negative
  if ( i < 0 ) {
    _int2str[ 0 ] = '-';
    i = -i;
  }
  else L = 0;
  // ten-thousands
  if( i > 9999 ) {
    c = i < 20000 ? 1
      : i < 30000 ? 2
      : 3;
    _int2str[ L++ ] = c + 48;
    i -= c * 10000;
    m = true;
  }
  // thousands
  if( i > 999 ) {
    c = i < 5000
      ? ( i < 3000
          ? ( i < 2000 ? 1 : 2 )
          :   i < 4000 ? 3 : 4
        )
      : i < 8000
        ? ( i < 6000
            ? 5
            : i < 7000 ? 6 : 7
          )
        : i < 9000 ? 8 : 9;
    _int2str[ L++ ] = c + 48;
    i -= c * 1000;
    m = true;
  }
  else if( m ) _int2str[ L++ ] = '0';
  // hundreds
  if( i > 99 ) {
    c = i < 500
      ? ( i < 300
          ? ( i < 200 ? 1 : 2 )
          :   i < 400 ? 3 : 4
        )
      : i < 800
        ? ( i < 600
            ? 5
            : i < 700 ? 6 : 7
          )
        : i < 900 ? 8 : 9;
    _int2str[ L++ ] = c + 48;
    i -= c * 100;
    m = true;
  }
  else if( m ) _int2str[ L++ ] = '0';
  // decades (check on lower byte to optimize code)
  b = char( i );
  if( b > 9 ) {
    c = b < 50
      ? ( b < 30
          ? ( b < 20 ? 1 : 2 )
          :   b < 40 ? 3 : 4
        )
      : b < 80
        ? ( i < 60
            ? 5
            : i < 70 ? 6 : 7
          )
        : i < 90 ? 8 : 9;
    _int2str[ L++ ] = c + 48;
    b -= c * 10;
    m = true;
  }
  else if( m ) _int2str[ L++ ] = '0';
  // last digit
  _int2str[ L++ ] = b + 48;
  // null terminator
  _int2str[ L ] = 0;  
  return _int2str;
}

// Usage example:
int i = -12345;
char* s;
void setup() {
  s = int2str( i );
}
void loop() {}

Este esboço é compilado para 1.082 bytes de código usando avr-gcc que vem junto com o Arduino v1.0.5 (o tamanho da própria função int2str é 594 bytes). Em comparação com a solução que usa o objeto String que compilou em 2.398 bytes, esta implementação pode reduzir o tamanho do código em 1,2 Kb (assumindo que você não precisa de nenhum outro método de objeto String, e seu número é restrito ao tipo int assinado).

Essa função pode ser otimizada ainda mais, escrevendo-a no código assembler adequado.


1
Uma abordagem alternativa para evitar o DIV é multiplicar por (2 ^ N / 10) e, em seguida, deslocar para a direita por N bits. Portanto, para N = 16, x / 10 ~ = (x * 6554) >> 16. Perto o suficiente para a maioria dos dígitos, de qualquer maneira.
David R Tribble

1

A solução é muito grande. Experimente este simples. Forneça um buffer de 7 ou mais caracteres, sem verificação.

char *i2str(int i, char *buf){
  byte l=0;
  if(i<0) buf[l++]='-';
  boolean leadingZ=true;
  for(int div=10000, mod=0; div>0; div/=10){
    mod=i%div;
    i/=div;
    if(!leadingZ || i!=0){
       leadingZ=false;
       buf[l++]=i+'0';
    }
    i=mod;
  }
  buf[l]=0;
  return buf;
}

Pode ser facilmente modificado para dar o back end do buffer, se você descartar o índice 'l' e incrementar o buffer diretamente.


0

Aqui abaixo está um myitoa auto-composto () que é muito menor em código e reserva um array FIXED de 7 (incluindo terminação 0) em char * mystring, o que geralmente é desejável. É óbvio que se pode construir o código com deslocamento de caracteres em vez disso, se for necessário uma string de saída de comprimento variável.

void myitoa(int number, char *mystring) {
  boolean negative = number>0;

  mystring[0] = number<0? '-' : '+';
  number = number<0 ? -number : number;
  for (int n=5; n>0; n--) {
     mystring[n] = ' ';
     if(number > 0) mystring[n] = number%10 + 48;
     number /= 10;
  }  
  mystring[6]=0;
}


0

Isso simplesmente funciona para mim:

int bpm = 60;
char text[256];
sprintf(text, "Pulso: %d     ", bpm);
//now use text as string
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.