Valores potenciometro

Buenas tardes

Soy un aficionado al tema de arduino y me gustaría saber si alguien puede ayudarme.

Estoy intentando emular una apertura de caja fuerte con dos combinaciones, utilizo dos potenciometros de 10k y lo que pretendo es que dada una determinada clave (en este caso de tres digitos para cada uno de los potenciometros), se abra un cajón (ahora suena un wav)… es para un escape room

El caso, es que cuando leo el valor analogico del potenciometro los valores son indeterminados… he mapeado la lectura para que devuelva un valor entre 0 y 9 y si muevo el potenciometro a una posición igual me lee 1, que 7 que otro valor… Sólo lee correcto el 0 y el 9 (que corresponde con el 1023).

He intentado de todo, cambiar potenciometros, hacer un for de 10 (y más) lecturas y hallar la media, pero pasa lo mismo… No se muy bien por donde meterle mano.

A lo mejor es que estoy intentando hacer algo con un sensor que no está pensado para eso pero no se me ocurre otra manera.

Me podeis ayudar?.

Muchas gracias

#include <SPI.h>
#include <SD.h>
#include <pcmConfig.h>
#include <pcmRF.h>
#include <TMRpcm.h>

#define SD_ChipSelectPin 53
TMRpcm audio;

//Declaración de variables antes del setup:

int potenciometro1=2;               //El potenciómetro1 está conectado al pin ANALÓGICO 2.
int potenciometro2=3;               //El potenciómetro2 está conectado al pin ANALÓGICO 3.
int leer=0;                         //Variable en la que se almacenará el valor leído en el potenciómetro.
                                    //se trata de un valor analógico (de 0 a 1023).
int total=0;
int media=0;
                                    
int ledOK1=13;

int convert=0;                      //Variable que contendrá el valor leído, convertido con función map() [rango de 0 a 9]
int convert_anterior=0;             //Variable que almacena el número correspondiente a la anterior conversión.

int secreto1[]={9, 2, 7};           //Vector que contiene el primer número secreto
                                    //que se compone de 3 cifras.
int secreto2[]={1, 5, 9};           //Vector que contiene el segundo número secreto
                                    //que se compone de 3 cifras.                                    


void setup()
{
   pinMode(potenciometro1,INPUT);   //El potenciómetro1 es una entrada.
   pinMode(potenciometro2,INPUT);   //El potenciómetro2 es una entrada.
   Serial.begin(9600);              //Se inicializa el puerto serial.
   audio.speakerPin=11;
   if(!SD.begin(SD_ChipSelectPin)){
    Serial.println("SD fails");
    return;
   }
   Serial.println("Prueba sonido");
   audio.setVolume(5);
   //audio.quality(1);
   audio.play("3.wav");
   delay(2000);
   
}

void playOK(){
  Serial.println("suena audio");
  //audio.stopPlayback();
  audio.play("3.wav");
  delay(2000);
  return;
}

void playFIN(){
  Serial.println("suena audio");
  //audio.stopPlayback();
  audio.play("tachan.wav");
  delay(10000);
  return;
}

