LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: GSI2 em 21 de Abril de 2011, 18:07
-
void setup() {
Serial.begin(9600);
}
int get;
void loop () {
if (Serial.available()>0){
get = Serial.read();
switch (get) {
case '1':
// do something
break;
case '2':
// do something
break;
/* 3, 4, 5, 6, 7, 8... */
case '20':
// do something
break;
default:
Serial.print("No command\n");
}
}
}
Não sou programador nem nunca estudei algum tipo de linguagem comprei o meu Arduino ontem
e ao que parece o que quero fazer é perguntado quase todos os dias mas nunca vi um exemplo que funcione.
Por esse motivo peço se alguém pode fazer o favor de completar o code para que consiga trabalhar com números > 9.
Se envio 12 ele actua o 1 e o 2 mas não o 12 já li dezenas de tópicos e por mais que tente não consigo :-[
Obrigado
-
Como estás a enviar?
E os números assim são vistos como números ou characteres?
-
Estou a enviar através de php e tudo funciona bem
<?php
$arduino = $_GET["arduino"];
$fp = fopen('com3', 'w');
fwrite($fp, $arduino);
fclose($fp);
?>
o unico problema é que so consigo ler 1 numero de cada vez com o serial.read.
-
Fazes algo assim:
junto com as outras variaveis junta estas:
uint8_t numero1, numero2;
if(Serial.available>2){
for(uint8_t i=0; i<2; i++){
get = Serial.read();
if((get >= '0') & (get <= '9')){ //Ter a certeza que é um numero
if(i==0){
numero1 = atoi(get, 10); } //Converter de ASCII para um inteiro
else {
numero2 = atoi(get, 10); }
}
}
get=numero1 + 10*numero2;
Agora tens inteiros e não caracteres no teu switch, basta tirares os '' e deve funcionar, outra coisa esse código compilava mesmo?
É que regra geral '10' ou qualquer coisa que não seja só um caracter o gcc queixa-se.
-
sim compilava. Com o que escreveste é que não.
tinhas if(Serial.available>2){
falta os ()
mudei para if (Serial.available() > 2){
já dá.
mas para aqui
numero1 = atoi(get, 10); } [code]
error: invalid conversion from 'int' to 'const char*'
-
Troca uint8_t numero1, numero2; por int numero1, numero2;
-
Troquei dá o mesmo erro :'(
o atoi() não me aparece com outra cor será que preciso de adicionar alguma livraria?
-
Pois, provavel, nem me lembrei disso, falta de hábito, no inicio do programa, logo na primeira linha mete isto:
#include <stdlib.h>
-
continua a dar o mesmo erro :-[
-
Esquece, paragem mental completa -.-
a função atoi é só atoi(get); tira a virgula e o 10.
-
mesmo erro :-[
-
Boas,
A função atoi() espera uma string no primeiro parâmetro, não um char como estás a passar, alem de que as dezenas estão a ser mal calculadas pois é usado o segundo carácter que é o das unidades.
Experimenta:
chars = Serial.available();
get = 0;
while (chars)
get += ((Serial.read()-'0') * (int) powl(10,--chars)));
... partindo do principio que o arduino "entende" a função powl(), se não entender podes sempre fazer a tua, é simples pois basta elevar 10 à potencia do segundo parâmetro. Se achares necessário podes ainda adicionar uma condição para testar se todos os caracteres são numéricos.
Abraços,
PA
-
Ok, horas de ir para a cama lol
-
Boas,
Ainda outra forma, mais no estilo "força bruta", de chegar ao mesmo resultado:
char lido[5];
chrcount = Serial.available();
lido[chrcount]=0;
for (int n=0 ; n<chrcount; n++)
lido[n]=Serial.read();
get = atoi(lido);
Abraços,
PA