Por favor, me ensinem, porque o sketch abaixo não funciona?

Exibições: 1295

As respostas para este tópico estão encerradas.

Respostas a este tópico

int leitura=0;
void setup(){
Serial.begin(9600);
Serial.println("digite 1 ou 2 e aperte enter");

}


void loop(){
if(Serial.available() >0){
leitura = Serial.read();
}
if(leitura=='1'){
Serial.println("vc digitou 1");
Serial.println("");

}
if(leitura == '2'){
Serial.println("vc digitou 2");
Serial.println("");
}
}

\\ espero ter te ajudado :D

Thomas,
Desculpe-me incomodá-lo novamente mas poderia me dizer
porque no sketch que você postou, ao executar, aparecem 5 vezes "vc digitou 1"
(usando 1).
Eu tenho semelhante que aparecem 4 vezes e se tirar "Serial.available"
aparece uma única vez.
Muitissimo obrigado

o motivo de não funcionar é o fato do void loop estar vazio o setup ele faz a leitura apenas uma vez enquanto o loop fica repetindo 

Obrigado Thomas mas note os seguintes sketches:

Ambos funcionam com loop vazio. Então quando funciona e quando não?

Murta;

Muito obrigado.

Conheço quase todos os links mas não me lembro exatamente em qual vi

superficialmente algo sobre "nuvem", que irei procurar novamente.

Mas o que estou pesquisando são as funções que funcionam no setup.

Já testei: for, delay e return as quais funcionaram e if que não funcionou.

Tenho muita curiosidade para saber porque o if  não funciona no setup

Vou continuar com outras.

É tudo puritanismo para eu fazer comparações com "main" do C.

Você vislumbra minha         utopia?

Teoricamente tudo funciona no setup(); 

O unico detalhe é que como no main(); vc não pode deixar terminar o programa, deve fazer ao final um loop infinito forçado.

A solução mais simples que o arduino adotou foi dividir em 2 funções. Uma para setup e outra para loop mas o loop fica em loop mesmo que vc não peça.

Possivelmente se vc desmontar o compilador (ou libs) vai descobrir que existe um main() que tem dentro um:

main()

{ setup();

  while(1) loop();

}

Ou algo assim.

Sobre o if, certamente funciona. No seu exemplo inicial o q ocorre com a leitura é que seu valor é atualizado somente se houver um novo caracter disponivel no buffer da serial (available). Se não tiver ele fica com o mesmo valor de antes. Imprimindo assim disparado.

Se vc quer que imprima somente uma vez mude o colchete para frente de forma que só seja executado o segundo if (==) se for encontrada a condição anterior (available).

A sua duvida é tipica de fundamentalista que busca argumentação. Em geral na informática a primeira tentativa é fazer do jeito que deve ser feito. Deixando as soluções criativas para caso não consiga do jeito certo. Assim se faz setup() para inicializações e loop() para o loop. Como um axioma.

Max

          Por favor da proxima vez, não coloque seu sketch como uma imagem, pois dá trabalho ficar digitando tudo de novo e ai o foco deixa ser de encontrar o erro.

   Bem, acho que ´que você quer tá nos sketchs abaixo.

Fiz de duas formas diferentes, escolhe a que achar mais legal

FORMA 1


    int mostre=1; // variavel simples que permitira mostrar o titulo apenas uma vez ao inves de ficar enchendo a tela
    int leitura=0;
    void setup(){
      Serial.begin(9600);
        while(true){     
 
  if(mostre==1){  
    Serial.println("digite 1 ou 2 e aperte enter");
    mostre=0;
  }
    if(Serial.available() > 0){
    leitura = Serial.read();
    mostre=1;
    }
    if(leitura=='1' ){
    Serial.println("vc digitou 1");
    Serial.println(" ");
    delay(500);
    leitura=0;
    }
    if(leitura == '2' ){
    Serial.println("vc digitou 2");
    Serial.println(" ");
    delay(500);
    leitura=0;
    }
    }
    }

    void loop(){}

FORMA 2


 
    int leitura=0;
    void setup(){
      Serial.begin(9600);
       

while(true){  

 Serial.println("digite 1 ou 2 e aperte enter");
   while( !Serial.available() ){}

    leitura = Serial.read();
 
    if(leitura=='1' ){
    Serial.println("vc digitou 1");
    Serial.println(" ");
    delay(500);
    leitura=0;
    }
    if(leitura == '2' ){
    Serial.println("vc digitou 2");
    Serial.println(" ");
    delay(500);
    leitura=0;
    }
    }
    }

    void loop(){}

Weider, Muito obrigado.
Qual seria a melhor forma de apresentar o sketch?
Alguém exigiu (bravo!) que eu postasse a imagem (não entendi)
Concordo contigo mas diga-me qual a melhor apresentação?
Quanto aos sketches irei, hoje, testá-los
Novamente obrigado

Max,

   Se você copiar da IDE do arduino e colar aqui tá de bom tamanho,  se for um sketch muuuuuito grande, ai você upa ele como arquivo anexo, mas no geral basta copiar e colar da IDE.

   Ah, essa segunda maneira que coloquei ai é a mais legal,  só deu o vacilo de esquecer de comentar, mas é porque eu resolvi o problema proposto quase 1 da matina, tava com sono, mas no geral o que fiz foi colocar um loop eterno com a função  while(true){}   isso fará com que o void setup passe a fazer o mesmo que o void loop faz, ou seja, fique em loop eterno.

  Fora isso no segundo exemplo coloquei um segundo while() aguardando algo da serial e ficando preso dentro de um loop até acontecer algo, quando acontece ele sai do loop e faz o que tiver abaixo, mas como ele ta dentro do while(true) ele entra em laço e volta a fazer tudo novamente.

   Sendo assim, se seu objetivo é deixar o void loop em branco, tá ai como é que se faz.

Weider

Tentei copiar e colar mas não consegui (copia mas não cola, não aparece 

a janela das opções).

Vou tentar novamente (sou muito lerdo)

Obrigado.

obs. tentei as duas opções e aparece depois da resposta,

duas vezes a frase "digite 1 ...."

Mudando Serial.println('digite.....") para imediatamente após "begin"

tudo ocorre corretamente.

Bom dia MW.

Não cole seu sketch na área de texto  do tópico.

Alem de perde a formatação pode perder caracter .

Ou anexe como um arquivo, ou post no www.pastebin.com, e post o link aqui.

RV

Faça o seguinte teste e entenderá o que estou dizendo:

Digite  um sinal de igual (=)  seguido de dois sinais de  menor (<) e dê " "adicionar resposta", e veja o que ocorre.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço