This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Ayuda con potenciometro
#1
Hola, llevo ya algunas semanas liado con un proyecto para hacer una calculadora y de momento todo bien menos una cosa y es que para escribir los simbolos de los operadores en un LCD o el monitor serial en lugar de utilizar un boton normal estoy usando un potenciometro para ir cambiando entre los diferentes operadores. Por ejemplo si el valor del potenciometro esta entre 0 y 63 seleccionar el operador suma (+).
Y hasta ahí todo bien, el problema me viene cuando quiero imprimir el operador en pantalla y es que lo que me sucede es que en lugar de imprimirse una vez el simbolo "+" se imprime infinitas veces hasta que cambio de posicion el potenciometro y lo saco de ese rango que dije antes (0-63) mi idea es que mientras esté dentro de ese rango solo se escriba una vez en el monitor serial o LCD o lo que usemos.
A continuacion os dejo el ejemplo de código que tengo, el código que os comento empieza donde pone //Seleccionar operador con un potenciometro.
[Imagen: 8f09d102ab5cb221e1c0fd66eb638ce9.jpg]

A ver si me echaís una mano o me iluminaís un poco Sonrisa
Gracias

Sent from my LG-D855 using Tapatalk
  Responder
#2
Hola

Le veo un par de problemas a ese codigo. SI me permites te explico:

1) La variable contadorSuma la incrementas dentro del loop() pero no veo que la reinicies a cero. Lo mas probable es que termine desbordando.

2) Hay una linea mal... If (contadorSuma = 1)... La comparacion es "==". Lo que has puesto es una asignacion.

He hecho un codigo que quizas te ayude. He puesto tres operadores "+", "-" y "x" que se escriben solo una vez segun muevas el potenciometro. Si te interesa lo puedes adaptar a tu codigo. Echale un vistazo, si tienes alguna duda, comentala.

Saludos

Código:
int rango, posicionPotenActual, potenciometro;
char operador;
boolean cambio;

void setup()
{
  rango = 255;
}

void loop()
{

  posicionPotenActual = analogRead(potenciometro)/4;
  
  if ((posicionPotenActual >= 0 ) && (posicionPotenActual < 63) && (rango != 0))
    {
      operador = '+';
      rango = 0;
      cambio = true;
    }

  if ((posicionPotenActual >= 63 ) && (posicionPotenActual < 100) && (rango != 1))
    {
      operador = '-';
      rango = 1;
      cambio = true;
    }
  
  if ((posicionPotenActual >= 100 ) && (posicionPotenActual < 150) && (rango != 2))
    {
      operador = 'x';
      rango = 2;
      cambio = true;
    }
    
  if (cambio)
    {
      Serial.print(operador);
      cambio = false;
    }
    
}
  Responder
#3
sejiozosky escribió:Hola, llevo ya algunas semanas liado con un proyecto para hacer una calculadora y de momento todo bien menos una cosa y es que para escribir los simbolos de los operadores en un LCD o el monitor serial en lugar de utilizar un boton normal estoy usando un potenciometro para ir cambiando entre los diferentes operadores. Por ejemplo si el valor del potenciometro esta entre 0 y 63 seleccionar el operador suma (+).
Y hasta ahí todo bien, el problema me viene cuando quiero imprimir el operador en pantalla y es que lo que me sucede es que en lugar de imprimirse una vez el simbolo "+" se imprime infinitas veces hasta que cambio de posicion el potenciometro y lo saco de ese rango que dije antes (0-63) mi idea es que mientras esté dentro de ese rango solo se escriba una vez en el monitor serial o LCD o lo que usemos.
A continuacion os dejo el ejemplo de código que tengo, el código que os comento empieza donde pone //Seleccionar operador con un potenciometro.
[Imagen: 8f09d102ab5cb221e1c0fd66eb638ce9.jpg]

A ver si me echaís una mano o me iluminaís un poco Sonrisa
Gracias

Sent from my LG-D855 using Tapatalk

