Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Como construir um monitor de energia Arduino e registrador de dados

Componentes e suprimentos

Arduino UNO
× 1
Dr. Quadro de monitoramento de energia Wattson
× 1
Gabinete para Dr. Wattson Energy Monitoring Board
× 1
Adafruit MicroSD card breakout board +
× 1
LED (genérico)
× 1
Botão tátil Adafruit
× 1
Resistor 221 ohm
× 1

Sobre este projeto


(Esta postagem é baseada em uma postagem que foi publicada pela primeira vez em 19 de setembro de 2017 no Medium e foi atualizada e mais atual aqui, incluindo detalhes da publicação da biblioteca e exemplo (s) no GitHub).

Neste post, vou mostrar como construí um monitor de energia Arduino e registrador de dados que me ajudaria a reunir dados de corrente e energia para diferentes cargas com facilidade, e plotar essas informações usando um programa como o Excel.

Alguns de vocês devem estar cientes de que criei uma nova placa de monitoramento de energia que chamo de Dr. Wattson (que é baseada no #Microchip # MCP39F521, um IC de monitoramento de energia) junto com uma biblioteca #Arduino e uma biblioteca #Python ( para placas como #RaspberryPi e #BeagleBoneBlack) para fácil integração de dados de energia de qualidade em seu próximo projeto! Se você ainda não ouviu falar e deseja obter mais informações, acesse https://upbeatlabs-wattson.launchrock.com/ para obter mais informações. Também está disponível no Tindie.

Para me ajudar a estudar as características de energia de diferentes cargas, fui em frente e criei um Monitor de Energia Arduino e um Registrador de Dados, que é o assunto deste post!

Consiste em um Arduino (é claro!) Conversando com a placa do Dr. Wattson para obter dados de energia, junto com um cartão SD para gravar os dados. Eu também adicionei um botão para alternar o registro de dados, junto com um indicador LED para mostrar quando os dados estão sendo registrados. O botão junto com o LED tornou muito fácil iniciar o registro de dados quando eu tinha a carga apropriada conectada.

Para facilitar o registro e a análise subsequente, também implementei um esquema de rotação de registro, de forma que cada execução seja registrada em um arquivo diferente. A saída está no formato CSV, o que significa que pode ser facilmente importado para o Excel (ou Numbers no Mac ou outro equivalente) e os dados plotados.





Configuração


Coloquei a placa Dr. Wattson em um gabinete de acrílico para que os fios de CA fiquem fechados e você possa usá-la de maneira segura! Igual a:

Posteriormente, atualizei um pouco o gabinete e agora está disponível no Tindie. É assim que parece agora. Um pouco mais limpo com um soquete IEC adicional e conectores tipo espada para conexões fáceis.

Eu preparei um Manual do Usuário mostrando como a fiação deve ser feita, que agora está disponível no GitHub.

A saída digital que está saindo do Dr. Wattson está totalmente isolada da rede elétrica, pois a medição de energia é feita de forma isolada por meio de transformadores de corrente e tensão, portanto, a saída digital é perfeitamente segura para manusear.

Uma vez no gabinete, tudo o que você precisa fazer é conectar o cabo a uma tomada existente e conectar qualquer dispositivo na tomada do gabinete - o PCB é projetado para correntes de até 12A, por isso é muito bem construído! Ele é calibrado para medir correntes de até 4A (para que eu pudesse medir correntes realmente pequenas para medir a energia em espera - o chip MCP39F521 no qual é baseado tem uma relação dinâmica de 4000:1, o que significa que pode medir de 4A até 1mA)





Circuito


Aqui está o circuito que usei:

Usei um breakout de cartão SD semelhante ao Adafruit (então usei no Fritzing, já que era a parte mais próxima). A conexão é bem padrão - CLK (Arduino Uno pino 13), MISO (Arduino Uno pino 12), MOSI (Arduino Uno pino 11) e CS (seleção de chip). CS é configurável, embora o padrão seja pino 10 para hardware CS - acabei de usar isso.

Para o botão, uso a biblioteca de botões de Jack Christensen, que fornece eliminação de pontos e uma variedade de coisas úteis em um pacote fácil de usar. (https://github.com/JChristensen/Button). O botão está usando o pullup interno do Arduino, então ele não tem nenhum pullup externo e também usa lógica invertida (alto é DESLIGADO, baixo é LIGADO) - todos estes são configuráveis ​​como parâmetros para o construtor do Botão! Eu conectei o botão ao pino 4, mas você pode usar qualquer pino disponível que desejar.

Eu realmente não tive tempo e paciência para modelar o Dr. Wattson como um novo personagem em Fritzing, então trapaceei e usei o conselho de Z-HUT para preparar facilmente uma peça personalizada sem muito barulho. Eu recomendo assistir! https://www.youtube.com/watch?v=dfxx8wF3Uhs - obrigado Z-HUT ! :-)

A única desvantagem é que tenho que me contentar em usar a imagem do breadboard da parte do “IC genérico” que modifiquei para representar o Dr. Wattson. É a vida!

Aqui está uma olhada nos pinos do Dr. Wattson (da esquerda para a direita):
  • SCL - para comunicação I2C, vai para Arduino Uno A5
  • SDA - para comunicação I2C, vai para Arduino Uno A4
  • ZCD - Zero Cross Detection - não estamos usando este recurso neste exemplo
  • Evento - Indicador de evento - não estamos usando este recurso neste exemplo
  • GND - Conecte ao Arduino GND
  • VIN - Conecte ao Arduino 5V
  • 3.3v - Conecte-se ao Arduino 3.3v
  • GND - Conecte ao Arduino GND (você só precisa conectar um dos pinos GND)





Sketch


Ok, agora para avançar para a programação real!

Deixe-me começar explicando o esboço. Em setup (), primeiro configuro as comunicações do cartão SD e as comunicações do Dr.Wattson chamando seus respectivos métodos begin ().
  // veja se o cartão está presente e pode ser inicializado:if (! SD.begin (CHIP_SELECT)) {Serial.println (F ("O cartão falhou ou não está presente")); // não faça mais nada:} wattson.begin (); // Passe o endereço apropriado. O padrão é 0x74  

Eu também inicializo o pino do LED como OUTPUT.
  // inicializa o pino digital como uma saída. pinMode (LED, OUTPUT);  

O botão é declarado globalmente, então não preciso fazer nada na configuração do botão.
  #define BUTTON_PIN 4 // Conecte uma chave de botão tátil (ou algo semelhante) // do pino 4 do Arduino ao aterramento. #define PULLUP true // Para manter as coisas simples, usamos o resistor pullup interno do Arduino. # define INVERT true // Uma vez que o resistor pullup manterá o pino alto a menos que // a chave seja fechada, esta é uma lógica negativa, ou seja, um alto estado // significa que o botão NÃO está pressionado. (Assumindo um interruptor normalmente aberto.) # Define DEBOUNCE_MS 20 // Um ​​tempo de debounce de 20 milissegundos geralmente funciona bem para interruptores de botão tátil. Botão myBtn (BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); // Declare o botão  

Meu registro de dados é feito em arquivos com um nome como DATAXX.CSV, onde XX é um número (de 00 a 99, ou seja, 100 arquivos). Eu verifico o cartão SD para nomes de arquivo existentes e escolho o nome de arquivo não utilizado mais recente - por exemplo DATA15.CSV
  char filename [] ="DATA00.CSV"; setup () {... // cria um novo arquivo para (uint8_t i =0; i <100; i ++) {filename [4] =i / 10 + '0'; nome do arquivo [5] =i% 10 + '0'; if (! SD.exists (nome do arquivo)) {Serial.print (F ("Arquivo de dados é")); Serial.println (nome do arquivo); // só abre um novo arquivo se ele não existir break; // saia do loop! o nome do arquivo agora será o que desejamos}} ...}  

Na função loop (), uma vez que o botão é pressionado, ele alterna a variável readData, que controla se eu leio os dados de energia.
  void loop () {... myBtn.read (); // Leia o botão if (myBtn.wasReleased ()) {// Se o botão foi liberado, altere o estado do LED readData =! ReadData; digitalWrite (LED, readData); } if (readData) {... // lê os dados e salva no cartão SD, etc .......}  

Depois que readData é alternado, eu leio os dados de energia do Dr. Wattson e também registro o tempo:
  UpbeatLabs_MCP39F521_FormattedData fData; int readMCPretval =wattson.readMCP39F521 (&dados, NULL); longo sem sinal currentMillis =millis ();  

e escrever no cartão SD:
  // se o arquivo estiver disponível, escreva nele:Arquivo dataFile =SD.open (nome do arquivo, FILE_WRITE); if (dataFile) {dataFile.print (currentMillis); dataFile.print (","); dataFile.print (fData.currentRMS); dataFile.print (","); dataFile.print (fData.activePower); dataFile.print (","); dataFile.print (fData.reactivePower); dataFile.print (","); dataFile.println (fData.apparentPower); // imprime também na porta serial:dataFile.close (); } // se o arquivo não estiver aberto, exibe um erro:else {Serial.print (F ("erro ao abrir")); Serial.println (nome do arquivo); }  

Se o botão for alternado novamente, interrompo a leitura / gravação de dados.





Ação!


Depois de compilar e fazer upload do esboço para meu Arduino, obter dados de energia foi muito fácil.

Liguei a carga de escolha - uma lâmpada CFL. Eu queria ver a corrente e o consumo de energia de uma perspectiva de inicialização a frio, bem como uma inicialização a quente. Liguei a lâmpada, mas não liguei.

Pressionei o botão no meu circuito para iniciar as medições de energia - quando estava registrando, o LED VERMELHO me disse isso! Em seguida, liguei a lâmpada CFL e esperei até que pensei ter obtido dados suficientes - veja, a CFL, ao iniciar, consome mais energia do que o anunciado (no meu caso, uma lâmpada CFL de 14 W), e então se acalma eventualmente para cerca de 14W. Esperei até que as leituras se acomodassem. Em seguida, pressionei o botão para desligar a leitura.

Agora eu poderia ejetar meu cartão SD e começar a olhar os dados!

PS - Para registrar dados de dispositivos adicionais, tudo o que você precisa fazer é redefinir o Arduino - ele escolherá o próximo DATAXX.CSV disponível para registrar os dados, para que você possa facilmente mantê-los separados.

Nota: Em vez de usar o Arduino Serial Monitor, eu uso o comando “screen” embutido no meu terminal Mac como um terminal serial. No meu Sketch, eu imprimo os dados de energia em Serial e também emito um comando “clearscreen”, para que a saída não se mova
  Serial.write ("\ x1B" "c"); // Limpa a tela em um terminal regular wattson.printMCP39F521Data (&data);  

Isso só funciona em um terminal regular que pode aceitar comandos de terminal como os acima e, infelizmente, não funciona no Monitor Serial Arduino. No entanto, uma vez que você tente tela , você pode nunca mais voltar para o Arduino Serial Monitor!

O comando será mais ou menos assim:
  $ screen /dev/tty.usbmodem1411 9600  

onde o primeiro parâmetro é a “porta serial” e o segundo é a velocidade que você configurou para sua conexão serial em seu esboço do Arduino.





Traçando os dados no Excel


Como o arquivo está no formato CSV, carregá-lo e plotá-lo no Excel foi muito fácil. Não vou entrar em detalhes aqui, pois existem muitos tutoriais para a criação de um gráfico no Excel. Eu inseri uma linha contendo os cabeçalhos das colunas
  timestamp, currentRMS, activePower, reactivePower, appearPower  

(nota para mim mesmo - este será um aprimoramento futuro do meu Sketch - para adicionar os cabeçalhos das colunas no CSV diretamente!)

Eu escolhi os pontos de dados acima para registrar e plotar. O consumo atual ao longo do tempo é obviamente interessante. Por que activePower, reactivePower e aparentePower? Com base nas características elétricas do dispositivo, pode ser uma carga resistiva, uma carga reativa ou algo no meio, e os três parâmetros de potência nos informam suas características gerais e também se eles mudam com o tempo. Ou então eu acho ...

Vamos dar uma olhada em meus resultados para uma lâmpada CFL de uma inicialização a frio:

A corrente atinge o pico em torno de 0,21 amperes antes de finalmente chegar a cerca de 0,18 amperes.

A potência ativa atinge o pico em cerca de 17 watts antes de finalmente chegar a cerca de 14,2 watts.

Depois que ele se estabilizou, desliguei o CFL e esperei um pouco, antes de ligá-lo novamente (daí a queda da corrente no gráfico acima). Você pode ver que, uma vez que um CFL tenha “aquecido”, ele rapidamente se acomoda ao consumo de estado estacionário.





Conclusão


Há muitos dados e experimentos interessantes que você pode fazer com os dados de energia de seus eletrodomésticos e dispositivos. Fiquei animado para começar a colocar em minhas mãos alguns dados e compartilhá-los com você!

Meu objetivo com o Dr. Wattson é habilitar dados de energia de qualidade para o Maker e torná-los mais acessíveis, para que você possa usá-los como um bloco de construção para suas ideias malucas.

Dr. Wattson é projetado para ser seguro de usar (especialmente com o gabinete), vem calibrado (para que você possa obter dados de energia de qualidade imediatamente), mas também expõe funcionalidades mais complexas para o usuário sério
  • rotinas de calibração
  • ZCD (detector de cruzamento zero)
  • Notificação de eventos (eventos de sobrecarga, sobrecarga de energia, queda / oscilação de tensão)
  • a capacidade de personalizar a faixa de leituras (modificando os resistores de carga e / ou CT e recalibrando usando as rotinas de calibração mencionadas acima),
  • usando vários Dr. Wattsons junto com um único MCU (alterando o endereçamento I2C configurável).

Se você está interessado em monitoramento de energia e gosta do Dr. Wattson, inscreva-se em (https://upbeatlabs-wattson.launchrock.com/) para ficar por dentro das novidades e atualizações!

Saúde,

Sridhar

Aqui está o Sketch completo, para sua referência! Você também pode encontrá-lo e a biblioteca Dr. Wattson, junto com uma série de outros exemplos no repositório GitHub drwattson do Upbeat Labs.
  / ******************************************* **** -> https://www.tindie.com/products/UpbeatLabs/dr-wattson-energy-monitoring-board-2/ Este exemplo demonstra obter dados de energia do Dr. Wattson e gravá-los em um cartão SD separados por vírgula Formato (CSV). Um botão é usado para alternar a coleta de dados, para que você possa registrar os dados quando estiver pronto. Quando o botão alterna a medição, o esboço começa a pesquisar o módulo para dados de energia e os imprime. Para facilitar a visualização dos valores, use uma tela semelhante a um programa para exibir a saída serial. O serial grava os caracteres necessários para limpar a tela em um terminal regular, o que significa que a saída serial permanecerá no lugar e apenas será atualizada com o tempo. Ligue a alimentação de entrada para ver a tensão RMS, os valores da frequência da linha mudam para os valores apropriados. Ligue a carga anexada à sua saída para ver a corrente RMS, fator de potência, alteração dos valores de potência ativa, reativa e aparente. Todos esses valores são gravados no cartão SD em formato CSV, que pode então ser usado com um programa como o Excel para visualizar / plotar os dados. O nome do arquivo tem o formato DATAnn.CSV. No momento da configuração, é escolhido um novo nome de arquivo que ainda não existe, de forma que os arquivos serão DATA00.CSV, DATA01.CSV, DATA02.CSV e assim por diante. O registro gira para novos arquivos até DATA99.CSV. A comunicação acontece em I2C. 2 pinos são necessários para fazer a interface. Existem 4 possibilidades de endereço I2C selecionáveis ​​por placa (selecionáveis ​​através de dois jumpers de solda (que selecionam cada pino como alto ou baixo). Com base nisso, existem 4 endereços possíveis:Endereço I2C SJ1 SJ2 0x74 LOW LOW 0x75 LOW HIGH 0x76 HIGH LOW 0x77 HIGH HIGH Dr. Wattson tem duas saídas, ZCD ou Event, que são usadas para notificações e, portanto, normalmente serão conectadas a um pino externamente interrompível (como pin2 ou pin3 no Arduino Uno). Neste exemplo, ZCD e Event não são O botão está conectado ao pino 4. * Cartão SD conectado ao barramento SPI da seguinte maneira:** MOSI - pino 11 ** MISO - pino 12 ** CLK - pino 13 ** CS - pino 10 LED está conectado ao pino 9 Escrito por Sridhar Rajagopal para Upbeat Labs LLC. Licença BSD. Todo o texto acima deve ser incluído em qualquer redistribuição * / # include  #include "UpbeatLabs_MCP39F521.h" #include  #include  //https://github.com/JChristensen/Button#define BUTTON_PIN 4 // Conecte um botão tátil (ou algo semelhante) // do pino 4 do Arduino para aterrar. # define PULLUP true // Para manter as coisas simples, usamos o resistor pullup interno do Arduino. # define INVERT true // Uma vez que o resistor pullup manterá o pino alto a menos que // a chave seja fechada, esta é uma lógica negativa, ou seja, um estado alto // significa que o botão NÃO está pressionado. (Assumindo um interruptor normalmente aberto.) # Define DEBOUNCE_MS 20 // Um ​​tempo de debounce de 20 milissegundos normalmente funciona bem para interruptores de botão tátil. Botão myBtn (BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); // Declara o botão # define LED 9 // Conecte um LED (através de um resistor de 220ohm) do pino 9 (ânodo) ao GND (cátodo). #define CHIP_SELECT 10UpbeatLabs_MCP39F521 wattson =UpbeatLabs_MCP39F521 (); bool readData =false; char filename [] ="DATA00.CSV"; void setup () {Serial.begin (9600); // liga a comunicação serial Serial.println (F ("** Upbeat Labs Dr. Wattson Example Sketch **")); Serial.println (F ("Exemplo de registro de cartão SD de dados de energia Upbeat Labs Dr. Wattson"); Serial.println (F ("****************************************** *********************** ")); // inicializa o pino digital como uma saída. pinMode (LED, SAÍDA); pinMode (CHIP_SELECT, OUTPUT); // veja se o cartão está presente e pode ser inicializado:if (! SD.begin (CHIP_SELECT)) {Serial.println (F ("*** O cartão SD falhou ou não está presente ***")); // não faça mais nada:} wattson.begin (); // Passe o endereço apropriado. O padrão é 0x74 // cria um novo arquivo para (uint8_t i =0; i <100; i ++) {nome do arquivo [4] =i / 10 + '0'; nome do arquivo [5] =i% 10 + '0'; if (! SD.exists (nome do arquivo)) {Serial.print (F ("Arquivo de dados é")); Serial.println (nome do arquivo); // só abre um novo arquivo se ele não existir break; // saia do loop! o nome do arquivo será agora o que desejamos}} Serial.println (F ("** inicialização completa. **"));} void loop () {myBtn.read (); // Leia o botão if (myBtn.wasReleased ()) {// Se o botão foi liberado, altere o estado do LED readData =! ReadData; digitalWrite (LED, readData); } if (readData) {UpbeatLabs_MCP39F521_Data data; UpbeatLabs_MCP39F521_FormattedData fData; int readMCPretval =wattson.read (&data, NULL); currentMillis longo sem sinal =millis (); if (readMCPretval ==UpbeatLabs_MCP39F521 ::SUCCESS) {// Imprimir Serial.write ("\ x1B" "c"); // Limpa a tela em um terminal regular wattson.convertRawData (&data, &fData); printMCP39F521Data (&fData); // se o arquivo estiver disponível, escreva nele:Arquivo dataFile =SD.open (nome do arquivo, FILE_WRITE); if (dataFile) {dataFile.print (currentMillis); dataFile.print (","); dataFile.print (fData.currentRMS); dataFile.print (","); dataFile.print (fData.activePower); dataFile.print (","); dataFile.print (fData.reactivePower); dataFile.print (","); dataFile.println (fData.apparentPower); // imprime também na porta serial:dataFile.close (); } // se o arquivo não estiver aberto, exibe um erro:else {Serial.print (F ("erro ao abrir")); Serial.println (nome do arquivo); }} else {Serial.print (F ("Erro!")); Serial.println (readMCPretval); }}} void printMCP39F521Data (dados UpbeatLabs_MCP39F521_FormattedData *) {Serial.print (F ("Voltage =")); Serial.println(data->voltageRMS, 4); Serial.print(F("Current =")); Serial.println(data->currentRMS, 4); Serial.print(F("Line Frequency =")); Serial.println(data->lineFrequency, 4); Serial.print("Analog Input Voltage ="); Serial.println(data->analogInputVoltage, 4); Serial.print(F("Power Factor =")); Serial.println(data->powerFactor, 4); Serial.print(F("Active Power =")); Serial.println(data->activePower, 4); Serial.print(F("Reactive Power =")); Serial.println(data->reactivePower, 4); Serial.print(F("Apparent Power =")); Serial.println(data->apparentPower, 4);} 

Code

  • Code snippet #1
  • Code snippet #3
  • Code snippet #4
  • Code snippet #5
  • Code snippet #7
  • Code snippet #11
Code snippet #1Plain text
// see if the card is present and can be initialized:if (!SD.begin(CHIP_SELECT)) { Serial.println(F("Card failed, or not present")); // don't do anything more:} wattson.begin(); // Pass in the appropriate address. Defaults to 0x74
Code snippet #3Plain text
#define BUTTON_PIN 4 //Connect a tactile button switch (or something similar) //from Arduino pin 4 to ground. #define PULLUP true //To keep things simple, we use the Arduino's internal pullup resistor.#define INVERT true //Since the pullup resistor will keep the pin high unless the //switch is closed, this is negative logic, i.e. a high state //means the button is NOT pressed. (Assuming a normally open switch.)#define DEBOUNCE_MS 20 //A debounce time of 20 milliseconds usually works well for tactile button switches.Button myBtn(BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); //Declare the button
Code snippet #4Plain text
char filename[] ="DATA00.CSV";setup() { ... // create a new file for (uint8_t i =0; i <100; i++) { filename[4] =i/10 + '0'; filename[5] =i%10 + '0'; if (! SD.exists(filename)) { Serial.print(F("Data file is ")); Serial.println(filename); // only open a new file if it doesn't exist break; // leave the loop! filename will now be the one we desire } }...}
Code snippet #5Plain text
 myBtn.read(); //Read the button if (myBtn.wasReleased()) { //If the button was released, change the LED state readData =!readData; digitalWrite(LED, readData); } if (readData) { ... // read data and save to SD card, etc ....
Code snippet #7Plain text
 // if the file is available, write to it:File dataFile =SD.open(filename, FILE_WRITE); if (dataFile) { dataFile.print(currentMillis); dataFile.print(","); dataFile.print(data.currentRMS); dataFile.print(","); dataFile.print(data.activePower); dataFile.print(","); dataFile.print(data.reactivePower); dataFile.print(","); dataFile.println(data.apparentPower); // print to the serial port too:dataFile.close(); } // if the file isn't open, pop up an error:else { Serial.print(F("error opening ")); Serial.println(filename); } 
Code snippet #11Plain text
/*************************************************** This is a example sketch for Upbeat Labs Dr. Wattson Energy Monitoring BreakoutThe communication happens over I2C. 2 pins are required to interface. There are 4 selectable I2C address possibilities per board (selectable via two solder jumpers (that select each pin to be high or low). Based on this, there are 4 possible addresses:I2C address SJ1 SJ2 0x74 LOW LOW 0x75 LOW HIGH 0x76 HIGH LOW 0x77 HIGH HIGHDr. Wattson has two outputs, ZCD or Event, that are used for notifications, and therefore will usually be connected to an externally interruptable pin (like pin2 or pin3 on Arduino Uno). In this example, ZCD and Event are not used.Button is connected to pin 4. * SD card attached to SPI bus as follows:** MOSI - pin 11 ** MISO - pin 12 ** CLK - pin 13 ** CS - pin 10 LED is connected to pin 9 Written by Sridhar Rajagopal for Upbeat Labs LLC. BSD license. All text above must be included in any redistribution */ #include #include "MCP39F521.h"#include #include  //https://github.com/JChristensen/Button#define BUTTON_PIN 4 //Connect a tactile button switch (or something similar) //from Arduino pin 4 to ground . #define PULLUP true //To keep things simple, we use the Arduino's internal pullup resistor.#define INVERT true //Since the pullup resistor will keep the pin high unless the //switch is closed, this is negative logic, i.e. a high state //means the button is NOT pressed. (Assuming a normally open switch.)#define DEBOUNCE_MS 20 //A debounce time of 20 milliseconds usually works well for tactile button switches.Button myBtn(BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); //Declare the button#define LED 9 // Connect an LED (via a 220ohm resistor) from pin 9 (anode) to GND (cathode).#define CHIP_SELECT 10MCP39F521 wattson =MCP39F521();bool readData =false;char filename[] ="DATA00.CSV";void setup() { Serial.begin(9600); //turn on serial communication Serial.println(F("**Upbeat Labs Dr. Wattson Example Sketch**")); // initialize the digital pin as an output. pinMode(LED, OUTPUT); pinMode(10, OUTPUT); // see if the card is present and can be initialized:if (!SD.begin(CHIP_SELECT)) { Serial.println(F("Card failed, or not present")); // don't do anything more:} wattson.begin(); // Pass in the appropriate address. Defaults to 0x74// create a new file for (uint8_t i =0; i <100; i++) { filename[4] =i/10 + '0'; filename[5] =i%10 + '0'; if (! SD.exists(filename)) { Serial.print(F("Data file is ")); Serial.println(filename); // only open a new file if it doesn't exist break; // leave the loop! filename will now be the one we desire } } Serial.println(F("**initialization complete.**")); }// This is what MCP39F521Data looks like, for reference!//typedef struct MCP39F521Data {// uint16_t systemStatus;// uint16_t systemVersion;// uint16_t voltageRMS;// uint16_t lineFrequency;// uint16_t analogInputVoltage;// int16_t powerFactor;// uint32_t currentRMS;// uint32_t activePower;// uint32_t reactivePower;// uint32_t apparentPower;//} MCP39F521Data; void loop() { myBtn.read(); //Read the button if (myBtn.wasReleased()) { //If the button was released, change the LED state readData =!readData; digitalWrite(LED, readData); } if (readData) { MCP39F521Data data; int readMCPretval =wattson.readMCP39F521(&data, NULL); unsigned long currentMillis =millis(); if (readMCPretval) { // Print stuff out Serial.write("\x1B" "c"); // Clear the screen on a regular terminal wattson.printMCP39F521Data(&data); // if the file is available, write to it:File dataFile =SD.open(filename, FILE_WRITE);if (dataFile) { dataFile.print(currentMillis); dataFile.print(","); dataFile.print(data.currentRMS); dataFile.print(","); dataFile.print(data.activePower); dataFile.print(","); dataFile.print(data.reactivePower); dataFile.print(","); dataFile.println(data.apparentPower); // print to the serial port too:dataFile.close(); } // if the file isn't open, pop up an error:else { Serial.print(F("error opening ")); Serial.println(filename); } } else { Serial.println(F("Error!")); } }}
Github
https://github.com/JChristensen/Buttonhttps://github.com/JChristensen/Button
Upbeat Labs Dr. Wattson Energy Monitoring Board Library
Libraries for use with Dr. Wattson Energy Monitoring BoardDr. Wattson is an Energy Monitoring Breakout Board for Arduino, Raspberry Pi and other Maker-Friendly Microcontrollers. Easily integrate quality AC energy measurements into your next project!Based on the MCP39F521, a single-phase power monitoring chip from Microchip, the board is designed to be tolerant of a wide range of voltages, which means that it can also be used with the Raspberry Pi or any other 3.3v MCUs just as easily.The unit comes pre-calibrated (enabling measurements from 1mA up to 4A) to enable you to start taking quality measurements on the get-go with just a couple of simple commands. You don't need any additional CT or other components.If you are a more advanced user, you have a wide range of functionality available from the rich library, as well as the ability to tweak the hardware to suit your needs and recalibrate using the library.https://github.com/upbeatlabs/drwattson

Schematics


Processo de manufatura

  1. Nuvem e como ela está mudando o mundo da TI
  2. Como construir e otimizar um cronograma de manutenção preventiva
  3. Como construir um codificador automático variacional com TensorFlow
  4. Registrador de dados de temperatura e umidade
  5. Arduino Temp. Monitor e relógio em tempo real com tela 3.2
  6. Como ler a temperatura e umidade em Blynk com DHT11
  7. Monitor doméstico
  8. Monitor de energia inteligente baseado em Arduino
  9. Registrador de dados GPS, curva em tempo real, altura máxima e velocidade máxima
  10. Como fazer uma bússola usando Arduino e IDE de processamento