Controlando salida analógico por tiempos

Hola:

Usando Arduino UNO r3.

Con un potenciómetro se puede controlar la tensión de 0 V. a 5 V. Que en su entrada analógica como salida son de 0 a 1023 bytes.

Usando solo 6 pulsadores como entradas digitales. Se representa así.

Pulsador = 0 V.
Pulsador = 1 V.
Pulsador = 2 V.
Pulsador = 3 V.
Pulsador = 4 V.
Pulsador = 5 V.

Al encender Arduino, se queda en 0 V. por defecto.

Si pulso el pulsador 1 V. Tiene que tardar 3 segundos poco a poco de 0 V. a 1 V. En una salida hay un Led. Por supuesto, como máximo enciende hasta los 5 V, con sus resistencia para que no se queme el Led. :wink:

Cuando haya llegado a 1 V. Ahora me da por pulsar el pulsador 5. Como está en 1 V. ahora llega poco a poco a 5 V. Ya que los segundos se suman, porque de un valor a otro son cada 3 segundos. En total, del paso 1 al 5 serían 20 segundos. 3 segundos por 4 pasos es igual a 20 segundos.

Por otro lado, quiero ver la agua del voltímetro analógico dc de 0 a 5 V.

Ver imagen.


Moderador: Editado para visualizar la imagen.

Por eso el tema de que cada paso, en tres segundos se mueva la agua un poco despacio, no al instante.

¿Alguna sugerencia de hacer un buen código para este tipo de cosas?

Saludos.

Editado: Metaconta!!!!!!
No puedo creer que preguntes cosas asi!! A veces me sorprenden tus programas y otras me dejas helado con las preguntas. Esta va con la segunda.

Habia respondido antes : "Si. Estudiar Arduino, ver los tutoriales que se aproximan a cada cosa que has comentando."

Necesitas una Red R-2R o sea un DAC (digital analogic converter) para lograr lo que quieres.
Son 6 salidas que aportan cada una un peso en voltios a la salida común.
Es algo conocido cuando se estudian microcontroladores.
El código es tan simple comp prender un led con cada uno de tus 6 pulsadores, accionar una salida y esa salida colabora en tensión con la red ya mencionad para lograr tu tensión deseada.
la otra opcion es comprar un DAC y decirle que quieres cuando se presiona cada tecla.

Creo que por ahí no van los tiros Surbyte.

No se si lo que pretende es que con los pulsadores y una salida analógica lograr el efecto, o como tu dices usar hacer un DAC.

Mas bien la pregunta va enfocada al tiempo.

Yo usaría un punto setPoint que es el que quiero obtener como resultado de pulsar el boton. y un punto para guardar el valor actual de la salida analogica, pongamos un analogWrite.

Como para moverse de un voltaje a otro tarda los mismo lo sencillo es calcula cuanto tiempo tarda en un incremento o decremento de una porcion de tiempo y usar milis.

Si usamos analogWrite tenemos que el valor de la salida va a ir de 0 a 255, siendo 0 los 0 voltios, 51 los 1 voltios, 102-2V, 153-3V, 204-4V y 255-5V. Eso quiere decir que entre voltio y voltio nos movemos 51 pasos durante 3 segundos. Eso no dará que cada 58.82mS incrementamos o decrementamos el valor actual en una posicion, redondeamos a 59 y usamos milis para alcanzar el valor que queremos...

Perdón que escriba lento pero estoy manco...

Esto es una simple aproximación usando analogWrite en el pin 11. Obviamente, para conectar el voltimetro hay que poner una red resistencia condensador para conseguir un voltaje en la salida estable y que no sea la salida PWM.

#include <BotonSimple.h>

BotonSimple p0(2); 
BotonSimple p1(3);
BotonSimple p2(4);
BotonSimple p3(5);
BotonSimple p4(6);
BotonSimple p5(7);

int setPoint=0;
int actual=0;
uint32_t t;

