У многих на кухне, над плитой, НЕ работает вытяжка. И только потому, что ее постоянно забывают включать при готовке. Моя вытяжка не исключение. Решил это дело поправить.
Для решения задачи решил использовать Arduino Pro Mini и потратить минимум времени.
Что понадобилось:
- Arduino Pro Mini (в принципе любую плату можно, просто Mini самая дешевая);
- 1 канальное реле, 5В;
- Датчик температуры, аля DS18B20 и резистор к нему 4.7КОм;
- Блок питания, 5В. Я использовал компактный зарядник от телефона с USB.
- Провода
Вешаем датчик температуры на 2 цифровой порт, реле на 3ий. Схем подключения датчика температуры в интернете тьма тьмущая.
Скетч:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
#include "OneWire\OneWire.h" #include "DallasTemperature\DallasTemperature.h" #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress tempAddress; void setup() { Serial.begin(9600); Serial.println("Device is run"); Serial.print("Locating devices..."); sensors.begin(); Serial.print("Found "); Serial.print(sensors.getDeviceCount(), DEC); Serial.println(" devices."); if (!sensors.getAddress(tempAddress, 0)) Serial.println("Not found any temp sensor"); Serial.print("Device 0 Resolution: "); Serial.print(sensors.getResolution(tempAddress), DEC); Serial.println(); pinMode(3, OUTPUT); pinMode(13, OUTPUT); flash(5); } int temp_ups = 0; int temp_downs = 0; float last_temp = 0; float step_up = 1; float step_down = 0.7; void flash(int cnt){ for (int x = 1; x <= cnt; x++){ digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); delay(100); } } long lastup = 0; long lastdown = 0; void loop() { sensors.requestTemperatures(); // get temperatures float tempC = sensors.getTempC(tempAddress); Serial.println(tempC); if (last_temp > 0){ if (tempC > last_temp){ if (tempC - last_temp >= step_up){ if (lastup == 0) { lastup = millis(); } if (millis() - lastup <= 60 * 1000) { temp_ups += 1; Serial.print("UP:"); Serial.println(temp_ups); flash(1); } else { temp_ups = 1; flash(3); } last_temp = tempC; lastup = millis(); temp_downs = 0; } } if (tempC < last_temp){ if (last_temp - tempC >= step_down){ temp_downs += 1; Serial.print("DOWN:"); Serial.println(temp_downs); last_temp = tempC; temp_ups = 0; flash(2); } } } else { last_temp = tempC; } if (temp_ups >= 5 || tempC >= 50){ digitalWrite(3, HIGH); } if (temp_downs >= 3 || tempC <= 40){ digitalWrite(3, LOW); } delay(1000); } |
Логика такая:
- При запуске определяется адрес датчика температуры, после чего переходим в рабочий режим (5 вспышек индикатора);
- Считаем сколько раз подряд поднялась температура, с шагом 1*С;
- Если с момента предыдущего повышения прошло более 60 секунд, то начинаем считать повышения сначала. Это необходимо для того чтобы отсечь простое потепление в квартире;
- Если насчитали 5 повышений подряд (или температура выше +50*С) – включаем реле (digitalWrite(3, HIGH));
- Ждем аналогично понижения (3х кратного температуры). Пока не стал делать отсечку предыдущих показаний, т.к. все работает как надо.
- Если насчитали 3 и более понижений (или температура ниже +40*С), то выключаем вытяжку.
Не забудьте вывести резервную кнопку отключения, мало ли. Я использовал кнопку подсветки для отключения моей платы.
PS. Для вытяжки под потолком разумнее использовать датчик влажности + датчик температуры. Т.к. если что-то долго варится и выпаривается то поднимается не столько температура, сколько влажность и на окнах, особенно зимой, конденсата много.
PS 2: Чтобы более полно использовать плату можно повесить датчик CO/CH.
UPD: Тестирование в реальной жизни выявило 2 слабых места в алгоритме:
- Если включить комфорку и пойти мыть кастрюлю, то датчик сработает, а когда поставить кастрюлю с водой на огонь, то температура падает и вытяжка выключается.
- Если запущены 2 конфорки, датчик срабатывает, но при выключении одной выключается вытяжка.
Судя по всему, придется усложнить схему для сохранения простоты алгоритма: добавить еще один датчик температуры, чтобы мерить температуру “за бортом” и если разрыв больше 10*С, к примеру, то включать вытяжку.