瘦网虫 发表于 2014-3-11 22:14:29

小野猫物联网初体验

本帖最后由 瘦网虫 于 2020-5-22 09:28 编辑



误想歪,此小野猫为货真价实小野猫,非你脑海中抓床单的小野猫。

你在屋内享受互联网,它在窗外渴盼一口猫粮,时代已经如此发达,为什么不让科技给小野猫(们)带来更多福利呢。

看着它(们),轻点鼠标,温暖的猫粮为喵们奉上,在这个寒冷的时代还有什么比一把新鲜的猫粮更让喵们心头一暖的呢?

让我们一起来DIY一个可视实时猫粮提供系统吧!!

实际运行的抓拍N天连播

https://v.youku.com/v_show/id_XODI0NDkxOTky.html
https://v.youku.com/v_show/id_XODI0NDkxOTky.html
××××××××××××
×内有广告,慎入×
××××××××××××

设想:通过互联网对门口的野猫进行实时监控,在发现喵来的时候,或发现喵饭盆空的时候,给它们添一把新鲜的猫粮,即使你在千里之外、异国他乡。

物料:
电信4M光纤宽带(动态ip),花生壳(ddns),顶级域名,乐联网注册帐号;
tplink wr703n(刷open-wrt系统),支持open-wrt系统的摄像头一个,乐联网E-KIT(或arduino UNO+w5100模块),两套5v1a电源供电,futaba舵机3003一个,连接线若干;
大小饮料空瓶各一个,废木板少许。

原理:
顶级域名绑定动态域名,动态域名在路由器上设置并测试好。
open-wrt系统挂上摄像头,安装mjpg-streamer程序,配置固定ip后,映射端口到公网,使公网可以访问摄像头,此摄像头对准喵饭盆。
乐联网E-KIT刷入反向控制代码,控制舵机,在收到来自互联网的“开仓放粮”命令后,执行投掷猫粮的程序,并闪烁LED提示。
提供夜晚开灯的按钮,实现烛光晚餐效果(led灯不够亮,暂时屏蔽夜间照明功能)。

步骤较多,各取所需。
1,设置路由器ddns,不解释,详问度娘。
2,固定域名解析到动态域名,不解释,详问度娘。

3,刚刷好openwrt系统的设备设置个密码,并联入家庭的无线网络

无线中继教程点这里:http://1979.1980th.com/?p=5314
配置好无线网:

4,open-wrt安装mjpg-streamer。
首先尝试刷新软件包,如果你跟我一样也报这个错,那是配置的地址不对:

在OPKG配置里,修改配置如下:#src/gz attitude_adjustment http://downloads.openwrt.org/attitude_adjustment/12.09.1/ar71xx/generic/packages
src/gz attitude_adjustment http://downloads.openwrt.org/attitude_adjustment/12.09-rc2/ar71xx/generic/packages
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
观察下被屏蔽的第一行和目前没问题的第二行区别,有兴趣可以自己去“http://downloads.openwrt.org/attitude_adjustment/”这个网址,看看默认配置出错的原因。
再回到“刷新列表”里,尝试刷新下,所有的可用软件应该可以刷出来了。
插上摄像头,通过putty这个软件,连接上openWrt,使用lsusb命令,可以看到usb摄像头被发现了。

我使用的这个内核默认就已经安装好mjpg_streamer了,所以我只需要测试看下能否工作正常即可。
直接尝试打开http://192.168.1.1:8080/

毫无意外的被无情地拒绝了。
在putty中运行下:mjpg_streamer -i "input_uvc.so -d /dev/video0 -r SVGA -f 10" -o "output_http.so -w /www/webcam"
看起来没问题的样子,再打开http://192.168.1.1:8080/

下面红框内就是摄像头抓到的内容了。

有问题可以尝试这个链接:
openwrt免驱摄像头挂载(免驱但非301方案分享) - 教程方案专区 - OpenWrt中文网 - Powered by Discuz!
http://www.openwrt.org.cn/bbs/forum.php?mod=viewthread&tid=6105

