Qué tal amigos, estoy trabajando en un generador de señales (ECG, YA TENGO LA SEÑAL GENERADA), y estoy usando un potenciometro para simular la frecuencia cardíaca y deseo hacer lo siguiente que cuando este en su valor máximo me de un valor de 30BPM, en su valor medio un valor de 60BPM y mínimo me de 120BPM, alguien que me pueda orientar, agradezco la atención prestada.
Pues empecemos por el principio... Publica el código y luego te ayudare!
usa
map(analogRead(pinPotenciometro), 0, 1023, 120, 30);
maximo 1023 => dara 30
minimo 0 => dara 120
medio 512 => será un punto medio que de ningún modo coincide con 60, creo que falló tu matemática o mi apreciación de que hablas de algo lineal.
Diferencia 120 - 30 = 90 La mitad es 45, 30 +45 = 85 eso dara al medio del potenciometro, jamás 60.
Si quieres 60 entonces requieres otra función. que no es lineal.
Y continuemos por el principio, que tal si lees las normas y editas ese código usando etiquetas?
Es el mismo proyecto en el que te he ayudado de ForosDeElectrónica?
Te he explicado como hacerlo, tienes que usar una máquina de estados.
Ve a Documentación => Indice de temas tutoriales => millis() y también lee máquina de estados.
No hay solución fácil sin trabajo.
El dato que se ve en el display debe ajustarse una sola vez para no afectar la generación de la señal de lo contrario tendrá interrupciones.
Asi que ajustas con el potenciometro, presentas y no lo consulta mas.
void loop() {
Wire.beginTransmission(MCP4725_ADDR);
Wire.write(64);
Wire.write(sintab2[lookup] >> 4);
Wire.write((sintab2[lookup] & 15) << 4);
Wire.endTransmission();
lookup = (lookup + 1) & 511;
frecuencia = analogRead(0);
if (abs(frecuencia-frecuenciaAnt > 10) // el valor de 10 puede cambiarse para evitar ruido
ajustoFreq();
frecuenciaAnt = frecuencia;
}
void ajustoFreq() {
Bpm = map(frecuencia,0,1023,120,30);
// la cuenta es 60 x 1000000 / 543 = 110497.237
long int intervalo = 110497 / Bpm; // en microsegundos
delayMicroseconds(intervalo); //
lcd.clear();//Elimina todos los simbolos del LCD
lcd.setCursor(2,0);//Posiciona la primera letra despues del segmento 5 en linea 1
lcd.print("ECG");
lcd.setCursor(5,1);//Posiciona la primera letra despues del segmento 6 en linea 2
lcd.print("Bpm");
lcd.setCursor(9,1);
lcd.print(Bpm);
}
Perdona, debes agregar la variable frecuenciaAnt del mismo tipo que frecuencia e igualala a 0.
Si la diferencia en valor absoluto es > a 10 entonces le prestamos atención al potenciometro.
Son valores del AD asi que no afecta su calculo de los BPM