Ir ao conteúdo
  • Cadastre-se

Posts recomendados

Postado

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.

Postado

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
  • Membro VIP
Postado

De fato os bytes do char texto [6] = "Teste"; estão distribuídos em algo como:

texto[0]='T' (ascii do T), texto[1]='e',texto[2]='s' texto[3]='t',texto[4]='e',texto[5]=0

Postado

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;
  }
}



 

Postado

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

 

  • Membro VIP
Postado

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.

Postado

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".

Postado
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.

  • Membro VIP
Postado
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

Postado
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();
    
  }

}

 

  • Membro VIP
Postado

Apesar de aparentemente certo, estás a trilhar por um caminho mais longo. Espero que em breve descubra atalhos por si mesmo - que carinhosamente não lhos mostro 🙂

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...