Как известно из популярной песенки Вячеслава Невинного губит людей не пиво — губит людей вода. Особенно когда вода заканчивается в самый неподходящий момент. С этим что-то надо делать, тем более, что в столе валяется не используемый контроллер esp8266 и зеленый светодиод


Вода, вода


Думаю, многие из читателей Хабра по традиции пьют бутылированную воду, которую мы потребляем в офисе и дома. Не то, чтобы меня как-то напрягает сам процесс заказа воды, но известным образом это как то не по айтишному, звонить куда-то, вечно занято, то просят номер договора, а куда вести, а во сколько? Решил я все это прекратить и сделать этот процесс интереснее.


Пишем письмо


Фирма, которая доставляет мне воду не очень дружит с высокими технологиями, нет ни приложений, ни заказа с сайта, но вода очень хорошая. Чтобы заказать доставку надо звонить каждый раз оператору. Пишу в службу поддержки (все-же нашелся на сайте контактный e-mail).


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

Кнопка, esp8266 и зеленый светодиод


Ну, идея, как уже многие догадались до ужаса простая. Имея контроллер esp8266, программируем его на отправку электронного письма на адрес фирмы доставки воды, нажимая и удерживая кнопку до момента, когда загорится зеленый светодиод, сигнализирующий о успешном отправлении сообщения. Удержание кнопки длится 3-5 секунд. За это время устройство коннектится с домашним WI- FI и выполняет этот простейший код.

#include <ESP8266WiFi.h>
#include "Gsender.h"

#pragma region Globals
const char* ssid = "HomeWIFI";                           // имя вашейсети
const char* password = "";                       // пароль сети 
const char* letter_message = "Здравствуйте!  Пожалуйста, примите заказ на" 
"2 бытылки воды и доставьте воду завтра по адресу Смоленский "
"переулок ==== в 19 часов. Спасибо. Номер договора ====== Телефон +7909====="; 
uint8_t connection_state = 0;                    
uint16_t reconnect_interval = 10000;             // если не удалось связаться - повторим через 10 секунд
#pragma endregion Globals

uint8_t WiFiConnect(const char* nSSID = nullptr, const char* nPassword = nullptr)
{
    static uint16_t attempt = 0;
    Serial.print("Connecting to ");
    if(nSSID) {
        WiFi.begin(nSSID, nPassword);  
        Serial.println(nSSID);
    } else {
        WiFi.begin(ssid, password);
        Serial.println(ssid);
    }

    uint8_t i = 0;
    while(WiFi.status()!= WL_CONNECTED && i++ < 50)
    {
        delay(200);
        Serial.print(".");
    }
    ++attempt;
    Serial.println("");
    if(i == 51) {
        Serial.print("Connection: TIMEOUT on attempt: ");
        Serial.println(attempt);
        if(attempt % 2 == 0)
            Serial.println("Check if access point available or SSID and Password\r\n");
        return false;
    }
    Serial.println("Connection: ESTABLISHED");
    Serial.print("Got IP address: ");
    Serial.println(WiFi.localIP());
    return true;
}

void Awaits()
{
    uint32_t ts = millis();
    while(!connection_state)
    {
        delay(50);
        if(millis() > (ts + reconnect_interval) && !connection_state){
            connection_state = WiFiConnect();
            ts = millis();
        }
    }
}

void setup()
{
pinMode(5, OUTPUT);
    Serial.begin(115200);
    connection_state = WiFiConnect();
    if(!connection_state)  // if not connected to WIFI
        Awaits();          // constantly trying to connect

    Gsender *gsender = Gsender::Instance();    // Getting pointer to class instance
    String subject = "Заказ на воду";
    if(gsender->Subject(subject)->Send("water*****@mail.ru", letter_message)) {
        Serial.println("Message send.");
digitalWrite(5, HIGH);  // включаем зеленый светодиод - все ОК
    } else {
        Serial.print("Error sending message: ");
        Serial.println(gsender->getError());

    }

}

void loop(){}

Всё необходимое умещается на ладони. Программирование микроконтроллера хорошо описано к примеру, в этой статье.


Код использует библиотеку Gsender.h, скачать которую можно здесь. Особенностью библиотеки является то, что она отправляет сообщения с gmail, поэтому нужно открыть для проекта гугловский адрес электронной почты. В самом тексте библиотеки необходимо указать логин и пароль от вновь открытой почты, но в виде base64 зашифрованных фраз. Используем для этого, к примеру, этот сервис. Должно быть что-то подобное.

const char* EMAILBASE64_LOGIN = "Y29zbWkxMTExMUBnbWFpbC5jb20=";<br>const char* EMAILBASE64_PASSWORD = "TGFzZGFzZDEyMzI="; 

