Задача проверки наличия 220в появилась для диспетчеризации работы теплого пола.
Необходимо определять - подано ли напряжение на сервоприводы клапанов коллектора теплого пола.
Определив моменты открытия/закрытия направлений отопления водяным теплым полом, можно уже вести статистику и передавать значения на сервер.
Выбор платы для контроля 220В.
Существуют в продаже специальные платы.
На вход подается исследуемая на наличие 220В линия, а на выходе будет 0 или +5В.
Выход можно подключить к аналоговым входам платы Arduino и на основе полученных значений уже совершать требуемые действия.
Бывают три вида плат с разным количеством измеряемых каналов: 1, 3, 8 - по цене 120, 320 и 622р соответственно.
Мне нужно контролировать наличие 220В нескольких направлений, поэтому заказал плату на 8 каналов.
Как работают изолированные оптопары.
Для начала необходимо выяснить - как же работает плата AC 220V 8 Channel MCU TTL Level 8 Ch Optocoupler Isolation Test Board Isolated Detection Tester Module PLC Processors.
Подключим ее к контроллеру Arduino Uno WiFi и посмотрим что будет на аналоговом входе при подаче 220В.
Пока на соответствующем контролируемом направлении сетевое питание отсутствует, на аналоговом входе Arduino мы наблюдаем значение 1023:
После подачи напряжения значение на аналоговом входе фиксируется на уровне 17-20:
Конечно имеет место переходный процесс:
Как использовать плату для контроля 220В при помощи Arduino.
Нам не нужно аналоговое значение, а нужно бинарное значение: ВКЛ/ВЫКЛ.
Получить это значение можно при помощи такого кода:
value1 = analogRead(analog1); if(value1 < 500) current1 = HIGH; else current1 = LOW; if(last1 != current1){ outflag = HIGH; out1 = current1; last1 = current1; Serial.println(out1); }
Переходный процесс линейный, поэтому можно ставить простой программный ключ без отсечки дребезга.
Возможно нужно добавить область неопределенности
if(value1 < 200) current1 = HIGH; else if(value1 > 700) current1 = LOW; else // что-то непонятное
Но в моем случае это лишне усложнит код, а работает и так.
Проблемы.
Ну а куда же без них.
Очень долго выявлял проблему, возникшую при практическом решении задачи передачи данных о работе коллектора теплых полов на сервер.
Там я контролировал питание 4-х головок-актуаторов направлений и питание насоса.
В зависимости от ситуации бывали моменты, когда плата зависала.
Исследования показали, что плата не зависала, а прекращался обмен по Serial, если включались направления, висящие на 4 и 5 аналоговых входах Arduino.
Помогла выяснить причину смена полярности подключения VSS,GND платы с оптронами к Arduino UNO.
Раньше подключение было: VSS-5.0V, GND-GND.
Теперь подключил наоборот: GND-VSS, 5.0V-GND.
После этой смены значения аналоговых входов A1-A3 стали таки зависеть от сигнала:
0 - выключен,
55-90 - включен.
Значения же A4,A5 не менялись и не зависели от сигнала.
Вот листинг вывода значений A1-A5, иллюстрирующий ситуацию:
В последних показаниях все направления включены, но выходы A4,A5 показывают иные значения, чем A1-A3.
В первых строчках направления для A4,A5 и направление A1 выключены, но показания A4,A5 постоянны.
Причем причина была не в плате с оптронами, а именно в Arduino - перестановка пина A3 на направления с пинов A4,A5 показывало, что каналы платы с оптронами работают одинаково.
Причем так же вела себя и совсем другая Arduino, что, вероятно, означает что тут я делаю что-то не так, а не Arduino такая.
Решать проблему не стал и обошёлся нормальными входами A0-A3.
В экспериментах я использовал входы A1-A4 для контроля направлений и вход A5 для контроля насоса.
Перенес контроль направлений на входы A0-A3, а от контроля насоса отказался.
Вернул полярность подключения в исходную и при не задействованных A4, A5 все работает нормально.