安装完成后把
mjpg_streamer -i "input_uvc.so -d /dev/video0 -r SVGA -f 10" -o "output_http.so -w /www/webcam"
加入到启动脚本里即可自动启动摄像头服务,服务端口在8080.

设置open-wrt的网络防火墙,将互联网访问回内网部分设置为允许。

5配置端口映射,将外网端口映射到内网open-wrt系统的8080端口,注意,外网不要使用80和8080端口,原因不解释。

最好将openWrt的无线网口设置成静态IP,方便映射端口。

此时,你的摄像头外网可见。

5,刷入乐联网E-KIT TCP反向控制代码(此服务非乐联网提供的标准服务,随时可能会停,也可能一直可用)
代码见最后。
将舵机的3根线接上:舵机黑线-GND,舵机红线-5V,舵机白线-d9引脚。
配置乐联网帐号中的“智能物联”-“控制命令管理”,添加一个下面代码中提到的feedCat


相关教程请参阅http://www.lewei50.com/dev/docList?cid=0102&sk=68

6,【此步骤非必须步骤】mjpg_streamer提供的是静态页面,不满足我对个性化及一些隐私保护的需求,于是在openwrt上安装个php服务器,通过php服务器来实现一些额外的功能。
我使用的是一个脚本来自动安装php服务器,有需要的可以通过下载帖子的附件,压缩包里面自带了说明文件。

安装完后,记得用vi查看下/etc/lighttpd/lighttpd.conf中的## bind to port (default: 80)
#server.port = 81
server.port = 88否则会与默认80端口的luci控制台冲突。


7,最复杂的部分来了,制作一个平台,可以装猫粮并且安装个装置阻止猫粮直接掉落,将舵机固定并连接到此装置上,控制开合,小的空饮料瓶做成导轨,引导掉落的猫粮进入喵饭盆。

一切完工后,要做疲劳测试,防止卡猫粮和猫粮四散。
最终效果图:


后加入了“野猫自助餐”功能,如果野猫自己按按钮也会掉猫粮,同时将按的次数记录在乐联网网站。

放出围观网址(动态域名,不能访问也不要奇怪,晚上看不见也不奇怪):
http://www.teammanager.cn:8081/*已取消在线观看和喂猫权限,原因见最后。


市场价30元一袋猫粮可供一只成年猫吃1个月,每天一块钱,快乐每一天。


-------------------------------------------------------------
乐联网E-KIT内的代码奉上,供参考:

#include <SPI.h>
#include <Ethernet.h>
#include <LeweiTcpClient.h>
#include <EEPROM.h>
#include <Servo.h>

#define LW_USERKEY "YOUR_API_KEY_HERE"
#define LW_GATEWAY "10"//gateway number


byte mac[] = {0x74,0x69,0x69,0x2D,0x30,0x39};
IPAddress ip(192,168,1, 251);
IPAddress mydns(8,8,8,8);
IPAddress gw(192,168,1,1);
IPAddress subnet(255,255,255,0);

LeweiTcpClient *client;
//int ctrl = 1;
//boolean ctrlStatue = false;
Servo myservo;// create servo object to control a servo
                // a maximum of eight servo objects can be created
int pos = 0;    // variable to store the servo position

long starttime;
int postInterval = 1000*60*10;//10 min
int feedCount = 0;//human feed count,stored in lewei50.com
int lastFeedCount = -1;
int selfFeedCount = 0;//cat self feed count,stored in lewei50.com
int lastSelfFeedCount = -1;
//int pbIn = 0;//interrupt0= pin2
int pbIn = 2;//sensor switch pin
int ledOut = 6;
volatile int state = LOW;      // 定义默认输入状态
boolean servoActing = false;

