Автоматизация смыва унитаза на Arduino + Z-Wave

    Что может быть общего между двумя этими объектами?



    Идея


    Однажды я задумал приучить кота к унитазу, с целью избавиться от неприятного запаха, исходящего от его лотка. Но приучить его ходить — это одно, а вот спускать за собой — задача почти невыполнимая. Поэтому я решил возложить это на электронные плечи, в роли которых выступает Arduino Nano.

    Сценарий задумывался такой:
    Котэ (тот, что на первой картинке) через минидверцу в двери санузла попадает внутрь, заставляя сработать датчик открытия, делает свои дела сколько ему угодно, и выходит. После второго срабатывания датчика включается вытяжка, спускается вода в унитазе и распыляется освежитель.

    Оборудование и тесты


    К плате были подключены сервомашинка Towerpro MG996R, Z-Wave реле Fibaro FGS221 и кнопка со светодиодом. Кнопку добавил в качестве бонуса параллельно реле и вывел ее на стену.



    По факту сервомашинка питается от БП 5V 2A. От него же запитана плата по USB.

    Схема подключения и код:


    Код для Arduino
    #include <Servo.h>            // подключаем библиотеку Servo
    
    Servo flush;                  // создаем объект для управления сервой
    
    const int buttonPin = 2;      // номер пина кнопки
    const int led =  4;          // номер пина светодиода
    
    int buttonState = 0;          // переменная для чтения статуса кнопки
    int flag = 0;                 // флаг по умолчанию сброшен
    unsigned long holdTime = 0;   // время начала события
    unsigned long blinkTime = 0;  // время начала события
    unsigned long loadTime = 0;   // время начала события
    
    void setup() {
      pinMode(led, OUTPUT);       // задаем пин светодиода как выход
      pinMode(buttonPin, INPUT);  // задаем пин кнопки как вход
      flush.attach(3, 8, 140);    // привязываем серву к пину 3 и задаем мин/макс угол
      flush.write(8);             // поворачиваем серву в положение по умолчанию
    }
    
    void loop(){
      buttonState = digitalRead(buttonPin);    // проверяем положение кнопки
    
      if (buttonState == LOW && flag == 0) {   // если кнопка не нажата и флаг не установлен
        flush.write(8);                        // поворачиваем серву в положение по умолчанию
        digitalWrite(led, LOW);                // включаем светодиод
      }
      if (buttonState == HIGH && flag == 0) {  // если кнопка нажата и флаг не установлен
        delay(100);                            // защита от дребезга контактов кнопки
        flush.write(140);                      // поворачиваем серву на заданный угол
        flag = 1;                              // устанавливаем флаг
        holdTime = millis();                   // включаем таймер удержания кнопки
      }
      if (buttonState == HIGH && flag == 1 && millis()-holdTime > 200) {  // если кнопка была нажата более X мс
        flag = 0;                              // сбрасываем флаг
        blinkTime = millis();                  // включаем таймер мигания светодиода
        do {
          digitalWrite(led, LOW);              // выключаем светодиод
          delay(200);
          digitalWrite(led, HIGH);             // включаем светодиод
          delay(200);
        } 
        while (millis()-blinkTime < 5000);     // мигаем светодиодом X мс
        flush.write(8);                        // поворачиваем серву в положение по умолчанию
        loadTime = millis();                   // включаем таймер ожидания наполнения бачка
        do {
          digitalWrite(led, LOW);              // выключаем светодиод
          delay(200);
          digitalWrite(led, HIGH);             // включаем светодиод
          delay(200);
        } 
        while (millis()-loadTime < 54000);     // мигаем светодиодом X мс (время полного наполнения бачка)
      }
      if (buttonState == LOW && flag == 1 && millis()-holdTime <= 200) {  // если кнопка была нажата менее X мс
        flag = 0;                              // сбрасываем флаг
        blinkTime = millis();                  // включаем таймер мигания светодиода
        do {
          digitalWrite(led, LOW);              // выключаем светодиод
          delay(200);
          digitalWrite(led, HIGH);             // включаем светодиод
          delay(200);
        } 
        while (millis()-blinkTime < 2000);     // мигаем светодиодом X мс
        flush.write(8);                        // поворачиваем серву в положение по умолчанию
        loadTime = millis();                   // включаем таймер ожидания наполнения бачка
        do {
          digitalWrite(led, LOW);              // выключаем светодиод
          delay(200);
          digitalWrite(led, HIGH);             // включаем светодиод
          delay(200);
        } 
        while (millis()-loadTime < 30000);      // мигаем светодиодом X мс
      }
    }
    



    Видео первой версии алгоритма с Z-Wave


    Эта версия отличается от финальной только задержкой перед возможностью повторного нажатия кнопки

    Задержка равна периоду полной перезарядки бачка водой.



    Реализация


    Так как во время ремонта была установлена инсталляция от Geberit, то подключение тяги не составило большого труда. Сервомашинка поставлена враспор между бачком и алюминиевым профилем, прикручена и залита термоклеем. В качестве тяги был использован тросик с зажимами, который пропущен через отверстие в бачке. Гибкая тяга нужна была, чтобы не потерять возможность спуска воды кнопкой на бачке.



    Электронная часть размещена в распаячных коробках за инсталляцией.



    Ручное управление может осуществляться как кнопкой, так и через приложение для Fibaro HomeCenter.



    Используется два режима спуска:
    1. При коротком нажатии (<200 мс) спускается половина воды.
    2. При удержании кнопки более 200 мс, бачок опустошается целиком.

    Z-Wave реле настроено на второй режим.

    Демонстрация работы устройства

    Задержка срабатывания вызвана тем, что приложение работало в режиме удаленного доступа через сервера fibaro.



    Заключение


    К сожалению, котэ на видео не будет, так как он съехал, а желание реализовать задуманное у меня осталось.

    Ну и бонусом :)

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 35

      –1
      Когда уже стартап кто-нибудь запустит — кошачий унитаз со смывом?
      +5
      К сожалению, котэ на видео не будет, так как он съехал
      Не захотел переучиваться на унитаз, видимо.
        +1
        Круто! Главное, чтобы кот не решил не вовремя вернуться, а то включится вентилятор, кот испугается и его не на роком смоет в унитаз
          0
          Он всего лишь расстроится из-за пропажи того, что обычно он старательно закапывает.
            +1
            не на роком? WAT???
            0
            Как решается проблема синхронизации фазы котэ и смыва?
              0
              После срабатывания датчика двери и появления движения внутри — никаких действий не будет производиться, пока датчик не сработает второй раз и не исчезнет движение.
                +1
                Всё же есть уязвимость и вероятность устроить инфаркт для котэ — если он наполовину зайдёт в дверцу, потом передумает и не станет заходить. И когда он в следующий раз всё-таки решит зайти — его встретит звук смыва унитаза и прочие прелести.
                Повысить надёжность можно двумя датчиками, чтобы можно было не считать входы/выходы, а определять направление движения — внутрь или наружу.
                  0
                  Можно придумать датчик с разными срабатываниями в зависимости от наклона дверцы.
                  Но вообще у меня есть такие дверцы и коты — вряд ли у кота получится выйти задом. Она ему в спину упираться будет. Если он передумает, ему придётся войти, а потом сразу выйти.
                    +1
                    Поэтому в паре всегда используется датчик движения.
                      +3
                      На котэ надо повесить метку, присутствие которой можно регистрировать, RFID например.
                        0
                        QR-код на спине выбить, а на дверце считыватель.
                        +3
                        Всё таки, основная проблема тут первая, как приучить кота.
                          +2
                          перепрошить
                            0
                            А как же гарантия?
                    0
                    Вам теперь можно самому не изворачиваясь смывать за собой и продолжать процесс. Круто.
                      0
                      Это было одно из условий:)
                        +1
                        Защита от переполнения стека? =)
                      0
                      Ненавижу унитазы с автосмывом. Бывает, сидишь на таком — и самопроизвольно вода спускается. Даже если не сидишь — все равно часто спускается без необходимости. Большой перерасход воды и неудобства. Конечно, все зависит от настроек автоматики, но для себя можно долго настройки вылизывать, а серийный продукт, который обслуживают сантехники, никто не будет точно настраивать на месте установки.
                        0
                        Вот-вот, чертовы люди, придумают нам всяких штуковин, лишь бы с нами не играть! А нам-то копать хочется, кошек во дворе лайкать…
                        +1
                        Изобретение, конечно, полезное!
                        Но что делать, если этот объект рандомно умудряется промахнуться и нагадить ровно рядышком с лоточком! Мимо!
                        Видимо у моего просто глючит система очконаведения на цель, тут ардуино не спасет

                        image
                          +1
                          У моего тоже осечки случались.
                            0
                            Почему же не спасёт? Собираем робота-пылесоса лоток на ардуино, который при явном запахе и звуках, сигнализирующих о скором событии заботливо подъезжает под задницу объекта.
                            0
                            А незакрытая дверь в туалет, когда кот проникает не через свой люк, а like a boss, не ломает последовательность?
                              0
                              Ломает. Тут только привыкать закрывать за собой дверь.
                              –1
                              Использовать Nano — верх расточительности! Достаточно было бы Pro Mini.
                              :D
                                0
                                Немного не в тему, но, как приучить кота ходить в унитаз а не в лоток?
                                Я очень смутно представляю подобную картину.
                                0
                                Что за датчик дверь? Не увидел или не заметил его.
                                А для чего в этой схеме arduino? Все же можно на z-wave сделать. На HC2 написать сценарий работы реле и датчика, таким образом сэкономить на ардуинке.
                                  0
                                  Такой.
                                  А как Z-Wave будет управлять сервой на 5V? Для этого и нужна ардуина.
                                    0
                                    Да, рулить сервой можно только с МК. Думаю с ардуинкой проще всего будет такая реализаци. Можно и 5 вольтовый моторчик включать с реле Fibaro при подключении по схеме с альтернативным питанием, но удерживать тросик в верхнем положении, сервой разумнее всего будет.
                                    +1
                                    Я тоже своего приучил к унитазу и теперь он его копает пока не подойдешь и не смоешь за ним.

                                    Pic

                                    Only users with full accounts can post comments. Log in, please.