Tienes opciones en el foro para insertar codigo. Una foto luego no se puede copiar en el IDE y probar para ayudarte :oops: :oops: :oops: Guiño
-> Mi CNC de escritorio CNCDesktop 500 -> https://www.spainlabs.com/foros/tema-Fresadora-Desktop-CNC-500
-> Laboratorio de Fabricación Digital Maker www.lowpower.io 
--> Twitter: https://twitter.com/Grafisoft_ES  | IG: https://www.instagram.com/lowpowerio/
  Responder
#4
grafisoft escribió:
sejiozosky escribió:Hola, llevo ya algunas semanas liado con un proyecto para hacer una calculadora y de momento todo bien menos una cosa y es que para escribir los simbolos de los operadores en un LCD o el monitor serial en lugar de utilizar un boton normal estoy usando un potenciometro para ir cambiando entre los diferentes operadores. Por ejemplo si el valor del potenciometro esta entre 0 y 63 seleccionar el operador suma (+).
Y hasta ahí todo bien, el problema me viene cuando quiero imprimir el operador en pantalla y es que lo que me sucede es que en lugar de imprimirse una vez el simbolo "+" se imprime infinitas veces hasta que cambio de posicion el potenciometro y lo saco de ese rango que dije antes (0-63) mi idea es que mientras esté dentro de ese rango solo se escriba una vez en el monitor serial o LCD o lo que usemos.
A continuacion os dejo el ejemplo de código que tengo, el código que os comento empieza donde pone //Seleccionar operador con un potenciometro.
[Imagen: 8f09d102ab5cb221e1c0fd66eb638ce9.jpg]

A ver si me echaís una mano o me iluminaís un poco Sonrisa
Gracias

Sent from my LG-D855 using Tapatalk

Tienes opciones en el foro para insertar codigo. Una foto luego no se puede copiar en el IDE y probar para ayudarte :oops: :oops: :oops: Guiño
Perdon es que lo he hecho desde Tapatalk en el móvil y me era mas rapido

Sent from my LG-D855 using Tapatalk
  Responder
#5
daniez escribió:
Código:
int rango, posicionPotenActual, potenciometro;
char operador;
boolean cambio;

void setup()
{
  rango = 255;
}

void loop()
{

  posicionPotenActual = analogRead(potenciometro)/4;
  
  if ((posicionPotenActual >= 0 ) && (posicionPotenActual < 63) && (rango != 0))
    {
      operador = '+';
      rango = 0;
      cambio = true;
    }

  if ((posicionPotenActual >= 63 ) && (posicionPotenActual < 100) && (rango != 1))
    {
      operador = '-';
      rango = 1;
      cambio = true;
    }
  
  if ((posicionPotenActual >= 100 ) && (posicionPotenActual < 150) && (rango != 2))
    {
      operador = 'x';
      rango = 2;
      cambio = true;
    }
    
  if (cambio)
    {
      Serial.print(operador);
      cambio = false;
    }
    
}

Hola, he estado mirando el código que me has mandado y tengo alguna duda, que es lo que hace la variable boolean "cambio" y lo de rango a que te refieres? En cuanto tenga un poco de tiempo mañana lo pruebo y lo adapto a mi código, pero si no te es mucha molestia explicame lo que comenté arriba jeje Mola
  Responder
#6
El código os lo dejo aquí como dijo el compañero arriba para que podáis verlo entero y copiarlo Mola
Código:
/*Librerias*/
#include <Wire.h>
#include <SoftwareSerial.h>


/*Variables */

int potenciometro = A0;
int posicionPotenActual;
int posicionPotenAnterior;
String operador = "";
int contadorSuma;
int boton_igual = 5;
int boton_reset = 4;
int boton_2 = 2;
int boton_1 = 3;
int numero = 0;
String reset = " ";
String igual = " ";
String valor1;
String valor2;
int estadoBoton1 = 0;
int estadoBoton2 = 0;

/*Configuracion de inicio de programa*/

