大阪近郊で活動するフリーランスエンジニアのブログです 技術情報とか趣味など

*

Raspberry Pi2を使ってリモートで餌やりをする

      2015/09/29

ブログからガレージの金魚にエサをやる

以前からやろうやろうと先延ばしにしてたエサやりのシステムが完成しました!
プラ船のページで完成品が見れます。
是非一度エサやりにきてください

以下にハウツーを残します

ハードウェア

まずはエサやり機を自作します
P_20150928_151827

材料

  • ホームセンターで売られてる端材の詰め合わせ
  • 100均の小さいタッパー
  • ペットボトル
  • トイレットペーパーの芯
  • サーボモーター SG90

P_20150928_151817
モーターにタッパーを取り付けて穴あけ
モーターが回ったときエサが飛び散るのでペットボトルを切ってカバーにします

P_20150928_151934_HDR
後はフタの隙間にエサが流れるように設置

配線やらソフトウェアの設定は前の記事を参考にしてください

ソフトウェア

続いてソフトウェア
無制限にボコボコとエサをやられたら水があっという間にダメになるので制限をかけます

仕様

  • 最後にエサをやった時刻から3時間経過していればエサがやれる
  • エサをやれる時刻は10時から20時までの間
  • 毎日10時に一度自動でエサをやる

Raspberry Pi2側

まずエサをやった時刻をさくらVPSのDBに保存します

// サクラVPS側
<?php
if (!array_key_exists('tbl', $_POST)) {
    exit;
}

require_once('./db_conf.php');
$pdo = getPDO();
$pdo->prepare('insert feed_log value()')->execute();
$pdo = null;
?>

ガレージのRaspberry Pi2からさくらVPSへ送信

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'uri'
require 'net/http'

def http_request(method, uri, query_hash={})
    query = query_hash.map{|k, v| "#{k}=#{v}"}.join('&')        #ハッシュをオプションの書式に変換
    query_escaped = URI.escape(query)

    uri_parsed = URI.parse(uri)
    http = Net::HTTP.new(uri_parsed.host)

    case method.downcase!
    when 'get'
        return http.get(uri_parsed.path + '?' + query_escaped).body
    when 'post'
        return http.post(uri_parsed.path, query_escaped).body
    end
end

#POSTで送るだけ
http_request('POST', '送信先URL', {:tbl=> 'g'})

サーボブラスターを使ってエサの入ったタッパーを回転させる

#!/bin/sh
echo 3=100%  > /dev/servoblaster
sleep 1
echo 3=20%  > /dev/servoblaster

#さくらVPSへログ送信
/usr/local/bin/send-feed-log                                                                                                                                          

Sangoのサブスクライバに追記

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'rubygems'
require 'mqtt'

MQTTHOST = "std1.mqtt.shiguredo.jp"
USERNAME = "ユーザー名"
PASSWORD = "パスワード"

# MQTTに接続するためのクライアントを作成します
client = MQTT::Client.new(
  MQTTHOST,
  :username => USERNAME,
  :password => PASSWORD,
  :keep_alive => 60
)

# 接続します
client.connect do |c|
  # Subscribeします
  TOPIC = "ユーザー名/#"
  c.get(TOPIC) do |topic, message|
    #
    # 他省略
    #
    #feed ←エサ用トピック追加
    if topic == "ユーザー名/feed"
       `/usr/local/bin/feed`
    end

  end

end

ブログ側

最後にエサをやった時刻と、次にエサをやれる時刻をJSONで出力する

require_once('./db_conf.php');
$pdo = getPDO();

$ret = array();

// エサやり最終時刻を取得
$sql_ret = $pdo->query("select *  FROM feed_log ORDER BY id DESC LIMIT 1")->fetchAll(PDO::FETCH_ASSOC);
$ret['latest'] = $sql_ret[0]['on_at'];
$pdo = null;

