Arduino IDE no se encuentra en los repositorios oficiales de Ubuntu, al menos en su última versión, por lo que tenemos que utilizar la web oficial del Proyecto para conseguir este IDE.
Actualmente existen dos versiones de Arduino IDE, una versión que corresponde a la rama 1.8.x y otra rama que corresponde con la versión 1.0.x. La diferencia entre ambas versiones radica en los modelos de placas que soportan: si descargamos la versión 1.8.x de Arduino IDE podemos cambiar en cualquier momento de placa y esta versión lo soportará ( si escogemos la versión 1.0.x hemos de cambiar el programa si cambiamos a una placa moderna, pues la rama 1.0.6 no soporta las placas de Arduino más modernas).
Una vez que hemos descargado el paquete de Arduino IDE desde aquí, descomprimimos el archivo comprimido en cualquier carpeta de nuestra home (mejor hacerlo ena Home y no en Descargas para evitar problemas cuando realizamos limpiezas en el futuro).
En el paquete que hemos descomprimido aparecerán varios archivos e incluso dos ejecutables, uno de ellos llamado Arduino-Builder, pero estos archivos ejecutables no seráa necesario para instalar Arduino IDE en nuestro Ubuntu
Una vez descomprimidos los archivos necesitaremos abrir una terminal en la carpeta donde están todos estos archivos, y desde la consola escribimos lo siguiente:
sudo chmod +x install.sh
Esta orden hará que el archivo de instalación pueda ejecutarse sin tener que ser root. Ahora ejecutamos en la terminal lo siguiente:
./install.sh
Puede que tenga problemas para ejecutar el instalable por los permisos, por lo que si fuese el caso solo tiene que escribir
sudo ./install.sh
Esto hará finalmente que comience la instalación de Arduino IDE en nuestro Ubuntu.
Tras seguir las instrucciones tendremos Arduino IDE instalado en nuestro Ubuntu y unacceso directo en nuestro escritorio. En este caso da igual la versión de Ubuntu que tengamos pues funciona con las últimas 10 versiones de Ubuntu que han sido lanzadas (versiones LTS incluidas).
Problemas con los puertos
Para los que esten aconstumbrados a usar el ide de Arduino sobre Windows , puede que les resulte extraño en la combinación Arduino-Ubuntu donde los puertos virtuales no se muestran del mismo modo, y con esto se desembocan en nuevos problemas, que como vamos a vers son facilmente resolubles.
COM1 es una designación de Windows (TM): se verá como/dev/ttyACM0,/dev/ttyUSB0 o similar en Linux.
El puerto atenuado tiende a significar que no ha configurado primero el tipo de placa: revise la configuración en arduino Menú Herramientas y configure la placa en ‘Uno’, también debería ver la habilitación de ‘puerto’ y el autocompletado.
El primer problema puede ser que el puerto Serial se encontraba deshabilitado, al momento de ingresar al IDE Arduino no detecta el puerto a pesar de encontrarse conectada la placa a la PC.Al acceder a Herramientas/ Puerto Serial aparece como deshabilitado y esto NO permitirá que descarguemos nuestro código a la placa. Esto es debido a que el sistema no tiene permisos suficientes para poder establecer una comunicación a travez del puerto USB.
En linux, al conectar un USB le asigna un formato del tipo ttyACM0 o similar y esto se encuentra en la ubicación /dev.
Lo primero que tenemos que hacer es revisar como asigna el sistema operativo los puertos.Vamos abrir una terminal de ubuntu y antes de conectar el Arduino ejecutaremos el siguiente comando.
ls -l /dev | grep ACM
Si no hay ningún dispositivo conectado, no aparecerá ningún resultado. En caso contrario aparecerá asignado con algún nombre.
Ahora conectamos el arduino a la placa y ejecutamos el mismo comando.
En este caso dice que solo el usuario root puede acceder al puerto.
Por lo tanto procedemos a brindarle permisos para los usuarios normales del sistema, ejecutamos e lo siguiente:
sudo chmod 777 /dev/ttyACM0
Donde ttyACM0 es el nombre que nos dio en el primer comando, este puede ser ttyACM1. Al ejecutar este comando les pedirá la contraseña del sistema. Para asegurarnos que ha cambiado los permisos ejecutamos de nuevo:
Esto ya indica que los demas usuarios tienen acceso al puerto ttyACM0 y por tanto no deberia dar problemas el ide de Arduino para reconocer la placa por el puerto.
Comando dmesg
En el caso de que pueda intentar iniciar sesión en Tools-> Port si existe un puerto que no sea /dev/ttyS0. Intente jugar con estas opciones. Finalmente, buscando en dmesg también puede averiguar qué puerto se ha ubicado para arduino.
Finalmente, otro enfoque es desconectar su arduino, volver a enchufarlo y escribir el siguiente comando:
dmesg | tail
Para registrar el último evento como el que ocurre cuando arduino se conecta a un puerto usb. El comando anterior le mostrará el puerto correcto.
Para obtener mejores resultados, puede usar lo siguiente:
dmesg | tail -f
Y conecte y desconecte continuamente el arduino del puerto usp hasta que vea cualquier mensaje relacionado con arduino. El parámetro -f permite mostrar en tiempo real los nuevos registros.
Si todo va mal
Si su cuenta de usuario probablemente no tiene permiso para usar el puerto serie y no consigue resolver el problema hay aun dos formas de abordar esto:
Más fácil, pero no aconsejable: Ejecute Arduino IDE como root (por ejemplo, inicie desde la línea de comando usando Sudo).
La segunda forma más recomendable de hacerlo es agregar su usuario al grupo dialout, que tiene permiso para usar el puerto serie. Use el comando Sudo adduser $USER dialout. Sin embargo, deberá cerrar sesión y volver a iniciarla para que surta efecto (o intente esto ). Para enumerar grupos de usuarios actuales, use groups o id -Gn.
Una vez hecho esto, cuando seleccione el puerto serie correcto (como otros han mencionado, tal vez /dev/ttyUSB0), debería poder escribir, permitiéndole programar el Arduino.
sudo chmod a+rw /dev/ttyACM0
o
sudo chmod a+rw /dev/ttyUSB0
Espero que se ha de utilidad este post, si tienen algún comentario o duda pueden dejarlo en los comentarios.
El sensor SCT-013 es un sensor de corriente no invasivo cuya principal utilidad es medir la intensidad en corriente alterna que atraviesa un conductor sin necesidad de interconectarlo en serie. Podemos emplear estos sensores con un microcontrolador como Arduino para medir la intensidad o potencia consumida por una carga.
Una de las ventajas más interesantes es su precio, pero sin duda otra facilidad innegable es que no tenemos que manipular el cable ya que se trata de un sensor de corriente alterna no invasivo.
La precisión del sensor puede ser de 1-2%, pero para ello es muy importante que el núcleo ferromagnético se cierre adecuadamente. Hasta un pequeño hueco de aire puede introducir desviaciones del 10%.
Como desventaja, al ser una carga inductiva, el SCT-013introduce una variación del ángulo de fase cuyo valor es función de la carga que lo atraviesa, pudiendo llegar a ser de hasta 3º.
SCT-013 principio de funcionamiento
Un factor importante dentro de los transformadores de corriente es el número de espiras o número de vueltas que da el cable al núcleo ferromagnético. Conociendo estos datos y la corriente que circula por uno de los devanados podemos calcular la corriente por el otro devanado.
Esto es debido a que guardan la siguiente relación:
A esta fórmula se le llama relación de transformación porque relaciona el número de espiras del primario (Np), del secundario (Ns), las intensidades del primario (Ip), del secundario (Is), el voltaje del primario (Vp) y del secundario (Vs).
En el caso del sensor de corriente alterna SCT-013 el devanado primario es el cable del aparato que queremos medir y el número de vueltas sería uno. El devanado secundario tiene 2.000 vueltas.
Si aplicamos la relación de transformación a esta situación y suponiendo que queremos medir una intensidad de 10 Amperios, el resultado sería el siguiente.
Como se puede comprobar se produce una transformación de energía pues hemos bajado de 10 A (imposible de medir esta corriente con Arduino) hasta los 0,005 A
Ahora nos faltaría conocer cómo medir la intensidad con Arduino a través de una resistencia de carga o resistencia burden (su función es convertir la corriente en un voltaje limitado que podamos medir, por ejemplo, con Arduino.).
Pero antes de meternos en ello, vamos a ver los tipos de sensores de corriente alterna SCT-013 que podemos encontrar.
Podemos comprar diferentes tipos de sensores de corriente alterna SCT-013 que se pueden organizar en dos grupos. Los que proporcionan una corriente o los que proporcionan un voltaje. La gran diferencia entre ellos es que en los primeros no viene incluida una resistencia de carga y en los segundos sí. Solo el SCT-013-000 es que nos proporciona una corriente y no tiene resistencia de carga. pudiendo medir una corriente de entre 50 mA y 100 A.
El resto de la familia de sensores SCT-013 si que tienen incluida la resistencia de carga. Podemos encontrar varios modelos pero todos tienen un voltaje de salida entre 0V y 1V y por tanto elegir uno u otro sensor SCT-013 dependerá de las necesidades según la intensidad de corriente del circuito a medir.
Con Arduino y otra placas como NodeMCU, solo podemos medir voltajes. Si además ese voltaje varía entre un mínimo y un máximo, solo podremos hacerlo a través de una entrada analógica. Por otro lado, en estos cálculos debemos conocer el consumo aproximado del aparato que vamos a medir. Esto nos permitirá ajustar la precisión. El SCT-013-000 puede medir desde 50 mA hasta los 100 A. El objetivo de calcular la resistencia de carga es obtener un valor de resistencia que nos permita leer el voltaje de la corriente que pasa por el sensor SCT-013-000. Debemos de conseguir la máxima resolución posible y para ello debemos conocer la potencia aproximada del aparato o electrodoméstico que vamos a medir.
El consumo aproximado en vatios deberemos sacarlo de las características técnicas del electrodoméstico o aparato que quiera medir. Como ejemplo hagamos los calculos para una carga de 1kw :
Calculo de la corriente :Para una carga de 1kw hacemos los cálculos para 1.000W y un voltaje típico, 220V, calculamos la corriente.
Convertir la corriente máxima eficaz en corriente de pico.La corriente que hemos obtenido en el paso anterior es corriente eficaz. Ahora hay que convertirla en corriente de pico con la siguiente fórmula.
Calcular la corriente de pico en el devanado secundario. Con la fórmula de relación de transformación que hemos visto antes, podemos calcular la corriente de pico en el devanado secundario.
Maximizar la resolución con el máximo valor de la entrada analógica.En este punto entra en juego la placa que estés utilizando ya que depende de cada placa la referencia interna de la entrada analógica. Esta referencia se llama AREF y nos informa del voltaje máximo que podemos medir en una entrada analógica. Por ejemplo, NodeMCU y Arduino MKR1000 utilizan 3,3V y Arduino UNO utiliza 5V. En este ejemplo vamos a utilizar el AREF de Arduino UNO, 5V. La idea es aplicar la Ley de Ohm pero utilizando la mitad de voltaje. Lo que hemos hecho en los pasos anteriores es calcular la corriente de pico lo que significa que todavía tenemos una onda sinusoidal que varía de positivo a negativo. El objetivo es ajustar la resistencia para que se cumpla la Ley de Ohm y tengamos un voltaje entre 2,5V y -2,5V ya que la corriente la tenemos fija. Por eso, como veremos ahora en la fórmula, debemos dividir AREF entre dos.
Obteniendo un valor coherente para la resistencia de carga.El valor que nos ha dado para la resistencia de carga es de 778Ω. Este valor no es un valor que podamos encontrar fácilmente. Por eso debemos utilizar varias resistencias en serie que sean más comunes para conseguir un valor aproximado .También se podría hacer con resistencias en paralelo: por ejemplo, podemos poner en serie dos resistencias de 330Ω y una de 100Ω. Esto nos daría un valor de 760Ω más o menos aproximado al que habíamos calculado. Siempre que lo hagas quédate por debajo del valor calculado. Esto evitará que nos salgamos del límite de voltaje establecido por AREF ya que podemos llegar a dañar la placa de desarrollo con el sensor SCT-013.
RESUMEN: Excepto el modelo SCT-013-100, todos los demás modelos tienen una resistencia de burden interna para que la salida sea una señal de tensión de 1V, por lo tanto si elegimos el adecuado ni siquiera tendremos que preocuparnos por ello. Únicamente en el caso del SCT-013-100, carece de resistencia burden interna, por lo que la salida es una señal de ±50mA aunque a efectos prácticos una resistencia de 33Ω en paralelo con el sensor será suficiente.
Offset
En la resistencia de carga vamos a tener un voltaje que varía de 2,5V a -2,5V que sigue siendo una señal sinusoidal por lo que el problema que existe es que ni Arduino ni NodeMCU leen voltajes negativos. Así que tenemos que modificar la señal para que pase a estar en el rango de 0V a 5V.
Eso se hace añadiendo un offset en DC a nuestra señal bastando con sumar 2,5V y estaría resuelto. Esto lo haremos a través de un circuito conocido como circuito offset en DC que básicamente consiste en poner un divisor de tensión y un condensador. El condensador tiene que ser de 10μF y unos pocos cientos de voltios. Esto hace que la reactancia sea baja y la corriente alterna evite la resistencia.
El valor de las resistencias del divisor de tensión puede ser 10kΩ siempre y cuando lo alimentemos a través de la red eléctrica. Si su dispositivo va a funcionar con pilas utilize unas resistencias de 470kΩ para que el consumo sea mínimo.
El circuito
Con todo lo que hemos visto, ya podemos montar el circuito eléctrico donde conectemos el SCT-013 y Arduino.
Antes de ver como conectar los componentes vamos a echar un vistazo al conector que viene incluido en toda la familia SCT-013. Se trata del típico conector de audio que tenemos en todos los auriculares, conocido como jack. Cada tipo de jack hembra es diferente. Deberemos investigar como se hacen las conexiones o bien cortar el cable; encontrará dos cables, uno rojo y otro blanco. Estos colores pueden variar dependiendo del fabricante y del modelo.
En el siguiente esquema vemos el montaje del circuito de offset y la resistencia de carga con un sensor SCR-013-000. Obviamente si usamos otro sensor podemos eliminar la resistencia de carga , y por tanto haciendo mas sencillo el circuito al estar dicha resistencia integrada y calibrada en el propio sensor
Por último vamos a ver cómo tenemos que abrazar los cables de alta tensión con el sensor de corriente alterna SCT-013. No vale de cualquier forma, hay que hacerlo de una manera determinada ya que de lo contrario, no estaremos midiendo correctamente el consumo.
Lo más importante es que tenemos que abrazar solo uno de estos cables, en caso contrario la medición será cero. Esto es debido a que por uno de los cables la corriente fluye en un sentido y por el otro cable fluye en sentido contrario. Si abrazamos los dos cables un flujo magnético compensará al otro flujo magnético y se anulará.
Es importante utilizar cables de buena calidad. Por tu seguridad y para conseguir una buena precisión.
Seguramente encuentre tres cables cuando quites la funda que cubre todo. Los colores de la fase suelen ser azul o negro y para el neutro marrón. En uno de estos cables es donde tienes que abrazar el sensor SCT-013(no el de masa) . El tercer cable suele ser de color verde y amarillo y sirve para la toma de tierra por lo que no daría ninguna lectura en caso de abrazar este cable.
Calibración del sensor de corriente alterna SCT-013
Debemos partir del concepto de que nuestros aparatos no son perfectos. Es imposible fabricar cualquier cosa con absoluta precisión. Hay una relación directamente proporcional (incluso exponencial) entre precisión y precio. Cuanto más preciso más caro es el aparato.
Hay tres factores importantes a tener en cuenta y que influyen en la precisión (fuente Open Energy Monitor):
La relación de transferencia del transformador
El valor de la resistencia de carga y su tolerancia
La precisión del ADC a la hora de medir el voltaje en la resistencia de carga
La idea es empezar con la teórica y luego corregir ese valor con la fase experimental. Mucho ojo en la parte experimental. Vamos a trabajar con alto voltaje y puede ser muy peligroso. SI NO ESTÁ SEGURO NO HAGA LA PARTE EXPERIMENTAL.
Proceso de calibración
El proceso de calibración es sencillo. Solo tenemos que aplicar la siguiente fórmula.
Lo que hacemos es calcular el factor de calibración dividiendo el factor de transformación (corriente máxima eficaz dividida entre la corriente mínima eficaz) entre la resistencia de carga.
El valor que nos da sería el valor que tenemos que poner en el sketch del SCT-013. Si sustituimos los valores para la resistencia de carga que hemos calculado quedaría de la siguiente manera.
Este sería el valor teórico. Ya tendríamos algo por donde empezar. Para asegurarnos de que realmente este factor de calibración es bueno sería interesante conectar un aparato del cual sepamos su consumo aproximado.Por ejemplo, podemos utilizar una bombilla incandescente. Se recomienda una con bastante potencia para no perder resolución. El sensor SCT-013 nos dará una resolución de 2 decimales por lo tanto, si queremos calibrar bien este sensor debemos utilizar un aparato que consuma más de 20W.
A efectos prácticos tenemos que medir la corriente real con la corriente que está dando el sensor SCT-013 para lo cual podemos usar diferentes métodos.
Midiendo el voltaje de la red eléctrica :Para medir el voltaje necesitarás un multímetro. Lo primero es configurar el aparato correctamente. Tienes que seleccionar voltaje en alterna y el rango correspondiente a 220V. Además tienes que conectar el cable rojo (suele ser de este color) en voltios y el cable negro en COM. Una vez configurado debes meter las dos puntas en un enchufe. Cada una en un agujero. Da lo mismo en que agujero metas la punta. La diferencia es que te dará o positivo o negativo. Esto te dará un valor de voltaje y es el que tienes que apuntar y actualizar en el sketch.Las mediciones en este punto dependen mucho de la calidad del multímetro. Este es otro caso claro donde el precio tiene que ver mucho con la precisión.
Midiendo la corriente alterna con el multímetro: La corriente es algo más complicado ya que tenemos que cortar el cable y poner el mutímetro en serie con el cable, como si fuera una resistencia. En estos casos es interesante tener una clema, bornera o ficha de empalme. Eso sí, que soporte la corriente que va a pasar por la bornera. No pongas una de electrónica porque puedes dañar la instalación. Antes de nada vamos a ver cómo configurar el multímetro para medir una corriente alterna. Es diferente a la configuración de voltaje en alterna. Es importante que también tengas conectado el sensor de corriente alterna SCT-013 para poder comparar una medida y otra. Cuando mido con el multímetro obtengo el siguiente resultado. ida de 0,33A. Si hacemos los cálculos para obtener la potencia se obtiene lo siguiente P=V x I=230v x 0,33a=75,9w. Con los datos obtenidos anteriormente donde teníamos una potencia de unos 120W, comprobamos que este factor de calibración hay que ajustarlo. Por lo tanto, el factor de calibración está mal. Hay que corregirlo. Pero ahora que tenemos los datos experimentales resulta sencillo. Si el valor obtenido a través del sensor de corriente alterna SCT-013 es mayor, baja el factor de corrección. Ajusta dicho valor hasta conseguir un dato aproximado al que has obtenido en el multímetro. Solo es cuestión de ir modificando y cargando el código en la placa hasta que tener un valor correcto. No te olvides de modificar también el valor del voltaje obtenido. Al final con un factor de calibración de 1.6 y un voltaje de 230V consigo ajustarme a la corriente que nos mostraba el multímetro.
Código final para obtener la potencia con el sensor SCT-013
Gracias a Emonlib no tenemos que hacer cálculos complejos pues podemos ayudarnos en esta tarea de una librería. En concreto vamos a utilizar Emonlib creado por el proyecto Open Energy Monitor. Open Energy Monitor es un proyecto que nos proporciona diferente hardware para medir el consumo en multitud de dispositivos y aparatos. Han creado sus propias placas compatibles con Arduino. Para inlcuir esta libreria Abra el gestor de librería y busque Emonlib. También puede descargarlo desde el repositorio en GitHub.Con unas pocas líneas de código obtendremos de una forma muy sencilla la potencia que está consumiendo el aparato. Lo primero es el voltaje de tu red eléctrica.
En la función setup() iniciamos la comunicación serie para poder mostrar los datos a través del monitor serie.
Luego iniciamos el objeto que hemos creado de la clase EnergyMonitor con la función current(pinAnalogico, factorCalibracion). Esta función admite dos parámetros:
pinAnalogico: es el pin analógico donde hemos conectado el sensor de corriente alterna SCT-013.
factorCalibracion: es un valor que tenemos que calcular para corregir errores de diferentes tipos como la tolerancia de la resistencia de carga o del propio sensor SCT-013.
El pin analógico no tiene duda. Según el esquema mostrado más arriba vamos a utilizar el A0 así que pasamos como argumento un 0. El factor de corrección de momento lo dejamos a 2,6. En el siguiente apartado veremos como se calcula.
Por último en la función loop() obtenemos la corriente eficaz llamando a la función calcIrms(numMuestras). Esta función admite un parámetro:
numMuestras: indica cuantas muestras tiene que tomar para calcular la corriente eficaz.
El número de muestras es importante. Como hemos estado hablando a lo largo de todo este artículo, estamos trabajando con una señal sinusoidal. Esto quiere decir que tiene ciclos que se van repitiendo en el tiempo.
El número de muestras indica el número de veces que se va a leer la señal para obtener el valor de la corriente eficaz. Es interesante que estas muestras sean en ciclos completos. Según la velocidad de acceso a los pines analógicos con Arduino UNO, aproximadamente podemos medir 106 muestras en cada ciclo. Si está utilizando otro microcontrolador este valor puede variar.
Si queremos medir 14 ciclos (un valor recomendado por el proyecto Open Energy Monitor), tendremos que medir . De aquí viene el valor que se pasa a la función calcIrms().
Por último mostramos toda esta información a través del monitor serie.
// Include Emon Library
#include "EmonLib.h"
// Crear una instancia EnergyMonitor
EnergyMonitor energyMonitor;
// Voltaje de nuestra red eléctrica
float voltajeRed = 230.0;
void setup()
{
Serial.begin(9600);
// Iniciamos la clase indicando
// Número de pin: donde tenemos conectado el SCT-013
// Valor de calibración: valor obtenido de la calibración teórica
energyMonitor.current(0, 1.6);
}
void loop()
{
// Obtenemos el valor de la corriente eficaz
// Pasamos el número de muestras que queremos tomar
double Irms = energyMonitor.calcIrms(1484);
// Calculamos la potencia aparente
double potencia = Irms * voltajeRed;
// Mostramos la información por el monitor serie
Serial.print("Potencia = ");
Serial.print(potencia);
Serial.print(" Irms = ");
Serial.println(Irms);
}
Si no deseamos usar la librería también podemos realizar los cálculos internos nosotros mismos, si bien el código ahora ya no queda tan claro como la version anterior:
Añadir un ADC con entrada diferencial, nos permite realizar mediciones de tensiones positivas y negativas, como el ADS1115. Esta es la opción que vamos a comentar como mejora.
Este convertidor analógico digital tiene una resolución de 16 bits y una interfaz I2C para un control cómodo.
El módulo es adecuado para todos los microcontroladores actuales con 2.0V – 5.5V, el uso con Raspberry es posible sin problemas.
La frecuencia de muestro del módulo es programable hasta 860/s.
Gracias a la PGA interna, es posible amplificar hasta 16 veces la señal analógica.
Ajustando la ganancia del ADS1115 a 2.048V estaremos dentro del rango de ±1.414V. En el caso de un sensor de 30A tendremos una precisión de 1.87mA, y 6,25 mA para un sensor de 100A.
Si usáis un SCT-013-100 con salida de ±50mA, tendremos que añadir una resistencia burden externa de 33Ω y subir la ganancia del ADS1115 a 4.096V para cumplir con el rango de ±2.33V.
Si no queréis usar un ADC externo, podéis usar la solución más convencional, que es añadir un circuito que nos permita añadir un offset central como vimos al principio del post.
Si habéis usado el montaje con un SCT-013 con salida de ±1V RMS y ADS1115, el código necesario es similar al que vimos en la entrada sobre el ADS1115. Necesitarémios la librería de Adafruit para el ADS1115.
Para que el ADS1115 muestree a una velocidad superior, deberemos modificar la siguiente línea del fichero ‘Adafruit_ADS1015.h’
#define ADS1115_CONVERSIONDELAY
Por,
#define ADS1115_CONVERSIONDELAY
Con esto conseguiremos bajar el tiempo de muestreo de unos 8-9 ms (unos 100 Hz) a 1.8 aprox (unos 500 Hz). Con eso nos alejamos de la frecuencia de Nyquist, y mejoramos el comportamiento de la medición.
Otra versión es emplear el máximo y el mínimo de la medición, y calcular la medición a partir del valor de pico. Los resultados deberían ser similares a los vistos en el ejemplo con la suma al cuadrado. Para ello, podéis sustituir la función por la siguiente.
Aunque depende mucho de las necesidades del aparato que quieras medir, estos sensores invasivos (debes alterar el cable que conecta el aparato) pueden ser una buena alternativa.
Interruptor Sonoff WiFi y medidor de corriente de Itead
En el pasado, muchos proyectos de amperímetros se basaban en sensores de corriente de efecto Hall como el ACS712, en amplificadores de detección de corriente de lado alto como el MAX4080SASA o fabricados con amplificadores operacionales , lo cual tiene un pequeño inconveniente: estos sistemas tienen una salida analógica que luego debe digitalizarse para procesarse en un sistema de adquisición de datos como Arduino.
Para intentar superar esos inconvenientes existe un CI muy interesante como el INA226, chip fabricado por Texas Instruments, que es un sensor de 36V, 16-bit, ultra-precise i2c output current/voltage/power monitor w/alert.
El sensor INA226 tiene una salida digital e incorpora un ADC de 16 bits por lo que se obtiene una gran exactitud y precisión. Mide la corriente y el voltaje y calcula la potencia mientras Arduino se comunica con el chip, pudiendo presentar las medidas en una pantalla LCD y almacenarlas en una tarjeta micro SD.
Este chip opera con un voltaje máximo de 36 voltios, mientras que la corriente está limitada solo por la derivación utilizada. Hay algunas bibliotecas para el chip INA226, peros se puede utilizar la biblioteca Korneliusz Jarzebski que me parece bastante completa incluso si tuviera que hacer algunos cambios en dos funciones.
Existen numerosas aplicaciones posibles para esta herramienta de monitorización: dispositivos alimentados por batería como scooters o bicicletas asistidas por pedaleo, paneles fotovoltaicos, etc.
En las mediciones de corriente con el shunt hay dos formas de insertarlo:
Tierra (lado bajo): la derivación está conectada entre la carga y la tierra.
Hacia la fuente de alimentación (lado alto): el shunt está conectado entre la fuente de alimentación y la carga.
El circuito integrado INA226, de Texas Instruments, es un dispositivo digital que mide la corriente con una derivación de lado alto o lado bajo y también mide el voltaje, calcula la potencia y proporciona una alarma multifuncional. El diagrama de bloques de dicho integrado es el siguiente:
La resolución de la tensión de derivación es de 2,5 m V con una escala completa de 32768×2,5 = 81,92 mV. Para la tensión VBUS, la resolución es de 1,25 mV con un fondo de escala teórico de 40,96 V, incluso si no se deben superar los 36 V. La resolución de la potencia es 25 veces mayor que la de la corriente, con un fondo de escala que depende del shunt utilizado. De modo que el sistema tiene una precisión de medición notable.
El ADC interno se basa en un convertidor delta-sigma de 16 bits (ΔΣ) con una frecuencia de muestreo típica de 500 kHz (± 30%), por lo que también es adecuado para corrientes que cambian rápidamente con el tiempo.El chip tiene 10 pines y dimensiones muy pequeñas, con una caja DGS (VSSOP).
El INA226 puede proporcionar una alerta de hardware o software si una variable, seleccionada por el usuario, ha superado un límite. El usuario puede seleccionar una de las cinco funciones disponibles para monitorear y / o establecer el bit de conversión lista. Las cinco funciones de alerta que se pueden monitorear son:
Sobre-límite de voltaje de derivación (SOL): excede el umbral de corriente máximo;
Bajo límite de voltaje de derivación (SUL): excede el umbral de corriente mínimo;
Límite de voltaje de bus (BOL): excede el umbral de voltaje máximo;
Límite inferior de voltaje de bus (BUL): superando el umbral de voltaje mínimo;
Power Over-Limit (POL): superando el umbral de potencia máxima;
La salida de alerta es de colector abierto y se puede conectar fácilmente a un dispositivo de bloqueo. Para simplificar, podemos leer la alerta de tipo de sobre-límite de voltaje de derivación (SOL) a través del software y presentarla en la pantalla. Gracias a este sensor pues podemos calcular la potencia con un Arduino presentando estas en una pantalla LCD almacenándolas en una tarjeta micro SD.
Este chip funciona con un voltaje máximo de 36 voltios, mientras que la corriente está limitada solo por la derivación utilizada. La resolución del voltaje de derivación es de 2.5 m V con una escala total de 32768×2.5 = 81.92mV.
El dispositivo tiene dos pines de dirección, A0 y A1. La siguiente tabla enumera las conexiones de clavijas para cada una de las 16 direcciones posibles.
A1
A0
Dirección del esclavo
A1
A0
Dirección del esclavo
GND
GND
1000000
SDA
GND
1001000
GND
VS
1000001
SDA
VS
1001001
GND
SDA
1000010
SDA
SDA
1001010
GND
SCL
1000011
SDA
SCL
1001011
VS
GND
1000100
SCL
GND
1001100
VS
VS
1000101
SCL
VS
1001101
VS
SDA
1000110
SCL
SDA
1001110
VS
SCL
1000111
SCL
SCL
1001111
El módulo monta dos resistencias pull-down (R2 y R3), por lo que la dirección es 0x40 si no conectamos los jumpers colocados en el lado opuesto al de los componentes (ver figura 2 a la derecha).Con la resistencia de derivación de 0.1 W (R100), montada en el módulo, hay una resolución de corriente de 2.5 m V / 0.1 = 0.025 mA, una escala completa de 81.92mV / 0.1 W = 819.2 mA y una resolución de potencia de 0.025 mA * 25 = 0,625 mW.
Una opción muy aconsejable es montar un shunt externo para corrientes altas, desoldando el interno e insertar un filtro RC,
Pantalla LCD
LCD
función
Arduino
LCD
función
Arduino
14
Línea de bus de datos D7
A3
5 5
R / W – Lectura / Escritura
Gnd
13
Línea de bus de datos D6
A2
4 4
RS – Registrarse Seleccionar
D7
12
Línea de bus de datos D5
D4
3
VEE
–
11
Línea de bus de datos D4
D5
2
VCC ( + 5V)
VCC
6 6
E – Habilitar señal
D6
1
VSS (GND)
Gnd
El Ci se puede complementar con una pantalla LCD común de dos líneas de 16 caracteres con controlador compatible con Hitachi HD44780 y una retroiluminada equipada con diodos LED de alta eficiencia que consume alrededor de 20 mA, que puede reducierse a 10 mA con una resistencia externa en serie con la iluminaciona. Las conexiones con Arduino Nano son las siguientes:
El módulo micro SD
La siguiente tabla muestra las conexiones y pines dedicados a la microSD:
J2
Módulo SD
Arduino
6 6
CS
D10
5 5
SCK
D13
4 4
MOSI
D11
3
MISO
D12
2
VCC
+5 V
1
GND
GND
Cálculos para la derivación utilizada
Podemos usar cualquier SHUNT de potencia. Como ejemplo el ICE 680R. Este shunt tiene una salida de 100 mV con una corriente de 25 A, por lo que Rs = 0.1 / 25 = 0.004 Ω. Desoldand la derivación de 0.1 Ω, montada en el módulo INA226, y soldarmos un conensador de 1 MF y dos resistencias de filtro. Este recurso permite el filtrado RC, como sugiere el fabricante del chip.
Con el voltaje de derivación a escala completa en mente, la corriente máxima medible ahora se convierte en:Ifs = 81,92 mV / 4 mΩ = 20,48 A
La resolución actual será: 20,48 / 32768 = 0,625 mA.
La función de calibración tiene como parámetros de entrada la resistencia en derivación y la corriente máxima, en nuestro caso: rShunt = 0.004 Ω e iMaxExpected = 20.48 A.
Otro dato para pasar al programa es el umbral actual de la función setShuntVoltageLimit .Si establecemos el límite superior del instrumento en 20 A, podemos calcular:setShuntVoltageLimit = 0,004 Ω * 20 A = 0,08 V
El montaje del circuito final
Podemos usar un Arduino Nano, pero por supuesto se puedne usar otras placas Arduino, como Arduino Uno o Arduino Pro, (pero esta placa es muy compacta, completa con un adaptador USB y se puede montar en un prototipo de pcb pretaladrado).
Arduino Nano tiene su propio regulador de 5V, un Low DropOut tipo AMS1117, pero podemos alimentar el sistema con un LM7805 común, esto se debe a que el primero acepta un voltaje de entrada máximo de 15V contra los 35V del segundo. Si tenemos que alimentar ArduINA226 con el voltaje que tengo que monitorear, es mejor tener valores compatibles. Ademas otra razón es la luz de fondo de la pantalla. El consumo de todo el sistema ronda los 45 mA. El diodo Schottky D1, que tiene una caída de solo 0,2 V, se utiliza para evitar conflictos entre la fuente de alimentación externa y la fuente de alimentación USB.
La figura siguiente muestra el diagrama de cableado :
Lista de componentes
componente
descripción
componente
descripción
C1, C2, C4
100 nF 50V, condensador cerámico
R4
Resistencia de 100 ohmios , ± 5%, 0.5 W
C3
10 MF 50V, condensador electrolítico
U1
Tablero Arduino Nano
C4
1 MF 25V, condensador cerámico
U2
LM7805, regulador de 5V
D1
1N5819, diodo Schottky
U3
Módulo INA226
Rp1
Recortadora resistiva de 22k W
monitor
LCD de 2 filas x 16 columnas
R1, R2
10 ohmios , ± 5%, resistencia de 0.25 W
módulo SD
Tarjeta micro SD con niveles de 5V
R3
4.7 kohmios , ± 5%, resistencia de 0.25 W
Sw1
Pulsador normalmente abierto (NO)
Nota : el prefijo de capacidad ‘M’ significa microfaradio (1e-6 F)
Cambios en la biblioteca INA226.cpp
Hay algunas bibliotecas para el chip INA226, siendo la biblioteca Korneliusz Jarzebski bastante completa cmbiando la función de calibración porque la corriente de derivación era incorrecta. La función setShuntVoltageLimit también estaba mal.
Aquí están las funciones modificadas, para reemplazar las originales:
El programa requiere solo dos parámetros que son: rShunt e iMaxExpected . Si desea utilizar una alerta, debe decidir qué señal le interesa. Si elige la corriente máxima, le interesara el voltaje de derivación máximo y el uso las funciones enableShuntOverLimitAlert y setShuntVoltageLimit .
En el caso de un sistema alimentado por baterías de iones de litio o plomo, sería más útil comprobar la tensión mínima de VBUS con las funciones enableBusUnderLimitAlert y setBusVoltageLimit .
Si no hemos insertado la tarjeta SD o si no es válida, aparecerá el mensaje «¡SD no presente!»
.Al final de la función setup (), el programa imprime «Push to Start» y espera a que se presione el botón SS, si el SD está presente, comienza a adquirir las medidas en archivo, de lo contrario las imprime solo en la pantalla .
En cuanto a la pantalla LCD, dos filas y 16 columnas son suficientes, por lo que debe administrar bien sus impresiones. Teniendo en cuenta la resolución de las variables a imprimir, estos son sus formatos:
Voltaje del bus: V = xx.xxx (8 caracteres)
Corriente de derivación: I = xx.xxx (8 caracteres)
Potencia del bus: W = xxx.xx (8 caracteres impresos)
Entonces, en la primera línea veremosel voltaje y la potencia, separados por un espacio y en la segunda la corriente y el número de muestras guardadas en SD (si está insertada), de esta manera:V = xx.xxx W = xxx.xxI = xx.xxx N = xxxxx
Si se produce la alerta cuando se excede el límite máximo de corriente (SOL, sobre límite de voltaje de derivación), aparecerá la impresión «ALERTA SOL» en la segunda línea, en lugar del valor actual y en la primera el voltaje de derivación:Derivación V = xx.xxxxxALERTA SOL
/ * Programar ArduINA226 a corriente, voltaje y potencia
con módulo Arduino Nano e INA226
utiliza la biblioteca Korneliusz Jarzebski para INA226 (modificado)
guardar las mediciones en SD si está presente
Giovanni Carrera, 14/03/2020
* /
#include <SPI.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <SD.h>
#include <INA226.h>
// Pines de LCD
#define rs 7
#define en 6
#define d4 5
#define d5 4
#define d6 A2
#define d7 A3
#define SSbutton 2
#define SD_CS 10
// inicializar la biblioteca asociando cualquier pin de interfaz LCD necesario
LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
INA226 ina;
char bline [17] = ""; // línea en blanco
const int deltat = 500; // período de muestreo en milisegundos
cmilli largo sin firmar, pmilli;
boolean SDOk = verdadero, FileHeader = verdadero, ACQ = falso;
unsigned int ns = 0;
void setup () {
// configura el número de columnas y filas de la LCD:
lcd. comienzo (16, 2);
pinMode (SSbutton, INPUT); // Botón de inicio / parada
pinMode (SD_CS, SALIDA); // Selección de chip SD
// La dirección INA226 predeterminada es 0x40
ina.begin (0x40);
lcd.print ("ArduINA226");
lcd.setCursor (0, 1); // imprime en la segunda fila
lcd.print ("Monitor de energía");
// Configurar INA226
ina.configure (INA226_AVERAGES_1, INA226_BUS_CONV_TIME_1100US, INA226_SHUNT_CONV_TIME_1100US, INA226_MODE_SHUNT_BUS_CONT);
// Calibrar INA226. Rshunt = 0,004 ohmios, corriente máxima esperada = 20,48 A
ina.calibrate (0,004, 20,48);
ina.enableShuntOverLimitAlert (); // habilita la alerta de sobretensión de derivación, corriente por encima del límite
ina.setShuntVoltageLimit (0.08); // límite de corriente = 20 A para 0,004 ohmios
ina.setAlertLatch (verdadero);
if (! SD.begin (SD_CS)) {
LCDprintLine ("¡SD no está presente!", 1);
delay (5000);
SDOk = false;
}
LCDprintLine ("Pulsar para iniciar", 1);
while (digitalRead (SSbutton) == HIGH) {}; // esperar el inicio
if (SDOk) ACQ = true;
}
void loop () {
cmilli = milis ();
si (cmilli - pmilli> deltat) {
pmilli = cmilli;
voltios flotantes = ina.readBusVoltage ();
corriente flotante = ina.readShuntCurrent ();
LCDprintLine ("V =", 0); // imprimir voltaje del bus
lcd.print (voltios, 3);
float power = ina.readBusPower (); // INA calcula la potencia
// potencia flotante = voltios * corriente; // Arduino calcula la potencia
lcd.print ("W ="); // potencia de impresión
lcd.print (potencia, 4);
flotar Vshunt = ina.readShuntVoltage ();
String dataString = String (voltios, 3) + ',' + String (actual, 4) + ',' + String (potencia, 4) + ',' + String (Vshunt, 6);
si (ACQ) {
Archivo dataFile = SD.open ("powerlog.csv", FILE_WRITE);
if (dataFile) {
if (FileHeader) {// imprimir el encabezado del archivo
dataFile.print ("Deltat [ms] =");
dataFile.println (deltat);
dataFile.println ("Vbus [V], Ishu [A], P [W], Vshu [V]");
FileHeader = false;
}
dataFile.println (dataString);
ns ++; // número de muestras adquiridas
dataFile.close ();
if (digitalRead (SSbutton) == LOW && ns> = 10) {// detente después de al menos 10 muestras
ACQ = false; // detener la adquisición
LCDprintLine (Cadena (ns), 1);
lcd.print ("muestras");
delay (5000);
}
} else {
LCDprintLine ("¡No se puede abrir el archivo!", 1);
ACQ = false;
delay (5000);
}
}
if (ina.isAlert ()) {
LCDprintLine ("Shunt V =", 0);
lcd.print (Vshunt, 5);
LCDprintLine ("ALERTA SOL", 1);
}
else {
LCDprintLine ("I =", 1);
lcd.print (actual, 3);
if(ACQ) {
dataString = "N =" + String (ns);
lcd.print (dataString); // número de impresión de la muestra adquirida
}
}
}
}
/ ************************** Funciones ********************* **** /
void LCDprintLine (texto de cadena, línea de bytes) {
lcd.setCursor (0, línea);
lcd.print (bline); // borra la segunda fila
lcd.setCursor (0, línea);
lcd.print (texto); // imprimir texto
}
El sistema puede funcionar incluso con periodos delta muy pequeños, pero la visualización, las impresiones y la escritura en archivo llevan algo de tiempo: si queremos reducirlo, por ejemplo a 100 ms, las medidas deben mostrarse cada 5 muestras.
También se pueden implementar algunos circuitos de hardware, como usar la salida de alerta para desconectar la fuente de alimentación a la carga a través de un relé estático o electromecánico o para hacer un sonido de timbre a través de Arduino.
ArduINa226, si se ha insertado una tarjeta micro SD, transfiere las medidas al archivo «powerlog.csv».La adquisición comienza presionando el botón ‘SS’ (Start / Stop) que también sirve para finalizar la grabación después de al menos diez muestras.
Las dos primeras líneas contienen el período de muestreo deltat en milisegundos y los nombres de las señales, como se ve en el siguiente ejemplo:Deltat [ms] = 500Vbus [V], Ishu [A], P [W], Vshu [V]10.021,0.0950,0.9531,0.00037510.023,0.0944,0.9531,0.00037710.023,0.0944,0.9531,0.000375……Los datos se agregan al archivo que no se sobrescribe.
Calculo de la potencia
La energía suministrada por la fuente es la integral de la potencia a lo largo del tiempo. El sistema más simple para hacer la integral definida de una función, aunque de manera bastante aproximada, es el de los trapezoides. La curva de potencia se aproxima en muchos trapecios, de los cuales es fácil calcular el área, para dos puntos tenemos:
La integral será igual a la suma de las áreas individuales.
Este método dará mejores resultados para intervalos de tiempo más pequeños, en nuestro caso:
(t2-t1) = deltat yf (t) es la potencia P (t), entonces
E2 = deltat * (P1 + P2) / 2 + E1 [J]
Donde P1 y P2 son las potencias en dos instantes sucesivos t1, t2 y E1, E2 las energías respectivas expresadas en W × s = julios , que se pueden expresar fácilmente en vatios hora [Wh] dividiendo los julios por 3600
ppower = potencia; // luego actualiza el poderDonde potencia es la potencia actual , ppower la del instante anterior ydeltath = deltat / 3.6e6; // período de muestreo en horas (deltat en [ms])
Al principio, debe restablecer la variable watthour pero el autor no agregoesta función porque no tenía más espacio en la pantalla y preferio calcular la energía en el PC con algoritmos de integración más sofisticados.
El autor de esta idea perteneze a un pueblo de Odisha, India, donde los cortes de energía frecuentes son muy comunes. Obstaculiza la vida de todos. Durante su de infancia, continuar con los estudios después del anochecer fue un verdadero desafío. Debido a este problema diseño un sistema solar para su casa de forma experimental. Uso un panel solar de 10 Watt, 6V para iluminar algunos LED brillantes. Después de enfrentar muchas dificultades, el proyecto tuvo éxito. Luego decidio monitorear el voltaje, la corriente, la potencia y la energía involucradas en el sistema. Esto trajo la idea de diseñar un MEDIDOR DE ENERGÍA. Uso ARDUINO como el corazón de este proyecto porque es muy fácil escribir código en su IDE y hay una gran cantidad de bibliotecas de código abierto disponibles en Internet que se pueden usar de acuerdo con el requisito.
Características: 1-Monitoreo de energía por pantalla LCD 2. Envio de lecturas a través de Internet (carga Xively) 3. Registro de datos en una tarjeta SD
Piezas necesarias:
Potencia y energía
ARDUINO UNO
ARDUINO ETHERNET SHIELD
LCD DE CARACTERES 16×2
SENSOR DE CORRIENTE ACS 712
RESISTENCIAS (10k, 330ohm)
POTENCIOMETRO 10K
CABLES DE PUENTE
CABLE ETHERNET
PANEL DE PAN
Potencia: potencia es el producto del voltaje (voltios) y la corriente (Amp).P = VxI La unidad de potencia es Watt o KW
Energía: Energía es producto de la potencia (Watt) y el tiempo (Hora) E = Pxt Unidad de energía es Watt Hora o Kilovatios hora (kWh) De la fórmula anterior, queda claro que para medir la energía necesitamos tres parámetros: 1. Voltaje 2. Corriente 3. Tiempo
Medición de voltaje
El voltaje se mide con la ayuda de un circuito divisor de voltaje.Como el voltaje de entrada del pin analógico ARDUINO está restringido a 5V, diseño el divisor de voltaje de tal manera que el voltaje de salida debería ser inferior a 5V.Labatería utilizada para almacenar la potencia del panel solar es de 6 V, 5,5 Ah, por lo que tenemps que reducir este 6,5 V a un voltaje inferior a 5 V. Usaremos R1 = 10k y R2 = 10K. El valor de R1 y R2 puede ser menor, pero el problema es que cuando la resistencia es baja, el flujo de corriente más alto lo atraviesa, como resultado, una gran cantidad de energía (P = I ^ 2R) se disipa en forma de calor. Por lo tanto, se pueden elegir diferentes valores de resistencia, pero se debe tener cuidado para minimizar la pérdida de potencia a través de la resistencia.
Vout = R2 / (R1 + R2) * Vbat Vbat = 6.5 cuando está completamente cargado R1 = 10k y R2 = 10k Vout = 10 / (10 + 10) * 6.5 = 3.25v que es inferior a 5v y adecuado para el pin analógico ARDUINO
NOTA Hemos mostrado que la batería de 9 voltios en el circuito de la placa desnuda es solo por ejemplo para conectar los cables. Se utiliza una batería de plomo-ácido de 6 voltios y 5,5 Ah.
Calibración de voltaje: Cuando la batería está completamente cargada (6.5v) obtendremos un Vout = 3.25v y un valor más bajo para otro voltaje de batería más bajo.
ARDUINO ADC convierte la señal analógica a la correspondiente aproximación digital. Cuando el voltaje de la batería es de 6.5v, obtuve 3.25v del divisor de voltaje y sample1 = 696 en el monitor en serie, donde sample1 es el valor ADC corresponde a 3.25v
Para una mejor comprensión, he adjuntado la simulación en tiempo real del circuito 123D para la calibración de medición de voltaje:
3.25v equivalente a 696 1 es equivalente a 3.25 / 696 = 4.669mv Vout = (4.669 * sample1) / 1000 volt Voltaje real de la batería = (2 * Vout) volt
CÓDIGO ARDUINO:
// tomando 150 muestras del divisor de voltaje con un intervalo de 2seg y luego promediar los datos de muestras
for (int i = 0; i <150; i ++) { sample1 = sample1 + analogRead (A2); // lee el voltaje del circuito divisor delay (2); } muestra1 = muestra1 / 150; voltaje = 4.669 * 2 * muestra1 / 1000;
Medición de corriente
Para la medición de corriente utilicé un sensor de corriente de efecto Hall ACS 712 (20 A). Hay diferentes sensores de rango de corriente ACS712 disponibles en el mercado, así que elija según sus necesidades. En el diagrama de la placa de pruebas, he mostrado el LED como una carga, pero la carga real es diferente. PRINCIPIO DE FUNCIONAMIENTO:
El efecto Hall es la producción de una diferencia de voltaje (el voltaje de Hall) a través de un conductor eléctrico, transversal a una corriente eléctrica en el conductor y un campo magnético perpendicular a la corriente. Para saber más sobre el sensor de efecto Hall, haga clic aquí. La hoja de datos del sensor ACS 712 se encuentra aquí.
De la hoja de datos 1. El ACS 712 mide 20 amperios positivos y negativos, correspondientes a la salida analógica 100 mV / A 2. Ninguna corriente de prueba a través del voltaje de salida es VCC / 2 = 5v / 2 = 2.5V
Calibración: La lectura analógica produce un valor de 0-1023, lo que equivale a 0v a 5v Por lo que la lectura analógica 1 = (5/1024) V = 4.89. Valor mv = (4.89 * Valor de lectura analógica) / 1000 V. Pero según las hojas de datos, la compensación es 2.5V (Cuando la corriente es cero, obtendrá 2.5V de la salida del sensor) Valor real = (valor-2.5) V Corriente en amperios = real valor * 10
CÓDIGO ARDUINO:
// tomar 150 muestras de sensores con un intervalo de 2 segundos y luego promediar los datos de muestras recolectados for (int i = 0; i <150; i ++) { sample2 + = analogRead (A3); // lee la corriente del sensor delay (2); } muestra2 = muestra2 / 150; val = (5.0 * muestra2) /1024.0; actualval = val-2.5; // el voltaje de compensación es 2.5v amps = actualval * 10;
Medición del tiempo
Para la medición del tiempo no se necesita ningún hardware externo, ya que ARDUINO tiene un temporizador incorporado.
La función millis () devuelve el número de milisegundos desde que la placa Arduino comenzó a ejecutar el programa actual.
CÓDIGO ARDUINO: milisec largo = milis (); // calcula el tiempo en milisegundos long time = milisec / 1000; // convierte milisegundos a segundos
Todos los resultados se pueden visualizar en el monitor en serie o utilizando una pantalla LCD. Utilicé una pantalla LCD de 16×2 caracteres para mostrar todos los resultados obtenidos en los pasos anteriores. Para los esquemas, consulte el circuito de la placa de pan que se muestra arriba.
Conecte la pantalla LCD con ARDUINO como se indica a continuación:
LCD -> Arduino 1. VSS -> Arduino GND 2. VDD -> Arduino + 5v 3. VO -> Arduino GND pin + Resistencia o potenciómetro 4. RS -> Arduino pin 8 5. RW -> Pin 7 de Arduino 6. E -> Pin 6 de Arduino 7. D0 -> Arduino – No conectado 8. D1 -> Arduino – No conectado 9. D2 -> Arduino – No conectado 10. D3 -> Arduino – No conectado 11 . D4 -> Pin 5 de Arduino 12. D5 -> Pin 4 de Arduino 13. D6 -> Pin 3 de Arduino 14. D7 -> Pin 2 de Arduino 15. A -> Pin 13 de Arduino + Resistencia (potencia de luz de fondo) 16. K -> Arduino GND (tierra de luz de fondo)
CÓDIGO ARDUINO:
Para monitor serie: Serial.print ("VOLTAJE:"); Serial.print (voltaje); Serial.println ("Volt"); Serial.print ("ACTUAL:"); Serial.print (amperios); Serial.println ("Amperios"); Serial.print ("POWER:"); Serial.print (vatios); Serial.println ("Watt"); Serial.print ("ENERGÍA CONSUMIDA:"); Serial.print (energía); Serial.println ("Watt-Hora"); Serial.println (""); // imprime los siguientes conjuntos de parámetros después de un retraso de línea en blanco (2000);
Para LCD:
Para la pantalla LCD, primero debe importar la biblioteca «LiquidCrystal» en el código aquí
El siguiente código es un formato para mostrar en LCD todo el cálculo de potencia y energía
#include <LiquidCrystal.h> lcd (8, 7, 6, 5, 4, 3, 2); int backLight = 9;configuración vacía () { pinMode (luz de fondo, SALIDA); // establece el pin 9 como salida analogWrite (backLight, 150); // controla la intensidad de la luz de fondo 0-254 lcd.begin (16,2); // columnas filas. tamaño de la pantalla lcd.clear (); // limpia la pantalla } void loop () { lcd.setCursor (16,1); // coloca el cursor fuera del recuento de la pantalla lcd.print (""); // imprime un carácter vacío delay (600);////////////////////////////////////////// Imprime potencia y energía en una pantalla LCD / ///////////////////////////////////////////////// lcd.setCursor (1,0); // coloca el cursor en la 1ª columna y la 1ª filalcd.print (vatios); lcd.print ("W"); lcd.print (voltaje); lcd.print ("V"); lcd.setCursor (1,1); // coloca el cursor en la 1ª columna y la 2ª fila lcd.print (energía); lcd.print ("WH"); lcd.print (amperios); lcd.print ("A"); }
Carga de datos a Xively.com
Elija un nombre de usuario, contraseña, establezca su dirección Recibirá un correo electrónico de confirmación; luego haga clic en el enlace de activación para activar su cuenta. Después de abrir correctamente la cuenta, será redirigido a la página de dispositivos de desarrollo .Haga clic en el cuadro + Agregar dispositivo .Dé un nombre a su dispositivo y una descripción (por ejemplo,MONITOREO DE ENERGÍA). Elija datos privados o públicos (elijo privados) Haga clic en Agregar dispositivo-Después de agregar el dispositivo, se le redirige a una nueva página donde hay mucha información importante. ID de producto,secreto de producto, número de serie, código de activación·
Feed ID, Feed URL, API End Point (Feed ID se usa en el código ARDUINO)
Agregar canales (elijo ENERGÍA y POTENCIA, pero puede elegir según su elección) Proporcione la unidad y el símbolo para el parámetro·Agrega tu ubicación·Claves API (utilizadas en el código ARDUINO, evite compartir este número)·Disparadores (hacer ping a una página web cuando ocurre un evento, como cuando el consumo de energía supera un cierto límite)
Para almacenar datos en una tarjeta SD, debe importar la biblioteca SD.
El código para almacenar datos en una tarjeta SD se escribe por separado, ya que no tengo suficiente memoria en mi ARDUINO UNO después de escribir el código para la pantalla LCD y cargar los datos xively.com. Pero estoy tratando de mejorar el código de la versión beta para que un solo código pueda contener todas las funciones (pantalla LCD, carga de datos Xively y almacenamiento de datos en una tarjeta SD). El código para el registro de datos se adjunta a continuación.
/*
SD card datalogger
This example shows how to log data from three analog sensors
to an SD card using the SD library.
The circuit:
* SD card attached to SPI bus as follows:
** UNO: MOSI - pin 11, MISO - pin 12, CLK - pin 13, CS - pin 4 (CS pin can be changed)
and pin #10 (SS) must be an output
** Mega: MOSI - pin 51, MISO - pin 50, CLK - pin 52, CS - pin 4 (CS pin can be changed)
and pin #52 (SS) must be an output
** Leonardo: Connect to hardware SPI via the ICSP header
Pin 4 used here for consistency with other Arduino examples
original code was created on 24 Nov 2010 and modified 9 Apr 2012 by Tom Igoe
I (Debasish Dutta) was again modified for my energy monitoring requirement on 14/01/14
podermos
This example code is in the public domain.
*/
#include <SD.h>
// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
const int chipSelect = 4;
File dataFile;
float sample1=0; // for voltage
float sample2=0; // for current
float voltage=0.0;
float val; // current callibration
float actualval; // read the actual current from ACS 712
float amps=0.0;
float totamps=0.0;
float avgamps=0.0;
float amphr=0.0;
float watt=0.0;
float energy=0.0;
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print("Initializing SD card...");
// make sure that the default chip select pin is set to
// output, even if you don't use it:
pinMode(SS, OUTPUT);
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
while (1) ;
}
Serial.println("card initialized.");
// Open up the file we're going to log to!
dataFile = SD.open("energy.txt", FILE_WRITE);
if (! dataFile) {
Serial.println("error opening energy.txt");
// Wait forever since we cant write data
while (1) ;
}
}
void loop()
{
long milisec = millis(); // calculate time in milisec
long time=milisec/1000; // convert time to sec
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// taking 150 samples from sensors with a inerval of 2sec and then average the samples data collected
for(int i=0;i<150;i++)
{
sample1+=analogRead(A2); //read the voltage from the sensor
sample2+=analogRead(A3); //read the current from sensor
delay(2);
}
sample1=sample1/150;
sample2=sample2/150;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////voltage calculation//////////////////////
voltage=4.669*2*sample1/1000; // callibration // 3.25 from voltage div is eqv 696 in A0 reading
// multiply 2 to get actual voltage// I used two 1k resistor to read 6.36v battery volt
//////////////////////////////////////////////// current calculation //////////////////////
val =(5.0*sample2)/1024.0;
actualval =val-2.5; // offset voltage is 2.5v
amps =actualval*10;// 10 is multiplied as 100mv/A ( from data sheet )
totamps=totamps+amps; // total amperes
avgamps=totamps/time; // average amperess
amphr=(avgamps*time); // ampere hour
watt =voltage*amps; // power=voltage*current
energy=(watt*time)/3600; // energy = power*timein Watt-sec ///again convert to Watt-Hr by dividing 3600sec
////////////////////////////////////////////////////////
// make a string for assembling the data to log:
String dataString = "";
int parameter[4]={voltage,amps,watt,energy}; // here parameters are power,energy,watt-hour and current
// read 4 parameters and append to the string:
for (int i = 0; i < 4; i++)
{
int sensor = parameter[i];
dataString += String(sensor);
if (i < 4)
{
dataString += ",";
}
}
dataFile.println(dataString);
// print to the serial port too:
Serial.println(dataString);
// The following line will 'save' the file to the SD card after every
// line of data - this will use more power and slow down how much data
// you can read but it's safer!
// If you want to speed up the system, remove the call to flush() and it
// will save the file only every 512 bytes - every time a sector on the
// SD card is filled with data.
dataFile.flush();
// Take 1 measurement every 500 milliseconds
delay(500);
}
Fuente https://www.instructables.com/ARDUINO-ENERGY-METER/
¿Qué pasa si una relación lineal no es un supuesto apropiado para nuestro modelo?
Una alternativa ampliamente propuesta por Thomas J. Sargent y John Stachurski es la estimación de máxima verosimilitud, que implica especificar una clase de distribuciones, indexadas por parámetros desconocidos, y luego usar los datos para precisar los valores de estos parámetros.
El beneficio relativo a la regresión lineal es que permite una mayor flexibilidad en las relaciones probabilísticas entre variables.
Aquí ilustramos la máxima probabilidad replicando el artículo de Daniel Treisman (2016) sobre los multimillonarios de Rusia , que conecta la cantidad de multimillonarios en un país con sus características económicas concluyendo que Rusia tiene una mayor cantidad de multimillonarios de lo que predicen factores económicos como el tamaño del mercado y la tasa impositiva.
Consideremos los pasos que debemos seguir en la estimación de máxima verosimilitud y cómo pertenecen a este estudio.
Flujo de ideas
El primer paso con la estimación de máxima verosimilitud es elegir la distribución de probabilidad que se cree que genera los datos.
Más precisamente, necesitamos suponer qué clase de distribución paramétrica está generando los datos.
por ejemplo, la clase de todas las distribuciones normales o la clase de todas las distribuciones gamma.
Cada una de estas clases es una familia de distribuciones indexadas por un número finito de parámetros.
Por ejemplo, la clase de distribuciones normales es una familia de distribuciones indexadas por su media. μ∈(−∞,∞) y desviación estándar σ∈(0,∞).
Dejaremos que los datos seleccionen un elemento particular de la clase definiendo los parámetros.
Las estimaciones de parámetros así producidas se denominarán estimaciones de máxima verosimilitud .
Contando multimillonarios
Treisman está interesado en estimar el número de multimillonarios en diferentes países.El número de multimillonarios se valora en números enteros.Por lo tanto, consideramos distribuciones que toman valores solo en los enteros no negativos.
(Esta es una de las razones por las que la regresión por mínimos cuadrados no es la mejor herramienta para el problema actual, ya que la variable dependiente en la regresión lineal no está restringida a valores enteros)
Una distribución entera es la distribución de Poisson , cuya función de masa de probabilidad (pmf) esf(y)=μyy!e−μ,y=0,1,2,…,∞
Podemos trazar la distribución de Poisson sobre y para diferentes valores de μ como sigue
poisson_pmf = lambda y, μ: μ**y / factorial(y) * exp(-μ)
y_values = range(0, 25)
fig, ax = plt.subplots(figsize=(12, 8))
for μ in [1, 5, 10]:
distribution = []
for y_i in y_values:
distribution.append(poisson_pmf(y_i, μ))
ax.plot(y_values,
distribution,
label=f'$\mu$={μ}',
alpha=0.5,
marker='o',
markersize=8)
ax.grid()
ax.set_xlabel('$y$', fontsize=14)
ax.set_ylabel('$f(y \mid \mu)$', fontsize=14)
ax.axis(xmin=0, ymin=0)
ax.legend(fontsize=14)
plt.show()
Observe que la distribución de Poisson comienza a parecerse a una distribución normal como la media de y aumenta.
Echemos un vistazo a la distribución de los datos con los que trabajaremos en esta conferencia.
La principal fuente de datos de Treisman son las clasificaciones anuales de multimillonarios de Forbes y su patrimonio neto estimado.
El conjunto de datos mle/fp.dtase puede descargar desde aquí o desde su página AER .
pd.options.display.max_columns = 10
# Load in data and view
df = pd.read_stata('https://github.com/QuantEcon/lecture-python/blob/master/source/_static/lecture_specific/mle/fp.dta?raw=true')
df.head()
país
ccode
año
año
entumecido
…
topint08
rintr
noyrs
roflaw
nrrents
0
Estados Unidos
2.0
1990.0
21990.0
Yaya
…
39.799999
4.988405
20,0
1,61
Yaya
1
Estados Unidos
2.0
1991.0
21991.0
Yaya
…
39.799999
4.988405
20,0
1,61
Yaya
2
Estados Unidos
2.0
1992,0
21992.0
Yaya
…
39.799999
4.988405
20,0
1,61
Yaya
3
Estados Unidos
2.0
1993.0
21993.0
Yaya
…
39.799999
4.988405
20,0
1,61
Yaya
4
Estados Unidos
2.0
1994.0
21994.0
Yaya
…
39.799999
4.988405
20,0
1,61
Yaya
5 filas × 36 columnas
Usando un histograma, podemos ver la distribución del número de multimillonarios por país numbil0, en 2008 (los Estados Unidos se descartan para fines de trazado)
A partir del histograma, parece que la suposición de Poisson no es irrazonable (aunque con un valor muy bajo μ y algunos valores atípicos).
Distribuciones condicionales
En el artículo de Treisman, la variable dependiente: el número de multimillonarios yi en el pais i – se modela en función del PIB per cápita, el tamaño de la población y los años de pertenencia al GATT y la OMC.
Por tanto, la distribución de yi necesita estar condicionado al vector de variables explicativas xi.
La formulación estándar, el llamado modelo de regresión de Poisson , es la siguiente:(58.1)f(yi∣xi)=μiyiyi!e−μi;yi=0,1,2,…,∞.where μi=exp(xi′β)=exp(β0+β1xi1+…+βkxik)
Para ilustrar la idea de que la distribución de yi depende de xi ejecutemos una simulación simple.
Usamos nuestra poisson_pmffunción de arriba y valores arbitrarios para β y xi
y_values = range(0, 20)
# Define a parameter vector with estimates
β = np.array([0.26, 0.18, 0.25, -0.1, -0.22])
# Create some observations X
datasets = [np.array([0, 1, 1, 1, 2]),
np.array([2, 3, 2, 4, 0]),
np.array([3, 4, 5, 3, 2]),
np.array([6, 5, 4, 4, 7])]
fig, ax = plt.subplots(figsize=(12, 8))
for X in datasets:
μ = exp(X @ β)
distribution = []
for y_i in y_values:
distribution.append(poisson_pmf(y_i, μ))
ax.plot(y_values,
distribution,
label=f'$\mu_i$={μ:.1}',
marker='o',
markersize=8,
alpha=0.5)
ax.grid()
ax.legend()
ax.set_xlabel('$y \mid x_i$')
ax.set_ylabel(r'$f(y \mid x_i; \beta )$')
ax.axis(xmin=0, ymin=0)
plt.show()
Podemos ver que la distribución de yi está condicionado a xi (μi ya no es constante).
Estimación de máxima verosimilitud
En nuestro modelo para el número de multimillonarios, la distribución condicional contiene 4 (k=4) parámetros que necesitamos estimar.
Etiquetaremos todo nuestro vector de parámetros como β dóndeβ=[β0β1β2β3]
Para estimar el modelo usando MLE, queremos maximizar la probabilidad de que nuestra estimación β^ es el verdadero parámetro β.
Intuitivamente, queremos encontrar el β^ que mejor se adapte a nuestros datos.
Primero, necesitamos construir la función de verosimilitud L(β), que es similar a una función de densidad de probabilidad conjunta.
Supongamos que tenemos algunos datos yi={y1,y2} y yi∼f(yi).
Si y1 y y2 son independientes, la PMF conjunta de estos datos es f(y1,y2)=f(y1)⋅f(y2).
Si yi sigue una distribución de Poisson con λ=7, podemos visualizar el PMF conjunto así
def plot_joint_poisson(μ=7, y_n=20):
yi_values = np.arange(0, y_n, 1)
# Create coordinate points of X and Y
X, Y = np.meshgrid(yi_values, yi_values)
# Multiply distributions together
Z = poisson_pmf(X, μ) * poisson_pmf(Y, μ)
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z.T, cmap='terrain', alpha=0.6)
ax.scatter(X, Y, Z.T, color='black', alpha=0.5, linewidths=1)
ax.set(xlabel='$y_1$', ylabel='$y_2$')
ax.set_zlabel('$f(y_1, y_2)$', labelpad=10)
plt.show()
plot_joint_poisson(μ=7, y_n=20)
De manera similar, la pmf conjunta de nuestros datos (que se distribuye como una distribución condicional de Poisson) se puede escribir comof(y1,y2,…,yn∣x1,x2,…,xn;β)=∏i=1nμiyiyi!e−μi
yi está condicionado a ambos valores de xi y los parámetros β.
La función de verosimilitud es la misma que la pmf conjunta, pero trata el parámetro β como una variable aleatoria y toma las observaciones (yi,xi) como se indicaL(β∣y1,y2,…,yn ; x1,x2,…,xn)=∏i=1nμiyiyi!e−μi=f(y1,y2,…,yn∣ x1,x2,…,xn;β)
Ahora que tenemos nuestra función de verosimilitud, queremos encontrar el β^ que produce el valor de máxima verosimilitudmaxβL(β)
Al hacerlo, generalmente es más fácil maximizar la probabilidad logarítmica (considere diferenciar f(x)=xexp(x) vs. f(x)=log(x)+x).
Dado que tomar un logaritmo es una transformación creciente monótona, un maximizador de la función de verosimilitud también será un maximizador de la función logarítmica de verosimilitud.
En nuestro caso, la probabilidad logarítmica eslogL(β)= log(f(y1;β)⋅f(y2;β)⋅…⋅f(yn;β))=∑i=1nlogf(yi;β)=∑i=1nlog(μiyiyi!e−μi)=∑i=1nyilogμi−∑i=1nμi−∑i=1nlogy!
El MLE del Poisson al Poisson para β^ se puede obtener resolviendomaxβ(∑i=1nyilogμi−∑i=1nμi−∑i=1nlogy!)
Sin embargo, no existe una solución analítica para el problema anterior: para encontrar el MLE necesitamos usar métodos numéricos.
MLE con métodos numéricos
Muchas distribuciones no tienen buenas soluciones analíticas y, por lo tanto, requieren métodos numéricos para resolver las estimaciones de los parámetros.
Uno de esos métodos numéricos es el algoritmo de Newton-Raphson.
Nuestro objetivo es encontrar la estimación de máxima verosimilitud β^.
A β^, la primera derivada de la función logarítmica de verosimilitud será igual a 0.
La gráfica muestra que el valor de máxima verosimilitud (la gráfica superior) ocurre cuando dlogL(β)dβ=0 (la trama inferior).
Por lo tanto, la probabilidad se maximiza cuando β=10.
También podemos asegurarnos de que este valor sea un máximo (en lugar de un mínimo) comprobando que la segunda derivada (pendiente del gráfico inferior) sea negativa.
El algoritmo de Newton-Raphson encuentra un punto donde la primera derivada es 0.
Para usar el algoritmo, hacemos una estimación inicial del valor máximo, β0 (las estimaciones de los parámetros de MCO pueden ser una suposición razonable), entonces
Utilice la regla de actualización para iterar el algoritmoβ(k+1)=β(k)−H−1(β(k))G(β(k))dónde:G(β(k))=dlogL(β(k))dβ(k)H(β(k))=d2logL(β(k))dβ(k)dβ(k)′
Compruebe si β(k+1)−β(k)<tol
Si es verdadero, deje de iterar y configure β^=β(k+1)
Si es falso, actualice β(k+1)
Como puede verse en la ecuación de actualización, β(k+1)=β(k) sólo cuando G(β(k))=0es decir. donde la primera derivada es igual a 0.
(En la práctica, dejamos de iterar cuando la diferencia está por debajo de un pequeño umbral de tolerancia)
Intentemos implementar el algoritmo de Newton-Raphson.
Primero, crearemos una clase llamada PoissonRegressionpara que podamos volver a calcular fácilmente los valores de probabilidad de registro, gradiente y hessiano para cada iteración.
classPoissonRegression:
def __init__(self, y, X, β):
self.X = X
self.n, self.k = X.shape
# Reshape y as a n_by_1 column vector
self.y = y.reshape(self.n,1)
# Reshape β as a k_by_1 column vector
self.β = β.reshape(self.k,1)
def μ(self):
return np.exp(self.X @ self.β)
def logL(self):
y = self.y
μ = self.μ()
return np.sum(y * np.log(μ) - μ - np.log(factorial(y)))
def G(self):
y = self.y
μ = self.μ()
return X.T @ (y - μ)
def H(self):
X = self.X
μ = self.μ()
return -(X.T @ (μ * X))
Nuestra función newton_raphsontomará un PoissonRegressionobjeto que tiene una suposición inicial del vector de parámetrosβ0.
El algoritmo actualizará el vector de parámetros de acuerdo con la regla de actualización y volverá a calcular el gradiente y las matrices hessianas en las estimaciones de los nuevos parámetros.
La iteración terminará cuando:
La diferencia entre el parámetro y el parámetro actualizado está por debajo de un nivel de tolerancia.
Se ha alcanzado el número máximo de iteraciones (lo que significa que no se logra la convergencia).
Para que podamos tener una idea de lo que sucede mientras se ejecuta el algoritmo, display=Truese agrega una opción para imprimir valores en cada iteración.
def newton_raphson(model, tol=1e-3, max_iter=1000, display=True):
i = 0
error = 100 # Initial error value# Print header of outputif display:
header = f'{"Iteration_k":<13}{"Log-likelihood":<16}{"θ":<60}'
print(header)
print("-" * len(header))
# While loop runs while any value in error is greater# than the tolerance until max iterations are reachedwhile np.any(error > tol) and i < max_iter:
H, G = model.H(), model.G()
β_new = model.β - (np.linalg.inv(H) @ G)
error = β_new - model.β
model.β = β_new
# Print iterationsif display:
β_list = [f'{t:.3}' for t in list(model.β.flatten())]
update = f'{i:<13}{model.logL():<16.8}{β_list}'
print(update)
i += 1
print(f'Number of iterations: {i}')
print(f'β_hat = {model.β.flatten()}')
# Return a flat array for β (instead of a k_by_1 column vector)return model.β.flatten()
Probemos nuestro algoritmo con un pequeño conjunto de datos de 5 observaciones y 3 variables en X.
X = np.array([[1, 2, 5],
[1, 1, 3],
[1, 4, 2],
[1, 5, 2],
[1, 3, 1]])
y = np.array([1, 0, 1, 1, 0])
# Take a guess at initial βs
init_β = np.array([0.1, 0.1, 0.1])
# Create an object with Poisson model values
poi = PoissonRegression(y, X, β=init_β)
# Use newton_raphson to find the MLE
β_hat = newton_raphson(poi, display=True)
Como se trataba de un modelo simple con pocas observaciones, el algoritmo logró la convergencia en solo 6 iteraciones.
Puede ver que con cada iteración, el valor de probabilidad logarítmica aumentó.
Recuerde, nuestro objetivo era maximizar la función de probabilidad logarítmica, que el algoritmo ha trabajado para lograr.
Además, tenga en cuenta que el aumento en logL(β(k)) se vuelve más pequeño con cada iteración.
Esto se debe a que el gradiente se acerca a 0 a medida que alcanzamos el máximo y, por lo tanto, el numerador de nuestra ecuación de actualización se hace más pequeño.
El vector de gradiente debe estar cerca de 0 en β^
El proceso iterativo se puede visualizar en el siguiente diagrama, donde el máximo se encuentra en β=10
logL = lambda x: -(x - 10) ** 2 - 10
def find_tangent(β, a=0.01):
y1 = logL(β)
y2 = logL(β+a)
x = np.array([[β, 1], [β+a, 1]])
m, c = np.linalg.lstsq(x, np.array([y1, y2]), rcond=None)[0]
return m, c
β = np.linspace(2, 18)
fig, ax = plt.subplots(figsize=(12, 8))
ax.plot(β, logL(β), lw=2, c='black')
for β in [7, 8.5, 9.5, 10]:
β_line = np.linspace(β-2, β+2)
m, c = find_tangent(β)
y = m * β_line + c
ax.plot(β_line, y, '-', c='purple', alpha=0.8)
ax.text(β+2.05, y[-1], f'$G({β}) = {abs(m):.0f}$', fontsize=12)
ax.vlines(β, -24, logL(β), linestyles='--', alpha=0.5)
ax.hlines(logL(β), 6, β, linestyles='--', alpha=0.5)
ax.set(ylim=(-24, -4), xlim=(6, 13))
ax.set_xlabel(r'$\beta$', fontsize=15)
ax.set_ylabel(r'$log \mathcal{L(\beta)}$',
rotation=0,
labelpad=25,
fontsize=15)
ax.grid(alpha=0.3)
plt.show()
Tenga en cuenta que nuestra implementación del algoritmo de Newton-Raphson es bastante básica; para implementaciones más sólidas, consulte, por ejemplo, scipy.optimize .
Estimación de máxima verosimilitud con statsmodels
Ahora que sabemos lo que está pasando bajo el capó, podemos aplicar MLE a una aplicación interesante.
Usaremos el modelo de regresión de Poisson statsmodelspara obtener una salida más rica con errores estándar, valores de prueba y más.
statsmodels utiliza el mismo algoritmo anterior para encontrar las estimaciones de máxima verosimilitud.
Antes de comenzar, volvamos a estimar nuestro modelo simple con statsmodels para confirmar que obtenemos los mismos coeficientes y valor logarítmico de verosimilitud.
¡Éxito! El algoritmo pudo lograr la convergencia en 9 iteraciones.
Nuestro resultado indica que el PIB per cápita, la población y los años de membresía en el Acuerdo General sobre Aranceles Aduaneros y Comercio (GATT) están relacionados positivamente con la cantidad de multimillonarios que tiene un país, como se esperaba.
Estimemos también los modelos más completos del autor y los mostraremos en una sola tabla.
Table 1 - Explaining the Number of Billionaires in 2008
=================================================
Model 1 Model 2 Model 3
-------------------------------------------------
const -29.050*** -19.444*** -20.858***
(2.578) (4.820) (4.255)
lngdppc 1.084*** 0.717*** 0.737***
(0.138) (0.244) (0.233)
lnpop 1.171*** 0.806*** 0.929***
(0.097) (0.213) (0.195)
gattwto08 0.006 0.007 0.004
(0.007) (0.006) (0.006)
lnmcap08 0.399** 0.286*
(0.172) (0.167)
rintr -0.010 -0.009
(0.010) (0.010)
topint08 -0.051*** -0.058***
(0.011) (0.012)
nrrents -0.005
(0.010)
roflaw 0.203
(0.372)
Pseudo R-squared 0.86 0.90 0.90
No. observations 197 131 131
=================================================
Standard errors in parentheses.
* p<.1, ** p<.05, ***p<.01
El resultado sugiere que la frecuencia de multimillonarios se correlaciona positivamente con el PIB per cápita, el tamaño de la población, la capitalización del mercado de valores y se correlaciona negativamente con la tasa de impuesto sobre la renta marginal máxima.
Para analizar nuestros resultados por país, podemos trazar la diferencia entre los valores predichos y reales, luego ordenar de mayor a menor y trazar los primeros 15
data = ['const', 'lngdppc', 'lnpop', 'gattwto08', 'lnmcap08', 'rintr',
'topint08', 'nrrents', 'roflaw', 'numbil0', 'country']
results_df = df[data].dropna()
# Use last model (model 3)
results_df['prediction'] = results[-1].predict()
# Calculate difference
results_df['difference'] = results_df['numbil0'] - results_df['prediction']
# Sort in descending order
results_df.sort_values('difference', ascending=False, inplace=True)
# Plot the first 15 data points
results_df[:15].plot('country', 'difference', kind='bar',
figsize=(12,8), legend=False)
plt.ylabel('Number of billionaires above predicted level')
plt.xlabel('Country')
plt.show()
Como podemos ver, Rusia tiene, con mucho, el mayor número de multimillonarios por encima de lo que predice el modelo (alrededor de 50 más de lo esperado).
Treisman usa este resultado empírico para discutir las posibles razones del exceso de multimillonarios de Rusia, incluido el origen de la riqueza en Rusia, el clima político y la historia de la privatización en los años posteriores a la URSS.
Michaele Klements nos apunta que para obtener mediciones perfectamente precisas, necesitamos monitorear tanto el voltaje de suministro como la corriente, pero para un monitoreo doméstico simple que brinde estimaciones de costos al mínimo de centavos, ¿por qué no simplificar las cosas?
Entonces, este simple medidor propuesto por Michaele mide la corriente de suministro a su hogar a través de un CT (transformador de corriente) y luego hace un par de cálculos para darle su corriente, potencia, potencia máxima y kilovatios hora consumidos. También es muy fácil agregar su tarifa local y mostrar el costo de la electricidad utilizada hasta la fecha.
Es evidente además que este circuito puede ser la base para volcar los datos a una BBDD o simplemente usando una plataforma de IoT como por ejemplo Cayenne , poder consultas las medidas online , obtener el histórico, realizar acciones correctoras , etc
Los mínimos componentes que necesitará para un medidor de energía doméstico de este tipo son los siguientes:
Arduino Uno ( o similar )
Pantalla LCD (o pantalla LCD-
CT – Talema AC1030
Resistencia de carga de 56Ω
Condensador de 10 µF
2 resistencias divisoras de 100K
En el siguiente video podemos ver el montaje del circuito así como una pequeña demostración del proyecto en funcionamiento
Cómo hacer el medidor de energía
Primero, debe comenzar ensamblando los componentes en el CT o en su placa de pruebas para crear su sensor actual que produce una señal que su Arduino puede entender. Un Arduino solo tiene entradas de voltaje analógicas que miden 0-5 V CC, por lo que debe convertir la salida de corriente del CT en una referencia de voltaje y luego escalar la referencia de voltaje en un rango de 0-5 V.
Ensamblaje
Si va a instalar su medidor de potencia en algún lugar de forma permanente, es posible que desee soldar las resistencias y el condensador directamente en el TC para que no se suelten. Si simplemente está probando este proyecto por diversión, entonces una placa de pruebas es perfecta.
El circuito básico para la conexión del CT al Arduino se muestra en el siguiente diagrama:
A continuación se muestra un diseño de circuito de tablero. Tenga en cuenta que TinkerCAD no es compatible con un transformador de corriente. Por tanto, se ha utilizado un generador de señales para generar una señal de ejemplo:
El blindaje de la pantalla LCD ya se activa en las entradas analógicas, pero el blindaje solo utiliza A0. Simplemente suelde los tres cables de su sensor de corriente en los encabezados de los pines en el escudo y use A1 como su entrada de sensor como se muestra a continuación.
Una vez que haya conectado todos sus componentes, debe conectar su sensor a lo que desea monitorear. Si desea monitorear un par de aparatos, entonces debe conectar el CT al cable de entrada de un enchufe múltiple, todo lo que conecte al enchufe múltiple luego se contará.
Alternativamente, puede conectar el CT directamente a la red eléctrica de su hogar y monitorear el uso de toda la casa como se ha hecho aquí. De cualquier manera, debe colocar el CT alrededor de uno de los cables de suministro, preferiblemente el cable rojo «vivo». Asegúrese de ponerlo solo alrededor de 1, ya que no funcionará si está alrededor de ambos y no se puede conectar alrededor del cable de tierra (cable amarillo, verde pelado) ya que la energía no se extrae a través de este cable. Si lo está conectando a la red, conéctelo a uno de los cables de salida después del interruptor principal como se muestra a continuación.
NB: tenga cuidado al conectar el medidor de potencia a la red eléctrica de su hogar y asegúrese de que la alimentación de su placa esté apagada antes de hacer nada en la caja de red. No retire ningún cable ni quite ningún tornillo antes de consultar con su autoridad local, puede requerir que un electricista certificado le instale el CT.
Elegir diferentes componentes
Básicamente, hay cuatro componentes que deben elegirse o dimensionarse correctamente para su medidor de energía.
Elegir un transformador de corriente
El primero es el CT o transformador de corriente. El que se utiliza aquí es el Talema AC1030 que puede detectar una corriente nominal de 30 A y una corriente máxima de 75 A. A 220 VCA, teóricamente puede detectar hasta 16,5 kW durante cortos períodos de tiempo, pero está dimensionado para detectar continuamente 6,6 kW, lo que es adecuado para un hogar pequeño. Para calcular cuántos amperios necesita detectar el suyo, tome la potencia continua máxima que espera detectar y divídala por su voltaje (generalmente 110 V o 220 V según su país).
Dimensionamiento de la resistencia de carga
A continuación, debe dimensionar su resistencia de carga R3, esto convierte su corriente CT en una referencia de voltaje. Comience dividiendo su corriente primaria (el máximo como se usó anteriormente) por la relación de vueltas de su CT (disponible en la hoja de datos). Esto debería estar alrededor de 500-5000 a 1. Este artículo trabajó en 42A con una relación de vueltas de 1000: 1 dando una corriente secundaria de 0.042A o 42mA. Su voltaje de referencia analógica para el Arduino es de 2.5V, por lo que para determinar la resistencia usa R = V / I – R = 2.5 / 0.042 = 59.5Ω. El valor de resistencia estándar más cercano es 56 Ω, por lo que se utilizó este.
Aquí hay algunas opciones en diferentes TC y sus resistencias de carga ideales (en tamaños estándar):
Murata 56050C – 10A – 50: 1 – 13Ω
Talema AS-103 – 15A – 300: 1 – 51Ω
Talema AC-1020 – 20A – 1000: 1 – 130Ω
Alttec L01-6215 – 30A – 1000: 1 – 82Ω
Alttec L01-6216 – 40A – 1000: 1 – 62Ω
Talema ACX-1050 – 50A – 2500: 1 – 130Ω
Alttec L01-6218 – 60A – 1000: 1 – 43Ω
Talema AC-1060 – 60A – 1000: 1 – 43Ω
Alttec L01-6219 – 75A – 1000: 1 – 33Ω
Alttec L01-6221 – 150A – 1000: 1 – 18Ω
CTYRZCH SCT-013-000 – 100A – Resistencia de carga incorporada –
TOOGOO SCT-013-000 – 100A –
El condensador utilizado es de 10 µF, que debería ser suficiente para la mayoría de los rangos de TC para aplicaciones domésticas.
Finalmente, necesita dos resistencias divisorias para obtener el voltaje de referencia de 2.5V del Arduino. Deben tener el mismo valor, por lo que R1 = R2 y no necesitamos mucha corriente, por lo que este artículo usa dos resistencias de 100K.
firmware
#include <LiquidCrystal.h>
int currentPin = 1; // Asignar entrada CT al pin 1
doubles kilos= 0;
int PeakPower = 0;
LiquidCrystal lcd (8, 9, 4, 5, 6, 7); // Asignar pines de pantalla LCD, según los requisitos de pantalla LCD
void setup ()
{
lcd.begin (16,2); // columnas filas. utilice 16,2 para una pantalla LCD de 16x2, etc.
lcd.clear ();
lcd.setCursor (0,0); // coloca el cursor en la columna 0, fila 0 (la primera fila)
lcd.print ("En ejecución");
}
void loop ()
{
int actual = 0;
int maxCurrent = 0;
int minCurrent = 1000;
for (int i = 0; i <= 200; i ++) // Supervisa y registra la entrada de corriente durante 200 ciclos para determinar la corriente máxima y mínima
{
current = analogRead (currentPin); // Lee la entrada actual y registra la corriente máxima y mínima
if(actual> = maxCurrent)
maxCurrent = actual;
else if (actual <= minCurrent)
minCurrent = actual;
}
if (maxCurrent <= 517)
{
maxCurrent = 516;
}
doble RMSCurrent = ((maxCurrent - 516) * 0,707) /11,8337; // Calcula la corriente RMS según el valor máximo
int RMSPower = 220 * RMSCurrent; // Calcula la potencia RMS asumiendo un voltaje de 220 VCA, cambie a 110 VCA en consecuencia
if (RMSPower> peakPower)
{
PeakPower = RMSPower;
}
kilos = kilos + (RMSPower * (2.05 / 60/60/1000)); // Calcule los kilovatios hora utilizados
delay (2000);
lcd.clear ();
lcd.setCursor (0,0); // Muestra todos los datos actuales
lcd.print (RMSCurrent);
lcd.print ("A");
lcd.setCursor (10,0);
lcd.print (RMSPower);
lcd.print ("W");
lcd.setCursor (0,1);
lcd.print (kilos);
lcd.print ("kWh");
lcd.setCursor (10,1);
lcd.print (PeakPower);
lcd.print ("W");
}
Aquí está el enlace para descargar el código del medidor .
Debido a que su configuración, CT, resistencias y voltaje de entrada pueden ser diferentes, hay un factor de escala en el esquema que deberá cambiar antes de obtener resultados precisos; consulte la calibración a continuación. Si su pantalla LCD está conectada a los mismos pines que se utilizan aquí y su CT está conectado al mismo pin de entrada, al menos debería llenar la pantalla con algunas cifras, aunque lo más probable es que sean incorrectas y algunas pueden ser negativas.
Si no desea usar o no tiene una pantalla LCD, también puede modificar el boceto para enviarlo a la ventana serial del Arduino IDE como se muestra a continuación.
// Michael Klements
// La vida del bricolaje
// 27 de octubre de 2014
int currentPin = 1; // Asignar entrada CT al pin 1
double kilos = 0;
int PeakPower = 0;
void setup ()
{
Serial.begin (9600); // Iniciar la comunicación en serie
Serial.println ("En ejecución");
}
void loop ()
{
int actual = 0;
int maxCurrent = 0;
int minCurrent = 1000;
for (int i = 0; i <= 200; i ++) // Supervisa y registra la entrada de corriente durante 200 ciclos para determinar la corriente máxima y mínima
{
current = analogRead (currentPin); // Lee la entrada actual y registra la corriente máxima y mínima
if (actual> = maxCurrent)
maxCurrent = actual;
else if (actual <= minCurrent)
minCurrent = actual;
}
if (maxCurrent <= 517)
{
maxCurrent = 516;
}
double RMSCurrent = ((maxCurrent - 516) * 0,707) /11,8337; // Calcula la corriente RMS según el valor máximo
int RMSPower = 220 * RMSCurrent; // Calcula la potencia RMS asumiendo un voltaje de 220 VCA, cambie a 110 VCA en consecuencia
if (RMSPower> peakPower)
{
PeakPower = RMSPower;
}
kilos = kilos + (RMSPower * (2.05 / 60/60/1000)); // Calcule los kilovatios hora utilizados
delay (2000);
Serial.print (RMSCurrent);
Serial.println ("A");
Serial.print (RMSPower);
Serial.println ("W");
Serial.print (kilos);
Serial.println ("kWh");
Serial.print (peakPower);
Serial.println ("W");
}
El código original del Energy Meter hacía uso de un período de tiempo fijo para calcular los kilovatios hora consumidos, esto se basaba en un tiempo de ciclo de 2050 ms y era bastante preciso.
Desde entonces, el código ha sido modificado para hacer uso de la función millis () incorporada que calcula el tiempo de ciclo exacto para cada ciclo con el fin de mejorar la precisión. Solo mejora alrededor del medio por ciento en la precisión del cálculo, pero es la mejor manera de hacerlo.
Aquí está el código mejorado:
#include <LiquidCrystal.h>
int currentPin = 1; // Asignar entrada CT al pin 1
duobles kilos = 0;
int PeakPower = 0;
unsigned long startMillis;
unsigned long endMillis;
LiquidCrystal lcd (8, 9, 4, 5, 6, 7); // Asignar pines de pantalla LCD, según los requisitos de pantalla LCD
void setup ()
{
lcd.begin (16,2); // columnas filas. utilice 16,2 para una pantalla LCD de 16x2, etc.
lcd.clear ();
lcd.setCursor (0,0); // coloca el cursor en la columna 0, fila 0 (la primera fila)
lcd.print ("Arduino");
lcd.setCursor (0,1); // coloca el cursor en la columna 0, fila 1 (la segunda fila)
lcd.print ("Medidor de energía");
startMillis = millis ();
}
void loop ()
{
int actual = 0;
int maxCurrent = 0;
int minCurrent = 1000;
for (int i = 0; i <= 200; i ++) // Supervisa y registra la entrada de corriente durante 200 ciclos para determinar la corriente máxima y mínima
{
current = analogRead (currentPin); // Lee la entrada actual y registra la corriente máxima y mínima
if (actual> = maxCurrent)
maxCurrent = actual;
else if (actual <= minCurrent)
minCurrent = actual;
}
if (maxCurrent <= 517)
{
maxCurrent = 516;
}
double RMSCurrent = ((maxCurrent - 516) * 0,707) /11,8337; // Calcula la corriente RMS según el valor máximo
int RMSPower = 220 * RMSCurrent; // Calcula la potencia RMS asumiendo un voltaje de 220 VCA, cambie a 110 VCA en consecuencia
if (RMSPower> peakPower)
{
PeakPower = RMSPower;
}
endMillis = millis ();
tiempo_largo_sin_firmar = endMillis - startMillis;
kilos = kilos + ((doble) RMSPower * ((doble) tiempo / 60/60/1000000)); // Calcule los kilovatios hora utilizados
startMillis = millis ();
delay (2000);
lcd.clear ();
lcd.setCursor (0,0); // Muestra todos los datos actuales
lcd.print (RMSCurrent);
lcd.print ("A");
lcd.setCursor (10,0);
lcd.print (RMSPower);
lcd.print ("W");
lcd.setCursor (0,1);
lcd.print (kilos);
lcd.print ("kWh");
lcd.setCursor (10,1);
lcd.print (PeakPower);
lcd.print ("W");
}
Aquí está el enlace para descargar el código actualizado de Millis Meter .
Para aquellos de ustedes que han leído que la función millis () se desborda después de aproximadamente 49 días, el código trata el rollover automáticamente haciendo uso de la variable larga sin firmar. Por ejemplo, si el desbordamiento ocurre en 10000, el milis inicial fue 9987 y el milis final fue 2031, la diferencia sería 2031-9987 = -7956 pero el valor no puede ser negativo ya que no está firmado, por lo que se convierte en -7956+ 10000 = 2044 que es la duración correcta.
Calibrar la lectura actual
Como se mencionó anteriormente, debido a que su configuración, CT, resistencias y voltaje de entrada pueden ser diferentes, hay un factor de escala en el esquema que deberá cambiar antes de obtener resultados precisos.
Para calibrar su medidor de energía, debe estar seguro de que la corriente que su medidor dice que se está extrayendo es la que espera que realmente se extraiga. Para hacer esto con precisión, necesita encontrar una carga calibrada. Estos no son fáciles de conseguir en un hogar normal, por lo que deberá encontrar algo que use una cantidad de energía establecida y constante. Usé un par de bombillas incandescentes y focos, estos vienen en una variedad de tamaños y su consumo es bastante cercano a lo que se indica en la etiqueta, es decir, una bombilla de 100W usa muy cerca de 100W de potencia real, ya que es casi completamente una carga puramente resistiva.
Enchufe una bombilla pequeña (100 W más o menos) y vea qué carga se muestra. Ahora deberá ajustar los usos del factor de escala en la línea de cálculo:
En este caso fue 11.8337, puede ser mayor o menor dependiendo de su aplicación. Utilice una escala lineal para calcular esta cifra o, si no es bueno con las matemáticas, juegue con diferentes valores hasta que la carga que ha conectado se muestre en la pantalla del medidor de energía.
Una vez que haya calibrado su medidor de energía, lo reinicia y deja que haga su trabajo. A continuación se muestran dos imágenes en uso, ambas con una entrada de baja potencia y una entrada de alta potencia.
El primer número que se muestra es la corriente instantánea seguida de la potencia instantánea. En la línea inferior, los kilovatios hora utilizados desde el reinicio y luego la potencia máxima registrada desde el reinicio.
Muchas áreas de carácter científico-técnico la adecuada elección del software y/o lenguaje de programación empleado es determinante, de cara a la potencia, versatilidad, facilidad de uso y acceso por parte de todos los usuarios en sus propios dispositivos, de manera generalizada y gratuita.
Dentro del software libre, uno de los que últimamente ha tenido una mejora sustancial, con la inclusión de potentes y versátiles nuevos módulos de cálculo simbólico (SymPy), numérico (NumPy, SciPy) y gráfico (PyPlot y Matplotlib) ha sido sin duda Python, y de ahí su vertiginosa evolución y expansión a nivel mundial, no sólo en el ámbito académico, sino también en el científico e industrial. De hecho, basta con echar un vistazo a las numerosas propuestas, tanto de comunidades de desarrolladores como de empresas privadas, surgidas a raíz de la versión de base inicial de Python, como por ejemplo IPython (interface interactivo de fácil uso, que gracias a Jupyter Notebook permite una versión HTML similar a los notebooks de Mathematica o Mapple) o Spyder (entorno integrado para cálculo científico parecido al de Matlab u Octave).
Por otro lado existen versiones completas de desarrollo, integrando Python como soporte de cálculo, pero con editores avanzados de texto para la programación y la depuración de código, ventanas de gráficos y datos, etc. La mayoría de estas plataformas integradas están disponibles para los distintos sistemas operativos Linux, MacOS X y Windows. Entre ellas cabría destacar Enthought Python Distribution (EPD), PyCharm y Anaconda CE (de Continuum Analytics).
Aunque no podamos abarcar todos los aspectos «básicos» del python científico, intentaremos en este resumen dar una idea de las principales librerías un funciones que podemos usar para NILM (Non-Intrusive Load Monitoring) sin olvidar los fundamentos de :Matplotlib y Numpy
Matplotlib: visualización con Python
Matplotlib es una biblioteca completa para crear visualizaciones estáticas, animadas e interactivas en Python haciendo que las cosas fáciles sean fáciles y las difíciles posibles.
Nos permite crear :
Desarrollando gráficos de calidad de publicación con solo unas pocas líneas de código
Utilizando figuras interactivas que puedan hacer zoom, desplazarse, actualizar …
Personalizar
Tomando el control total de los estilos de línea, las propiedades de la fuente, las propiedades de los ejes …
Exportando e incrustando en varios formatos de archivo y entornos interactivos
Ampliar
Explorando la funcionalidad personalizada proporcionada por paquetes de terceros
Obteniendo más información sobre Matplotlib a través de los numerosos recursos de aprendizaje externos
Matplotlib es en resumen la librería de python para dibujar (equivalente al plot en matlab).
NumPy es una biblioteca para el lenguaje de programación Python que da soporte para crear vectores y matrices grandes multidimensionales, junto con una gran colección de funciones matemáticas de alto nivel para operar con ellas.
Numpy es pues una librería especializada para operaciones con matrices y vectores
Opciones de visualizacion de matplotlib para un notebook
%matplotlib inline
plt.rcParams['figure.figsize'] = (13, 6)
plt.style.use('ggplot')
Otras importaciones:
import warnings
warnings.filterwarnings('ignore')
Crear arrays en python es muy sencillo y se puede hacer de forma nativa usando un tipo list. Sin embargo, aquí consideramos arrays del tipo numpy pues esto arrays incluyen funciones que facilitan las operaciones matemáticas y su manipulación
v=[1,2,3] # tipo list
v=np.array([1,2,3]) # array numpy
print (v)
print ("Dimensiones: " + str(v.ndim)) # numero de dimensiones
print ("Elementos: " + str(v.size)) # numero de elementos
print ("Longitud de las dimensiones: " + str(v.shape)) # longitud de cada dimensión
[1 2 3]
Dimensiones: 1
Elementos: 3
Longitud de las dimensiones: (3,)
Crear una matriz de 2 x 3:
v=np.array([[1,2,3], [4,5,6]])
print (v)
print ('Dimensiones: ' + str(v.ndim)) # numero de dimensiones
print ('Elementos: '+str(v.size)) # numero de elementos
print ('Longitud de las dimensiones: '+str(v.shape)) # longitud de cada dimensión
[[1 2 3]
[4 5 6]]
Dimensiones: 2
Elementos: 6
Longitud de las dimensiones: (2, 3)
Crear una Matriz triple de 2 x 3 x 2 :
v=np.array([[[1,2], [3,4]],[[5,6], [7,8]]])
print (v)
print ("Dimensiones: " + str(v.ndim)) # numero de dimensiones
print ("Elementos: "+str(v.size)) # numero de elementos
print ("Longitud de las dimensiones: "+str(v.shape) )# longitud de cada dimensión
[[[1 2],
[3 4]],
[[5 6],
[7 8]]]
Dimensiones: 3
Elementos: 8
Longitud de las dimensiones: (2, 2, 2)
Utilizamos la función reshape para redimensionar los arrays
En python, las funciones pueden estar definidas en cualquier parte pero siempre antes de su llamada. En python, las anidaciones (bucles, if conditions, functions, etc.) se realizan mediante indentación, no existe el statement end. Las funciones se definen así:
def funcion_suma(x):
suma=0
for i in x:
suma=suma+i
return suma
v=np.arange(10)
print (funcion_suma(v))
45
Aunque, como hemos dicho antes, numpy facilita las operaciones matemáticas y ya incluye una serie de operaciones:
Pandas (Python Data Analysis Library) es una librería de python para el análisis y manipulación de una gran cantidad de datos. También facilita el uso de «timeseries»
La llamada a la librería es:
import pandas as pd
Dado un archivo csv, la función read_csv carga los datos en un dataframe
# El parámetro parse_dates indica a pandas que al cargar este csv la primera columna [0] es de tipo datetime
df=pd.read_csv('data/events.csv',parse_dates=[0])
Las primeras N filas del dataFrame se puede visualizar de la siguiente forma
Dado el consumo eléctrico de una vivienda (voltage y corriente) queremos detectar en que momento se produce una conexión de un dispositivo. Para ello, filtraremos la señal sinusoidal obteniendo el valor eficaz de la corriente cada cierto intervalo. Los cambios en el valor eficaz van a determinar las conexiones y desconexiones de los distintos dispositivos. Derivando este valor eficaz, obtenemos picos en los que existe un cambio en el valor eficaz y, por lo tanto, posibles candidatos a eventos de conexión/desconexión. Finalmente, usando un detector de picos filtraremos los eventos reales del resto.
Mediremos nuestros resultados usando métricas estándar de NILM.
Paso por paso
Importar pandas, numpy y matplotlib tal y como se ha visto anteriormente
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
Definir una funcion llamada rms_function que devuelva un valor rms y que tenga como parámetro de entrada un vector de valores
# función rms
def rms_function(x):
return np.sqrt(np.mean(np.square(x)))
Usar el siguiente path para cargar los datos en un dataframe df de pandas. Como parámetros: el índice es la columna 0 (index_col) y la fecha está en la columna 1 (parse_dates)
Imprimir mínimo y máximo de datetime y la diferencia de ambos
print (df.datetime.min())
print (df.datetime.max())
print (df.datetime.max()-df.datetime.min())
2011-10-20 12:21:58.973000
2011-10-20 12:23:03.713996
0 days 00:01:04.740996
Seleccionar datetime como índice del dataframe df
df.index=df.datetime
Periodo y frequencia de muestreo
# frecuencia
ts=df.datetime.diff().mean().total_seconds()
print (str(ts)+' seconds')
fs=1/ts
print ( str(fs)+' Hz')
8.3e-05 seconds
12048.192771084337 Hz
Dibujar Voltage (v) haciendo zoom en el intervalo de 100ms (6 periodos aproximadamente)
d1='2011-10-20 12:22:29.9'
d2='2011-10-20 12:22:30'
df[(df.index>d1)&(df.index<d2)].v.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f6e2b9f86d8>
df.i.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f6e2e274d30>
Resamplear mediante la función resample de pandas a 50ms (’50L’). La función rms_function se pasará como parámetro para obtener cada valor del resampleado. El resultado debe de guardarse en un dataframe nuevo llamado rms . Dibujar el resultado.
<matplotlib.axes._subplots.AxesSubplot at 0x7f6e2f8848d0>
Hacer la derivada del dataframe rms y guardar el resultado en rms_diff.
rms_diff=rms.diff()
Dibujar el resultado (rms_diff)
rms_diff.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f6e2f7f9fd0>
Guardar los valores de la columna «i» en una variable «y» en forma de array
y=rms_diff.i.values
Modifica los parámetros th_noise y dist de la función detect_peaks para obener los índices de los eventos y evaluar las métricas. Realizar el proceso 3 veces. ¿ Con qué valores de th_noise y dist se obtienen mejores resultados en las métricas?
th_noise=5
dist=5
from detect_peaks import detect_peaks
indexes=detect_peaks(y,mph=th_noise,mpd=dist)
dates=rms_diff.ix[indexes].index
Cuantos eventos hemos detectado
print (str(len(indexes))+' eventos detectados')
8 eventos detectados
Dibujamos los eventos y la corriente en una misma gráfica
plt.vlines(dates,-80,80)
df.i.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f6e2f79ca58>
Métricas
from IPython.display import Image
Image(filename='metricas1.png')
Image(filename='metricas2.png')
Obtener las métricas: recall, precision y F1
FP=0.
P=9.
N=len(df)-P
TN=N-FP
P=9.
N=len(df)-P
TP=8.
FP=0.
FN=1.
TN=N-FP
recall=TP/(TP+FN)
precision=TP/(TP+FP)
F1=2*precision*recall/(precision+recall)
print (recall)
print (precision)
print (F1)
0.8888888888888888
1.0
0.9411764705882353
*Parámetros optimizados: * th_noise=0.1 y dist=5
*Con esto obtenemos : * recall=1, precision=1 y F1=1;
El Pebble fue un reloj inteligente que presume de ser uno de los primeros relojes inteligentes que usaba pantalla de tinta electronica (primero en tonos de grises y luego mas adelante con pantalla a color ).
Este pionero reloj inteligente fue desarrollado por Pebble Technology Corporation, empresa que por cierto recaudó U$ 10.3 millones de dólares a través de una campaña de crowfonding (micromecenazgo) en Kickstarter; la cual comenzó el 11 de abril de 2012 y finalizó el 18 de mayo de 2012.
Todos los relojes Pebble podían conectarse a teléfonos tanto Android como iOS para mostrar notificaciones del teléfono ( mensajes de texto , llamadas entrantes, entradas en redes sociales ,etc ) desde la propia pantalla del reloj a modo de segunda pantalla.
En su momento existia una tienda de aplicaciones distribuia apps compatibles con Pebble de terceros desarrolladores tales como ESPN, Uber, Runkeeper y GoPro.
La empresa Best Buy inició la venta del reloj inteligente Pebble en julio del 2013 y este se agotó a los cinco días de iniciada la venta.Asimismo este reloj se siguió vendiendo en otras tiendas físicas así como en el sitio de Amazon a nivel global . Tal fue el exito del reloj que el 31 de diciembre de 2014 Pebble había alcanzado la venta de un millón de relojes inteligentes. En el 2015 Pebble lanzó al mercado el Pebble Time y el Pebble Time Steel en Kickstarter, recaudando U$ 20.3 millones de dólares de más de 75.000 patrocinadores; rompiendo récords de recaudación para ambos productos. En el 2016 Pebble canceló la fabricación del Peeble Time 2 y reembolsó a sus patrocinadores; citando problemas financieros.
El 7 de diciembre de 2016, Pebble anunció el cierre del compañía y que por tanto no proveería soporte oficial ni garantía a ningún dispositivo existente. Tanto la fuerza laboral como la propiedad intelectual de Pebble fueron adquiridas por Fitbit, una empresa de tecnología corporal especializada en fitness. El 14 de diciembre de 2016 se publicó el blog Pebble Dev para aclarar el cronograma de transición y los esfuerzos por hacer a Pebble OS y sus apps auto suficientes. La compra de Pebble Technology Corp. por parte de Fitbit se completó en diciembre de 2016 por un valor de U$ 23 millones de dólares. Desgraciadamente Fitbit no tubo ningún interés en continuar con la fabricación y venta del smartwatch Pebble y este fantástico reloj fue abandonado a su suerte y actualmente no esta disponible la tienda de aplicaciones no hay posibilidad de ninguna actualización desde sus sitios «originales oficiales», pero afortunadamente existen opciones que vamos a a ver en este post.
Por qué Rebble Web Services?
Parte de la inteligencia del Pebble se incorporaba al reloj y parte de ella se entregaba a través de servicios web. Originalmente, estos servicios web eran proporcionados por Pebble Technology, Corp. Sin embargo, Pebble Technology, Corp. detuvo sus operaciones y, después de algún tiempo, estos servicios web también desaparecieron. , lo cual hizo que los Pebble no funcionase dejandolo casi como un relojjnormal, pues las cosas que antes eran posibles, ya no son posibles. ¿Es hora de deshacerse de su Pebble ?
Pues no gracias a The Rebble Alliance que ha creado Rebble Web Services, para llenar el vacío dejado por la desaparición de Pebble Technology, Corp. La mayoría de los servicios que han desaparecido tienen reemplazos ahora. Sin embargo, hay una cosa que The Rebble Alliance no puede hacer: cambiar todos los Pebble para que utilicen los servicios web de Rebble. Esto necesita alguna acción por parte del usuario. No se preocupe porque vamos a ver cómo hacerlo …
Introducción a los servicios web de Rebble
Entonces, si tiene un reloj Pebble y quiere volver a comenzar a usarlo. ¡pues veamos como reanimarlo!
iOS
Primera parte: conecte el reloj al teléfono.
Nota: puede omitir esta parte si ya es usuario de Pebble. En su lugar, debe verificar si tiene la última versión de la aplicación Pebble instalada en su teléfono.
Conecte su Pebble al cable de carga USB enchufado. ¡Realmente no querrás que pierda energía en medio de una actualización de firmware! El reloj se enciende. Presione el botón izquierdo para cerrar la pantalla de carga.
Si ahora ve una esfera de reloj, significa que su Pebble todavía está configurado, tal vez por el propietario anterior, tal vez por usted. Si lo usó antes, ahora es el momento de anotar las carátulas del reloj y las aplicaciones que desea reinstalar después de que finalice este procedimiento.
Si ve un reloj, presione el botón central derecho, vaya a Configuración , luego a Sistema y elija Restablecimiento de fábrica . Esto puede tardar unos minutos.
Serás recibido por una página de Pebble Account . Simplemente toque Omitir en la esquina superior izquierda para continuar.
Elija su idioma para la entrada de voz.
Elige el tipo de Pebble que tienes. iOS luego solicita permiso para usar Bluetooth, toque Aceptar .
La aplicación comienza a buscar Guijarros cercanos. En breve debería ver su Guijarro, como Guijarroxxxx . Esta misma cuerda se puede ver en el Pebble, por lo que sabe que el teléfono ve el reloj correcto. Tócalo.
El reloj pide emparejarse. Presione el botón superior derecho. Toque Emparejar en el teléfono.
Si el Pebble tiene un firmware antiguo, ahora se actualizará automáticamente. Mantenga el reloj en el cable de carga y cerca del teléfono. Esto tardará unos minutos en completarse, después de eso, el reloj se reiniciará.
En la aplicación Pebble, elija el idioma de los menús, notificaciones y mensajes del reloj.
Muchos Pebbles necesitan usar una segunda conexión Bluetooth. Si tiene uno de esos, la aplicación ahora le pide que vuelva a emparejar el reloj. Toque Habilitar , presione el botón superior derecho del reloj para emparejar y toque emparejar en el teléfono.
Toque otorgar acceso y toque aceptar si desea que las notificaciones de su teléfono se envíen a su reloj.
Toque otorgar acceso y toque aceptar siempre si desea que su reloj y sus aplicaciones sepan dónde se encuentra.
Toque otorgar acceso y toque aceptar si desea que los elementos del calendario de los próximos días aparezcan en su reloj.
Si tiene un Pebble Time o más reciente: para habilitar la salud, toque Habilitar . Luego, toca Aceptar .
Si tienes un Pebble Time o más reciente: elige tu configuración de salud, luego toca Continuar , luego ingresa tu información y toca Completar .
Ya terminaste. Bueno, la parte de Pebble está lista. Toque listo .
Parte dos: conecte la aplicación Pebble a Rebble Web Services.
En el teléfono, abre la aplicación Pebble, toca Configuración , Ayuda y ACTUALIZA TU PEBBLE para asegurarte de que tu Pebble tenga el firmware más reciente.
Se le recibe con varias formas de iniciar sesión. Elija una e inicie sesión. ¡ Recuerde sus credenciales de inicio de sesión! Volverá al sitio de Rebble y le dará la bienvenida. ¡ Ya está todo listo! Lea la página, luego toque el enlace Comenzar ahora en el primer párrafo.
Se le redirige a boot.rebble.io y se le saluda con ¡ Aquí vamos! Lea la página, luego toque el botón para cambiar a Rebble . Safari te pregunta si quieres abrirlo con Pebble. Toque Abrir .
Se abre la aplicación Pebble y muestra un cambio de configuración emergente . Toque Cambiar .
Ahora, espere al menos 15 segundos antes de continuar con el siguiente paso.
Mientras tanto, en la esquina superior izquierda, apareció un signo de exclamación amarillo. Tócalo.
Llega a una pantalla titulada Correcciones y Cierre de sesión . Toque iniciar sesión .
Llegas a una cuenta de Pebble en pantalla y te damos la bienvenida a Rebble . Toca ES HORA DE REBBLEAR .
¡Listo! Vaya a Watchfaces , elija Get Watchfaces y busque e instale los watchfaces que le gusten en la tienda Rebble.
La segunda parte también se puede ver en nuestro video .
Android
Primera parte: conecte el reloj al teléfono.
Nota: puede omitir esta parte si ya es usuario de Pebble. En su lugar, debe verificar si tiene la última versión de la aplicación Pebble instalada en su teléfono.
Conecte su Pebble al cable de carga USB enchufado. ¡Realmente no querrás que pierda energía en medio de una actualización de firmware! El reloj se enciende. Presione el botón izquierdo para cerrar la pantalla de carga.
Si ahora ve una esfera de reloj, significa que su Pebble todavía está configurado, tal vez por el propietario anterior, tal vez por usted. Si lo usó antes, ahora es el momento de anotar las carátulas del reloj y las aplicaciones que desea reinstalar después de que finalice este procedimiento.
Si ve un reloj, presione el botón central derecho, vaya a Configuración , luego a Sistema y elija Restablecimiento de fábrica . Esto puede tardar unos minutos.
Obtén tu teléfono y descargue la aplicación Pebble de APKMirror . Abra el APK y habilite la instalación desde fuentes desconocidas si se lo solicita. Toque instalar en el cuadro de diálogo. Luego, abre la aplicación.
Serás recibido por una página de Pebble Account . Simplemente toque Omitir inicio de sesión dos veces para continuar.
Elige el tipo de Pebble que tienes.
La aplicación comienza a buscar Guijarros cercanos. En breve debería ver su Guijarro, como Guijarroxxxx . Esta misma cuerda se puede ver en el Pebble, por lo que sabe que el teléfono ve el reloj correcto. Tócalo.
Si el Pebble no aparece y estás en Android 10, ve a la página de configuración de bluetooth del teléfono, empareja el reloj y vuelve a intentarlo. (Si eso no ayuda, desemparejarlo allí nuevamente).
El reloj pide emparejarse. Presione el botón superior derecho. Toque Emparejar en el teléfono.
Si el Pebble tiene un firmware antiguo, buscará actualizaciones. Toque Continuar . Mantenga el reloj en el cable de carga y cerca del teléfono. Esto tardará unos minutos en completarse, después de eso, el reloj se reiniciará.
En la aplicación Pebble, elija el idioma de los menús, notificaciones y mensajes del reloj.
Para recibir notificaciones en su Pebble, toque Abrir pantalla de configuración . Habilita Pebble . Toque Permitir .
Si tiene un Pebble Time o más reciente: para habilitar la salud, toque Habilitar . Luego, toca Aceptar .
Si tienes un Pebble Time o más reciente: elige tu configuración de salud, luego toca Continuar , luego ingresa tu información y toca Completar .
Elige una esfera de reloj. luego toque la flecha en la esquina superior derecha.
No tomes aplicaciones todavía, toca la flecha en la esquina superior derecha.
Ya terminaste. Bueno, la parte de Pebble está lista. Toque listo .
Parte dos: conecte la aplicación Pebble a Rebble Web Services.
En el teléfono, abra un navegador decente (como Chrome) y vaya a auth.rebble.io .
Se le recibe con varias formas de iniciar sesión. Elija una e inicie sesión. ¡ Recuerde sus credenciales de inicio de sesión! Volverá al sitio de Rebble y le dará la bienvenida. ¡ Ya está todo listo! Lea la página, luego toque el enlace Comenzar ahora en el primer párrafo.
Se le redirige a boot.rebble.io y se le saluda con ¡ Aquí vamos! Lea la página, luego toque el botón para cambiar a Rebble . El navegador le pregunta si desea abrirlo con Pebble. Toque Abrir .
Si no se abre con Pebble, deberá usar otro navegador y reiniciar desde la primera viñeta de esta segunda parte.
Se abre la aplicación Pebble. Entonces sucederá una de tres cosas:
Aparecerá una pantalla de Rebble. Puede tener una ruleta naranja encima; puede ignorar esto con seguridad.
Aparecerá la antigua pantalla de inicio de sesión de Pebble. Si esto sucede, cierre la aplicación desde el conmutador de aplicaciones y ábrala nuevamente. Ahora debería aparecer una pantalla de Rebble.
Nada. Si esto sucede, toque «⋮» en la esquina superior derecha, luego toque Configuración . En este punto, ya sea:
Aparecerá una pantalla de Rebble, o
Nada interesante. En este caso, desplácese hacia abajo hasta CUENTA y asegúrese de haber cerrado la sesión. Si no es así, tóquelo para cerrar la sesión. Ahora, toque para iniciar sesión. Debería aparecer una pantalla de Rebble.
En cualquier caso, una vez que toque el botón en la pantalla Bienvenido a Rebble de la aplicación Pebble, ¡habrá terminado!
Si su Pebble se desconecta, simplemente toque el botón de conexión habitual.
¡Listo! Ve a Watchfaces , toca el gran » + » rojo en la esquina inferior derecha y busca e instala los watchfaces que te gusten de la tienda Rebble.
Servicios meteorológicos y de dictado
Entonces, comenzó a usar los servicios web de Rebble, pero desea agregar el plan pago para los servicios de dictado y clima. Hay algunas cosas a considerar antes de ordenarlo:
En iOS, no es posible responder a los mensajes de texto. Esta es una limitación de iOS. Por lo tanto, el dictado NO agregará respuestas habladas a los mensajes de texto. A menos que hagas jailbreak a tu teléfono …
Los servicios meteorológicos son únicamente para la aplicación meteorológica nativa Pebble y para la información meteorológica en la línea de tiempo. Las pantallas de reloj y las aplicaciones de terceros que ofrecen información meteorológica tienen sus propios medios para obtener información meteorológica. No necesitas el plan pago de Rebble para ellos.
El pago lo gestiona Stripe, que solo ofrece el pago con tarjeta de crédito.
Su dinero ayudará a Rebble Alliance a mantener en funcionamiento todos los servicios web de Rebble (incluidos los gratuitos).
Dicho esto, estos son los pasos para agregar el plan:
En el teléfono, abra su navegador (Safari en iOS o Chrome en Android) y diríjase a Rebble Account .
Muy importante: ¡asegúrate de haber iniciado sesión con la misma cuenta que usaste cuando te cambiaste a Rebble por primera vez!
Elija su plan ($ 3.00 / mes o $ 33 / año).
Se le reenvía a Stripe. Ingrese la información de su tarjeta y finalice el pago.
Se le redirige al sitio de Rebble. La suscripción a Voice / Weather ahora debería estar activa .
En el último párrafo, toque repetir el enlace de configuración inicial . Luego, siga el resto del procedimiento de la parte 2 anterior.
Gracias por apoyar a Rebble. ¡En realidad!
En la aplicación Pebble, en Aplicaciones , la aplicación The Weather Channel ahora debería estar allí. Toque el botón de engranaje para configurarlo según sus necesidades.
Carga lateral de aplicaciones o esferas de reloj
En muy raras circunstancias, la instalación de esferas de reloj o aplicaciones a través de la tienda de aplicaciones dentro de la aplicación Pebble no funciona. En este caso, puede probar si la carga lateral de la esfera del reloj funciona.
Encuentra la esfera del reloj o la aplicación y tócala.
En la parte inferior, toca descargar pwb .
Abra el archivo con la aplicación Pebble.
Se abre la aplicación Pebble y solicita instalar la esfera del reloj o la aplicación. Toque Aceptar .
Ahora, la esfera del reloj o la aplicación se instala en el teléfono y en el reloj.
Resumen de pasos a seguir
En resumen para reanimar nuestro Pebble vamos a necesitar 4 apps:
Pebble AppStore BACKUP
Sideloader
Pebble
Pebble-Rebble
Peble AppStore Backup
Este programa no es mas que un repositorio donde poder descargar gratuitamente todas las esferas y aplicaciones disponibles que en su dia estuvieron disponibles para el Pebble.
Su mecánica de uso es bien sencilla: buscamos las app o esfera qeu nos interesa .Nos aseguramos que nos es compatible con nuestro modelo de Pebble , y en caso afirmativo nos la descargamos en local mediante el enlace «download PBW» que tendremos disponible al final de la explicación de cada app/esfera
Sideloader
Si la app anterior nos permitía descargar un fichero de esfera o app gracias a esta otra aplicación podemos instalar dicho archivo en nuestro reloj
Esta aplicación pues nos ayuda a abrir archivos .pbw, .pbl y .pbz en la aplicación oficial Pebble. Para comenzar, presione el botón Examinar archivos a continuación o abra un archivo Pebble compatible en su aplicación Archivos
Pebble
Es la antigua aplicación que ya no esta disponible en google play y que por tanto habrá que descargarla como una apk desde un repositorio como por ejemplo https://pebble-time.uptodown.com/android
Esta app la necesitamos para sincronizar por bluetooth con el telefono aunque el resto de servicios ya no estén disponibles
Peebble-Rebble
Gracias a The Rebble Alliance que ha creado Rebble Web Services, para llenar el vacío dejado por la desaparición de Pebble Technology, Corp. La mayoría de los servicios que han desaparecido tienen reemplazos ahora.
Problemas comunes
No se puede agregar la esfera del reloj, la tienda dice que se agregó, pero no está en el teléfono del reloj
A veces, el casillero puede perder la sincronización con la realidad. Aunque esta situación debería resolverse por sí sola con el tiempo, es fácil de solucionar. Simplemente cargue la esfera del reloj (ver arriba). El casillero ahora ya no está desincronizado para esta esfera de reloj. Es posible que deba repetir esto para cada esfera de reloj o aplicación que muestre este comportamiento.
En Android (9.0+), las llamadas entrantes se muestran en el reloj como «Llamada desconocida»
Para corregir el «Llamador desconocido» o las notificaciones que faltan por completo en las llamadas entrantes para Pebble emparejadas con dispositivos Android 9.0, existe una solución con la aplicación Dialer for Pebble:
Instale la aplicación complementaria Dialer for Pebble y una aplicación respectiva para Pebble.
Abra la aplicación Pebble en su teléfono y vaya a Notificaciones . Luego, desactive las notificaciones para llamadas telefónicas.
Abra la aplicación Dialer for Pebble en su teléfono y habilite Call Popup para llamadas entrantes y salientes.
Asegúrese de que la aplicación Dialer for Pebble tenga permisos del sistema para acceder a Contactos, Registro de llamadas, Marcador y SMS en su teléfono.
Esto debería solucionar el problema. En caso de que Marcador para Pebble funcione de manera inconsistente, asegúrese de que se ejecute en segundo plano tanto en su Pebble ( Configuración y luego en la Aplicación en segundo plano ) como en su teléfono.
Me suscribí al plan de servicios Weather and Dictation, pero la aplicación Weather Channel y el dictado no están disponibles
Verifique su cuenta de Rebble y la información de pago.
Mire la suscripción a la línea Voice / Weather . Si está activo , vuelva a pasar por boot.rebble.io .
Si está vencida, es posible que la tarjeta de crédito utilizada durante la suscripción no sea válida. Simplemente puede suscribirse nuevamente.
Si no está activo, es posible que haya iniciado sesión con una cuenta diferente a la que tenía cuando se suscribió por primera vez. Elimine las cookies de su navegador (por lo tanto, cierre la sesión) e inicie sesión en la cuenta de Rebble con la cuenta correcta. Luego, verifique su cuenta y la información de pago nuevamente.
Esta esfera del reloj ya no muestra información meteorológica o la información es incorrecta
Desafortunadamente, algunos servicios meteorológicos de uso frecuente se han retirado o han cambiado su API. Las esferas de reloj que usan esas API ahora ya no pueden obtener su información meteorológica. Vea si la esfera del reloj puede cambiar de API o elija otra esfera. Tenga en cuenta que esto no está relacionado con el plan de servicios de dictado y meteorología de Rebble.
El dictado no funciona: “Se produjo un error. Intentar otra vez.»
Abra la aplicación Pebble en su teléfono y vaya a Configuración . Toque Idioma de voz . Cámbielo a cualquier otro idioma. Luego, cámbielo de nuevo a su idioma preferido.
Necesito cambiar de cuenta, o eliminé y reinstalé la aplicación Pebble
Para cerrar sesión en el sitio web de Rebble, debe eliminar las cookies (para .rebble.io y auth.rebble.io ) de su navegador. Cómo hacerlo, depende del navegador. Ahora dirígete a la autenticación de Rebble e inicia sesión con la cuenta correcta.
Para configurar la aplicación Pebble para usar la cuenta en la que acaba de iniciar sesión, vuelva a pasar por boot.rebble.io .
Los eventos de mis calendarios no aparecen en la línea de tiempo ni en la vista rápida
Abra la aplicación Pebble en su teléfono y vaya a Aplicaciones . Toca el engranaje junto a Calendario . Aquí, puede elegir los calendarios desde los que aparecerán los eventos en su línea de tiempo.
Quiero agregar un Pebble o Pebble Steel original, pero el paso de actualización del firmware muestra «Migration Failed»
La pantalla de actualización también muestra No se pudo encontrar ningún firmware de migración para instalar. Para resolver esto, necesita un dispositivo con una aplicación Pebble que no se haya cambiado a Rebble. Puede usar otro dispositivo o eliminar Rebble de la aplicación Pebble visitando pebble://custom-boot-config/defaultdesde el navegador, o puede eliminar la aplicación Pebble de su teléfono y reinstalarla. Cuando vuelva a emparejar el reloj, ahora debería completar la actualización del firmware. Después de eso, puede comenzar a usar Rebble Web Services nuevamente, siguiendo la parte 2 anterior.
Cuando comienzo a cargar mi reloj, la pantalla comienza a encender y apagar la luz de fondo
Mientras está conectado al cable de carga, mantenga presionado cualquier botón del reloj hasta que aparezca un código de error en la pantalla. Suelta el botón. Ahora, deje que el reloj se cargue durante algún tiempo (al menos una hora). Finalmente, presione un botón para salir del código de error.
Consejos generales
Como muchos servicios en el reloj se implementan en el teléfono y en los servicios web, muchos problemas también se encuentran allí. Un reinicio de su teléfono tiene más posibilidades de solucionar problemas que un reinicio de su reloj. Casi nunca es necesario restaurar su reloj a la configuración de fábrica.
Si tiene problemas con el dictado, debe consultar el servicio meteorológico para descartar problemas con su suscripción. Si el clima funciona en Timeline oa través de la aplicación The Weather Channel, entonces su suscripción está funcionando bien.
EL NILM o Non-Intrusive Load Monitoring, es decir la desagregación no intrusiva de la demanda . es una técnica computacional para la estimación del consumo individual de diversos dispositivos utilizando para ello la lectura agregada de un único medidor de energía (Smart Meter, SM).
Gracias a las ventajas en cuanto instalación , coste e implementación, éste concepto ha tomado relevancia en los últimos años en el ámbito de las Smart Grids, al aportar una estimación de los hábitos de consumo de los clientes sin la necesidad de un despliegue masivo de contadores inteligentes en cada punto de consumo.
Tal es el interés por esta técnica que desde el 2010 , el número de publicaciones científicas referentes al NILM se ha incrementado exponencialmente sin duda condicionado por los beneficios de esta técnica en el marco de las redes inteligentes de energía como por ejemplo la posibilidad de generar facturas de electricidad que muestren en detalle el consumo de los electrodomésticos utilizando solamente las lecturas de un SM
Asimismo, existen aplicaciones de Energy Management System (EMS) en conjunto con NILM, las cuales pueden ser compatible con los programas de respuesta a la demanda o Demand Response (DR) de las compañías de electricidad.
Por otro lado, algunos plantean la posibilidad de usar NILM para detectar averías en los dispositivos cuando se presenta un comportamiento anómalo en las mediciones desagregadas. Es así como NILM se presenta como una valiosa herramienta para reducir el consumo de energía, tanto así que algunos afirman que es el “santo grial de la eficiencia energética”.
En este contexto vamos a ver una herramienta o toolkit open software llamado NILMTK que nos va a ayudar a comparar algoritmos para implementar la desagregación ( ademas particularmente no contempla un uso diferente a este)
Para el análisis de la desagregación , necesitamos recolectar datos del consumo centralizado , lo cual nos va permitir a creación de un nuevo dataset el cual puede ser analizado usando las funciones de NILMTK lo que permite, por ejemplo, visualizar los datos de potencia en un determinado periodo u obtener estadísticas de energía del dataset.
Posteriormente, en la etapa de preprocesamiento se toman decisiones en línea con los análisis realizados, con el objetivo de preparar correctamente los datos para del entrenamiento de los modelos de desagregación. Básicamente, el entrenamiento de un modelo consiste en enseñarle a reconocer por separado las características de los dispositivos para luego identificarlos dentro de una señal agregada. El entrenamiento contempla el uso de los algoritmos Combinatorial Optimization (CO) y Factorial Hidden Markov Model (FHMM).
HDF5 es un formato de datos jerárquico que se usar en el NILMTK como fuente datos basado en HDF4 y NetCDF (otros dos formatos de datos jerárquicos).El formato de datos jerárquico, versión 5 (HDF5), es un formato de archivo de código abierto que admite datos grandes, complejos y heterogéneos. HDF5 utiliza una estructura similar a un «directorio de archivos» que le permite organizar los datos dentro del archivo de muchas formas estructuradas diferentes, como lo haría con los archivos en su computadora. El formato HDF5 también permite la incrustación de metadatos, lo que lo hace autodescriptivo .
Estructura jerárquica: un directorio de archivos dentro de un archivo
El formato HDF5 se puede considerar como un sistema de archivos contenido y descrito en un solo archivo. Piense en los archivos y carpetas almacenados en su computadora. Es posible que tenga un directorio de datos con algunos datos de temperatura para varios sitios de campo. Estos datos de temperatura se recopilan cada minuto y se resumen cada hora, día y semana. Dentro de un archivo HDF5, puede almacenar un conjunto de datos similar organizado de la misma manera que podría organizar archivos y carpetas en su computadora. Sin embargo, en un archivo HDF5, lo que llamamos «directorios» o «carpetas» en nuestras computadoras, se llaman groupsy lo que llamamos archivos en nuestra computadora datasets.
2 Términos importantes de HDF5
Grupo: un elemento similar a una carpeta dentro de un archivo HDF5 que puede contener otros grupos O conjuntos de datos dentro de él.
Conjunto de datos: los datos reales contenidos en el archivo HDF5. Los conjuntos de datos se almacenan a menudo (pero no es necesario) dentro de grupos en el archivo.
Un ejemplo de estructura de archivo HDF5 que contiene grupos, conjuntos de datos y metadatos asociados.
Un archivo HDF5 que contiene conjuntos de datos podría estructurarse así:
Un ejemplo de estructura de archivo HDF5 que contiene datos para varios sitios de campo y también contiene varios conjuntos de datos (promediados en diferentes intervalos de tiempo).
HDF5 es un formato autodescriptivo
El formato HDF5 es autodescriptivo. Esto significa que cada archivo, grupo y conjunto de datos puede tener metadatos asociados que describen exactamente cuáles son los datos. Siguiendo el ejemplo anterior, podemos incrustar información sobre cada sitio en el archivo, como por ejemplo:
El nombre completo y la ubicación X, Y del sitio.
Descripción del sitio.
Cualquier documentación de interés.
De manera similar, podríamos agregar información sobre cómo se recopilaron los datos en el conjunto de datos, como descripciones del sensor utilizado para recopilar los datos de temperatura. También podemos adjuntar información, a cada conjunto de datos dentro del grupo de sitios, sobre cómo se realizó el promedio y durante qué período de tiempo están disponibles los datos.
Un beneficio clave de tener metadatos adjuntos a cada archivo, grupo y conjunto de datos es que esto facilita la automatización sin la necesidad de un documento de metadatos separado (y adicional). Usando un lenguaje de programación, como R o Python, podemos obtener información de los metadatos que ya están asociados con el conjunto de datos y que podríamos necesitar para procesar el conjunto de datos.
Los archivos HDF5 son autodescriptivos, lo que significa que todos los elementos (el archivo en sí, los grupos y los conjuntos de datos) pueden tener metadatos asociados que describen la información contenida en el elemento.
Subconjunto comprimido y eficiente
El formato HDF5 es un formato comprimido. El tamaño de todos los datos contenidos en HDF5 está optimizado, lo que reduce el tamaño general del archivo. Sin embargo, incluso cuando están comprimidos, los archivos HDF5 a menudo contienen grandes volúmenes de datos y, por lo tanto, pueden ser bastante grandes. Un atributo poderoso de HDF5 es data slicingmediante el cual se puede extraer un subconjunto particular de un conjunto de datos para su procesamiento. Esto significa que no es necesario leer el conjunto de datos completo en la memoria (RAM); muy útil para permitirnos trabajar de manera más eficiente con conjuntos de datos muy grandes (gigabytes o más).
Almacenamiento de datos heterogéneos
Los archivos HDF5 pueden almacenar muchos tipos diferentes de datos dentro del mismo archivo. Por ejemplo, un grupo puede contener un conjunto de conjuntos de datos para contener datos enteros (numéricos) y de texto (cadenas). O bien, un conjunto de datos puede contener tipos de datos heterogéneos (por ejemplo, tanto texto como datos numéricos en un conjunto de datos). Esto significa que HDF5 puede almacenar cualquiera de los siguientes (y más) en un archivo:
Datos de temperatura, precipitación y PAR (radiación fotosintética activa) para un sitio o para muchos sitios
Un conjunto de imágenes que cubren una o más áreas (cada imagen puede tener asociada información espacial específica, todo en el mismo archivo)
Un conjunto de datos espaciales multi o hiperespectral que contiene cientos de bandas.
Datos de campo para varios sitios que caracterizan insectos, mamíferos, vegetación y clima.
Un conjunto de imágenes que cubren una o más áreas (cada imagen puede tener asociada información espacial única)
¡Y mucho más!
Formato abierto
El formato HDF5 es abierto y de uso gratuito. Las bibliotecas de apoyo (y un visor gratuito) se pueden descargar desde el sitio web de HDF Group . Como tal, HDF5 es ampliamente compatible con una gran cantidad de programas, incluidos lenguajes de programación de código abierto como R y Python, y herramientas de programación comerciales como Matlaby IDL. Los datos espaciales que se almacenan en formato HDF5 se pueden utilizar en los programas de SIG y de imagen que incluyen QGIS, ArcGISy ENVI.
Beneficios de HDF5
Autodescripción Los conjuntos de datos con un archivo HDF5 son autodescriptivos. Esto nos permite extraer metadatos de manera eficiente sin necesidad de un documento de metadatos adicional.
Admite datos heterogéneos : un archivo HDF5 puede contener diferentes tipos de conjuntos de datos.
Admite datos grandes y complejos : HDF5 es un formato comprimido que está diseñado para admitir conjuntos de datos grandes, heterogéneos y complejos.
Admite la división de datos: la «división de datos», o la extracción de partes del conjunto de datos según sea necesario para el análisis, significa que los archivos grandes no necesitan leerse por completo en la memoria o RAM de la computadora.
Formato abierto: soporte amplio en las muchas herramientas : debido a que el formato HDF5 es abierto, es compatible con una gran cantidad de lenguajes y herramientas de programación, incluidos lenguajes de código abierto como R y Pythonherramientas SIG abiertas como QGIS.E
Instalación del NILTK
Descargue e instale Conda
Los entornos virtuales hacen que la organización de paquetes de Python sea pan comido. Además, el proyecto NILMTK ofrece varias versiones de Conda Forge. Primero, consiga Anaconda aquí. Luego, abra una ventana de terminal e inicie la instalación desde la línea de comando:
Dowloads cd /
bash Anaconda3-2020.11-Linux-x86_64.sh -u
Se le guiará a través de varios pasos. Instale Conda y pruebe la instalación ejecutando el comando conda en el símbolo del sistema:
conda
En caso de que el comando conda resulte en «un error de intérprete incorrecto» (es decir, no existe tal error de archivo o directorio), aplique la siguiente solución:
cd / inicio / usuario / nano .bashrc
agregue la línea:
export PATH = ~ / anaconda3 / bin: $ PATH
Guarde los cambios en el archivo y, finalmente, ejecute el comando:
source .bashrc
Felicidades, acaba de instalar Conda.
Instalación de NILMTK
Abra una ventana de terminal, cree un nuevo entorno de Conda y actívelo:
Si aún no está presente en su instalación de Conda, agregue el conda-forge a la lista de canales:
conda config --add channels conda-forge
Finalmente, instale la última versión de NILMTK de conda-forge :
conda install -c nilmtk nilmtk=0.4.3
Observe que el signo igual no lleva espacios(piense estamos usando Python.
La ejecución del comando puede tardar un rato. Mientras tanto, consulte otros paquetes en Forge de NILMTK .
Como puede experimentar algunos problemas posteriores a la instalación con NILMTK y Matplotlib., para s olucionarlos, aplique el comando:
conda install matplotlib=3.3.2
Agregar un kernel de Jupyter
Básicamente, NILMTK ahora está instalado en su ordenador. El siguiente paso involucra los cuadernos de Jupyter. Trabajar con Jupyter abre muchas posibilidades y se dice que es una herramienta imprescindible. Por lo tanto, agregue el entorno NILMTK a Jupyter:
MeterGroup (metros = ElecMeter (instancia = 1, edificio = 1, conjunto de datos = Ninguno, electrodomésticos = []) ElecMeter (instancia = 2, edificio = 1, conjunto de datos = Ninguno, electrodomésticos = []) ElecMeter (instancia = 3, edificio = 1, conjunto de datos = Ninguno, electrodomésticos = []) ElecMeter (instancia = 4, edificio = 1, conjunto de datos = Ninguno, electrodomésticos = []) ElecMeter (instancia = 5, edificio = 1, conjunto de datos = Ninguno, electrodomésticos = []) )
¡Felicitaciones! Lo ha logrado. ¡NILMTK parece funcionar según lo previsto! La próxima vez, discutiremos cómo usar la API de NILMTK para una experimentación rápida y conveniente.
Debe estar conectado para enviar un comentario.