====== Нагреватель воды ======
===== Описание =====

Не секрет что каждое лето происходит отключение горячего водоснабжения. Каждому приходится что-то придумывать, чтобы помыться. Самый простой способ, вскипятить воду в чайнике или кастрюле, разбавить её в большой ёмкости и помыться. Однако, мы лёгких путей не ищем, и подумали что можно сделать нечто более удобное. Например, купить кипятильник и нагревать воду в большой ёмкости до нужной температуры. Далее можно помыться из ковша или приобрести садовый душ, который будет насосом забирать воду из ёмкости и лейкой мыть своего владельца.

Итак, для этого нам понадобится термометр, а так как мы его будем опускать в воду, нужно чтобы он был герметичным. Далее, хотелось бы вывести температуру на дисплей, чтобы видеть какая текущая температура воды. Скорее всего сразу определить комфортную температуру будет сложно, да и погода разная за окном. В жару хочется воду немного похолоднее, а когда холодно - потеплее. Поэтому регулировать уровень нагрева воды будем с помощью потенциометра. Ну и наконец, добавим зуммер ко всему, он будет в качестве сигнального устройства, показывать что уже пора выключать кипятильник - вода достигла нужной температуры.

===== Шаг 1. Что понадобится =====
^ Что нужно   ^ Количество  ^
| [[https://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер ]] | 1           |
| [[https://smartelements.ru/collection/shildy/product/sensor-shield|Sensor shield]] | 1           |
| [[https://smartelements.ru/collection/datchiki-i-sensory/product/datchik-temperatury-ds18b20-germetichnyy-2-m|Герметичный датчик 2м]] | 1           |
| [[https://smartelements.ru/collection/datchiki-i-sensory/product/modul-dlya-germetichnogo-datchika-temperatury|Модуль для удобного подключения датчика]] | 1           |
| [[https://smartelements.ru/collection/moduli/product/modul-potentsiometra|Модуль потенциометра]] | 1           |
| [[https://smartelements.ru/collection/moduli/product/modul-zummera-2|Модуль зуммера]] | 1           |
| [[https://smartelements.ru/collection/displei-i-indikatory/product/oled-displey-096-i2c|LED-Дисплей]] | 1           |
| [[https://smartelements.ru/collection/provoda-i-kabeli/product/shleyf-mama-mama-h4-20-sm|Шлейф х4]] | 1           |
| [[https://smartelements.ru/collection/provoda-i-kabeli/product/shleyf-mama-mama-h3-20-sm|Шлейф х3]] | 3           |

===== Шаг 2. Схема сборки =====
{{ :main:projects:heater.png?nolink |}}

===== Шаг 3. Скетч =====
Загрузите скетч на контроллер:
<file Arduino>
#include <OLED_I2C.h> //подключение библиотеки для работы с дисплеем

#include <OneWire.h> //подключение библиотеки OneWire
#include <DallasTemperature.h> //подключение библиотеки для работы с датчиком

#define ONE_WIRE_BUS 10 //шина передачи данных

const int PIN_POT = A0; //пин подключения модуля потенциометра
const int PIN_BUZ = 9; //пин подключения зуммера
int temperature = 0; //переменная для хранения требуемой температуры
boolean inverter = false; //переменная для сигнализации о температуре

OneWire oneWire(ONE_WIRE_BUS); //создание объекта oneWire для передачи данных по технологии OneWire
 
DallasTemperature sensors(&oneWire); //создание объектов типа DallasTemperature дял измерения температуры
 
OLED  myOLED(SDA, SCL, 8); //инициализация дисплея
 
extern uint8_t RusFont[]; //русский шрифт
extern uint8_t BigNumbers[]; //средние цифры
 
void setup()
{
  sensors.begin(); //инициализация датчика(ков)
  myOLED.begin(); //запуск дисплея
  pinMode(PIN_BUZ, OUTPUT);     //установка вывода зуммера как выходной
}
 
void loop()
{
  temperature = map(analogRead(PIN_POT), 0, 1024, 15, 50); //определить требуемую температуру
  
  sensors.requestTemperatures(); //запрос температуры устройств
  float currentTemp = sensors.getTempCByIndex(0); //получить температуру с первого датчика

  if (currentTemp > temperature) { //если температура датчика больше ожидаемой
    myOLED.invert(inverter); //поморгать дисплеем
    if (inverter) { //если сейчас нужно посигналить
      tone(PIN_BUZ, 294, 400); //подать сигнал
    }
    inverter = !inverter; //инвертировать переменную
  }
 
  myOLED.clrScr(); //очистка дисплея
 
  myOLED.setFont(RusFont); //установить шрифт
  myOLED.print("NTR NTVGTHFNEHF", CENTER, 0); //вывести надпись "ТЕМПЕРАТУРА"
 
  myOLED.setFont(BigNumbers); //установить шрифт
  myOLED.print(String(currentTemp), CENTER, 9); //вывести текущую температуру
 
  myOLED.setFont(RusFont); //установить шрифт
  myOLED.print("uhflecjd Wtkmcbz", CENTER, 40); //вывести надпись "градусов Цельсия"
 
  myOLED.setFont(RusFont); //установить шрифт
  String waitingTemp = "j;blftv " + String(temperature); //сформировать надпись "ожидаем Х"
  myOLED.print(waitingTemp, CENTER, 55); //вывести надпись
 
  myOLED.update(); //обновить дисплей установленными настройками и надписями 
}
</file>

===== Шаг 4. Готовое устройство =====
После того как скетч загружен, проведите несколько тестов, не погружая датчик в воду, а нагревая его руками. После успешных тестов, устройство можно поместить в корпус. Можно оставить как макет и собирать его только на время отключения воды.
