Посыл мысли этой статьи глобальный, он о том, почему до сих пор функция открытия окон летом в жару не стоит на машинах по умолчанию. Речь не идет о том, чтобы открывать стекла нараспашку, и не о том, что машина условно стоит в опасном районе, где процветает вандализм... Однако бывают такие ситуации, когда скажем машину можно оставить во дворе частного дома и открывать окно на 0,5-1 см, для проветривания салона в случае его сильного прогрева солнца. В этом нет ничего такого страшного с любой из возможных альтернатив развития ситуации, все даже с точностью наоборот, все во благо. Салон не перегреется, пластик не потечет, панель машины не будет подпорчена перегревом на солнце. 

Итак, надеюсь вы уловили мою мысль, теперь к реализации проекта на микроконтроллере, который между прочим будет работать в своем самом экономном режиме, используя режимы сна.

Алгоритм работы устройства

Измерение 1: next_signal =1, T >45 → сигнал 1, next_signal=2. (при температуре скажем больше 45 градусов будет отправляться управляющий сигнал на открытие)

Измерение 2: next_signal=2, T >45 → не срабатывает, next_signal остается 2. (при температуре больше 45 градусов сигнал остается с режимом 1, ничего не происходит)

Измерение 3: next_signal=2, T <28 → сигнал 2, next_signal=1. (при температуре меньше 28 градусов сигнал переходит в первоначальный режим)

Таким образом, сигналы чередуются только после срабатывания. Измерение происходит каждые 7 минут:

1. Считать температуру.

2. Проверить, какой сигнал ожидается (next_signal).

3. Если next_signal ==1 и T >45: активировать сигнал 1 на 0.3 сек, next_signal =2.

4. Если next_signal ==2 и T <28: активировать сигнал 2 на 0.3 сек, next_signal =1.

5. Иначе: ничего не делать, next_signal не меняется.

Таким образом, сигналы чередуются только после срабатывания.

Как реализуется режим экономии потребления тока?

Настройка watchdog таймера на 8 секунд, счетчик циклов до 53 (8*53=424 сек ≈7 минут). В прерывании WDT увеличивать счетчик, при достижении 53 — устанавливать флаг измерения. В основном цикле, если флаг установлен:

- Считать температуру.

- Определить, какой сигнал должен сработать.

- Активировать сигнал, если условия выполнены.

- Переключить next_signal при срабатывании.

- Сбросить флаг измерения.

Важно отключать глобальные прерывания при работе с критическими секциями, например, при изменении переменных, используемых в прерываниях. Также функции для работы с DS18B20 должны быть написаны с учетом 1-Wire протокола. Возможно, использовать библиотечные функции, но в данном случае напишу их вручную. Проверка наличия датчика, отправка команд CONVERT_T и READ_SCRATCHPAD. Учтем, что для чтения температуры нужно дождаться завершения преобразования, которое может занимать до 750 мс. Теперь напишем код, следуя этим рассуждениям.

Смотреть код