Ir ao conteúdo
  • Cadastre-se

Arduino Função ler cada letra de uma string e retornar o valor ascii ou binario da mesma


Posts recomendados

Boa Tarde

Eu Preciso fazer uma função, até sei a lógica dela, mas não estou achando as funções que devo usar na IDE do arduino:

A função executará um laço de repetição pegando cada uma das letras de uma String, e deverá retornar o valor na tabela ascII ou binário desta letra para uma 2ª função

Seria algo assim

função (texto)
repita A de 1 até [numero de caracteres de texto]
letra recebe o A caracter de texto
pegar o caractere ASC ou Binário  da letra

executar a função com o resultado
fim do repita
fim da funçaõ

o número de caracteres, pelo que vi eu devo usar a função sizeof(texto)
Quanto a tabela ascII, eu achei esse código: https://www.arduino.cc/en/Tutorial/BuiltInExamples/ASCIITable, mas não entendi como colocar essa função que no exemplo é escrita numa variável.

Link para o comentário
Compartilhar em outros sites

Não sei nada de arduino, mas pelo meus conhecimentos em linguagem c acredito que seria algo assim:

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // prints title with ending line break
  Serial.println("ASCII Table ~ Character Map");
}

char[6] texto = "Teste";
int i = 0;

void loop() {

  Serial.write(texto[i]);

  Serial.print(", dec: ");
  Serial.print(texto[i]);
  Serial.print(", hex: ");
  Serial.print(texto[i], HEX);
  Serial.print(", oct: ");
  Serial.print(thisByte, OCT);
  Serial.print(", bin: ");
  Serial.println(texto[i], BIN);

  if (texto[i] == '\0') {     // you could also use if (thisByte == '~') {
    // This loop loops forever and does nothing
    while (true) {
      continue;
    }
  }
  // go on to the next character
  i++;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Eu queria isso em variável e não imprimindo no Serial. Mas descobri que se ponho um char pro int "salva" o numero na variável.
Ficou assim se alguém precisar no para algo no futuro
 

void escreve(String texto){ 
  for (byte i = 0; i < texto.length() ; i++) {
    char caracter = texto.charAt(i);
    int asccar = caracter;
  }
}



 

Link para o comentário
Compartilhar em outros sites

Me surgiu mais um probleminha na execução do projeto que usei esta função
Com a função que coloquei acima estou escrevendo num lcd, s/ a biblioteca (necessidade chata do projeto, quem leu meus outros topicos e/ou me ajudou já deve saber porque).
Ocorre que a colocação dos caracteres dos f... disp0lays não é linear..........

Eu já tenho uma lógica na cabeça do que fazer. Só me falta 1 peça.
Normalmente se escreve texto entre aspas num comando e depois se manda escrever a variavel em outro comando. (como no exemplo acima)

Se eu tiver uma string por linha será relativamente simples eu fazer um laço que escreva o display inteiro como quero, mas tem que escrever todo ele de 1 vez.
Mas para isso eu preciso somar tudo isso em uma única variável string,

Tipo, eu quero escrever: "Posição" e depois a variavel pos que tem o valor 12

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Sim você pode criar sua própria função escreve no display (como fiz há anos) uma pra texto e outra pra decimal mas na atual conjuntura não vale a pena...

2 horas atrás, Thiago Miotto disse:

necessidade chata do projeto, quem leu meus outros topicos e/ou me ajudou já deve saber porque

Talvez eu tenha visto mas não lembro o porque. Apresente argumentos fortes e convincentes contra usar as libs prontas.

Link para o comentário
Compartilhar em outros sites

39 minutos atrás, if. disse:

Sim você pode criar sua própria função escreve no display (como fiz há anos) uma pra texto e outra pra decimal mas na atual conjuntura não vale a pena...

Talvez eu tenha visto mas não lembro o porque. Apresente argumentos fortes e convincentes contra usar as libs prontas.

É o projeto que usa a placa de interface que tem um hex inverter e que inverte todos os sinais que chegam em 2 hc74hc, que tive que fazer um shiftout com sinais trocados
Os comandos desse shiftout vão a um lcd. Você mesmo deu a melhor solução para mim aqui no forum:


No caso de um display 16x01 s/ scroll, aparece os 1ºs 8 caracteres, depois os caracteres ficam somente na RAM, sem aparecer, e só voltará a parecer o 30 caracter.
No caso de um display 20x4, pelo que vi pesquisando ontem, se preenche a 1ª linha, depois a 3ª, depois a 2ª, depois a 4ª.

Se eu tiver todas as strings do display bonitinhas, é relativamente fácil fazer o for que vai preenchendo cada coisa no seu devido lugar.

 

26 minutos atrás, Flávio Pedroza disse:

Não sei se essa era sua dúvida, mas você pode transformar um número em string e depois concatená-lo a outra string;



int x = 12
String pos = "Posicao ";
String num = String(x);
pos = pos + num;

na String pos terá "Posição 12".

Estou desenvolvendo este projeto em casa, e só vou poder testar hj a noite, mas tb creio que é isso mesmo.


Hj a noite verei se da certo e posto aqui o resultado para que fique documentado se alguém tiver futuras duvidas e cair aqui.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
3 horas atrás, Thiago Miotto disse:

fazer um shiftout com sinais trocados
Os comandos desse shiftout vão a um lcd

Jamais ia adivinhar que era pro lcd. E se já mencionou isso, tô nem aí se esqueci... nem queira me lembrar...

 

Ok eu até poderia te mostrar meu fonte de anos atrás que escrevia na raça e coragem no display.  Mas ia drenar muita energia nossa pra sintonizar. Acompanhe a 'ideota': ...

 

Localize onde está sua lib liquidcrystal.h e faça as alterações algo como

(esta mrd é c++ que entendo paul newman)

void LiquidCrystal::init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
			 uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
			 uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
{
  _rs_pin = !rs;
  _rw_pin = !rw;
  _enable_pin = !enable;
  
  _data_pins[0] = !d0;
  _data_pins[1] = !d1;
  _data_pins[2] = !d2;
  _data_pins[3] = !d3; 
  _data_pins[4] = !d4;
  _data_pins[5] = !d5;
  _data_pins[6] = !d6;
  _data_pins[7] = !d7; 

  if (fourbitmode)
    _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
  else 
    _displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS;
  
  begin(16, 1);  
}

 

Perceba que alterei de

_data_pins[x] = dx;

para

_data_pins[x] = !dx ou se o compilador chiar mude para

_data_pins[0] = ~d0;

 

Faça o mesmo pras funções que escrevem no display

 

Eis a camada mais baixa da lib - está no final... inverta com ! ou ~ e LOW <--> HIGH

 

void LiquidCrystal::send(uint8_t value, uint8_t mode) {
  digitalWrite(_rs_pin, mode);

  // if there is a RW pin indicated, set it low to Write
  if (_rw_pin != 255) { 
    digitalWrite(_rw_pin, LOW);
  }
  
  if (_displayfunction & LCD_8BITMODE) {
    write8bits(value); 
  } else {
    write4bits(value>>4);
    write4bits(value);
  }
}

void LiquidCrystal::pulseEnable(void) {
  digitalWrite(_enable_pin, LOW);
  delayMicroseconds(1);    
  digitalWrite(_enable_pin, HIGH);
  delayMicroseconds(1);    // enable pulse must be >450ns
  digitalWrite(_enable_pin, LOW);
  delayMicroseconds(100);   // commands need > 37us to settle
}

void LiquidCrystal::write4bits(uint8_t value) {
  for (int i = 0; i < 4; i++) {
    digitalWrite(_data_pins[i], (value >> i) & 0x01);
  }

  pulseEnable();
}

void LiquidCrystal::write8bits(uint8_t value) {
  for (int i = 0; i < 8; i++) {
    digitalWrite(_data_pins[i], (value >> i) & 0x01);
  }
  
  pulseEnable();
}

 

Lembre-se que se mudar e der certo, a lib estará contaminada e vai ser só pra este projeto doidão invertido

Link para o comentário
Compartilhar em outros sites

10 horas atrás, if. disse:

Jamais ia adivinhar que era pro lcd. E se já mencionou isso, tô nem aí se esqueci... nem queira me lembrar...

 

Ok eu até poderia te mostrar meu fonte de anos atrás que escrevia na raça e coragem no display.  Mas ia drenar muita energia nossa pra sintonizar. Acompanhe a 'ideota': ...

 

Localize onde está sua lib liquidcrystal.h e faça as alterações algo como

(esta mrd é c++ que entendo paul newman)


void LiquidCrystal::init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
			 uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
			 uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
{
  _rs_pin = !rs;
  _rw_pin = !rw;
  _enable_pin = !enable;
  
  _data_pins[0] = !d0;
  _data_pins[1] = !d1;
  _data_pins[2] = !d2;
  _data_pins[3] = !d3; 
  _data_pins[4] = !d4;
  _data_pins[5] = !d5;
  _data_pins[6] = !d6;
  _data_pins[7] = !d7; 

  if (fourbitmode)
    _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
  else 
    _displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS;
  
  begin(16, 1);  
}

 

Perceba que alterei de

_data_pins[x] = dx;

para

_data_pins[x] = !dx ou se o compilador chiar mude para

_data_pins[0] = ~d0;

 

Faça o mesmo pras funções que escrevem no display

 

Eis a camada mais baixa da lib - está no final... inverta com ! ou ~ e LOW <--> HIGH

 


void LiquidCrystal::send(uint8_t value, uint8_t mode) {
  digitalWrite(_rs_pin, mode);

  // if there is a RW pin indicated, set it low to Write
  if (_rw_pin != 255) { 
    digitalWrite(_rw_pin, LOW);
  }
  
  if (_displayfunction & LCD_8BITMODE) {
    write8bits(value); 
  } else {
    write4bits(value>>4);
    write4bits(value);
  }
}

void LiquidCrystal::pulseEnable(void) {
  digitalWrite(_enable_pin, LOW);
  delayMicroseconds(1);    
  digitalWrite(_enable_pin, HIGH);
  delayMicroseconds(1);    // enable pulse must be >450ns
  digitalWrite(_enable_pin, LOW);
  delayMicroseconds(100);   // commands need > 37us to settle
}

void LiquidCrystal::write4bits(uint8_t value) {
  for (int i = 0; i < 4; i++) {
    digitalWrite(_data_pins[i], (value >> i) & 0x01);
  }

  pulseEnable();
}

void LiquidCrystal::write8bits(uint8_t value) {
  for (int i = 0; i < 8; i++) {
    digitalWrite(_data_pins[i], (value >> i) & 0x01);
  }
  
  pulseEnable();
}

 

Lembre-se que se mudar e der certo, a lib estará contaminada e vai ser só pra este projeto doidão invertido

Seria uma boa solução, mas agora o trabalho todo está feito......

adicionado 8 minutos depois

Para documentação no futuro. Para "somar" Strings no arduino você usa a função String(), como eu demonstro abaixo.
 

linha1="Novo";
linha1= String(linha1 + " teste");
linha1= String(linha1 + String(regis[1])+ String(23));



Se algum louco precisar fazer a mesma coisa, só usar aqui. Para 16x01 pelo menos.
 

void escreve(String texto){ 
  regis[10]=1;
  for (byte i = 0; i < texto.length() ; i++) {
    if (i == 8) { // se chegar no caracter 9, dá 32 espaços
      regis[0]=0;
      regis[1]=0;
      regis[2]=0;
      regis[3]=0;
      regis[4]=0;
      regis[5]=1;
      regis[6]=0;
      regis[7]=0; // espaco
      for (byte j = 1; j <= 32; j++) {
        changeValues();
      }
    }
    char caracter = texto.charAt(i);
    int asccar = caracter;
    
    regis[0]=asccar % 2;
    regis[1]=(asccar / 2) % 2;
    regis[2]=(asccar / 4) % 2;
    regis[3]=(asccar / 8) % 2;
    regis[4]=(asccar / 16) % 2;
    regis[5]=(asccar / 32) % 2;
    regis[6]=(asccar / 64) % 2;
    regis[7]=(asccar / 128) % 2; // trasnforma o numero asc em decimal

    changeValues();
    
  }

}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...