家庭监视器
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
关于这个项目
我从在女儿家中安装 Ecobee Smart 恒温器开始进行家庭监控。它们已被 Ecobee 停产,所以我想要一种替代方案,可以监控水槽液位、洪水警报、断电以及其他项目。我从各种网站上的其他项目中汲取了很多东西,特别是在 Arduino 和网站的编码方面。使用 Pushingbox 进行通知是系统的关键部分,它允许远程通知。我感谢开放设计社区发布他们的知识和项目。
我从 Arduino Mega 2560 开始,添加了一个以太网卡。使用 Eagle cad,我设计了几个输入板和一个视觉信号器。我有这些是由 OSH Park 制作的。接口板将七个可用的干触点、温度和湿度传感器、实时时钟和超声波水槽液位传感器连接到 Arduino。
对于本地显示,我使用了 4x20 LCD 显示器。还有 8 个 LED 显示任何警报输入的状态,输入时为琥珀色,清除时为绿色,复位时为关闭。
重置按钮清除所有绿色 LED,同时消息启用 PB 使用 Pushingbox 打开/关闭通知。
该网站仅在局域网上显示。出于可能的安全原因,我不想移植我的路由器。有几个 Arduino 示例,我使用了 jqplot 和 jqplot 的一部分,因为我想独立于我的实验室系统。
还没有标签,但是,软件设置为在距离传感器不到 10 英寸处发出警报,并且琥珀色 LED 亮起表示此警报处于活动状态。绿色的警报表明它曾经出现过,但后来又打开了。按下复位键,绿色 LED 将熄灭,但琥珀色 LED 将保持点亮,直到水平面大于 10 英寸。
代码
- Arduino 代码
- 网站
Arduino 代码C/C++
// Home Monitor code/* ASSIGNMENTS arduino grn led red led interface annunciator annunciator sensor# variable input pin output pin output pin variable board pin board red pin board grn pinsump level 1 6,8 18 19inches x15-2 to 6 , x15-3 至 8 20-1 20-2 洪水警报 2 28 23 25 x15-4 20-3 20-4 断电 3 30 27 29 x15-5 20-5 20-6 温度 4 ftemp 5 (ftemp,1 ) x15-1 湿度 5 fhumi 5 (fhumi,1) x15-1aux 1 6 aux1 32 31 33 x15-6 20-7 20-8aux 2 7 aux2 34 35 37 x15-11 21-1 21-2 aux 3 3 36 39 41 x15-7 21-3 21-4aux 4 9 aux4 38 43 45 x15-8 21-5 21-6aux 5 10 aux5 40 47 49 x15-9 21-7 21-8reset reset 102 x1 msg禁止4 x15-12message led 17* 必须更改为 wifi 屏蔽 WIRINGVCC 到 5VLCD:SDA 针到针 21LCD:SCL 针到针 20DHT:DHT 针 1 到 VCCDHT:DHT 针 2 到针 5 和 10K 到 VCCDHT:DHT 针 3 备用 DHT:DHT引脚 4 至 GNDSR04:SR04 引脚触发至引脚 8SR04:SR04 引脚回波至引脚 6RTC:SDA 引脚至引脚 21RTC:SCL 引脚至引脚 20LOSS OF POWER 引脚 30FLOOD ALARM 引脚 28MESSAGE LED 引脚 17 不能使用引脚 4、7、10、11、12、13 50、51、52 和 53 */// LIBRARIES#include#include #include # include #include #include #include #include #include //用于捕获HTTP的缓冲区大小requests#define REQ_BUF_SZ 50//boardbyte mac[] ={ 0xzz, 0xzz, 0xzz, 0xzz, 0xzz, 0xzz };IPAddress ip(192, 168, 1, 100);//(10, 9, 9, 12);或 (192,168,1,100); IP地址,可能需要根据网络改变IP地址网关(192,168,1,1); //(10,9,9,1):或 (192,168,1,1);以前未在其他草图中使用过可能必须删除 IP 地址子网(255,255,255,0);// (255,255,255,0);以前没有在其他草图中使用过,可能必须删除以太网服务器服务器(1000); // 在端口 1000File webFile 上创建一个服务器; // SD卡上的网页文件char HTTP_req[REQ_BUF_SZ] ={0}; // 缓冲的 HTTP 请求存储为空终止 stringchar req_index =0; // 索引到 HTTP_req 缓冲区//来自 PushingBox.com 的秘密 DevID。如果你想要char DEVID1[] ="xxxxxxxxxxxxxxxxx",你可以在多个Pin上使用多个DevID; //场景:“这是第一个警报场景”将您的 DevID 放在引号中// DEVICE SETUP//setup LCDLiquidCrystal_I2C lcd(0x27,20,4); // 将 LCD 地址设置为 0x27,用于 16 个字符和 2 行显示//设置 DHT22dht DHT;#define DHT22_PIN 5//setup sonar#define TRIGGER_PIN 8 // Arduino 引脚连接到超声波传感器上的触发引脚。#define ECHO_PIN 6 // Arduino 引脚连接到超声波传感器上的回声引脚。#define MAX_DISTANCE 200 // 我们想要 ping 的最大距离(以厘米为单位)。最大传感器距离额定为 400-500cm.NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // 引脚和最大距离的 NewPing 设置。//setup RTCRTC_DS3231 RTC;//全局变量 unsigned long mathtime1 =0;无符号长 mathtime2 =0;无符号长 mathtime3 =0;无符号长 mathtime3a =0;无符号长 mathtime4 =0;字符串时间字符串;字符串日期字符串;无符号整数英寸;浮动 ftemp;漂浮福米;内部辅助1; int aux2; int aux3; int aux4; int aux5;内部重置; int msginhbt =低; int sensor1 =0;字符串传感器2 =0;字符串传感器3 =0; int sensor4 =0; int sensor5 =0;字符串传感器6 =0;字符串传感器7 =0;字符串传感器8 =0;字符串传感器9 =0;字符串传感器10 =0; String messageend;String sensor1msg;String sensor2msg;String sensor3msg;String sensor6msg;String sensor7msg;String sensor8msg;String sensor9msg;String sensor10msg;String msginhbtmsg;String devid ="xxxxxxxxxxxxxxxxx";char serverName[] ="api.pushingbox.com"; boolean lastConnected =false;boolean DEBUG =true; // 用于故障排除 pushboxboolean DEBUG1 =true; //用于排除网站故障boolean DEBUG2 =false; //用于故障排除 datavoid setup(){// SD CARD OPERATIONS // 禁用以太网芯片 pinMode(10, OUTPUT);数字写入(10,高); // 开始调试串口 Serial.begin(9600); if (DEBUG1){Serial.println("Starting Program..");} Ethernet.begin(mac,ip,gateway,subnet); if (DEBUG1){Serial.println("Active Server IP:");Serial.println(Ethernet.localIP());} server.begin(); // 初始化 SD 卡 if (DEBUG1){Serial.println("Initializing SD card...");} if (!SD.begin(4)) { if (DEBUG1){Serial.println("ERROR - SD card初始化失败!");} return; // 初始化失败 } if (DEBUG1){Serial.println("SUCCESS - SD card initialized.");} // 检查 index.htm 文件 if (!SD.exists("index.htm")) { if ( DEBUG1){Serial.println("错误 - 找不到 index.htm 文件!");} return; // 找不到索引文件 } Serial.println("SUCCESS - Found index.htm file."); // 初始化设备 //初始化网络服务器 Ethernet.begin(mac, ip); // 初始化以太网设备 server.begin(); // 开始监听客户端 // 初始化液晶显示器 lcd.init(); //初始化RTC Wire.begin(); RTC.begin(); if (! RTC.isrunning()) { if (DEBUG2){Serial.println("RTC is NOT running!");} // 下面这行将 RTC 设置为编译此草图的日期和时间 RTC.adjust(DateTime (__约会时间__));现在日期时间 =RTC.now(); DateTime 编译 =DateTime(__DATE__, __TIME__); if (now.unixtime() -1){ //检查命令是否来了 homefront =homefront+6; //获取下一个字符 int endfront =homefront+3; //我希望这个命令 3 个字符 String action =line.substring(homefront,endfront);//检索命令的值 client.print("datas({ sensor1 :"); client.print(sensor1); client. print(", sensor2 :"); client.print(sensor2); client.print(", sensor3 :"); client.print(sensor3); client.print(", sensor4 :"); client.print(sensor4) ); client.print(", sensor5 :"); client.print(sensor5); client.print(", sensor6 :"); client.print(sensor6); client.print(", sensor7 :"); client .print(sensor7); client.print(", sensor8 :"); client.print(sensor8); client.print(", sensor9 :"); client.print(sensor9); client.print(", sensor10 :"); client.print(sensor10); client.print(", msgtimer :"); client.print(mathtime3a); client.print(", msgonoff :"); client.print(msginhbtmsg); client.print( "})"); } 休息; } if(c =='\n') { 连续 =真; } else if (c !='\r') { 连续 =false; } } } 延迟(1);客户端停止(); } if (DEBUG1){Serial.print("datas({ sensor1 :"); Serial.println(sensor1); Serial.print(", sensor2 :"); Serial.println(sensor2); Serial.print(", sensor3 :"); Serial.println(sensor3); Serial.print(", sensor4 :"); Serial.println(sensor4); Serial.print(", sensor5 :"); Serial.println(sensor5); Serial. print(", sensor6 :"); Serial.println(sensor6); Serial.print(", sensor7 :"); Serial.println(sensor7); Serial.print(", sensor8 :"); Serial.println(sensor8) ); Serial.print(", sensor9 :"); Serial.println(sensor9); Serial.print(", sensor10 :"); Serial.println(sensor10); Serial.print(", msgtimer :"); Serial .println(mathtime3a); Serial.print(", msgonoff :"); Serial.print(msginhbtmsg); Serial.println("})");} if (DEBUG1){Serial.print("我的网站IP地址: "); Serial.println(Ethernet.localIP());} }void timeanddate(){//time and date DateTime now =RTC.now(); DateTime future (now.unixtime() - 0);//时间修正为840 String hoursstring;字符串分钟字符串;字符串 secondstring; if(future.hour() <10){ hoursstring ='0' + String(future.hour()) + ':';} else { hoursstring =String(future.hour()) + ':';} if (future.minute() <10){ minutestring ='0' + String(future.minute()) + ':';} else { minutestring =String(future.minute()) + ':';} if( future.second() <10){ secondstring ='0' + String(future.second());} else { secondstring =String(future.second());} timestring=hourstring + minutestring + secondstring;字符串月字符串;字符串 daystring;字符串年字符串; if(future.month() <10){ monthstring ='0' + String(future.month()) + '/';} else {monthstring =String(future.month()) + '/';} if (future.day() <10){ daystring ='0' + String(future.day()) + '/';} else {daystring =String(future.day()) + '/';} datestring=月字符串 + 日字符串 + future.year(); lcd.setCursor(0,0);液晶显示(时间字符串); lcd.setCursor(10,0);液晶显示(日期字符串); mathtime1 =(now.unixtime());返回; }void 超声波传感器(){ //超声波传感器{ unsigned int uS =sonar.ping_median(5); // 发送 ping,以微秒 (uS) 为单位获取 ping 时间。 lcd.setCursor(9,1);液晶打印(“”); lcd.setCursor(9,1); lcd.print(美国/美国_ROUNDTRIP_IN); // 将 ping 时间转换为以厘米为单位的距离并打印结果(0 =超出设定的距离范围)英寸 =(uS / US_ROUNDTRIP_IN);传感器 1 =英寸; if (DEBUG2){Serial.print("Distance:");Serial.println(inches);}}return;}void dht22(){//温度和湿度传感器{ if ((mathtime1 - mathtime4)>2) { int chk =DHT.read22(DHT22_PIN); fhumi=(DHT.湿度); ftemp=((DHT.温度*1.8)+32); lcd.setCursor(9,2); lcd.print(fhumi, 1); lcd.setCursor(12,3); lcd.print(ftemp, 1);数学时间 4 =数学时间 1; } //延迟(2000); // 读数延迟 2 秒 if (DEBUG2){Serial.println("Temperature and Humidity:");} if (DEBUG2){Serial.println(ftemp,1);} if (DEBUG2){Serial.println(fhumi) ,1);} }return;}void annunciator() { //油底壳报警 if (inches<10) { digitalWrite(18, HIGH);数字写入(19,高); } else { digitalWrite(19, LOW);}//洪水警报 if (digitalRead(28) ==HIGH ) { digitalWrite(23, HIGH);数字写入(25,高); } else { digitalWrite(25, LOW);}//断电警报if (digitalRead(30) ==HIGH ) { digitalWrite(27, HIGH);数字写入(29,高); } else { digitalWrite(29, LOW);}//aux 1 alarmif (digitalRead(32) ==HIGH ) { digitalWrite(31, HIGH);数字写入(33,高); } else { digitalWrite(33, LOW);}//aux 2 alarmif (digitalRead(34) ==HIGH ) { digitalWrite(35, HIGH);数字写入(37,高); } else { digitalWrite(37, LOW);}//aux 3 alarmif (digitalRead(36) ==HIGH ) { digitalWrite(39, HIGH);数字写入(41,高); } else { digitalWrite(41, LOW);}//aux 4 alarmif (digitalRead(38) ==HIGH ) { digitalWrite(43, HIGH);数字写入(45,高); } else { digitalWrite(45, LOW);}//aux 5 alarmif (digitalRead(40) ==HIGH ) { digitalWrite(47, HIGH);数字写入(49,高); } else { digitalWrite(49, LOW);}//重置ledsif (digitalRead(42) ==HIGH) { int ledPinsout[] ={18, 19, 23, 25, 27, 29, 31, 33, 35, 37 , 37, 39, 41, 43, 45, 47, 49}; int ledPinsoutcnt =17; { for (int q=0; q 99999){mathtime3a =99999;};if (DEBUG2){Serial.print("MATH TIME 1:");Serial.println(mathtime1);Serial.print("MATH TIME 2:");Serial .println(mathtime2);Serial.print("MATH TIME 3:");Serial.println(mathtime3);Serial.print("ZFLAG:");Serial.println(zflag);}{ if (zflag ==1) &&mathtime3> 300 ) // 更改为 300 秒发送消息不超过每 5 分钟 {mathtime2 =mathtime1; if (DEBUG1){Serial.println("SEND MESSAGE!");} EthernetClient 客户端; Serial.println("以太网就绪"); // 打印以太网板/屏蔽的 IP 地址:Serial.print("My SENDMESSAGE IP address:"); Serial.println(Ethernet.localIP()); // 给以太网屏蔽一秒钟初始化: delay(1000);if (DEBUG2){Serial.print("incoming value:");Serial.println(messagesend);}String repel =messagesend;char room[repel. length()+1];repel.toCharArray(room,repel.length()+1); if (DEBUG2){Serial.print("这是被框起来的值:");Serial.println(room);} client.stop(); if(DEBUG){Serial.println("connecting...");} if (client.connect(serverName, 80)) { if(DEBUG){Serial.println("connected");} if(DEBUG){ Serial.println("发送请求");} client.print("GET /pushingbox?devid=");客户端打印(devid); client.print("&room="); if (DEBUG){Serial.print("这是正在发送的值:");Serial.println(room);} client.print(room); client.println(" HTTP/1.1"); client.print("主机:"); client.println(serverName); client.println("用户代理:Arduino");客户端打印(); } else { if(DEBUG){Serial.println("连接失败");} } }} return;}
网站JavaScript
需要添加 js 和 css 文件来运行它,它们驻留在您正在使用的计算机上。 IHome Monitor <脚本类型="text/javascript" src="../src/plugins/jqplot.canvasAxisLabelRenderer.min.js"> // <脚本class="code" language="javascript" type="text/javascript"> // 图表和仪表对象 var tempChar, humChar; var tempGauge, humGauge; // 存储两个图表数据点的数组 var tempData =new Array(); var humData =new Array(); // 为两个图表创建过去的“虚拟”数据 var startTime =(new Date()).getTime() - 270000; for(var i =0; i <10; i++) { tempData.push([startTime, 20]); humData.push([startTime, 50]);开始时间 +=30000; } // 当文档准备好时,创建对象并用“虚拟”数据填充图表 $(document).ready(function() { showCharts(); showGauges(); }); // 显示两个图表的函数 function showCharts() { tempChar =$.jqplot('tempchartdiv', [tempData], { title:'Sump Level', series:[{showMarker:false, lineWidth:1,color:" blue"}], 轴:{ xaxis:{ renderer:$.jqplot.DateAxisRenderer, tickOptions:{ formatString:'%M:%S', }, tickInterval:15 }, yaxis:{ min:0, max:30,滴答间隔:5, } } }); humChar =$.jqplot('humchartdiv', [humData], { title:'Temperature', series:[{showMarker:false, lineWidth:1,color:"red"}], axes:{ xaxis:{ renderer:$ .jqplot.DateAxisRenderer, tickOptions:{ formatString:'%M:%S' }, tickInterval:10 }, yaxis:{ min:0, max:100, tickInterval:10 } } }); } // 显示两个仪表的函数 function showGauges() { tempGauge =new Gauge({ renderTo :'tempgauge', width :250, height :250, glow :true, units :'in', title :'Sump Level' , minValue :0, maxValue :50, majorTicks :['0','10','20','30','40','50'], minorTicks :5, strokeTicks :false, highlight :[ { from :0, to :12, color :'rgba(50, 255, 61, .70)' }, { from :12, to :20, color :'rgba(205, 216, 0, .70)' }, { from :20, to :50, color :'rgba(255, 00, 0, .70)' }, ], colors :{ plate :'#824E00', majorTicks :'#f5f5f5', minorTicks :'#ddd ',标题:'#fff',单位:'#000',数字:'#eee',针:{开始:'rgba(240, 128, 128, 1)', 结束:'rgba(255, 160, 122, .9)' } } }); humGauge =new Gauge({ renderTo :'humgauge', width :250, height :250, glow :true, units :'Deg F', title :'Temperature', minValue :0, maxValue :100, majorTicks :['0 ','10','20','30','40','50','60','70','80','90','100'],minorTicks:5,strokeTicks:false , 亮点 :[ { from :0, to :50, color :'rgba(255, 0, 0, .70)' }, { from :50, to :65, color :'rgba(205, 216, 0, .70)' }, { from :65, to :80, color :'rgba(50, 255, 61, .70)' }, { from :80, to :100, color :'rgba(255, 0, 0, .70)' }, ], 颜色 :{ plate :'#824E00', majorTicks :'#f5f5f5', minorTicks :'#ddd', title :'#fff', units :'#000', numbers :'#eee', 针:{ 开始:'rgba(240, 128, 128, 1)', 结束:'rgba(255, 160, 122, .9)' } } }); tempGauge.draw(); humGauge.draw(); }; // 每 3 秒调用一次更新函数 setInterval(updateValues, 3000); // 从 Arduino 检索更新数据并更新图表和仪表的函数 function updateValues() { var actualTemp; var actualHum; var gotData =false; // 从 Arduino 获取数据,采用 JSON 格式并使用 JSONP 执行跨域调用 $('#status').css({"color":"yellow"}); $('#status').text("发送请求..."); var jqxhr =$.ajax({ url:'http://10.9.9.12:1000/?callback=?', dataType:'jsonp', jsonpCallback:'datas'}) // 如果请求成功... .done(function(data) { $('#status').css({"color":"green"}); $('#status').text("Request Received!"); // 保存检索两个变量中的数据并显示在 JS 控制台上 actualTemp =50 - data.sensor1; actualHum =data.sensor4; console.log("--------- 得到新数据 -------- --"); console.log("Temperature:\t" + actualTemp); console.log("Humidity:\t" + actualHum); console.log("Sump Level:\t" + data.sensor1); console.log("洪水警报:\t" + data.sensor2); console.log("断电:\t" + data.sensor3); console.log("温度:\t" + data.sensor4); console.log("湿度:\t" + data.sensor5); console.log("Aux 1:\t" + data.sensor6); console.log("Aux 2:\t" + data.sensor7); console.log("Aux 3:\t" + data.sensor8); console.log("Aux 4:\t" + data.sensor9); console.log("Aux 5:\t" + data.sensor10 ); console.log(""); console.log("更新值..."); // 更新 c harts,删除最旧的值 var x =(new Date()).getTime(); if(tempData.length ==100) tempData.shift(); tempData.push([x, actualTemp]); tempChar.series[0].data =tempData; tempChar.resetAxesScale(); tempChar.axes.xaxis.tickInterval =15; tempChar.axes.yaxis.min =0; tempChar.axes.yaxis.max =50; tempChar.replot(); if(humData.length ==100) humData.shift(); humData.push([x, actualHum]); humChar.series[0].data =humData; humChar.resetAxesScale(); humChar.axes.xaxis.tickInterval =15; humChar.axes.yaxis.min =0; humChar.axes.yaxis.max =100; humChar.replot(); // 更新仪表 tempGauge.setValue(actualTemp); humGauge.setValue(actualHum); console.log("...完成!");控制台日志(“”); //允许将变量传输到网页 var elArduino1 =document.getElementById('sensor1'); elArduino1.textContent =data.sensor1; var elArduino2 =document.getElementById('sensor2'); elArduino2.textContent =data.sensor2; var elArduino3 =document.getElementById('sensor3'); elArduino3.textContent =data.sensor3; var elArduino4 =document.getElementById('sensor4'); elArduino4.textContent =data.sensor4; var elArduino5 =document.getElementById('sensor5'); elArduino5.textContent =data.sensor5; var elArduino6 =document.getElementById('sensor6'); elArduino6.textContent =data.sensor6; var elArduino7 =document.getElementById('sensor7'); elArduino7.textContent =data.sensor7; var elArduino8 =document.getElementById('sensor8'); elArduino8.textContent =data.sensor8; var elArduino9 =document.getElementById('sensor9'); elArduino9.textContent =data.sensor9; var elArduino10 =document.getElementById('sensor10'); elArduino10.textContent =data.sensor10; var elArduino10 =document.getElementById('msgtimer'); elArduino10.textContent =data.msgtimer; }) // 如果错误打印到 JS 控制台 .fail(function() { console.log( "Unable to get new data :("); }); }Home Monitor Developed by Kevin Strain
日期和时间:
MUDSHARK INDUSTRIES
改变世界,创造更美好的未来。状态:
Sump Level 值: 距离顶部英寸
洪水警报 状态:
电源 状态:
温度 值: ° F
湿度 值: %
Aux Input 1 状态:
Aux Input 2 状态:
Aux Input 3 状态:
Aux Input 4 状态:
Aux Input 5 状态:
电子邮件已发送 分钟前
示意图
接口和报警器 LED%20BAR%202.sch
制造工艺
-
如何在家制作手势控制机器人
组件和用品 Arduino UNO × 1 Arduino Nano R3 × 1 HC-05 蓝牙模块 × 2 SparkFun 三轴加速度计和陀螺仪 - MPU-6050 × 1 直流电机,12 V × 2 橡胶轮 × 1 Texas Instruments 双 H 桥电机驱动器 L293D × 1 9V 电池(通用) × 2 必要的工具和机器 烙铁(通用) 焊锡丝,无铅
-
接近家时开灯
组件和用品 Arduino Yun × 1 LED(通用) × 1 电阻 221 ohm × 1 面包板(通用) × 1 跳线(通用) × 1 苹果 iPhone × 1 应用和在线服务 Arduino 网页编辑器 Blynk 关于这个项目 概览 你有没有想过当你靠近你的房子时,你家的灯会打开,这样你就永远不会走进你的房子,被黑暗包围?该设备旨在为您完成所有这些工作,因此当您使
-
Arduino PC 监视器
组件和用品 Arduino Leonardo 或其他 Arduino 设备,甚至带有 UART 转换器的 Atmega × 1 LCD 16x2 × 1 跳线(通用) × 1 关于这个项目 简介 这个项目的想法实际上源于对乐趣和知识的需求。这个项目很容易制作并且有很多应用程序。例如,我们可以使用它来控制、存储和显示一些硬件变量。 让我们开始吧 首先,我们需要连接我们的 LCD(我使用的是 I2C 转换器): 当我们这样做时,我们可以进入下一部分...... 让我们写一些代码..
-
基于 GSM 的家庭自动化
组件和用品 Arduino UNO × 1 12v 4 通道中继 × 1 Adafruit RGB 背光 LCD - 16x2 × 1 GSM 模块 SIM900A × 1 12v 适配器 × 1 必要的工具和机器 烙铁(通用) 应用和在线服务 Arduino IDE 关于这个项目 手机是本世纪的革命性发明。它最初是为拨打和接听电话和短信而设计的,但在智能手机出现后,它已成为整个世界。在这个项目中,我们正在构