Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Как создать монитор энергии и регистратор данных Arduino

Компоненты и расходные материалы

Arduino UNO
× 1
Доктор. Совет по мониторингу энергии Wattson
× 1
Корпус для платы мониторинга энергии доктора Ваттсона
× 1
Отрывная плата для карт памяти MicroSD Adafruit +
× 1
LED (общий)
× 1
Тактильная кнопка Adafruit
× 1
Резистор 221 Ом
× 1

Об этом проекте

(Этот пост основан на сообщении, которое было впервые опубликовано 19 сентября 2017 года на Medium и было обновлено и более актуально здесь, включая подробности публикации библиотеки и примеров на GitHub).

В этом посте я собираюсь показать вам, как я создал монитор энергии и регистратор данных Arduino, которые помогут мне легко собирать данные о токе и энергии для различных нагрузок и отображать эту информацию с помощью такой программы, как Excel.

Некоторые из вас, возможно, знают, что я создал новую коммутационную плату для мониторинга энергопотребления, которую я назвал доктором Ваттсоном (которая основана на #Microchip # MCP39F521, ИС для мониторинга мощности) вместе с библиотекой #Arduino и библиотекой #Python ( для таких плат, как #RaspberryPi и #BeagleBoneBlack) для легкой интеграции данных о качестве энергии в ваш следующий проект! Если вы не слышали об этом и хотели бы получить дополнительную информацию, посетите https://upbeatlabs-wattson.launchrock.com/ для получения дополнительной информации. Он также доступен на Tindie.

Чтобы помочь мне изучить энергетические характеристики различных нагрузок, я пошел дальше и создал Arduino Energy Monitor и Data Logger, которым и посвящена эта статья!

Он состоит из Arduino (конечно!), Говорящего с платой доктора Ваттсона для получения данных об энергии, а также SD-карты для записи данных. Я также добавил кнопку для переключения регистрации данных, а также светодиодный индикатор, показывающий, когда данные записываются. С помощью кнопки и светодиода стало очень легко начать регистрацию данных, когда у меня была подключена соответствующая нагрузка.

Чтобы облегчить ведение журнала и последующий анализ, я также реализовал схему ротации журналов, поэтому каждый запуск будет записываться в отдельный файл. Вывод находится в формате CSV, что означает, что его можно легко импортировать в Excel (или Numbers на Mac или другой эквивалент), а данные отображаются на графике.

Настройка

Я поместил плату доктора Ватсона в акриловый корпус, чтобы провода переменного тока были закрыты, и вы могли использовать ее безопасно! Вот так:

Позже я немного обновил корпус, и теперь он доступен на Tindie. Вот как это выглядит сейчас. Еще немного прибрано, добавлены дополнительные розетки IEC и лопаточные разъемы для облегчения подключения.

Я подготовил руководство пользователя, показывающее, как должна быть сделана проводка, которое теперь доступно на GitHub.

Цифровой выход доктора Ваттсона полностью изолирован от сети, поскольку измерение энергии выполняется изолированно с использованием трансформаторов тока и напряжения, поэтому использование цифрового выхода совершенно безопасно.

Оказавшись в корпусе, все, что вам нужно сделать, это подключить кабель к существующей розетке и подключить любое устройство к розетке корпуса - печатная плата рассчитана на ток до 12 А, поэтому она довольно хорошо построена! Он откалиброван для измерения токов до 4 А (чтобы я мог измерять действительно небольшие токи для измерения мощности в режиме ожидания - чип MCP39F521, на котором он основан, имеет динамическое соотношение 4000:1, что означает, что он может измерять от 4 А до 1 мА)

Схема

Вот схема, которую я использовал:

Я использовал разъем для SD-карты, аналогичный тому, что был у Adafruit (так что я использовал его во Fritzing, так как это была самая близкая часть). Подключение довольно стандартное - CLK (вывод 13 Arduino Uno), MISO (вывод 12 Arduino Uno), MOSI (вывод 11 Arduino Uno) и CS (выбор микросхемы). CS настраивается, хотя по умолчанию для аппаратного CS используется вывод 10 - я просто его использую.

Для кнопки я использую библиотеку Button от Джека Кристенсена, которая обеспечивает устранение неполадок и множество полезных вещей в простом в использовании пакете. (https://github.com/JChristensen/Button). Кнопка использует внутреннюю подтяжку Arduino, поэтому она не имеет никаких внешних подтягиваний, а также использует инвертированную логику (высокий уровень выключен, низкий уровень включен) - все это можно настроить как параметры для конструктора кнопки! Я подключил кнопку к контакту 4, но вы можете использовать любой доступный контакт, который вам нравится.

У меня действительно не было времени и терпения, чтобы смоделировать доктора Уоттсона как новую роль во Фритцинге, поэтому я схитрил и воспользовался советом Z-HUT чтобы легко создать нестандартную деталь без особых усилий. Очень рекомендую его посмотреть! https://www.youtube.com/watch?v=dfxx8wF3Uhs - спасибо Z-HUT ! :-)

Единственным недостатком является то, что мне приходится довольствоваться использованием макета «общей ИС», которую я модифицировал, чтобы представить доктора Ваттсона. C’est la vie!

Вот вид булавок доктора Ваттсона (слева направо):

  • SCL - для связи I2C используется Arduino Uno A5.
  • SDA - для связи I2C используется Arduino Uno A4.
  • ZCD - Zero Cross Detection - мы не используем эту функцию в этом примере.
  • Событие - индикатор события - в этом примере мы не используем эту функцию.
  • GND - подключение к Arduino GND.
  • VIN - подключение к Arduino 5V
  • 3,3 В - подключение к Arduino 3,3 В
  • GND - подключитесь к Arduino GND (вам нужно подключить только один из контактов GND)

Эскиз

Хорошо, теперь переходим к собственно программированию!

Позвольте мне сначала начать с объяснения наброска. В setup () я сначала настроил связь SD-карты и связь доктора Ваттсона, вызвав соответствующие методы begin ().

  // смотрим, присутствует ли карта и может ли быть инициализирована:if (! SD.begin (CHIP_SELECT)) {Serial.println (F («Карта вышла из строя или отсутствует»)); // больше ничего не делаем:} wattson.begin (); // Передаем соответствующий адрес. По умолчанию 0x74  

Я также инициализирую вывод светодиода как ВЫХОД.

  // инициализируем цифровой контакт как выход. pinMode (LED, ВЫХОД);  

Кнопка объявлена ​​глобально, поэтому мне не нужно ничего делать в настройке для кнопки.

  #define BUTTON_PIN 4 // Подключите тактильный кнопочный переключатель (или что-то подобное) // от контакта 4 Arduino к земле. #define PULLUP true // Для простоты мы используем внутренний подтягивающий резистор Arduino. #define INVERT true // Поскольку подтягивающий резистор будет поддерживать высокий уровень на выводе, если // переключатель не замкнут, это отрицательная логика, т. е. высокий state // означает, что кнопка НЕ ​​нажата. (Предполагается, что переключатель нормально разомкнут.) #Define DEBOUNCE_MS 20 // Время устранения дребезга в 20 миллисекунд обычно хорошо работает для тактильных кнопочных переключателей. Кнопка myBtn (BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); // Объявление кнопки  

Моя регистрация данных выполняется в файлах с такими именами, как DATAXX.CSV, где XX - это число (от 00 до 99, то есть 100 файлов). Я проверяю SD-карту на наличие существующих имен файлов и выбираю последнее неиспользуемое имя файла, например DATA15.CSV

  char filename [] ="DATA00.CSV"; setup () {... // создаем новый файл для (uint8_t i =0; i <100; i ++) {filename [4] =i / 10 + '0'; имя файла [5] =i% 10 + '0'; if (! SD.exists (имя файла)) {Serial.print (F ("Файл данных есть")); Serial.println (имя файла); // открывать новый файл только в том случае, если он не существует break; // выход из цикла! имя файла теперь будет тем, которое нам нужно}} ...}  

В функции loop () после нажатия кнопки она переключает переменную readData, которая определяет, читаю ли я данные об энергии.

  void loop () {... myBtn.read (); // Считываем кнопку if (myBtn.wasReleased ()) {// Если кнопка была отпущена, измените состояние светодиода readData =! ReadData; digitalWrite (светодиод, readData); } if (readData) {... // считываем данные и сохраняем на SD-карту и т. д. .......}  

После переключения readData я читаю данные об энергии от доктора Ваттсона, а также записываю время:

  UpbeatLabs_MCP39F521_FormattedData fData; int readMCPretval =wattson.readMCP39F521 (&данные, NULL); беззнаковый длинный currentMillis =millis ();  

и запишите на SD-карту:

  // если файл доступен, записываем в него:File dataFile =SD.open (filename, FILE_WRITE); если (файл данных) {файл данных.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); // печать также на последовательный порт:dataFile.close (); } // если файл не открыт, выдается сообщение об ошибке:else {Serial.print (F ("ошибка открытия")); Serial.println (имя файла); }  

Если снова нажать кнопку, я прекращаю чтение / запись данных.

Действие!

После того, как я скомпилировал и загрузил скетч в свой Arduino, получить данные об энергии стало довольно просто.

Я подключил выбранную нагрузку - лампу КЛЛ. Я хотел увидеть потребление тока и энергии с точки зрения холодного старта, а также теплого старта. Я воткнул лампу, но не включил.

Я нажал кнопку на своей схеме, чтобы начать измерения энергии - во время записи мне об этом сообщил КРАСНЫЙ светодиод! Затем я включил лампу CFL и подождал, пока, как мне кажется, я получил достаточно данных - видите ли, CFL при запуске потребляет больше энергии, чем рекламируется (в моем случае лампа CFL 14 Вт), а затем успокаивается. в итоге примерно до 14Вт. Я подождал, пока показания не стабилизируются. Затем я нажал кнопку, чтобы выключить чтение.

Теперь я мог извлечь SD-карту и начать просмотр данных!

PS - Чтобы записывать данные с дополнительных устройств, все, что вам нужно сделать, это перезагрузить Arduino - он выберет следующий доступный DATAXX.CSV для входа в данные, так что вы можете легко хранить данные отдельно.

Примечание. Вместо использования последовательного монитора Arduino я использую встроенную команду «screen» на моем терминале Mac в качестве последовательного терминала. В моем эскизе я распечатываю данные об энергопотреблении в последовательном режиме, а также выдаю команду «очистить экран», чтобы выходные данные не перемещались

  Serial.write ("\ x1B" "c"); // Очищаем экран на обычном терминале wattson.printMCP39F521Data (&data);  

Это работает только на обычном терминале, который может принимать команды терминала, подобные приведенным выше, и, к сожалению, не работает на последовательном мониторе Arduino. Однако как только вы попробуете экран , возможно, вы больше никогда не вернетесь к Arduino Serial Monitor!

Команда будет выглядеть примерно так:

  $ screen /dev/tty.usbmodem1411 9600  

где первый параметр - это «последовательный порт», а второй - скорость, которую вы настроили для своего последовательного соединения в скетче Arduino.

Отображение данных в Excel

Поскольку файл в формате CSV, загрузить его и построить в Excel было довольно просто. Я не буду здесь вдаваться в подробности, так как существует множество руководств по созданию диаграммы в Excel. Я вставил строку, содержащую заголовки столбцов

  отметка времени, currentRMS, activePower, reactivePower, очевидная мощность  

(примечание для себя - это будет будущим усовершенствованием моего Sketch - добавление заголовков столбцов напрямую в CSV!)

Я выбрал указанные выше точки данных для регистрации и построения графика. Потребление тока с течением времени, очевидно, интересно. Почему активная мощность, реактивная мощность и полная мощность? Основываясь на электрических характеристиках устройства, это может быть резистивная нагрузка, реактивная нагрузка или что-то среднее между ними, и три параметра мощности, таким образом, сообщают нам его общие характеристики, а также то, изменяются ли они с течением времени. По крайней мере, я так думаю…

Давайте посмотрим на мои результаты для лампы CFL после холодного запуска:

Пик тока составляет около 0,21 ампера, а затем в конечном итоге стабилизируется до 0,18 ампера.

Пиковая активная мощность составляет примерно 17 Вт, а затем стабилизируется примерно до 14,2 Вт.

После того, как он успокоился, я выключил CFL и немного подождал, прежде чем снова включить его (отсюда падение тока в таблице выше). Вы можете видеть, что как только КЛЛ «нагреваются», он быстро приходит к установившемуся режиму потребления.

Заключение

Есть много интересных данных и экспериментов, которые вы можете провести с данными об энергопотреблении ваших бытовых приборов и устройств. Я был очень рад получить в свои руки некоторые данные и поделиться ими с вами!

Моя цель с доктором Ваттсоном - предоставить Создателю качественные данные об энергии и сделать их более доступными, чтобы вы могли использовать их в качестве строительного блока для своих безумных и безумных идей.

Доктор Ватсон безопасен в использовании (особенно с корпусом), поставляется откалиброванным (так что вы можете сразу получить качественные данные об энергопотреблении), но также предоставляет более сложные функции для серьезного пользователя

  • процедуры калибровки
  • ZCD (Детектор пересечения нуля)
  • Уведомление о событиях (перегрузка по току, перегрузка по мощности, скачки / скачки напряжения).
  • возможность настройки диапазона показаний (путем изменения нагрузочных резисторов и / или ТТ и повторной калибровки с использованием вышеупомянутых процедур калибровки),
  • использование нескольких Dr. Wattsons вместе с одним MCU (путем изменения настраиваемой адресации I2C).

Если вы заинтересованы в мониторинге энергии и любите доктора Ваттсона, зарегистрируйтесь на (https://upbeatlabs-wattson.launchrock.com/), чтобы быть в курсе новостей и обновлений!

Ура,

Шридхар

Вот и весь Скетч для справки! Вы также можете найти его и библиотеку доктора Ваттсона, а также множество других примеров в репозитории Drwattson GitHub Upbeat Labs.

  / ****************************************** *********************************** Это пример скетча для Upbeat Labs Dr Wattson Energy Monitoring Breakout. -> https://www.tindie.com/products/UpbeatLabs/dr-wattson-energy-monitoring-board-2/ Этот пример демонстрирует получение данных об энергии от доктора Ваттсона и их запись на SD-карту через запятую. (CSV) формат. Кнопка используется для переключения сбора данных, поэтому вы можете регистрировать данные, когда будете готовы. Когда кнопка переключает измерение, эскиз начинает опрашивать модуль для получения данных об энергии и распечатывает их. Для облегчения просмотра значений используйте программу, подобную экрану, для отображения последовательного вывода. Последовательный порт записывает символы, необходимые для очистки экрана на обычном терминале, что означает, что последовательный вывод будет оставаться на месте и просто обновляться с течением времени. Включите входное питание, чтобы увидеть среднеквадратичное значение напряжения, значения частоты сети изменится на соответствующие значения. Включите нагрузку, подключенную к вашему выходу, чтобы увидеть текущее среднеквадратичное значение, коэффициент мощности, изменение значений активной, реактивной и полной мощности. Все эти значения записываются на SD-карту в формате CSV, который затем можно использовать с такой программой, как Excel, для просмотра / построения данных. Имя файла имеет вид DATAnn.CSV. Во время настройки выбирается новое имя файла, который еще не существует, поэтому файлы будут называться DATA00.CSV, DATA01.CSV, DATA02.CSV и так далее. Ведение журнала переходит в новые файлы до DATA99.CSV. Связь происходит по I2C. Для подключения требуются 2 контакта. На плате имеется 4 выбираемых адреса I2C (выбираемых с помощью двух паяных перемычек (которые выбирают каждый вывод как высокий или низкий). Исходя из этого, есть 4 возможных адреса:I2C-адрес SJ1 SJ2 0x74 LOW LOW 0x75 LOW HIGH 0x76 HIGH LOW 0x77 ВЫСОКИЙ ВЫСОКИЙ У доктора Ваттсона есть два выхода, ZCD или Event, которые используются для уведомлений и поэтому обычно подключаются к внешнему прерываемому выводу (например, pin2 или pin3 на Arduino Uno). В этом примере ZCD и Event не являются Кнопка подключена к контакту 4. * SD-карта подключена к шине SPI следующим образом:** MOSI - контакт 11 ** MISO - контакт 12 ** CLK - контакт 13 ** CS - контакт 10 Светодиод подключен к контакту 9 Записано Автор:Шридхар Раджагопал для Upbeat Labs LLC. Лицензия BSD. Весь текст выше должен быть включен в любое повторное распространение * / # include  #include "UpbeatLabs_MCP39F521.h" #include  #include  //https://github.com/JChristensen/Button#define BUTTON_PIN 4 // Подключаем тактильный кнопочный переключатель (или что-то подобное) // от пина 4 Arduino на землю. # define PULLUP true // Для простоты мы используем внутренний подтягивающий резистор Arduino. #define INVERT true // Поскольку подтягивающий резистор будет поддерживать высокий уровень на выводе, если // переключатель не замкнут, это отрицательная логика, т.е. высокое состояние // означает, что кнопка НЕ ​​нажата. (Предполагается, что переключатель нормально разомкнут.) #Define DEBOUNCE_MS 20 // Время устранения дребезга в 20 миллисекунд обычно хорошо работает для тактильных кнопочных переключателей. Кнопка myBtn (BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); // Объявить кнопку # определить светодиод 9 // Подключить светодиод (через резистор 220 Ом) от контакта 9 (анод) к GND (катоду). #define CHIP_SELECT 10UpbeatLabs_MCP39F521 wattson =UpbeatLabs_MCP39F521 (); bool readData =false; char filename [] ="DATA00.CSV"; void setup () {Serial.begin (9600); // включаем последовательную связь Serial.println (F ("** Upbeat Labs Dr. Wattson Example Sketch **")); Serial.println (F («Пример с записью на SD-карту данных энергии доктора Ваттсона из лаборатории Upbeat Labs»)); Serial.println (F ("****************************************** *********************** ")); // инициализируем цифровой вывод как выход. pinMode (светодиод, ВЫХОД); pinMode (CHIP_SELECT, OUTPUT); // посмотрим, присутствует ли карта и может ли она быть инициализирована:if (! SD.begin (CHIP_SELECT)) {Serial.println (F ("*** SD-карта вышла из строя или отсутствует ***")); // больше ничего не делаем:} wattson.begin (); // Передаем соответствующий адрес. По умолчанию 0x74 // создаем новый файл для (uint8_t i =0; i <100; i ++) {filename [4] =i / 10 + '0'; имя файла [5] =i% 10 + '0'; if (! SD.exists (имя файла)) {Serial.print (F ("Файл данных есть")); Serial.println (имя файла); // открывать новый файл только в том случае, если он не существует break; // выход из цикла! имя файла теперь будет желаемым}} Serial.println (F ("** инициализация завершена. **"));} void loop () {myBtn.read (); // Считываем кнопку if (myBtn.wasReleased ()) {// Если кнопка была отпущена, измените состояние светодиода readData =! ReadData; digitalWrite (светодиод, readData); } if (readData) {UpbeatLabs_MCP39F521_Data data; UpbeatLabs_MCP39F521_FormattedData fData; int readMCPretval =wattson.read (&данные, NULL); беззнаковый длинный currentMillis =millis (); if (readMCPretval ==UpbeatLabs_MCP39F521 ::SUCCESS) {// Распечатать данные Serial.write ("\ x1B" "c"); // Очистить экран на обычном терминале wattson.convertRawData (&data, &fData); printMCP39F521Data (&fData); // если файл доступен, записываем в него:File dataFile =SD.open (filename, FILE_WRITE); если (файл данных) {файл данных.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); // печать также на последовательный порт:dataFile.close (); } // если файл не открыт, выдается сообщение об ошибке:else {Serial.print (F ("ошибка открытия")); Serial.println (имя файла); }} else {Serial.print (F ("Ошибка!")); Serial.println (readMCPretval); }}} void printMCP39F521Data (UpbeatLabs_MCP39F521_FormattedData * data) {Serial.print (F ("Voltage =")); Serial.println (данные-> VoltageRMS, 4); Serial.print (F ("Текущий =")); Serial.println (данные-> currentRMS, 4); Serial.print (F ("Частота линии =")); Serial.println (данные-> lineFrequency, 4); Serial.print («Аналоговое входное напряжение =»); Serial.println (данные-> analogInputVoltage, 4); Serial.print (F ("Коэффициент мощности =")); Serial.println (данные-> powerFactor, 4); Serial.print (F ("Активная мощность =")); Serial.println (данные-> activePower, 4); Serial.print (F ("Реактивная мощность =")); Serial.println (данные-> реактивная мощность, 4); Serial.print (F ("Кажущаяся мощность =")); Serial.println (данные-> кажущаяся мощность, 4);}  

Код

  • Фрагмент кода №1
  • Фрагмент кода №3
  • Фрагмент кода 4
  • Фрагмент кода 5
  • Фрагмент кода № 7
  • Фрагмент кода №11
Фрагмент кода №1 Обычный текст
 // смотрим, присутствует ли карта и может ли быть инициализирована:if (! SD.begin (CHIP_SELECT)) {Serial.println (F («Карта вышла из строя или отсутствует»)); // больше ничего не делаем:} wattson.begin (); // Передаем соответствующий адрес. По умолчанию 0x74 
Фрагмент кода № 3 Обычный текст
 #define BUTTON_PIN 4 // Подключите тактильный кнопочный переключатель (или что-то подобное) // от контакта 4 Arduino к земле. #define PULLUP true // Для простоты мы используем внутренний подтягивающий резистор Arduino. #define INVERT true // Поскольку подтягивающий резистор будет поддерживать высокий уровень на выводе, если // переключатель не замкнут, это отрицательная логика, т. е. высокий state // означает, что кнопка НЕ ​​нажата. (Предполагается, что переключатель нормально разомкнут.) #Define DEBOUNCE_MS 20 // Время устранения дребезга в 20 миллисекунд обычно хорошо работает для тактильных кнопочных переключателей. Кнопка myBtn (BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); // Объявить кнопку 
Фрагмент кода №4 Обычный текст
 char filename [] ="DATA00.CSV"; setup () {... // создаем новый файл для (uint8_t i =0; i <100; i ++) {filename [4] =i / 10 + '0'; имя файла [5] =i% 10 + '0'; if (! SD.exists (имя файла)) {Serial.print (F ("Файл данных есть")); Serial.println (имя файла); // открывать новый файл только в том случае, если он не существует break; // выход из цикла! имя_файла теперь будет тем, которое мы хотим}} ...} 
Фрагмент кода № 5 Обычный текст
 myBtn.read (); // Считываем кнопку if (myBtn.wasReleased ()) {// Если кнопка была отпущена, измените состояние светодиода readData =! ReadData; digitalWrite (светодиод, readData); } if (readData) {... // считываем данные и сохраняем на SD-карту и т. д .... 
Фрагмент кода № 7 Обычный текст
 // если файл доступен, записываем в него:File dataFile =SD.open (filename, FILE_WRITE); если (файл данных) {файл данных.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); // печать также на последовательный порт:dataFile.close (); } // если файл не открыт, выдается сообщение об ошибке:else {Serial.print (F ("ошибка открытия")); Serial.println (имя файла); } 
Фрагмент кода № 11 Обычный текст
 / ********************************************* ***** Это пример скетча для Upbeat Labs Dr. Wattson Energy Monitoring Breakout. Связь происходит по I2C. Для подключения требуются 2 контакта. На плате имеется 4 выбираемых адреса I2C (выбираемых с помощью двух паяных перемычек (которые выбирают каждый вывод как высокий или низкий). Исходя из этого, есть 4 возможных адреса:I2C-адрес SJ1 SJ2 0x74 LOW LOW 0x75 LOW HIGH 0x76 HIGH LOW 0x77 HIGH HIGHD д-р Уотсон имеет два выхода, ZCD или Event, которые используются для уведомлений и, следовательно, обычно подключаются к внешнему прерываемому выводу (например, pin2 или pin3 на Arduino Uno). В этом примере ZCD и Event не используются .Кнопка подключена к контакту 4. * SD-карта подключена к шине SPI следующим образом:** MOSI - контакт 11 ** MISO - контакт 12 ** CLK - контакт 13 ** CS - контакт 10 Светодиод подключен к контакту 9 Написано пользователем Шридхар Раджагопал из Upbeat Labs LLC. Лицензия BSD. Весь текст выше должен быть включен в любое повторное распространение * / #include  #include "MCP39F521.h" #include  #include  / /https://github.com/JChristensen/Button#define BUTTON_PIN 4 // Подключите тактильный кнопочный переключатель (или что-то подобное) // от контакта 4 Arduino к земле . #define PULLUP true // Для простоты мы используем внутренний подтягивающий резистор Arduino. #define INVERT true // Поскольку подтягивающий резистор будет поддерживать высокий уровень на выводе, если // переключатель не замкнут, это отрицательная логика, т. е. высокий state // означает, что кнопка НЕ ​​нажата. (Предполагается, что переключатель нормально разомкнут.) #Define DEBOUNCE_MS 20 // Время устранения дребезга в 20 миллисекунд обычно хорошо работает для тактильных кнопочных переключателей. Кнопка myBtn (BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); // Объявление кнопки # define LED 9 // Подключите светодиод (через резистор 220 Ом) от контакта 9 (анод) к GND (катоду). #Define CHIP_SELECT 10MCP39F521 wattson =MCP39F521 (); bool readData =false; char filename [ ] ="DATA00.CSV"; void setup () {Serial.begin (9600); // включаем последовательную связь Serial.println (F ("** Upbeat Labs Dr. Wattson Example Sketch **")); // инициализируем цифровой вывод как выход. pinMode (светодиод, ВЫХОД); pinMode (10, ВЫХОД); // посмотрим, присутствует ли карта и может ли она быть инициализирована:if (! SD.begin (CHIP_SELECT)) {Serial.println (F («Карта вышла из строя или отсутствует»)); // больше ничего не делаем:} wattson.begin (); // Передаем соответствующий адрес. По умолчанию 0x74 // создаем новый файл для (uint8_t i =0; i <100; i ++) {filename [4] =i / 10 + '0'; имя файла [5] =i% 10 + '0'; if (! SD.exists (имя файла)) {Serial.print (F ("Файл данных есть")); Serial.println (имя файла); // открывать новый файл только в том случае, если он не существует break; // выход из цикла! имя файла теперь будет желаемым}} Serial.println (F ("** инициализация завершена. **")); } // Вот так выглядит MCP39F521Data, для справки! // typedef struct MCP39F521Data {// uint16_t systemStatus; // uint16_t systemVersion; // uint16_t VoltageRMS; // uint16_t lineFrequency; // uint16_t analogInputVoltage; // int16 /t powerFoltage; // / uint32_t currentRMS; // uint32_t activePower; // uint32_t reactivePower; // uint32_t visiblePower; //} MCP39F521Data; недействительный цикл () {myBtn.read (); // Считываем кнопку if (myBtn.wasReleased ()) {// Если кнопка была отпущена, измените состояние светодиода readData =! ReadData; digitalWrite (светодиод, readData); } if (readData) {MCP39F521Data data; int readMCPretval =wattson.readMCP39F521 (&данные, NULL); беззнаковый длинный currentMillis =millis (); if (readMCPretval) {// Распечатать данные Serial.write ("\ x1B" "c"); // Очистить экран на обычном терминале wattson.printMCP39F521Data (&data); // если файл доступен, напишите в него: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); // печать также на последовательный порт:dataFile.close (); } // если файл не открыт, выдается сообщение об ошибке:else {Serial.print (F ("ошибка открытия")); Serial.println (имя файла); }} else {Serial.println (F ("Ошибка!")); }}} 
Github
https://github.com/JChristensen/Buttonhttps://github.com/JChristensen/Button
Библиотека совета по мониторингу энергии доктора Ваттсона Upbeat Labs
Библиотеки для использования с Советом по мониторингу энергии доктора Ваттсона Wattson - это коммутационная плата для мониторинга энергии для Arduino, Raspberry Pi и других микроконтроллеров, удобных для производителей. С легкостью интегрируйте качественные измерения энергии переменного тока в свой следующий проект! Плата, основанная на MCP39F521, однофазной микросхеме контроля мощности от Microchip, спроектирована так, чтобы выдерживать широкий диапазон напряжений, что означает, что ее также можно использовать с Raspberry Pi или любые другие микроконтроллеры на 3,3 В. Устройство поставляется предварительно откалиброванным (с возможностью измерения от 1 мА до 4 А), чтобы вы могли начать измерения качества с самого начала с помощью пары простых команд. Вам не нужны никакие дополнительные CT или другие компоненты. Если вы более опытный пользователь, у вас есть широкий спектр функций, доступных из богатой библиотеки, а также возможность настраивать оборудование в соответствии с вашими потребностями и откалибровать с помощью библиотека. https://github.com/upbeatlabs/drwattson

Схема


Производственный процесс

  1. Облако и как оно меняет мир ИТ
  2. Как построить и оптимизировать график профилактического обслуживания
  3. Как создать вариационный автоэнкодер с TensorFlow
  4. Регистратор данных температуры и влажности
  5. Arduino Temp. Монитор и часы реального времени с дисплеем 3.2
  6. Как читать температуру и влажность на Blynk с DHT11
  7. Домашний монитор
  8. Smart Energy Monitor на основе Arduino
  9. Регистратор данных GPS, кривая в реальном времени, максимальная высота и максимальная скорость
  10. Как сделать компас с помощью Arduino и Processing IDE