Цитата
Никак не могу придумать алгоритм...
Это типовая задачка из области распределения и управления ресурсами. Решается, в общем виде, примерно так:
1) Устройства (потребители энергии) могут получать доступ к ресурсу (в данном случае питание от сети) только после запроса к некоему к супервизору (ваша программа на МК). Устройствам достаточно использовать два вида запросов - выделить ресурс (включить питание) и освободить ресурс (выключить питание). Супервизор, после запроса устройства, может выделить ресурс или отказать в выделении. В процессе работы, он также может самостоятельно отобрать ресурс (выключить питание) или предоставить ресурс ожидающим устройствам (включить питание).
2) Устройства, в процессе работы, имеют три состояния:
- ожидание (отправлен запрос к супервизору на получение ресурса, но питание еще не подано)
- активно (ресурс предоставлен и используется, питание устройства включено)
- выключено (ресурс освобожден, питание не требуется, отправлено уведомление супервизору об освобождении ресурса)
3) Всем устройствам нужно присвоить приоритеты для получения доступа к ресурсу. Желательно, для упрощения, не иметь устройств с одинаковым приоритетом. В простейшем случае - это список в каком порядке устройства нужно включать. Номер в списке и будет приоритетом.
Теперь собственно сам алгоритм:
1) Определяете имеющийся в вашем распоряжении текущий лимит ресурса - мощности (в данном случае - постоянно 5кВт).
2) Определяете текущее состояние каждого устройства. Составляете список активных устройств - те, что уже подключены или требуют подключения (отправили запрос и ожидают).
3) Выстраиваете активные устройства согласно их приоритетам. Распределяете (пока виртуально) имеющийся в данный момент лимит полной мощности, последовательно выделяя ресурс до исчерпания согласно списку активных устройств по приоритету.
4) Проверяете для каждого устройства его текущее состояние и полученное вами в пункте 3. В процессе проверки, устраняете несоответствия - какие-то устройства подключаете, какие-то отключаете (переводите в режим ожидания).
5) Повторяете пункты 1 -4 с заданной периодичностью, или работаете по событиям - изменению состояния устройств.
6) В более сложном случае, можно ввести в алгоритм дополнительные события - изменение текущих приоритетов, изменение текущего лимита ресурса (имеющейся в данный момент мощности) и другие.
P.S. Примерно так, в первом приближении...
Забыл еще указать, что запросы должны содержать требуемую величину ресурса - подключаемую/отключаемую мощность. Текущие приоритеты устройствам устанавливаете исходя из своих задач - что, собственно, хотите в первую очередь - обед приготовить или помещение нагреть. Это и будет управлением ресурсами электропитания, остальное - автоматика.