[小MU]用小MU中的图传模式做一个智能宠物管家
作品展示
项目背景
我们家养了一只猫,可是国庆7天假我要和我的家人一起出去游玩,如果猫咪一个人在家的话,又没有人喂养它!怕它会饿着。在外面游玩的我,时不时也想着猫咪,想看 看它一个人在家干嘛!要是我有一个宠物管家该多好啊:我可以通过宠物管家远程给猫咪喂食,并且监控它在做什么!
功能介绍
我们的宠物管家有两种模式:自动模式和远程模式
1,自动模式:我们按下宠物管家的鼻子,我们的宠物管家就开启了自动模式,当有猫咪路过时,我们的宠物管家就会通过超声波传感器检测宠物的距离驱动我们的步进电机来投多少食物。通过水位传感器来检测我们碗里有没有水,当它低于某一值时,我们的宠物管家就会驱动打开我们的继电器,继而驱动我们的水泵给碗里送水。
2,远程模式:在浏览器中输入192.168.4.1打开我们的远程终端,来控制我们舵机云台的转动,查看小猫咪在做什么,按下A键可以投食,按一下B键可以送水。
硬件清单
1 DFRduino UNO R3(含USB线|传感器扩展板)
2 自锁按钮
3 超声波测距模块 HC-SR04 超声波传感器
4 ULN2003步进电机驱动板+ 5V步进电机
5 水位传感器
6 数字继电器模块
7 9G舵机
8 直流电机3V 卧式小潜水泵
9 最重要的当然还是我们的小MU摄像头啦
小MU摄像头
硬件连接
硬件组装
程序设计
mind + 编程
代码编程
/*!
* MindPlus
* uno
*
*/
#include <DFRobot_Servo.h>
#include <DFRobot_URM10.h>
#include <SoftwareSerial.h>
// 动态变量
volatile float mind_n_recv_char, mind_n_X, mind_n_Y, mind_n_dist, mind_n_count;
// 函数声明
void DF_SerialReceive();
void DF_LimitValue();
void DF_remove();
void DF_feeder(float angle, String speeds);
void DF_Automatic();
// 创建对象
SoftwareSerial softwareSerial1(2, 3);
Servo servo_7;
Servo servo_6;
DFRobot_URM10 urm10;
// 主程序开始
void setup() {
servo_7.attach(7);
servo_6.attach(6);
softwareSerial1.begin(9600);
mind_n_X = 90;
mind_n_Y = 120;
servo_7.angle(abs(mind_n_Y));
servo_6.angle(abs(mind_n_X));
digitalWrite(12, LOW);
}
void loop() {
mind_n_dist = (urm10.getDistanceCM(4, 5));
if ((digitalRead(13)==1)) {
DF_Automatic();
}
else {
DF_remove();
}
}
// 自定义函数
void DF_SerialReceive() {
mind_n_recv_char = softwareSerial1.read();
if ((mind_n_recv_char==85)) {
mind_n_X = (mind_n_X-10);
}
if ((mind_n_recv_char==68)) {
mind_n_X = (mind_n_X+10);
}
if ((mind_n_recv_char==82)) {
mind_n_Y = (mind_n_Y+10);
}
if ((mind_n_recv_char==76)) {
mind_n_Y = (mind_n_Y-10);
}
if ((mind_n_recv_char==65)) {
DF_feeder("720", "0.002");
}
if ((mind_n_recv_char==66)) {
digitalWrite(12, HIGH);
delay(5000);
digitalWrite(12, LOW);
}
}
void DF_LimitValue() {
if ((mind_n_X<=0)) {
mind_n_X = 0;
}
if ((mind_n_X>=180)) {
mind_n_X = 180;
}
if ((mind_n_Y<=0)) {
mind_n_Y = 0;
}
if ((mind_n_Y>=180)) {
mind_n_Y = 180;
}
}
void DF_remove() {
if (softwareSerial1.available()) {
DF_SerialReceive();
DF_LimitValue();
servo_7.angle(abs(mind_n_X));
servo_6.angle(abs(mind_n_Y));
}
}
void DF_feeder(float angle, String speeds) {
for (int index = 0; index < (ceil(((abs(angle))*1.45))); index++) {
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
delay(speeds * 1000);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, HIGH);
delay(speeds * 1000);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, HIGH);
digitalWrite(8, LOW);
delay(speeds * 1000);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
delay(speeds * 1000);
}
}
void DF_Automatic() {
if ((analogRead(A0)<=500)) {
digitalWrite(12, HIGH);
delay(5000);
digitalWrite(12, LOW);
}
if ((mind_n_dist<=8)) {
mind_n_count = (map(mind_n_dist, 0, 8, 0, 1800));
DF_feeder(mind_n_count, "0.002");
}
}
视频演示