$ret['next'] = "";
// 次のエサやり時刻
if((date('Hi') + 0) > 2000 ) {
    $ret['next'] = date("Y-m-d", strtotime("+1 day"  )) . " 13:00:00";
}else if((date('Hi') + 0) < 1000 ) {
    $ret['next'] = date("Y-m-d") . " 13:00:00";
}else{
    $ret['next'] = date("Y-m-d H:i:s", strtotime($ret['latest'] . " +3 hour"));
    
    // 次にエサをやれる時刻が20時以降の場合は翌日の13時とする
    if(date("Hi", strtotime($ret['next'])) > 2000) {
        $ret['next'] = date("Y-m-d", strtotime("+1 day"  )) . " 13:00:00";
    }
}

header('Access-Control-Allow-Origin: *');
header('Content-type: application/json');
echo json_encode($ret, JSON_PRETTY_PRINT);

エサやりボタン押下でSangoを使ってガレージのRaspberry Pi2にキューを飛ばす

if (!array_key_exists('from', $_POST)) {
    exit;
}

require_once('./phpMQTT.php');
require_once('./db_conf.php');

$pdo = getPDO();

// エサやり時刻チェック 
$cnt = $pdo->query('select count(*) as cnt from feed_log where on_at > (now() - interval 3 hour)')->fetch(PDO::FETCH_ASSOC);
$pdo = null;

if($cnt['cnt'] === 0) {
    $mqtt = new phpMQTT("tcp://std1.mqtt.shiguredo.jp", 1883, md5(time()));
    if ($mqtt->connect(null,null,'ユーザー名', 'パスワード')) {
        $mqtt->publish("ユーザー名/feed","",0);
        $mqtt->close();
    }
}

これで一先ずやりたい事は実装できた感じ
やぶ蚊に刺されず屋内から金魚を眺めながらエサがやれるようになりました!
おかげで人には懐かずカメラに懐いてしまった・・・人が近づくと逃げますがカメラが動くとエサくれーしますw

 - php, Raspberry Pi, ruby, 金魚 , , , ,

  • このエントリーをはてなブックマークに追加
  • にほんブログ村 観賞魚ブログ 金魚へ

Comment

  1. pon より:

    こんにちは。初めまして。ponと申します。
    ラズパイを使った水槽への自動給餌機に興味があり、情報を探していたところ、こちらの記事に出会いました。
    いくつかお聞きしたいことがあるのですが、よろしいでしょうか?
    ご連絡お待ちしております。

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

  関連記事

プラ舟のカメラ復活しました

カメラの首振りができなくなっていた プラ船のカメラが横方向に動かなくなっていたの …

金魚が病気の為、隔離しました

配信中の金魚水槽ですが、金魚が病気で1匹死んでしまったので隔離しました メイン水 …

プラ舟に外部フィルター追加

安かったのでつい・・・ ヤフオクで安い中古の外部フィルターが売っていたので衝動買 …

みんなのラズパイコンテストにて受賞しました

ラズパイマガジンと日経Linux、日経ソフトウエア様の みんなのラズパイコンテス …

穂竜水槽のフィルターを交換

穂竜が挟まる! 金魚水槽のページで配信している穂竜たちですが、非常にドン臭く よ …

45cm水槽を修理してみた

大昔に使ってた45cm水槽が出てきたので洗って使おうと思ったんですが水漏れしてま …

RaspberryPi2を使ったリモートのエサやりボタン復活しました

春がきた 春になり水温が上がってきたのでプラ舟ページのエサやりボタンを復活させま …

福だるま 購入しました

新入り金魚 メイン水槽をリセットしたのでヤフオクで金魚を購入しました 福だるまと …

プラ舟はじめました

プラ船買っちゃった 金魚にだだハマりなGW ついにプラ船買ってガレージに設置して …

エサやりボタンを撤去しました

寒い! 寒くなってきましね。 水温を10度を切り始めたので、プラ舟ページに配置し …