На каком уровне. Что если реле "залипло" ? Или что если ошибка в ПО
включает все три? Или что если пробой транзистора включающего реле?
И наконец, если "защита" сработало, то что должна делать программа
-- делать вид, что всё нормально что ли? Это IMHO точно не
нормально. Я бы случай сбоя в ПО исключил совсем. Если программист-идиот, то ничего не поможет. Он может начать дрочить реле с частотой 10Гц и оно сгорит вместе с управляемым прибором.
Разумно какой-то вывод статуса с контактов самого реле ввести в компьютер/контроллер. Чтоб он принимал решение, какие реле можно включить и мог сигнализировать об ошибке.
Чтоб исключить случай пробоя транзистора (а он может произойти независимо от контроллера), то городить не схему препятствующую двойному-тройному включению реле (она в любом случае срабатывает с заметной задержкой -- так и контроллер может заметить сбой и отключить всё что нужно), а делать решения, в которых реле включаются не уровнем, а исключительно частотой. Тогда сбои в контроллере (какие попало напряжения на выводах) и сгоревшие транзисторы ничего не включат.
В базе идея в том, что есть схема наподобии boost-converter'а, от которой питается реле. И которая сама питается низким напряжением, недостаточным для включения реле. Тогда при пробое транзистора реле точно не включается (и реле не удерживается если ранее было включено, кстати -- из-за КЗ по питанию). Транзистор управляется частотой с ноги МК: для выключения нужно подать ноль, для включения частоту с заданным коэффициентом заполнения.
PS: нормальной картинки не найти, рисовать лень. Нужно "минус" нагрузки (реле) подключить к "плюсу" источника питания (и конденсатор тоже). Тогда работает. Как нарисовано -- нет.