void loop()
{
  // Bucle for para el potenciometro
  for (int i=0;i < 3;i++)
  {    
    Serial.println("POTENCIOMETRO 1");
    Serial.print("Adivina el primer numero secreto de la posicion ");
    Serial.print(i+1);
    Serial.println(); 
 
    // Leer potenciometro1 (izquierda)
    convert_anterior=0;
    leer=analogRead(potenciometro1);
    convert=map(leer, 0 , 1023 , 0 , 9);
    delay(1000);
    while(convert!=secreto1[i])
    {
      leer=analogRead(potenciometro1);
      convert=map(leer, 0 , 1023 , 0 , 9);    //Se cambia el rango. Ahora el máximo es 9.
      if(convert!=convert_anterior && convert!=secreto1[i])
      {
        Serial.print(convert); 
        Serial.println(" no es el numero correcto");
        delay(1000);
      } else
        {
          //no hacer nada
        }
      convert_anterior=convert;
    }
    //Cuando sale del bucle anterior es porque hemos adivinado un número.
    Serial.println();
    Serial.print("Bien hecho! Has adivinado del potenciometro1 el numero de la posicion ");
    Serial.print(i+1);
    Serial.print(", que era el numero ");
    Serial.print(convert);
    Serial.println();
    playOK();
    
   
    Serial.println("POTENCIOMETRO 2");
    Serial.print("Adivina el primer numero secreto de la posicion ");
    Serial.print(i+1);
    Serial.println(); 
 
    // Leer potenciometro2 (derecha)
    convert_anterior=0;
    leer=analogRead(potenciometro2);
    convert=map(leer, 0 , 1023 , 0 , 9);
    delay(1000);
    Serial.println(leer);
    Serial.println(convert);
    Serial.println(secreto2[i]);
    while(convert!=secreto2[i])
    {
      leer=analogRead(potenciometro2);
      convert=map(leer, 0 , 1023 , 0 , 9);    //Se cambia el rango. Ahora el máximo es 9.
      if(convert!=convert_anterior && convert!=secreto2[i])
      {
        Serial.print(convert); 
        Serial.println(" no es el numero correcto");
        delay(1000);
      } else
        {
          //no hacer nada
        }
      convert_anterior=convert;
    }
    //Cuando sale del bucle anterior es porque hemos adivinado un número.
    Serial.println();
    Serial.print("Bien hecho! Has adivinado del potenciometro2 el numero de la posicion ");
    Serial.print(i+1);
    Serial.print(", que era el numero ");
    Serial.print(convert);
    Serial.println();
    playOK();
    
  }
  
  //Cuando salimos del último bucle es porque hemos acertado todos los números secretos.
  playFIN();
  Serial.println("____________________________________________");
  Serial.println("Enhorabuena, has adivinado el numero secreto!");
  Serial.println("____________________________________________");
  Serial.println("Puedes volver a empezar pulsando el botón de RESET");
}

Os hago una copia del código para ver si alguien puede ayudarme.

¿Qué placa estás usando?¿Mega? ¿Puedes poner el esquema de conexión?

A primera vista el código estaría bien, pero sospecho de los pines que estás usando.

Al margen, no hace falta definir las entradas analógicas como INPUT.

Estoy usando un arduino uno r3. Los potenciómetros van pinchados en el A2 y A3

Entonces tienes mal definido los pines

int potenciometro1=2;               //El potenciómetro1 está conectado al pin ANALÓGICO 2.
int potenciometro2=3;               //El potenciómetro2 está conectado al pin ANALÓGICO 3.

2 y 3 definen los pines D2 y D3, respectivamente.

A los analógicos 2 y 3 debes definirlos como A2 y A3, entonces lo correcto es

const int potenciometro1=A2;               //El potenciómetro1 está conectado al pin ANALÓGICO 2.
const int potenciometro2=A3;               //El potenciómetro2 está conectado al pin ANALÓGICO 3.

Como los valores no van a cambiar porque refieren a pines, y por un tema de manejo de memoria, lo mejor es que uses constantes en lugar de variables.

Saludos

PD: si así se soluciona tu consulta por favor edita tu primer post y agrega "[SOLUCIONADO]" en el título.

Perdona gatul, te mentí… estoy con arduino Mega2560
He probado a hacer lo que me indicas y sigo teniendo el mismo problema

Os adjunto el esquema de conexión

De todos modos lo que @gatul te sugirió es correcto. Si no funciona es porque debes tener una mala conexión entre tu MEGA y el protoboad, algo muy común.

Verifica con un tester o multímetro, la tensión en los bornes extremos de los potenciómetros. Debes leer 5V entre ellos. Y si lo pones entre GND y el cursor podrás ver la variación de tensión al girarlo. Luego verifica que dicho valor esta llegando a A2 y A3. Nunca se debe suponer que lo que se ve esta ocurriendo realmente hasta que un tester lo comprueba cuando pasan cosas como las que describes.

De acuerdo... lo probaré y os cuento

Muchas gracias por la ayuda