void setup()
{
Serial.begin(9600);
//pinMode(ctrl,OUTPUT);

//attachInterrupt(pbIn, stateChange, FALLING);
pinMode(ledOut,OUTPUT);
pinMode(pbIn,INPUT);
myservo.attach(9);
//you can use 2 ways to init your network
//1.simplest
//client = new LeweiTcpClient(LW_USERKEY, LW_GATEWAY);
//2.full setting for your network
client = new LeweiTcpClient(LW_USERKEY, LW_GATEWAY,mac,ip,mydns,gw,subnet);


//test1 is the function you write below to handle your program
//"testFunction" is the function name you set on website:http://www.lewei50.com/
//on "controll command manager" menu
//we test transfer 1-5 para from website(you defined on it) to your arduino
//enjoy it


UserFunction uf1 (feedCat,"feedCat");
client->addUserFunction(uf1);
UserFunction uf2 (changeLed,"changeLed");
client->addUserFunction(uf2);


/*
enable easySetupMode will open the port 80 of this board,
you can setup your apikey and gateway number via http://your_arduino_ip/
the key and number will be burned into board's eeprom
after setting you need to restart your arduino.
after reboot,you can comment this line for fasten your board.
this library will will use apikey and gateway number in eeprom FIRST,if it exsit.
you can send empty value from the browser to wipe the data in eeprom.
*/
//client->easySetupMode(true);
}

void loop()
{
    client->keepOnline();
   
    if ((millis()-starttime) > postInterval)
    {
      if(feedCount != lastFeedCount || selfFeedCount !=lastSelfFeedCount)sendFeedCount();
      starttime = millis();
    }
   
    if(digitalRead(pbIn)==LOW)
    {
      stateChange();
    }
   
}

void stateChange()
{
if(!servoActing)
{
    state = !state;
    digitalWrite(ledOut, state);
    servoActing = true;
    feedCat("0");
}
}


void feedCat(char* p1)
{
if(String(p1).equals("0"))
{
   selfFeedCount++;
   Serial.println(selfFeedCount);
}else
{
   feedCount ++;
   client->setRevCtrlMsg("true","eat!");
}
myservo.write(0);
delay(500);
myservo.write(70);
servoActing = false;

//attachInterrupt(pbIn, stateChange, FALLING);
}

void changeLed(char* p1)
{
    state = !state;
    digitalWrite(ledOut, state);
   client->setRevCtrlMsg("true","chg!");
}

void sendFeedCount()
{
client->appendSensorValue("selfFeedCount",selfFeedCount);
client->sendSensorValue("feedCount",feedCount);
lastFeedCount = feedCount;
feedCount = 0;
lastSelfFeedCount = selfFeedCount;
selfFeedCount = 0;
}

============================================
最新更新:
由于喂食者众,小野猫们终日吃了睡,睡了ooxx,ooxx了吃,造成小区小小野猫们迅速添丁增口,系统不堪重负,决定:

永久取消此设备的在线查看、使用权限。有喜欢这个设备,请自行按照上面的制作方法制作。
妙龄少女:
http://image.geek-workshop.com/forum/201403/11/130454ccyyrz22eity9nrt.jpg
对比
伟大母亲:(第二窝)

laoliu1982 发表于 2014-3-11 22:36:08

第一时间顶一下

ZiShuo 发表于 2014-3-11 22:39:14

群里的前来报到

czmlj 发表于 2014-3-11 23:01:09

顶一下,很好的创意。

muggle 发表于 2014-3-11 23:16:16

贱贱的笑,哈哈哈哈

darkorigin 发表于 2014-3-12 08:48:38

笑笑~~~~~~~~~~~~~~~~~

Horo 发表于 2014-3-12 09:31:55

顶起! 很有爱的物联网应用!

紫云飞鹤 发表于 2014-3-12 11:13:16

非常不错!但愿楼主能在主要代码后面都加上中文注译,对我等小白的帮助就大了。

紫云飞鹤 发表于 2014-3-12 11:15:26

在哪里捐猫粮啊

美好时光 发表于 2014-3-12 12:33:47

顶起!!!科技改变喵喵们的命运!!!

yagrath 发表于 2014-3-23 09:26:12

顶,家里有宠物的都适合用 。

buttony 发表于 2014-4-18 14:43:45

顶!感谢分享!

iothouzhuo 发表于 2014-7-17 14:06:18

请问楼主不用openwrt行么。。我是小白。。

chzhewl 发表于 2014-11-11 13:23:13

不顶对不住野猫!

大只佬 发表于 2015-5-7 14:49:14

好厉害!必需多看几遍!!!!!!!
页: [1] 2
查看完整版本: 小野猫物联网初体验