• Welcome to LusoRobótica - Robótica em Português.
 

Preciso de ajuda, com erro no código de uma bobinadeira.

Started by luisjustin, 29 de June de 2013, 06:05

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

luisjustin

Olá, venho pedir a ajuda de vocês sobre o código de uma bobinadeira que comecei a criar criar apenas o setup dela, mas como posso fazer para que isto funcione ele faça cada pergunta de uma vez e aguarde a resposta, geralmente em outras linguagens eu sempre fiz assim.


int M1A = 5;
int M1B = 6;
int M2A = 9;
int M2B = 10;
int ConfigStep = 0;
int Mm = 0;
int Voltas = 0;
int Speed = 0;

void setup(){
  Serial.begin(9600);
}

void loop(){
  if(Serial.available()){
   
    if(ConfigStep == 0){
      Serial.write("Insira a espessura do cabo em mm.");
      if(Serial.read()){
        Mm = (int)Serial.read();
        Serial.write("|OK|");
        delay(100);
        ConfigStep = 1;
      }
    }
   
    if(ConfigStep == 1){
      Serial.write("Insira quantas voltas a bobina vai ter.");
      if(Serial.read()){
        Voltas = (int)Serial.read();
        Serial.write("|OK|");
        delay(100);
        ConfigStep = 2;
      }
    }
   
    if(ConfigStep == 2){
      Serial.write("Insira a velocidade desejada velocidade default 1, maxima 10");
      if(Serial.read()){
        Speed = (int)Serial.read();
        Serial.write("|OK|");
        delay(100);
        ConfigStep = 3;
      }
    }
   
    if(ConfigStep == 3){
      Serial.write("Configuracao Salva com sucesso, por favor verificar e gitar |OK|");
      Serial.write("Bitola do Fio: "+Mm);
      Serial.write("Numero de Voltas: "+Voltas);
      Serial.write("Velocidade de Giro: "+Speed);
      Serial.write("Digite |OK| para confirmar ou digite |R| para reconfigurar.");
      if(Serial.read() == 'OK'){
        Serial.write("Iniciando Montagem da Bobina.");
      }
      if(Serial.read() == 'R'){
        Serial.write("Reiniciando sitema para reconfigurar.");
        delay(500);
      }
    }
   
  }
}


Se poderem ajudar eu agradeço.

metRo_