void setup(){
Serial.begin(9600);
pinMode(potenciometro, INPUT);
pinMode(boton_igual, INPUT);
pinMode(boton_reset, INPUT);
pinMode(boton_2, INPUT);
pinMode(boton_1, INPUT);
Serial.print("Calculadora by Sergio");
delay(2000);
numero = 0;
igual = "";
reset = "";
valor1 = "";
valor2= "";
operador = "";
}

/*Programa*/

void loop(){
//Seleccionar el operador con un potenciometro

posicionPotenActual = analogRead(potenciometro) / 4; //Leemos el valor del potenciometro
if(posicionPotenActual != posicionPotenAnterior) {
  posicionPotenActual = posicionPotenAnterior;
  if(posicionPotenActual >= 0 && posicionPotenActual < 63) { //Si el valor del potenciometro va de 0 a 63
  operador="+"; //La variable "valores" será el signo de +
contadorSuma ++;
if (contadorSuma = 1){
  Serial.print(operador); //Mostramos en pantalla el signo +
  }
  }
}

//Botones numericos
estadoBoton1 = digitalRead(3);
if(estadoBoton1 == HIGH) {//Si el boton1 esta pulsado
numero = 1; //numero valdra 1, porque está pulsado el boton1
valor1 += numero; //valor1 sera el numero ya guardado unido al que acabamos de pulsar
Serial.println();
Serial.print(valor1); //Imprimimos en pantalla el valor1
delay(1000);
}
estadoBoton2 = digitalRead(2);
if(estadoBoton2 == HIGH) {//Si el boton2 esta pulsado
numero=2; //numero valdra 2, porque está pulsado el boton2
valor1 += numero; //valor1 sera el numero ya guardado unido al que acabamos de pulsar
Serial.println();
Serial.print(valor1); //Imprimimos en pantalla el valor1
delay(1000);
}
}
  Responder
#7
sejiozosky escribió:
daniez escribió:
Código:
int rango, posicionPotenActual, potenciometro;
char operador;
boolean cambio;

void setup()
{
  rango = 255;
}

void loop()
{

  posicionPotenActual = analogRead(potenciometro)/4;
  
  if ((posicionPotenActual >= 0 ) && (posicionPotenActual < 63) && (rango != 0))
    {
      operador = '+';
      rango = 0;
      cambio = true;
    }

  if ((posicionPotenActual >= 63 ) && (posicionPotenActual < 100) && (rango != 1))
    {
      operador = '-';
      rango = 1;
      cambio = true;
    }
  
  if ((posicionPotenActual >= 100 ) && (posicionPotenActual < 150) && (rango != 2))
    {
      operador = 'x';
      rango = 2;
      cambio = true;
    }
    
  if (cambio)
    {
      Serial.print(operador);
      cambio = false;
    }
    
}

Hola, he estado mirando el código que me has mandado y tengo alguna duda, que es lo que hace la variable boolean "cambio" y lo de rango a que te refieres? En cuanto tenga un poco de tiempo mañana lo pruebo y lo adapto a mi código, pero si no te es mucha molestia explicame lo que comenté arriba jeje Mola


cambio es una variable boolean para que solo se imprima una vez el operador seleccionado.

rango es lo que divide al recorrido del potenciometro. Por ejemplo si divides el recorrido en 4 partes, cada zona seria un operador.
  Responder
#8
daniez escribió:
sejiozosky escribió:
daniez escribió:
Código:
int rango, posicionPotenActual, potenciometro;
char operador;
boolean cambio;

void setup()
{
  rango = 255;
}

void loop()
{

  posicionPotenActual = analogRead(potenciometro)/4;
  
  if ((posicionPotenActual >= 0 ) && (posicionPotenActual < 63) && (rango != 0))
    {
      operador = '+';
      rango = 0;
      cambio = true;
    }

  if ((posicionPotenActual >= 63 ) && (posicionPotenActual < 100) && (rango != 1))
    {
      operador = '-';
      rango = 1;
      cambio = true;
    }
  
  if ((posicionPotenActual >= 100 ) && (posicionPotenActual < 150) && (rango != 2))
    {
      operador = 'x';
      rango = 2;
      cambio = true;
    }
    
  if (cambio)
    {
      Serial.print(operador);
      cambio = false;
    }
    
}

