Вода, вода
Думаю, многие из читателей Хабра по традиции пьют бутылированную воду, которую мы потребляем в офисе и дома. Не то, чтобы меня как-то напрягает сам процесс заказа воды, но известным образом это как то не по айтишному, звонить куда-то, вечно занято, то просят номер договора, а куда вести, а во сколько? Решил я все это прекратить и сделать этот процесс интереснее.
Пишем письмо
Фирма, которая доставляет мне воду не очень дружит с высокими технологиями, нет ни приложений, ни заказа с сайта, но вода очень хорошая. Чтобы заказать доставку надо звонить каждый раз оператору. Пишу в службу поддержки (все-же нашелся на сайте контактный 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)
vconst
30.06.2017 12:06+1//оффтоп
Лучше поставьте себе мембранный фильтр обратного осмоса, вода будет чище и картриджи раз в год стоят дешевле, чем покупка воды.Evgeny42
30.06.2017 12:15+1Минерализатор только не забыть
vconst
30.06.2017 12:22+1Зачем он нужен? Только воду портить.
Evgeny42
30.06.2017 12:54-1Потому что без него долго не протяните :)
vconst
30.06.2017 13:00+2С чего бы вдруг?
Предваряя ссылки на всякие страшилки про дистиллированную воду: человек из воды получает настолько ничтожное количество минералов и микроэлементов, что их полное отсутствие в воде — вообще не окажет никакого влияния. Зато фильтр гарантированно избавит от того, что пить не хотелось бы.
Лучше гарантированно избавиться от хороших и плохих примесей вместе, чем ради неразличимого количества полезных — пить еще и некоторое количество плохих.Evgeny42
30.06.2017 13:19Как же мне тогда что-то вам доказать, если ссылки кидать вы мне запретили? В прочем могу и вашим уровнем аргументации — минералы нужны, и лучше с ними чем без них. А вообще, пейте дистиллят, лично вам я не запрещаю.
А другие могут ознакомиться с исследованием ВОЗ http://www.who.int/water_sanitation_health/dwq/nutrientsindw.pdf 12-я глава.vconst
30.06.2017 13:48+3И где там «долго не протянете»? Увы — нигде.
Проскроллил по диагонали — в основном все о кальции и магнии, про реальную опасность — регион с пониженным содержанием фтора и отсутствие его в воде, что вредно для развития зубов у детей — не нашел. Но может плохо искал.
Более того, там честно сказано в выводах, что исследования по употреблению полностью деминерализованной воды сильно устарели и результаты могут быть не достоверные, а новых не проводилось.
А теперь немного посчитаем.
По нормам того же ВОЗ — максимум кальция в воде для питья — примерно 0,1 г на литр. Это очень много, такая вода неприятна на вкус и большее содержание выводит ее из питьевой категории, в ней почти не пенится мыло, очень плохо стирается белье и образуется огромное количество накипи при кипячении. Суточная норма потребления кальция — 1 г. То есть надо выпивать в сутки 10 литров жесткой воды или 20+ литров хорошей, не жесткой. Такое количество воды — может быть смертельно.
С остальными минералами из вода — примерно так же картина.
saege5b
30.06.2017 22:44+1В хим. Академии множество преподавателей заваривают чай в бидистиляте. И весьма бодро выглядят. И делают это на протяжении большого количества лет, некоторые дольше чем я живу.
С обычной водой прилетает максимум 200-300 мг. Кальция, это не то количество о котором стоит беспокоиться. Но вот о чём стоит беспокоиться, это о камнях в почках.sav1812
01.07.2017 10:45-1А Вы предложите им пить не чай, в котором содержится довольно много чего, а тот самый бидистиллят. Будет очень интересно узнать их реакцию… :))
P.S. Камни в почках тут ни при чём: это, в первую очередь, наследственность.
d00m178
30.06.2017 12:13еще можно к мк прикрутить датчик наличия воды (есть разные варианты) и полностью автоматизировать заказ воды — умный дом должен сам определять когда нужно купить воду)
Ilgrim
30.06.2017 13:34А что если у вас закончилась первый бутыль, но рядом стоит еще одна?
Тогда система подумает, что вода закончилась и закажет еще? -На этот случай можно поставить таймаут на то, чтобы успеть заменить бутыль. Но что если к вам пришли гости и выпили всю воду, и собрались уходить, а вы пошли их провожать? Тогда истечет время таймаута и система опять закажет воды.
Я к тому, что в данном случае полная автоматизация будет излишней.
Если конечно, еще и не автоматизировать замену бутылей, тогда имеет смысл делать полную автоматизацию :)Krypt
30.06.2017 21:55Бутыли в шкаф. Под шкаф (или под полку с водой) весы. Когда шкаф становится слишком лёгким на продолжительное время и вода в куллере кончается — заказывать воду.
Gryphon88
30.06.2017 14:47Можно и так. Принимаем, что заказываем всегда по 4 бутыли, бутыль выпивается за 2 дня, доставка за 2-4 дня. Тогда установка бутыли декрементирует счётчик "бутылок в наличии", а когда бутылок остаётся 2, считаем прогноз и по таймеру заказываем воду. Тут только надо будет статистику где-то вести, чтоб расход предсказывать, на сервере или на карточке.
suntori
30.06.2017 17:27Можно немного иначе, но через небольшое усложнение системы и самодисциплину :). Решение вижу таким: устанавливается датчик давления, и на него помещается бутыль с водой. Далее вступает в работу простейшая логика: сравнивается наличие воды в установленной в кулер бутыли и наличие полной бутыли в месте установки датчика давления. Если в кулере вода заканчивается (0), а рядом стоит полная бутыль (1), то ничего не происходит (0). Ну или какое-либо напоминание владельцу о том, что вода на исходе. Если же воды в кулере нет (0), как и нет полной бутыли рядом (либо пустая) (0), происходит автоматический заказ новой поставки (1). Но это порождает необходимость постоянно хранить полные бутыли в месте установки датчика давления. Как-то так :)
Gryphon88
30.06.2017 18:10Тут можно долго усложнять, как с автоматическим включением света в туалете :) и геркон, и тензодатчик, и оптопару, и подключение к 1С, гуглокалендарю и системе электронного документооборота, чтобы после дней рождений и корпоративов всегда была автоматически оплаченная вода… Тут каждый сам проводит границу здравого смысла.
Markscheider
30.06.2017 14:03По коду вопрос (с листа читаю не очень уверенно, простите)
Как я понял, кнопка просто включает питание. А за сколько секунд происходит полный цикл (включение, инициализация ESP, подключение к вайваю и отправка)?
И светодиод у вас просто включается, когда до него в коде очередь доходит или по какому-то событию?
MisterParser
30.06.2017 15:28+1Я бы добавил сразу событие в гугл-календарь для того, чтобы быть дома к назначенному времени.
VladimirKokarev
02.07.2017 10:41Не хватает эл.магнитного реле, чтобы долго не держать кнопку. По завершению МК сам себя обесточит.
Frolls
02.07.2017 10:41Зачем, если с телефона можно письмо спокойно из любого места отправить? Да и редактировать его явно проще при необходимости.
roboter
Вы только что изобрели «Amazon Dash Button»
осталось только оформить в красивый корпус и предложить той-же самой компании по доставки воды.
Uris
Какая досада...)))
Dmitry_4
За 4 доллара
roboter
4.99
MaxLevs
И добавить, что это со скидкой в 30% и предложение ограничено.
Acuna
А я вот сам лично получаю какое-то просто неописуемое удовольствие от хардварной техники, например. Казалось бы, можно на компе в почтовом клиенте создать действие автоматической отправки почты, но нет, сам бы такую кнопку заимел бы. Слушать музыку и радио на компе — дак нет, до сих пор имею музыкальную стойку, где все разделено — тюнер, сидюк, кассетная дека (последнияя на всякий случай), и мало того, собрал ее полностью всего пару лет назад. Какая-то магия просто. Про книги и журналы и вовсе не говорю, запах бумаги и клея ничего не заменит, есть читалки даже без задней подсветки вообще, но все-равно неприятно глазам.