|
| 1 | +/* |
| 2 | + * Arduino Home Lab |
| 3 | + * Hecho por: David Guzmán |
| 4 | + * 6 de julio de 2020 |
| 5 | + * |
| 6 | + * Osciloscopio lento (T_muestreo>10ms): |
| 7 | + * Hace lecturas de 3 puertos análogos de entrada, e imprime en puerto serial los valores medidos en voltios. |
| 8 | + * Ideal para usarse con 'serial plotter' de Arduino. |
| 9 | + * También puede usarse con algún monitor serial para guardar en archivo de texto plano los datos. |
| 10 | + * |
| 11 | + * Generadores de señales: |
| 12 | + * Produce señales cuadradas periódicas de amplitud 5V, con duración especificada por el usuario. |
| 13 | + * |
| 14 | + * |
| 15 | + * Parámetros configurables: |
| 16 | + * - periodo de muestreo, en ms. Se recomienda sea mayor a 10ms. |
| 17 | + * - miBaudRate. Tasa de comunicación de puerto serial. Se debe escoger este mismo valor en monitor serial o en 'serial plotter'. |
| 18 | + * |
| 19 | + * Para tener periodo de muestreo de 1ms, se recomienda usar baud rate de 115200 o superior |
| 20 | + */ |
| 21 | + |
| 22 | +/////////////////////////////// |
| 23 | +// Parámetros del usuario |
| 24 | +// |
| 25 | +// para osciloscipio |
| 26 | +// 1) Escoger la tasa (baudRate) de comunicación de puerto serial. ATENCIÓN: usar esta tasa en monitor serial y serial plotter. |
| 27 | +unsigned long miBaudRate = 115200; //en baudios, valores válidos: {9600,19200,38400,57600,115200,230400} |
| 28 | +// 2) Escoger periodo de muestreo. |
| 29 | +unsigned long periodoMuestreo_ms = 1; // intervalo en el que lee entradas (milisegundos)=periodo de muestreo. |
| 30 | +// |
| 31 | +// para generadores |
| 32 | +int t_on_generadorD13_ms = 500; //tiempo que dura el pulso de salida en D13 en encendido (5V) |
| 33 | +int t_off_generadorD13_ms = 500; //tiempo que dura el pulso de salida en D13 en apagado (0V) |
| 34 | +int t_on_generadorD12_ms = 50; //tiempo que dura el pulso de salida en D12 en encendido (5V) |
| 35 | +int t_off_generadorD12_ms = 50; //tiempo que dura el pulso de salida en D12 en apagado (0V) |
| 36 | +/////////////////////////////// |
| 37 | + |
| 38 | + |
| 39 | +///////////////////////////////// |
| 40 | +///Variables usadas por el código |
| 41 | +int entradaA0 = 0; // lectura de entrada análoga A0 |
| 42 | +int entradaA1 = 0; // lectura de entrada análoga A1 |
| 43 | +int entradaA2 = 0; // lectura de entrada análoga A2 |
| 44 | +float voltajeA0 = 0; // valor en voltios de entrada análoga A0 |
| 45 | +float voltajeA1 = 0; // valor en voltios de entrada análoga A0 |
| 46 | +float voltajeA2 = 0; // valor en voltios de entrada análoga A0 |
| 47 | +unsigned long lecturaPrevia_ms = 0; // tiempo de la última ejecución de milis |
| 48 | +unsigned long cronoGen13=0; //para almacenar la hora de crono generador 13 |
| 49 | +unsigned long cronoGen12=0; //para almacenar la hora de crono generador 12 |
| 50 | +///////////////////////////////// |
| 51 | + |
| 52 | +void setup() { |
| 53 | + // inicia comunicación serial |
| 54 | + Serial.begin(miBaudRate); |
| 55 | + // configura pines digitales de salida |
| 56 | + pinMode(12, OUTPUT); |
| 57 | + pinMode(13, OUTPUT); |
| 58 | +} |
| 59 | + |
| 60 | +void loop() { |
| 61 | + |
| 62 | + unsigned long lecturaActual_ms = millis(); //lee hora actual |
| 63 | + |
| 64 | + generadorCuadrada(13,t_on_generadorD13_ms,t_off_generadorD13_ms,&cronoGen13); //pin D13 = LED en Arduino UNO |
| 65 | + generadorCuadrada(12,t_on_generadorD12_ms,t_off_generadorD12_ms,&cronoGen12); |
| 66 | + |
| 67 | + if(lecturaActual_ms - lecturaPrevia_ms > periodoMuestreo_ms) { |
| 68 | + // guarda el valor actual de millis, para la siguiente lectura |
| 69 | + lecturaPrevia_ms = lecturaPrevia_ms + periodoMuestreo_ms; |
| 70 | + |
| 71 | + // lectura de entradas análogas 0,1,2: |
| 72 | + entradaA0 = analogRead(0); |
| 73 | + entradaA1 = analogRead(1); |
| 74 | + entradaA2 = analogRead(2); |
| 75 | + // calcula valor asociado de voltaje: 1023=5V |
| 76 | + voltajeA0 = deEnteroAVoltaje(entradaA0); |
| 77 | + voltajeA1 = deEnteroAVoltaje(entradaA1); |
| 78 | + voltajeA2 = deEnteroAVoltaje(entradaA2); |
| 79 | + |
| 80 | + //Imprime en puerto serial los valores leídos en voltios, con resolución 5mV. |
| 81 | + Serial.print(voltajeA0,3); //el '3' indica 3 cifras decimales |
| 82 | + Serial.print("\t"); //valores deben separarse con \t para 'serial plotter' |
| 83 | + Serial.print(voltajeA1,3); |
| 84 | + Serial.print("\t"); //valores deben separarse con \t para 'serial plotter' |
| 85 | + Serial.println(voltajeA2,3);//la última lectura debe terminar con un enter para 'serial plotter' |
| 86 | + |
| 87 | + } |
| 88 | + |
| 89 | +} |
| 90 | + |
| 91 | + |
| 92 | +float deEnteroAVoltaje(int valor){ |
| 93 | + //convierte número entero de 0 a 1023 en un voltaje, siendo 5V=1023. |
| 94 | + return float(valor)*5/1023; |
| 95 | +} |
| 96 | + |
| 97 | +void generadorCuadrada(int pinDigital, int t_on_ms, int t_off_ms, unsigned long *cronoLocal){ |
| 98 | + //genera una señal cuadrada periodica de amplitud 5V, con las |
| 99 | + //duraciones de encendido y apagado especificadas. |
| 100 | + |
| 101 | + unsigned long actualMillis = millis(); //lee hora actual |
| 102 | + unsigned long siguiente_on=0; |
| 103 | + unsigned long siguiente_off=0; |
| 104 | + |
| 105 | + siguiente_off = *cronoLocal + t_on_ms; //apagar cuando hayan pasado t_on_ms |
| 106 | + siguiente_on = *cronoLocal + t_on_ms + t_off_ms; //prender cuando hayan pasado t_on_ms+t_off_ms |
| 107 | + |
| 108 | + if(actualMillis > siguiente_on) { //si es hora de encender |
| 109 | + digitalWrite(pinDigital,HIGH); //encender |
| 110 | + *cronoLocal = siguiente_on; //actualiza hora de último encendido |
| 111 | + while(actualMillis > (*cronoLocal + t_on_ms + t_off_ms)) |
| 112 | + { |
| 113 | + //si el reloj quedó atrasado, actualizar hasta que la diferencia no supere un periodo (t_on+t_off) |
| 114 | + *cronoLocal = *cronoLocal + t_on_ms + t_off_ms; //si el reloj quedó atrasado, actualizar hasta |
| 115 | + } |
| 116 | + } |
| 117 | + else if(actualMillis > siguiente_off) { //si es hora de apagar |
| 118 | + digitalWrite(pinDigital,LOW); //apagar |
| 119 | + } |
| 120 | + |
| 121 | +} |
0 commit comments