Hola, he estado mirando el código que me has mandado y tengo alguna duda, que es lo que hace la variable boolean "cambio" y lo de rango a que te refieres? En cuanto tenga un poco de tiempo mañana lo pruebo y lo adapto a mi código, pero si no te es mucha molestia explicame lo que comenté arriba jeje Mola


cambio es una variable boolean para que solo se imprima una vez el operador seleccionado.

rango es lo que divide al recorrido del potenciometro. Por ejemplo si divides el recorrido en 4 partes, cada zona seria un operador.
Vale gracias, la ultima función donde dices "if (cambio) ......"
No hay ninguna condicion en el if? O como funciona? Gracias por la contestacion

Sent from my LG-D855 using Tapatalk
  Responder
#9
Vale gracias, la ultima función donde dices "if (cambio) ......"
No hay ninguna condicion en el if? O como funciona? Gracias por la contestacion

Sent from my LG-D855 using Tapatalk

Solo ejecuta lo que hay dentro del IF si la variable es true. Saludos
  Responder
#10
daniez escribió:Vale gracias, la ultima función donde dices "if (cambio) ......"
No hay ninguna condicion en el if? O como funciona? Gracias por la contestacion

Sent from my LG-D855 using Tapatalk

Solo ejecuta lo que hay dentro del IF si la variable es true. Saludos
Vale porque la boolean solo puede ser true o false segun se, gracias

Sent from my LG-D855 using Tapatalk
  Responder
#11
Aqui tienes el codigo un poco mas optimizado :yeah:

He quitado la variable rango que estaba de mas...

Código:
int posicionPotenActual, potenciometro;
char operador;
boolean cambio;

void setup()
{

}

void loop()
{

  posicionPotenActual = analogRead(potenciometro)/4;
  
  if ((posicionPotenActual >= 0 ) && (posicionPotenActual < 63) && (operador != '+'))
    {
      operador = '+';
      cambio = true;
    }

  if ((posicionPotenActual >= 63 ) && (posicionPotenActual < 100) && (operador != '-'))
    {
      operador = '-';
      cambio = true;
    }
  
  if ((posicionPotenActual >= 100 ) && (posicionPotenActual < 150) && (operador != 'x'))
    {
      operador = 'x';
      cambio = true;
    }
    
  if (cambio)
    {
      Serial.print(operador);
      cambio = false;
    }
    
}
  Responder
#12
daniez escribió:Aqui tienes el codigo un poco mas optimizado :yeah:

Gracias por la ayuda! Ya lo he adaptado a mi código y me ha funcionado lo único que he tenido problema es que con el potenciometro por ejemplo si se encuentra en el valor 63 y lo giro despacio para pasar a 64 pues se escribe varias veces "+" y "-" porque está como en el limite. Lo he solucionado un poco con lo primero que se me ha pasado por la cabeza ya lo optimizaré, y es que en lugar de poner "si el valor del potenciometro esta entre 0 y 63.." lo que he hecho ha sido "si el valor del potenciometro es 50, operador será "+"" y así, os dejo el código por si alguien busca hacer lo mismo que yo Sonrisa Sonrisa

Código:
int potenciometro = A0;
boolean cambio;
String operador = "";
int posicionPotenActual;

void loop(){
posicionPotenActual = analogRead(potenciometro) / 4; //Leemos el valor del potenciometro
  if((posicionPotenActual == 50) && (operador != "+")) { //Si el valor del potenciometro es 50 y el operador no es +
  operador="+"; //La variable "valores" será el signo de +
  cambio = true;
   }
if (cambio){
  Serial.println();
  Serial.print(operador); //Mostramos en pantalla el signo +
  cambio = false;
  }
}

Mola Mola Mola Mola
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  Problema con potenciómetro DavidGom1 3 1,866 31-12-2018, 08:14 PM
Último mensaje: Surbyte