Однажды мне было очень скучно. Настолько, что я решил достать все детали своего «конструктора» и собрать что-нибудь.
В закромах нашлось следующее: Arduino совместимая плата, роутер tp-link mr3020, модуль GPS, гироскопакселерометр, и куча всякой прочей ерунды.
Забегая вперед, чтобы не огорчать некоторых читателей, скажу, что модуль GPS и гироскоп не пригодились
.
Причем тут twitter. Мое отношение к сабжу балансирует на грани безразличия и негатива. Ну что можно такого интересного рассказать используя всего 140 символов без картинок и видео? Непонятная игрушка для тех, кто живет в социальных сетях и постит о том что он съел на завтрак. Это мое личное мнение, если оно не совпадает с вашим, я могу это понять. Поэтому прошу уважаемых читателей не холиварить на эту тему, хотя бы в комментариях к этой статье.
Все эти мысли меня натолкнули на идею для незаменимого девайса, который будет твитить при каждом посещении мной туалета! Ну чтобы все были в курсе. И не просто о посещении, а более подробно: что именно я там делал. Приступим.
Первое что придется сделать — определить критерии. Я считаю, что признаки нахождения меня в туалете — это закрытая дверь и включенный свет. Под рукой оказался какой-то датчик от автоматических ворот, из которого был извлечен светочувствительный элемент.
Поигравшись с мультиметром, я выяснил, что при изменении освещенности в нем возникает разность потенциалов. При максимальной освещенности «напряжометр» показал примерно 0,330 вольт. Цепляем его к «ардуине». Определять положение двери (открытазакрыта) я решил просто замыканием контактов. Это кстати оказалось самым сложным, потому что подходящей кнопки у меня не нашлось.
Вот программка для «ардуины»:
#include <SoftwareSerial.h> // подключаем модуль
SoftwareSerial mySerial(2, 3); // RX, TX пины для передачи по rs323
int cnt = 0; // Счетчик секунд
void setup() {
mySerial.begin(115200); // инициализируем порт
mySerial.println("Halo world");
}
void loop() {
int lightValue = analogRead(A0); // считываем значения с датчика света
int doorValue = analogRead(A1); // считываем положение двери
boolean light = false;
boolean door = false;
if(lightValue > 60) light = true; // если значение больше 60 - значит свет включен. Порог определен экспериментально
if(doorValue > 500) door = true; // при разомкнутой сети значение должно быть 0, при замкнутой 1023.
//Но там всякие помехи, дрожание контактов... Так надежней
if(light && door) cnt++; // если я внутри - считаем секунды
else {
if(cnt>0) { // если только вышел
mySerial.print("<");
mySerial.print(cnt); // шлем в порт секунды пребывания
mySerial.println(">");
}
cnt = 0; // обнуляем счетчик
}
delay(1000);
}
Второе что нам понадобится — это роутер. Я взял tp-link mr3020. На него надо установить OpenWRT, настроить подключение к интеренту и установить php. Как это делается тут описано много раз, в том числе и мной. Поэтому не будем на этом задерживаться. Только важные моменты: вот мы слушаем порт и получаем нужные нам данные
<?php
//Отделяем дочерний процесс от основного
$child_pid = pcntl_fork();
if ($child_pid) {
exit();
}
posix_setsid();
// Тут функция постинга в твитер
include("post.php");
$filename = "/dev/ttyATH0"; // serial-порт роутера
$handle = fopen($filename, "r"); // открываем
while (!feof($handle)) {
$sym = fread($handle, 1); // читаем по одному байту за цикл
if($sym=='>') {
$f=false;
echo "<<$cnt>>n";
flush();
act($cnt);
$cnt='';
}
elseif($sym=='<') $f=true;
elseif($f) $cnt .= $sym;
}
fclose($handle);
function act($time) {
if($time<40) {echo "dunnon";}
if(40<=$time && $time<150) { postMyPost("i was pee");}
if(150<=$time && $time<300) { postMyPost("i was poo");}
if(300<=$time && $time<900) { postMyPost("i take shower");}
}
?>
Постим с помощью этой библиотеки:
Третий важный момент — это возможность постить в твитер программно. Для этого нужно авторизоваться, зайти на dev.twitter.com/, навести курсор вверху справа на свой светлый лик, выбрать My Applications. Делее Create New Application, отвечаем на все вопросы. Потом в Settings обязательно указать Access: Read and Write. Затем в Details нажимаем Create my access token и запоминаем поля Consumer key, Consumer secret, Access token и Access token secret, они нам еще понадобятся. Качаем библиотеку для PHP: github.com/abraham/twitteroauth/archive/master.zip
В config.php подставляем запомненные ранее данные:
define('CONSUMER_KEY', 'xxxxxxxxxxxxxxxxxxxxxxxxxx');
define('CONSUMER_SECRET', 'yyyyyyyyyyyyyyyyyyyyyyyyyy');
define('OAUTH_TOKEN', 'qwertyqwertyqwertyqwertyqwertyqwerty');
define('OAUTH_SECRET', 'sashagreysashagreysashagreysashagrey');
define('OAUTH_CALLBACK', 'http://example.com/twitteroauth/callback.php');
Ну и сам скрипт для отправки (post.php):
<?PHP
require_once('lib/twitteroauth/twitteroauth.php');
require_once('lib/config.php');
function postMyPost($status) {
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET,OAUTH_TOKEN,OAUTH_SECRET);
$connection->format = 'xml';
$connection->post('statuses/update', array('status'=>$status));
}
?>
Процесс отладки:
Изделие в сборе:
Подключение:
Использование:
подключаемся к роутеру по SSH, запускаем скрипт:
root@OpenWrt:~# php-cgi /www/twitter/run.php
X-Powered-By: PHP/5.4.11
Content-type: text/html
root@OpenWrt:~#
При этом запускается фоновый процесс, а родительский завершается. Таким образом скрипт будет работать даже после отключения от консоли.
Чтобы остановить скрипт, нужно посмотреть ID процесса и сделать ему kill:
root@OpenWrt:~# ps | grep run.php
1665 root 10436 S php-cgi /www/twitter/run.php
1670 root 1492 S grep run.php
root@OpenWrt:~# kill 1665
Результат работы можно посмотреть тут: twitter.com/kruz_ivan
Что в планах:
1) Прикрутить камеру, чтобы можно было еще и видеть фото самого процесса.
2) Сейчас активно развиваются технологии передачи запахов. С появлением первый серийных устройств, я обязательно задействую их в своем проекте.
3) Создание подобных устройств, интегрированных с соцсетями, которые будут твитить когда вы, например, открываете холодильник, или инстаграмить фото каждый раз, когда вы садитесь принимать пищу.
Автор: mehos