Primero felicitarlos por el trabajo, me gustó y me voy a permitir hacerte algunas sugerencias solo para mejorar su funcionalidad. Son consejos, tu código esta bien en líneas generales.
- Promedio
La rutina en la que calculas el promedio puede mejorarse y hacerse mas rapida de varias maneras.
1.1 No hace falta calcular el valor de cada muestra si no lo vas a presentar, si no lo almacenas. Entonces esto es mas eficiente. Tomas la muestra, las guardas en un sumador y luego promedias y calulas la corriente del valor promediado. No sumas los valores de corrientes de cada muestra como en tu caso.
float voltaje;
unsigned long corrienteSuma = 0;
for (int i = 0; i < NumMuestras; i++) {
corrienteSuma += analogRead(A0);
}
voltaje = (float) (corrienteSuma/ NumMuestras) * 5.0 / 1023.0;
float corriente += (voltaje - 2.4955) / Sensibilidadcc;
Es lo mismo con muchas menos cuentas para el microcontrolador.
1.2 Esto mismo se puede hacer con promedio movil. Si te interesa te lo indico pero hace días lo he respondido. Solo búscalo.
float get_corriente();
en la linea 79 no tiene razón de ser. Bórralo
- Solucion de compromiso.
Evidentemente esto
if (corriente < 0.100 && corriente > -0.100) {
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Sin lectura");
lcd.setCursor(6,1);
lcd.print("CA");
delay(1000);
}
fue una solución de compromsio para que no se vean digitos cambiando en torno a 0.
En lo personal yo pondría una opción por software que permitiera ver el 0 o "Sin Lectura" como opciones.
-
long tiempo = millis();
Siempre que uses millis() los valores con los que operes deben definirse como unsigned long.
-
get_corriente()
De nuevo calculas cada corriente muestreada y se supone que quieres tomar la mayor cantidad de muestras en 500 mseg.
yo modificaría esa rutina sin hacer tanta cuenta. Las cuentas cuando tenga Imax e Imin una sola vez.
Incluso hablas de AC de modo que pondria el ADC en freewheeling.
Sin embargo el ADC tarda 100useg en cada conversión en modo normal asi que en 500mseg dudo que no capture correctamente los máx y min de la corriente.
Esta observación sobre poner el ADC en modo libre podria pasarse por alto.
-
220VAC
Queda para la versión 2.0 la medición de tensión con lo que obtendrás un medidor de potencia completo.
Error
Rescato la medición de error tipica de la materia Mediciones Electrónicas alias Instumentitos como le decíamos nosotros en la Universidad (UBA Bs As).
No vi que el Tektronix TX1 TrueRMS Multimeter que usan como elemento comparativo tuviera un certificado de calibración.
Se usó el provisto por el fabricante?
Disipación de la resistencia de carga :
Al realizar la contrastación teníamos errores inaceptables a medida que la medida progresaba en el tiempo, además de una varianza en la medición azarosa, dejando una precisión totalmente variable. Se descubrió que el problema se debía a que la carga utilizada en prueba fue una resistencia de 100Ω/7W. Por ser tan baja la capacidad de disipación de potencia, el calor en aumento distorsionaba toda medición, haciendo imposible la contrastación y calibración del amperímetro. Esto se corrigió utilizando una serie de resistencia de 8Ω con gran poder de disipación, manteniéndose casi “fría” a lo largo del nuevo ensayo.
Es una experiencía práctica que muestra como las cosas en el papel(diseño o laboratorio) son de un modo y en la práctica de otro a pesar que sea coherente, la observación. Muy pocos a menos que hayan pasado por una falla de este tipo considerarían la carga tal como uds optaron luego de los primeros errores. Para destacar
Sensibilidad
La medición de corriente alterna presentaba un gran error, cercano al 20%. Al
cálculo realizado por el algoritmo en el código de Arduino, se le asignó una nueva
sensibilidad distinta a la sensibilidad de continua, para corregir dicha desviación,
logrando disminuir el error muy por debajo de 10%.
Este es otro aporte para considerar.
CONCLUSIONES:
Hubiera usado un DUE en lugar de un MEGA porque dispone de un ADC de 12 bits, 2 bits de mejora respecto del MEGA.
El trabajo me gusta mucho y tiene cuestiones que me llamaron la atención como este recurso simple pero efectivo
Pulsador = digitalRead(PulsadorPin);
delay(200);
if (Pulsador == LOW) { // MODO DC
Toma el valor del pulsador. espera 200 para estabilizarsarlo por si hay rebotes y luego pregunta por un estado.
Me pareció interesante!!
Todos tenemos proyectos pero este merece completarse.. a tener en cuenta y como la Universidad exige trabajos, sería bueno que a la primer oportunidad retomen este buen trabajo y lo potencien.
Hoy con el aumento del costo de la energia en $/Kwatt saber el consumo en una vivienda es importante.
Tienen algo bueno entre manos.