亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

家庭监视器

组件和用品

Arduino Mega 2560
× 1
Arduino 以太网板
× 1
带 I2C 接口的 4x20 LCD
× 1
DHT22 温度传感器
× 1
DS3231 RTC
× 1
HC-SR04 超声波距离
× 1
OSH Park 定制PCB
× 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 文件来运行它,它们驻留在您正在使用的计算机上。 I
 Home 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

制造工艺

  1. 血压计
  2. 在家中构建无线传感器网络
  3. 使用 Raspberry Pi 监控家中温度
  4. RASPBERRY PI 家庭自动化
  5. 在家制作 DIY 作业书写机
  6. 使用 Arduino 制作流光溢彩监视器
  7. 使用物联网的心率监测器
  8. 热水器热电偶电压监测器
  9. 自主家庭助理机器人
  10. 由 Alexa 激活的 Arduino 家庭控制器
  11. MAX 30102 16x2 LCD 心率监测器
  12. 基于Arduino的智能能量监测器