Luxeon UPS: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
Строка 58: | Строка 58: | ||
В этом примере видно что есть устройства на адресах <code>0x40</code>, <code>0x41</code>, <code>0x44</code>, <code>0x45</code><BR> |
В этом примере видно что есть устройства на адресах <code>0x40</code>, <code>0x41</code>, <code>0x44</code>, <code>0x45</code><BR> |
||
(У меня фактически включены 4 датчика, но 2 не используются) |
(У меня фактически включены 4 датчика, но 2 не используются) |
||
+ | |||
+ | |||
+ | Для снятия данных с датчика использую простой скрипт на <code>Python</code>, </BR> |
||
+ | библиотека для работы с ina-219 может быть установлена командой <code>pip3 install pi-ina219<code> |
||
+ | <PRE> |
||
+ | #!/usr/bin/env python3 |
||
+ | |||
+ | from ina219 import INA219 |
||
+ | from ina219 import DeviceRangeError |
||
+ | |||
+ | import time |
||
+ | |||
+ | SHUNT_OHMS = 0.1 |
||
+ | COUNT = 10 |
||
+ | |||
+ | def read(): |
||
+ | V = ina1.voltage() |
||
+ | return V |
||
+ | |||
+ | ina1 = INA219(SHUNT_OHMS,address=0x40) |
||
+ | ina1.configure() |
||
+ | |||
+ | if __name__ == "__main__": |
||
+ | c = 0 |
||
+ | voltage_summ = 0 |
||
+ | while c < COUNT: |
||
+ | try: |
||
+ | current_voltage = read() |
||
+ | if current_voltage < 18: |
||
+ | raise ValueError("Voltage can't be < 18v"); |
||
+ | voltage_summ = voltage_summ + current_voltage |
||
+ | |||
+ | c = c + 1 |
||
+ | time.sleep(0.01) |
||
+ | except: |
||
+ | time.sleep(0.2) |
||
+ | pass |
||
+ | |||
+ | print("{V1:.3f}".format(V1=voltage_summ/COUNT)) |
||
+ | </PRE> |
||
+ | В этом скрипте |
||
+ | * <code>ina1 = INA219(SHUNT_OHMS,address=0x40)</code> - 0x40 это адрес датчика, для снятия данных с нескольких датчиков его можно вынести в параметры или сделать копию скрипта =) |
||
+ | * <code>if current_voltage < 18: |
||
+ | raise ValueError("Voltage can't be < 18v");</code> |
Версия 09:39, 29 декабря 2022
Мониторинг напряжения на UPS Luxeon
Постановка задачи
Есть UPS/инвертор (24В): Файл:Ep3000-pro (1).pdf
К нему подключены 2 батареи по 100 Ач, 12Вб последовательно. RS232 или не работает или использует протокол с которым я не смог разобраться.
Для прогнозирования времени работы единственный способ получить данные - это мониторинг напряжения на аккумуляторах.
Аппаратная часть
Для мониторинга использую то что есть под рукой а именно
- Raspberry Pi Model 1 (самая старая, какая есть)
- Датчики INA-219 (2шт)
INA-219 подключается по интерфейсу I²C (2 проводной интерфейс), питание на датчик подается с распберри
У распберри
- pin 02 - +5В на Vcc датчиков
- pin 05 - Земля на Gnd датчиков
- pin 03 - I2C SDA (данные) на SDA датчиков
- pin 05 - I2C SCL (синхронизация) на SCL датчиков
Всего на одну шину можно подключить 4 датчика, адрес на шине задается с помошью перемычек (2 перемычки, дают 4 возможных адреса)
Другими словами все датчики подключены к 4 пинам распберри, отдельные пины для каждого датчика не нужны
Программная часть
Требуется включение поддержки I2C со стороны линукса
Самый простой способ - использовать raspi-config
который пропишет все что надо в /etc/modules-load.d/modules.conf
или вручную загрузить нужные модули:
lsmod | grep i2c i2c_bcm2835 16384 0 i2c_dev 20480 0
После загрузки модулей можно просканировать шину на предмет устройств:
i2cdetect 1
Параметр 1
это номер шины I2C ( их может быть более чем одна, но в моем случае - одна, с номером 1, /dev/i2c-1
WARNING! This program can confuse your I2C bus, cause data loss and worse! I will probe file /dev/i2c-1. I will probe address range 0x03-0x77. Continue? [Y/n] y 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: 40 41 -- -- 44 45 -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
В этом примере видно что есть устройства на адресах 0x40
, 0x41
, 0x44
, 0x45
(У меня фактически включены 4 датчика, но 2 не используются)
Для снятия данных с датчика использую простой скрипт на Python
,
библиотека для работы с ina-219 может быть установлена командой pip3 install pi-ina219
#!/usr/bin/env python3
from ina219 import INA219
from ina219 import DeviceRangeError
import time
SHUNT_OHMS = 0.1
COUNT = 10
def read():
V = ina1.voltage()
return V
ina1 = INA219(SHUNT_OHMS,address=0x40)
ina1.configure()
if __name__ == "__main__":
c = 0
voltage_summ = 0
while c < COUNT:
try:
current_voltage = read()
if current_voltage < 18:
raise ValueError("Voltage can't be < 18v");
voltage_summ = voltage_summ + current_voltage
c = c + 1
time.sleep(0.01)
except:
time.sleep(0.2)
pass
print("{V1:.3f}".format(V1=voltage_summ/COUNT))
В этом скрипте
ina1 = INA219(SHUNT_OHMS,address=0x40)
- 0x40 это адрес датчика, для снятия данных с нескольких датчиков его можно вынести в параметры или сделать копию скрипта =)
if current_voltage < 18:
raise ValueError("Voltage can't be < 18v");