Возможно, системы безопасности GMAIL запросят разрешения использовать подобное подключение. Разрешите.

Кнопка лишь подает питание на контроллер на время отработки кода. На любой из портов подвесим светодиод для сигнализирования успешной передачи сообщения.

Устройство коннектится и питается от двух батареек и ресурса хватит на 1000 заказов, т.е. лет на 10. Устройство можно сконфигурировать при желании из сети и навесить на него кучу всякий дополнительных примочек, что, в принципе, особо то и не нужно.

Не смотря на простоту, сама идея мне показалась симпатичной и в духе действительно реальной интернет-вещи. Используя этот принцип можно реализовать простейшие функции, к примеру, вызов такси, любимой пиццы или положить такую «умную» кнопку рядом с хворающим родственником. Нажал — смс-ка прилетела. Удобно и можно в нужный момент помочь больному. Для отправки смс можно, к примеру, использовать сервис IFTTT.

Всем хорошего дня!
Поделиться с друзьями
-->

Комментарии (34)


  1. roboter
    30.06.2017 10:15
    +3

    Вы только что изобрели «Amazon Dash Button»
    осталось только оформить в красивый корпус и предложить той-же самой компании по доставки воды.


    1. Uris
      30.06.2017 12:15

      Вы только что изобрели «Amazon Dash Button»
      осталось только оформить в красивый корпус и предложить той-же самой компании по доставки воды.!

      Какая досада...)))


    1. Dmitry_4
      30.06.2017 12:47

      За 4 доллара


      1. roboter
        30.06.2017 12:50

        4.99


        1. MaxLevs
          30.06.2017 13:52
          +1

          И добавить, что это со скидкой в 30% и предложение ограничено.


    1. Acuna
      01.07.2017 06:14
      +1

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


  1. vconst
    30.06.2017 12:06
    +1

    //оффтоп
    Лучше поставьте себе мембранный фильтр обратного осмоса, вода будет чище и картриджи раз в год стоят дешевле, чем покупка воды.


    1. Evgeny42
      30.06.2017 12:15
      +1

      Минерализатор только не забыть


      1. vconst
        30.06.2017 12:22
        +1

        Зачем он нужен? Только воду портить.


        1. Evgeny42
          30.06.2017 12:54
          -1

          Потому что без него долго не протяните :)


          1. vconst
            30.06.2017 13:00
            +2

            С чего бы вдруг?

            Предваряя ссылки на всякие страшилки про дистиллированную воду: человек из воды получает настолько ничтожное количество минералов и микроэлементов, что их полное отсутствие в воде — вообще не окажет никакого влияния. Зато фильтр гарантированно избавит от того, что пить не хотелось бы.

            Лучше гарантированно избавиться от хороших и плохих примесей вместе, чем ради неразличимого количества полезных — пить еще и некоторое количество плохих.


            1. Evgeny42
              30.06.2017 13:19

              Как же мне тогда что-то вам доказать, если ссылки кидать вы мне запретили? В прочем могу и вашим уровнем аргументации — минералы нужны, и лучше с ними чем без них. А вообще, пейте дистиллят, лично вам я не запрещаю.

              А другие могут ознакомиться с исследованием ВОЗ http://www.who.int/water_sanitation_health/dwq/nutrientsindw.pdf 12-я глава.


              1. vconst
                30.06.2017 13:48
                +3

                И где там «долго не протянете»? Увы — нигде.
                Проскроллил по диагонали — в основном все о кальции и магнии, про реальную опасность — регион с пониженным содержанием фтора и отсутствие его в воде, что вредно для развития зубов у детей — не нашел. Но может плохо искал.
                Более того, там честно сказано в выводах, что исследования по употреблению полностью деминерализованной воды сильно устарели и результаты могут быть не достоверные, а новых не проводилось.

                А теперь немного посчитаем.
                По нормам того же ВОЗ — максимум кальция в воде для питья — примерно 0,1 г на литр. Это очень много, такая вода неприятна на вкус и большее содержание выводит ее из питьевой категории, в ней почти не пенится мыло, очень плохо стирается белье и образуется огромное количество накипи при кипячении. Суточная норма потребления кальция — 1 г. То есть надо выпивать в сутки 10 литров жесткой воды или 20+ литров хорошей, не жесткой. Такое количество воды — может быть смертельно.

                С остальными минералами из вода — примерно так же картина.


              1. saege5b
                30.06.2017 22:44
                +1

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

                С обычной водой прилетает максимум 200-300 мг. Кальция, это не то количество о котором стоит беспокоиться. Но вот о чём стоит беспокоиться, это о камнях в почках.


                1. sav1812
                  01.07.2017 10:45
                  -1

                  А Вы предложите им пить не чай, в котором содержится довольно много чего, а тот самый бидистиллят. Будет очень интересно узнать их реакцию… :))

                  P.S. Камни в почках тут ни при чём: это, в первую очередь, наследственность.


                  1. saege5b
                    01.07.2017 11:09
                    +1


                    — А! Понял!
                    По, Вашему, мнению, люди употребляют (питаются) исключительно водой.
                    — Вопросов, комментариев больше не имею.


                    1. sav1812
                      01.07.2017 11:27
                      -1

                      Благодарю Вас за рассказ о моём мнении. :)


  1. YuryZakharov
    30.06.2017 12:13

    А кто отслеживает остатки воды?


  1. d00m178
    30.06.2017 12:13

    еще можно к мк прикрутить датчик наличия воды (есть разные варианты) и полностью автоматизировать заказ воды — умный дом должен сам определять когда нужно купить воду)


    1. Ilgrim
      30.06.2017 13:34

      А что если у вас закончилась первый бутыль, но рядом стоит еще одна?
      Тогда система подумает, что вода закончилась и закажет еще? -На этот случай можно поставить таймаут на то, чтобы успеть заменить бутыль. Но что если к вам пришли гости и выпили всю воду, и собрались уходить, а вы пошли их провожать? Тогда истечет время таймаута и система опять закажет воды.

      Я к тому, что в данном случае полная автоматизация будет излишней.

      Если конечно, еще и не автоматизировать замену бутылей, тогда имеет смысл делать полную автоматизацию :)


      1. Krypt
        30.06.2017 21:55

        Бутыли в шкаф. Под шкаф (или под полку с водой) весы. Когда шкаф становится слишком лёгким на продолжительное время и вода в куллере кончается — заказывать воду.


    1. Gryphon88
      30.06.2017 14:47

      Можно и так. Принимаем, что заказываем всегда по 4 бутыли, бутыль выпивается за 2 дня, доставка за 2-4 дня. Тогда установка бутыли декрементирует счётчик "бутылок в наличии", а когда бутылок остаётся 2, считаем прогноз и по таймеру заказываем воду. Тут только надо будет статистику где-то вести, чтоб расход предсказывать, на сервере или на карточке.


      1. suntori
        30.06.2017 17:27

        Можно немного иначе, но через небольшое усложнение системы и самодисциплину :). Решение вижу таким: устанавливается датчик давления, и на него помещается бутыль с водой. Далее вступает в работу простейшая логика: сравнивается наличие воды в установленной в кулер бутыли и наличие полной бутыли в месте установки датчика давления. Если в кулере вода заканчивается (0), а рядом стоит полная бутыль (1), то ничего не происходит (0). Ну или какое-либо напоминание владельцу о том, что вода на исходе. Если же воды в кулере нет (0), как и нет полной бутыли рядом (либо пустая) (0), происходит автоматический заказ новой поставки (1). Но это порождает необходимость постоянно хранить полные бутыли в месте установки датчика давления. Как-то так :)


        1. Gryphon88
          30.06.2017 18:10

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


          1. vadimr
            30.06.2017 21:38

            Ещё немного, и в этом обсуждении будет изобретён водопровод.


  1. Markscheider
    30.06.2017 14:03

    По коду вопрос (с листа читаю не очень уверенно, простите)
    Как я понял, кнопка просто включает питание. А за сколько секунд происходит полный цикл (включение, инициализация ESP, подключение к вайваю и отправка)?
    И светодиод у вас просто включается, когда до него в коде очередь доходит или по какому-то событию?


    1. Uris
      30.06.2017 17:23

      5 секунд


  1. giner
    30.06.2017 14:35
    -7

    А что на вводной картинке делает оппонент Навального?


    1. Barafu
      30.06.2017 16:19
      +3

      Пиво пьёт.


  1. MisterParser
    30.06.2017 15:28
    +1

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


  1. megacoder
    30.06.2017 17:22

    А если забыл, что уже нажимал и нажал повторно, два заказа пришлют?


    1. Uris
      10.07.2017 12:20

      Повторно нажали и удерживаете несколько секунд — то да.


  1. VladimirKokarev
    02.07.2017 10:41

    Не хватает эл.магнитного реле, чтобы долго не держать кнопку. По завершению МК сам себя обесточит.


  1. Frolls
    02.07.2017 10:41

    Зачем, если с телефона можно письмо спокойно из любого места отправить? Да и редактировать его явно проще при необходимости.