if(Serial.read()){
Quando fazes isto o microcontrolador não espera que o utilizar escreva, apenas verifica se já esvreu ou não, mas isto acontece us a seguir a teres pedido para ele escrever.

Depois tens outro problema que é o facto de que isto Serial.write("Insira a espessura do cabo em mm."); só é executado após  utilizador escrever alguma coisa na consola até lá fica sem saber o que fazer.

Serial.write("Insira a espessura do cabo em mm.");
ConfigStep = 0;

if(Serial.available()){
   
    if(ConfigStep == 0){
        Mm = (int)Serial.read();
        Serial.write("|OK|");
        delay(100);
        Serial.write("Insira quantas voltas a bobina vai ter.");
        ConfigStep = 1;
    }else if(ConfigStep == 1){
        Voltas = (int)Serial.read();
        Serial.write("|OK|");
        delay(100);
        ConfigStep = 2;
    }
    ...
    ...
    ...

}


luisjustin

Você me ajudou bastante mas só 1 duvida quando eu envio o comando parece que ele não esta salvando.
E quando ele vai exibir a configuração para revisar ele mostra -1 as vezes +10 mas números que não coloquei.
Pode me ajudar ?

int M1A = 5;
int M1B = 6;
int M2A = 9;
int M2B = 10;
int ConfigStep = 0;
int Mm = 0;
int Voltas = 0;
int Speed = 0;

void setup(){
  Serial.begin(9600);
}

void loop(){
  if(Serial.available()){
   
    if(ConfigStep == 0){
      Serial.write("Insira a espessura do cabo em mm.");
      if(Serial.read()){
        Mm = (int)Serial.read();
        Serial.println("|OK|");
        delay(100);
        ConfigStep = 1;
        delay(100);
      }
    }else if(ConfigStep == 1){
      Serial.write("Insira quantas voltas a bobina vai ter.");
      if(Serial.read()){
        Voltas = (int)Serial.read();
        Serial.println("|OK|");
        delay(100);
        ConfigStep = 2;
        delay(100);
      }
    }else if(ConfigStep == 2){
      Serial.write("Insira a velocidade desejada velocidade default 1, maxima 10");
      if(Serial.read()){
        Speed = (int)Serial.read();
        Serial.println("|OK|");
        delay(100);
        ConfigStep = 3;
        delay(100);
      }
    }else if(ConfigStep == 3){
      Serial.println("Configuracao Salva com sucesso, por favor verificar e gitar |OK|");
      Serial.println("Bitola do Fio: ");
      Serial.print(Mm);
      Serial.println("Numero de Voltas: ");
      Serial.print(Voltas);
      Serial.println("Velocidade de Giro: ");
      Serial.print(Speed);
      Serial.println("Digite |OK| para confirmar ou digite |R| para reconfigurar.");
      if(Serial.read() == 'K'){
        Serial.println("Iniciando Montagem da Bobina.");
        ConfigStep = 4;
        delay(100);
      }
      if(Serial.read() == 'R'){
        Serial.println("Reiniciando sitema para reconfigurar.");
        delay(500);
      }
    }else{
      //Inicia a criacao da bobina(Vou implantar o codigo)
    }
   
  }
}

Njay

Luis, o Serial.read não funciona como estás a pensar, ele só lê um caracter e em ASCII. Dá uma olhada na documentação. Tens que fazer uma função para ler os vários caracteres ASCII de um número (até, por exemplo, ser lido um "enter" do utilizador) e depois converter isso para um int com atoi() ou para float com atof().

luisjustin

Sim, concordo mas eu já fiz um sistema que identificava pelo menos os números.

Njay

Se queres identificar só um número de 0 a 9 é fácil,

int  num = Serial.read() - '0';

Agora para ler números maiores... terás que ir estudar primeiro :)

luisjustin

Sim, mas eu testo com o numero de 1 a 5 e ele mostra um numero nada a ver.

senso

Possivelmente dá-te qualquer coisa acima de 48, não é?
Estás a ler os valores do ascii, já te disseram o que tens de fazer.
Avr fanboy

tarquinio

Para ler numeros como strings vindas do serial eu costuma usar uma função deste género:

int readIntFromSerial()
{
    char buffer[12];
    byte pos = 0;
    int chr = Serial.read();
    while(chr==' ' || chr=='\r' || chr=='\n' ) chr = Serial.read();
    while(chr!=-1 && chr!=' ' && chr!='\r' && chr!='\n' )
    {
        buffer[pos++] = chr;
        chr = Serial.read();
        if (chr==-1)
        {
            delay(5);
            chr = Serial.read();           
        }
    }
    buffer[pos] = 0;
    return atoi(buffer);   
}



samc

Quando é para ler apenas um valor numérico (exemplo: nível PWM de 8bits para o analogWrite 0 a 255), basta usar o parseInt, não há necessidade de complicar. Este código corre bem no serial monitor da IDE do Arduino. Assim que introduzo o valor numérico e carrego em ENTER, o valor é logo associado à variável, exemplo de parte do código em que uso isto:

if (Serial.available()>0) {
    x2 = Serial.parseInt();
    if (x2 != x){
      Serial.println(x2);
      x=x2;
    }
  }

tarquinio

Sim é verdade não costumo usar essa função por outras razões, às vezes até me esqueço que ela existe :P Mas para o caso actual server perfeitamente :)
Já agora, podes fazer tb

Serial.setTimeout(10);

Para o programa não ter de esperar 1 segundo entre escreveres um valor e ele ser lido pelo arduino