Pull to refresh

Используем Twitter по назначению

Reading time 4 min
Views 67K
Однажды мне было очень скучно. Настолько, что я решил достать все детали своего «конструктора» и собрать что-нибудь.



В закромах нашлось следующее: 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 "dunno\n";}
	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) Создание подобных устройств, интегрированных с соцсетями, которые будут твитить когда вы, например, открываете холодильник, или инстаграмить фото каждый раз, когда вы садитесь принимать пищу.
Tags:
Hubs:
+93
Comments 51
Comments Comments 51

Articles