Buenas noches
Este semestre estoy en un curso de micro controladores en la universidad y esta semana debemos enviar valores a traves del puerto serial para mostrar por pantalla los valores de 2 potenciometros.
Si introduzco el numero 1 debe darme el valor de voltaje del pot 1 y si coloco 2, el del pot 2:
int pot=A0;
int pot2=A1;
int FLAG=0;
char respuesta;
void setup () {
pinMode (pot,INPUT);
pinMode (pot2,INPUT);
Serial.begin(9600);
}
void loop (){
if (Serial.available() >0){ //Si esta la pantalla
FLAG=1;
caracter=Serial.read();
}
if (FLAG == 1 && caracter=='1')
{
float VALOR = analogRead(pot);
float voltaje = VALOR * (5.0 / 1023.0);
Serial.println("voltaje:");
Serial.println(voltaje);
FLAG=0;
delay(1000);
}
else if (FLAG == 1 && caracter=='2')
{
float VALOR = analogRead(pot2);
float voltaje2 = VALOR * (5.0 / 1023.0);
Serial.println("voltaje2:");
Serial.println(voltaje2);
FLAG=0;
delay(1000);
}
}
Inicialmente estaba trabajando con este codigo:
void loop (){
while (Serial.available() == 0);
//Read the Input
int val = Serial.read() - '0';
if (val == 1)
{
float VALOR = analogRead(pot);
float voltaje = VALOR * (5.0 / 1023.0);
Serial.println(voltaje);
}
else if (val == 2)
{
float VALOR2 = analogRead(pot2);
float voltaje2 = VALOR2 * (5.0 / 1023.0);
Serial.println(voltaje2);
}
else
{
Serial.println("NOPE");
}
Serial.readStringUntil('\n');
}
El error que me da en ambos es que al colocar 12 o 21, me lee el caracter '1' y '2' respectivamente, lo cual no deberia pasar.
Hablando con el profesor el me recomienda crear un arreglo y recorrerlo hasta la primera posición. Ademas de trabajar con banderas (Para que solo tome el 1 y el 2)
Estaba leyendo y haciendo pruebas y lo mas parecido a la idea que tengo es esto, pero aun asi me da error por pantalla ya que al parecer entra en un loop y no dejan de aparecer valores por consola.
Tu profesor se complica. Sé que con banderas te refieres a booleans (flags) pero entre eso y ESTO:
pipee:
Hablando con el profesor el me recomienda crear un arreglo y recorrerlo hasta la primera posición. Ademas de trabajar con banderas (Para que solo tome el 1 y el 2)
...Y concretamente me estresa cuando un docente "traduce" una palabra de origen inglesa a otra española tan sólo porque le suena. Pídele a tu profesor con la RAE en la mano que te diga cómo un ARRAY pasó a llamarse Arr"eglo".
Un Array si quiere traducirse nos podemos ir a las matemáticas y utilizar el término matriz (Y ni así).
Pero en fin, que no te mareen haciendo códigos extensos. Yo soy nuevo en hardware en sofware NO... Y mal vamos si enseñamos así la programación. Luego tengo que oir palabras como "catcheables" para un try catch en youtube y los nuevos lo repiten como loros y parecen hablar de una Caché en vez de capturar un error.
Una cosa es un anglicismo, otra un "spanglish" y otra añadir por la cara una palabra que ya tiene un significado un valor por simple parecido en la forma de estar escrita.
Al tema y comentado:
char str[20]; //buffer del char según tu necesidad
int index = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
// envía datos sólo si los recibe:
while (Serial.available() > 0) {
byte mybyte = Serial.read(); // leemos el byte de entrada:
if (mybyte != '\n' && mybyte != '\r' ){ //No es fin de línea //Serial.print("He recibido: "+String(mybyte));
str[index] = mybyte;
index++;
}else if(mybyte == '\n'){ //Fin de línea
if (strcmp(str,"12") == 0){
Serial.println("Es 12");
}
if (strcmp(str,"1") == 0){
Serial.println("Es 1");
}
if (strcmp(str,"2") == 0){
Serial.println("Es 2");
}
if (strcmp(str,"hola") == 0){
Serial.println("hola mundo!!!");
}
index = 0; //reiniciamos el índice
memset(str, 0, sizeof(str)); //limpiamos el array
}
}
}
Al leer añadimos el byte a la variable str declarada como char siempre que no sea el salto de línea (valores 13 / 10 = '\n\t' = Enter = Pulsar botón Enviar).
Cuando detectamos el 13, \n (Enter) Comprobamos si hay diferencia entre el texto con la función strcmp() y si no hay, es coincidencia
Posteriormente reiniciamos el índice y limpiamos la memoria del array usando memset().
No obstante si lo quieres con un String y adaptado al ejercicio:
Nótese que no uso delays. No tienen en tu caso un por qué. Un delay entre lecturas analógicas es correcto, pero en tu ejercicio muestras el valor de 1 sólo potenciómentro que está asignado a un único valor. En cualquier caso, si hubiese que usarlo, mejor usar millis() y hacer un timer que delay().
Me parece mejor para el usuario escribir una comando o texto a poner como entrada un 1 ó 2, pero eso es cuestión de gustos.
Con el float por más que te empeñes si lo escribes así con el println sin más te va a dar un entero, lo mismo que en mi caso y me ahorré unas variables.
/Leyendo potenciómetros y enviado a Serial/
int
pot0 = A0,
pot1 = A1;
Arduinito: No obstante si lo quieres con un String y adaptado al ejercicio:
Nótese que no uso delays. No tienen en tu caso un por qué. Un delay entre lecturas analógicas es correcto, pero en tu ejercicio muestras el valor de 1 sólo potenciómentro que está asignado a un único valor. En cualquier caso, si hubiese que usarlo, mejor usar millis() y hacer un timer que delay().
Me parece mejor para el usuario escribir una comando o texto a poner como entrada un 1 ó 2, pero eso es cuestión de gustos.
Con el float por más que te empeñes si lo escribes así con el println sin más te va a dar un entero, lo mismo que en mi caso y me ahorré unas variables.
Muchas gracias por tus respuestas!
Pienso lo mismo en que seria mejor un texto a un valor, pero la tarea especifica que debe ser el valor 1 para el potenciometro 1 y el 2 para el pot 2. Para cualquier otro valor o texto que no corresponda debe arrojar un mensaje de error.
Lamentablemente no me ha funcionado el segundo programa, ya que al introducir el texto no me retorna nada, si no que queda en blanco.
Para el primer codigo tuve que cambiar byte por char en la varialble mybyte, ya que si no me retornaba en codigo ASCII. Ademas de que me retorta caracter por caracter en la pantalla.
He recibido: hHe recibido: oHe recibido: lHe recibido: a
pipee:
Muchas gracias por tus respuestas!
Pienso lo mismo en que seria mejor un texto a un valor, pero la tarea especifica que debe ser el valor 1 para el potenciometro 1 y el 2 para el pot 2. Para cualquier otro valor o texto que no corresponda debe arrojar un mensaje de error.
Lamentablemente no me ha funcionado el segundo programa, ya que al introducir el texto no me retorna nada, si no que queda en blanco.
Para el primer codigo tuve que cambiar byte por char en la varialble mybyte, ya que si no me retornaba en codigo ASCII. Ademas de que me retorta caracter por caracter en la pantalla.Gracias nuevamente por tu tiempo y ayuda
Antes de decir "NO ME FUNCIONA", pregúntate POR QUÉ NO TE FUNCIONA. Es más yo me pregunto como no te puede funcionar algo que es hacer copy and paste.
Si alguien te ayuda créeme que se habrá tomado la molestia de probarlo.
Tengo dos potenciómetros conectados a los pines analógicos A0 y A1 y a 5V y GND de esta manera:
En cuanto al primer ejemplo claro que si necesitas imprimir el valor que se envía tienes que cambiarlo a char. Yo lo puse en byte y además comenté (quité) el println() que comentas ya que si el valor enviado por Serial es correcto ya después me va a dar el valor. Lo ví redundante.
No obstante println() permite un segundo parámetro para cambiar el tipo de dato que escribe por consola.
// print it out in many formats:
Serial.println(analogValue); // print as an ASCII-encoded decimal
Serial.println(analogValue, DEC); // print as an ASCII-encoded decimal
Serial.println(analogValue, HEX); // print as an ASCII-encoded hexadecimal
Serial.println(analogValue, OCT); // print as an ASCII-encoded octal
Serial.println(analogValue, BIN); // print as an ASCII-encoded binary
En cualquier caso quedó resuelta tu duda ¿No? Si es así puedes editar el título a Solucionado por si otras personas que visiten el foro tuviesen el mismo problema.
Un saludo.
P.D: Y si cambiases el segundo ejemplo por los valores 1 y 2 en vez de potenciometro 1 / potenciometro 2... Obtienes el mismo resultado. Ignoro cual es tu problema con los ejemplos.