Skip to content

Commit badcaee

Browse files
authored
Add files via upload
1 parent 35819c7 commit badcaee

1 file changed

Lines changed: 121 additions & 0 deletions

File tree

arduinoHomeLab/arduinoHomeLab.ino

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
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

Comments
 (0)