void setup() {
 Serial.begin(9600);
}

void loop() {
  p0.actualizar();
  p1.actualizar();
  p2.actualizar();
  p3.actualizar();
  p4.actualizar();
  p5.actualizar();

  if ( p0==SOLTANDOLO ) setPoint = 0;
  if ( p1==SOLTANDOLO ) setPoint = 51*1;
  if ( p2==SOLTANDOLO ) setPoint = 51*2;
  if ( p3==SOLTANDOLO ) setPoint = 51*3;
  if ( p4==SOLTANDOLO ) setPoint = 51*4;
  if ( p5==SOLTANDOLO ) setPoint = 51*5;

  if ( millis()-t > 59 ) {
    if ( actual < setPoint ) {
      actual++;
    }
    else {
      
      if ( actual>0 ) actual--;
    }
    analogWrite(11,actual);
    t = millis();
    Serial.print(setPoint);
    Serial.print(" ");
    Serial.println(actual);
  }
}

Para los botones use la libreria del tutorial Como no leer un boton.... Cada cual que use la suya, además es una simple idea.

Cierto.. mi enfoque esta horrible.
Disculpas Metaconta.

Buenas:

@SurByte. ¿Qué haces justo este 31-12-2.022 alegando sin saber? Xdddddddddd.

Menudo broncón me metió, ajajajajaja.

Mi objetivo es los tiempos entre botones como dijo el compañero @victorjam. Tendrá en cuenta sus ejemplos y leer el tutorial que hiciste por si acaso me de ideas nuevas y frescas.

Voy a probar.

Una corrección y una recomendación al código de @victorjam. Lo correcto es comparar si el tiempo transcurrido es mayor o igual, así que en lugar de:

  if ( millis()-t > 59 ) {

Debería de ser:

  if ( millis()-t >= 59 ) {

Y la recomendación, aunque si el programa no va a hacer muchas más cosas no afecta mucho, es que es bueno tomar como costumbre el incrementar el intervalo de tiempo que se está midiendo, en lugar de asignar el tiempo actual. Esto evita que pueda retrasarse poco a poco. Así que en lugar de:

    t = millis();

Recomiendo poner en estos casos:

    t += 59;

Ojo, se le suma 59 porque es el intervalo que queremos controlar. Si se cambia de intervalo, se ha de cambiar en la comparación anterior y en el incremento. Por eso recomiendo definir una constante con el valor deseado. Así, si se quiere cambiar, basta con cambiarlo únicamente en la definición de la constante.

Ya puestos, en lugar de usar millis() mejor aún si utilizamos micros() y cambiamos los 59 milisegundos por 58824 microsegundos (en los dos sitios si se hace caso de mi recomendación). De esta forma puede ser más exacto.

Error.

D:\Arduino\Voltimetro_analogico\Voltimetro_analogico.ino:1:10: fatal error: BotonSimple.h: No such file or directory
 #include <BotonSimple.h>
          ^~~~~~~~~~~~~~~
compilation terminated.

exit status 1

Compilation error: BotonSimple.h: No such file or directory

Obvio si no has instalado la libreria que use en el tutorial... :D:D:D

Aquí está el enlace: BotonSimple

De todas formas, use la libreria del tutorial, por haberla hecho yo, ser simple y estar en español. Pero puede sustituir la lectura de los botones por cualquier
libreria de botones, la tuya propia o jugando con ** digitalRead ** y con cuidado de los debounce...

Captura

Les paso aquí un ejemplo desde lejos en PC con Windows para que vea como funciona. De momento, esperando que me llegue el voltímetro, me quedan menos de dos meses.

GDI circulo flecha 03.zip (5.3 KB)

Pues solo para que mires para otro lado, busca Python Gauges y por ejemplo algo como esto

o el mismo un poco antes

Esto con Qt pero hay versiones en otros Frameworks.

Muy bueno.

Controles de calidad. Xddddd. El mío hecho desde cero.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.