LusoRobótica - Robótica em Português
Electrónica => Electrónica Geral => Tópico iniciado por: luisjustin em 29 de Junho de 2013, 06:05
-
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.
-
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;
}
...
...
...
}
-
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)
}
}
}
-
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().
-
Sim, concordo mas eu já fiz um sistema que identificava pelo menos os números.
-
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 :)
-
Sim, mas eu testo com o numero de 1 a 5 e ele mostra um numero nada a ver.
-
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.
-
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);
}
-
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;
}
}
-
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