Предыдущая статья. Следующая статья

Общая концепция.

Для опроса различных датчиков (тока, напряжения, температуры...) и передачи собранных данных по сети ethrenet, требуется небольшое, автономно работающее и нечувствительное к перезагрузкам устройство, которое может быть запитано от локального низковольтного источника питания. Ардуино с Ethernet Shield, на мой взгляд, прекрасно подходит для этих задач.

Планируется:
- силами контроллера производить циклический сбор и усреднение данных,
- с помощью EthernetShield - выдавать собранные данные по запросу удаленного компьютера в виде:
variable.value 00000
- на удаленном компьютере устанавливается программа типа munin, которая ведет свою rrd базу, и отрисовывает графики изменения параметров во времени. Для проведения численных измерений можно скриптом, на стороне компьютера, вести текстовый лог, в который записываются "сырые" данные, отдаваемые контроллером.


Реализация.

Осталось только подобрать датчики и согласовать параметры.

Модуль для измерения тока (ACS712 Module 20A Range Hall Current Sensor Module) - содержит клеммную колодку для подключения измерительной цепи, сам датчик Холла ACS712, конденсатор, pullup резистор, светодиод для индикации питания и три ножки для подключения "слаботочки".

Питание = 5-8V
Чувствительность = 100mV / A

Выпускается три варианта токового датчика для разных диапазонов измерения:

+-5 А (ACS712-05B),
+-20 А (ACS712-20B),
+-30 А (ACS712-30A)

Соответствующие уровни чувствительности составляют 185 мВ/А, 100 мА/В и 66 мВ/A. 
При нулевом токе, протекающем через датчик, выходное напряжение равно половине напряжения питания (Vcc/2). Необходимо заметить, что 
выходное напряжение при нулевом токе и чувствительность ACS712 пропорциональны напряжению питания. Это особенно полезно при 
использовании датчика совместно с АЦП.

Схема меряет ток по 20A в обе стороны, т.е. "ноль" находится в середине АЦП (512) - 2.5 вольта.отсюда получаем коэффициент пересчета 
показаний АЦП в амперы (kVolt): для АЦП при питании 5 вольт: I = 1/(204*[0.185|0.1|0.066]) * (Count - 512)
Более подробно в статьях на rlocman-е: Использование датчика тока ACS712.

Тестовая программа выдает в сериальную консоль результат в амперах и два знака после запятой, результат слегка гуляет, поэтому надо будет изучить вопрос усреднения, или подавления помехи. При подключении внешнего источника питания 6V ситуация несколько улучшилась: показания прыгают уже в пределах одной-двух единиц АЦП. Внутреннее опорное напряжение по мультиметру 4.8V вместо обещанных пяти.

Перед началом работы надо выставить "ноль" (значение ZeroLevel) - который должен быть где-то в районе значения 1024/2, и по имеющемуся измерительному прибору в планируемом диапазоне работы подобрать коэффициент персчета (kVolt), который зависит от величины опорного напряжения АЦП. При проверке выяснилось, что либо опорное напряжение гуляет, либо у меня мультиметр нелинейно меряет, либо у модуля зависимость в разных диапазонах чуть отличается (пробовал токи 0.5А, 5А, 9А).

Есть подозрение, что для корректной работы параметр ожидания delay(350) надо делить на количество опрашиваемых датчиков (или заменить на millis() ), но это будет реализовано позже.

Различные грабли на пути запуска в эксплуатацию и дальнейшее развитие... (читать на форуме).


Первые результаты работы:
    
Рабочая программа: etherShield_web_temperature.ino текущая версия.
Рабочая программа: etherShield_web_temperature.ino от 20121215

Plugin для munin-monitoring простейший:


Цикл статей про подключение enc28j60 к сети и написании кода для него.

Аналогичные проекты других авторов

Вот, у братьев по разуму что-то похожее уже реализовано:
http://www.instructables.com/id/DIY-Amp-Hour-Meter-Arduino/
http://www.hacktronics.com/Tutorials/arduino-current-sensor.html

Пример рассчета коэффициента для перевода значений АЦП в реальные миллиамперы:

// convert to milli amps
outputValue = (((long)sensorValue * 5000 / 1024) - 500 ) * 1000 / 133;

/* sensor outputs about 100 at rest. Analog read produces a value of 0-1023, equating to 0v to 5v.
"((long)sensorValue * 5000 / 1024)" is the voltage on the sensor's output in millivolts. There's 
a 500mv offset to subtract. The unit produces 133mv per amp of current.*/ 
Весь диапазон 1024 единицы АЦП соотносится с величиной опорного напряжения AREF который дает нам количество милливольт на единицу АЦП. Чувствительность датчика - так же известна - 133 mV/A (это у него, похоже, 15-18 амперный датчик тока)

http://openenergymonitor.org

Вот еще вариант опроса ардуино с инициированием соединения со стороны компьютера и под конкретный EthernetShield. В архиве два скетча: http-сервер и сборщик данных с чипа.
http://clete2.com/2012/01/munin-monitoring-temperature/
If you want to use this plugin but are having issues, leave a comment below.

arduinotemp (Munin code, Perl)
TempServer.zip (Arduino code, you must have the Dallas OneWire library first)

Библиотека etherShield в современных IDE ругается при компиляции на ошибку в prog_char.
Для исправления - надо во всех встречающихся файлах исправить const prog_char *progmem_s на const PROGMEM char *progmem_s
Источник: https://geektimes.ru/post/255430/



PR-CY.ru
Еще статьи.