Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Monitor de casa

Componentes y suministros

Arduino Mega 2560
× 1
placa Ethernet Arduino
× 1
LCD 4x20 con interfaz I2C
× 1
Sensor de temperatura DHT22
× 1
DS3231 RTC
× 1
HC-SR04 distancia ultrasónica
× 1
OSH Park Custom fabricado PCB
× 1

Acerca de este proyecto

Comencé con el monitoreo del hogar instalando un termostato Ecobee Smart en la casa de mi hija. Ecobee los ha descontinuado, así que quería una alternativa que permitiera monitorear cosas como el nivel del sumidero, la alarma de inundación, la pérdida de energía y otros elementos. Dibujé mucho de otros proyectos en varios sitios, especialmente para la codificación tanto de Arduino como del sitio web. El uso de Pushingbox para notificaciones fue la parte clave del sistema para permitir un medio de notificación remota. Agradezco a la comunidad de diseño abierta por publicar sus conocimientos y proyectos.

Comencé con un Arduino Mega 2560, agregué una tarjeta Ethernet. Usando Eagle cad, diseñé un par de placas para entradas, así como un anunciador visual. Hice que estos los hiciera OSH Park. La placa de interfaz conecta los siete contactos secos disponibles, el sensor de temperatura y humedad, el reloj en tiempo real y el sensor de nivel de sumidero ultrasónico al Arduino.

Para la visualización local, utilicé una pantalla LCD de 4x20. También hay 8 leds que muestran el estado de cualquier entrada de alarma, ámbar cuando está encendido, verde cuando se borra y apagado cuando se reinicia.
El botón de reinicio borra los leds verdes mientras que el mensaje enable PB enciende / apaga las notificaciones usando Pushingbox.

El sitio web se muestra solo en la LAN. No quería portar mi enrutador por posibles razones de seguridad. Hubo varios ejemplos de Arduino de los que usé partes, así como jqplot, ya que quería estar solo en mi sistema de laboratorio.

Sitio web de visualización completa.

Aún no hay etiquetas, sin embargo, el software está configurado para emitir una alarma a menos de 10 pulgadas del sensor y el LED ámbar se enciende para indicar que esta alarma está activa. La alarma que es verde muestra que una vez estuvo adentro pero que se ha abierto desde entonces. Al presionar el botón de reinicio, el LED verde se apagará, sin embargo, el LED ámbar permanecerá encendido hasta que el nivel supere las 10 pulgadas.

Código

  • código Arduino
  • Sitio web
Código Arduino C / C ++
 // Código del monitor doméstico / * ASIGNACIONES arduino grn led interfaz de led rojo anunciador anunciador sensor # pin de entrada variable pin de salida pin de salida tablero variable tablero pin tablero rojo pin grn nivel 1 6,8 18 19 pulgadas x15-2 a 6 , x15-3 a 8 20-1 20-2 alarma de inundación 2 28 23 25 x15-4 20-3 20-4 pérdida de potencia 3 30 27 29 x15-5 20-5 20-6 temperatura 4 ftemp 5 (ftemp, 1 ) x15-1 humedad 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 8 aux3 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 42 x15-10 inhibición de mensajes msginhbt 44 x15-12mensaje led 17 * debe cambiar para escudo wifi WIRINGVCC a 5VLCD:pin SDA a pin 21LCD:pin SCL a pin 20DHT:pin 1 de DHT a VCCDHT:pin 2 de DHT a pin 5 y 10K a VCCDHT:pin 3 de DHT de repuestoDHT:DHT pin 4 a GNDSR04:SR04 pin disparo a pin 8SR04:SR04 pin eco a pin 6RTC:SDA pin a pin 21RTC:SCL pin a pin 20 PÉRDIDA DE ALIMENTACIÓN pin 30 ALARMA DE INUNDACIÓN pin 28 MENSAJE El pin 17 del LED no puede usar los pines 4, 7, 10, 11, 12, 13 50, 51, 52 y 53 * /// BIBLIOTECAS # incluye  #include  #include  # include  #include  #include  #include  #include  #include  // tamaño del búfer utilizado para capturar HTTP peticiones # define REQ_BUF_SZ 50 // Dirección MAC de la etiqueta protectora de Ethernet debajo de boardbyte mac [] ={0xzz, 0xzz, 0xzz, 0xzz, 0xzz, 0xzz}; IPAddress ip (192, 168, 1, 100); // (10, 9, 9, 12); o (192,168,1,100); Dirección IP, es posible que deba cambiar según la puerta de enlace networkIPAddress (192,168,1,1); // (10,9,9,1):o (192,168,1,1); no utilizado previamente en otros bocetos PUEDE TENER QUE ELIMINARIPAddress subnet (255,255,255,0); // (255,255,255,0); no utilizado previamente en otros bocetos PUEDE TENER QUE ELIMINAREthernetServer server (1000); // crea un servidor en el puerto 1000File webFile; // el archivo de la página web en la tarjeta SDchar HTTP_req [REQ_BUF_SZ] ={0}; // solicitud HTTP almacenada en búfer almacenada como cadena terminada en nulo req_index =0; // indexar en el búfer HTTP_req // Su DevID secreto de PushingBox.com. Puede utilizar varios DevID en varios pines si desea cargar DEVID1 [] ="xxxxxxxxxxxxxxxxx"; // Escenario:"este es el primer escenario de alerta" ponga su DevID aquí entre comillas // CONFIGURACIÓN DEL DISPOSITIVO // configurar LCDLiquidCrystal_I2C lcd (0x27,20,4); // establece la dirección LCD en 0x27 para una pantalla de 16 caracteres y 2 líneas // configura DHT22dht DHT; #define DHT22_PIN 5 // configura la sonda # define TRIGGER_PIN 8 // Pin de Arduino vinculado al pin de disparo en el sensor ultrasónico. # define ECHO_PIN 6 // Pin de Arduino atado al pin de eco en el sensor ultrasónico. # Define MAX_DISTANCE 200 // Distancia máxima para la que queremos hacer ping (en centímetros). La distancia máxima del sensor está clasificada en 400-500 cm. Nueva sonda Ping (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Configuración NewPing de pines y distancia máxima.//setup RTCRTC_DS3231 RTC; // Variables globales unsigned long mathtime1 =0; mathtime2 largo sin signo =0; mathtime3 largo sin signo =0; unsigned long mathtime3a =0; unsigned long mathtime4 =0; Cadena de tiempo; Cadena de fecha; pulgadas int sin firmar; float ftemp; flotar fhumi; int aux1; int aux2; int aux3; int aux4; int aux5; int reset; int msginhbt =BAJO; int sensor1 =0; String sensor2 =0; String sensor3 =0; int sensor4 =0; int sensor5 =0; String sensor6 =0; String sensor7 =0; String sensor8 =0; String sensor9 =0; String sensor10 =0; String messagesend; 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"; booleano lastConnected =falso; booleano DEBUG =verdadero; // para solucionar problemas pushboxboolean DEBUG1 =true; // para solucionar problemas websiteboolean DEBUG2 =false; // para solucionar problemas datavoid setup () {// OPERACIONES CON TARJETA SD // deshabilitar el chip Ethernet pinMode (10, OUTPUT); escritura digital (10, ALTA); // INICIAR SERIE PARA DEPURAR Serial.begin (9600); if (DEBUG1) {Serial.println ("Programa de inicio ...");} Ethernet.begin (mac, ip, gateway, subnet); if (DEBUG1) {Serial.println ("Active Server IP:"); Serial.println (Ethernet.localIP ());} server.begin (); // inicializar la tarjeta SD if (DEBUG1) {Serial.println ("Inicializando tarjeta SD ...");} if (! SD.begin (4)) {if (DEBUG1) {Serial.println ("ERROR - tarjeta SD ¡la inicialización falló! ");} return; // init falló} if (DEBUG1) {Serial.println ("SUCCESS - Tarjeta SD inicializada.");} // verifica el archivo index.htm if (! SD.exists ("index.htm")) {if ( DEBUG1) {Serial.println ("ERROR - ¡No se puede encontrar el archivo index.htm!");} Return; // no se puede encontrar el archivo de índice} Serial.println ("SUCCESS - Se encontró el archivo index.htm."); // INICIALIZAR EL EQUIPO // inicializar el servidor web Ethernet.begin (mac, ip); // inicializar el dispositivo Ethernet server.begin (); // empezar a escuchar a los clientes // inicializar el lcd lcd.init (); // inicializar el RTC Wire.begin (); RTC.begin (); if (! RTC.isrunning ()) {if (DEBUG2) {Serial.println ("¡RTC NO se está ejecutando!");} // la siguiente línea establece el RTC en la fecha y hora en que se compiló este boceto RTC.adjust (DateTime (__FECHA Y HORA__)); } DateTime ahora =RTC.now (); DateTime compilado =DateTime (__ DATE__, __TIME__); if (now.unixtime ()  -1) {// verifica si el comando vino homefront =homefront + 6; // obtiene el siguiente carácter int endfront =homefront + 3; // Espero que este comando de 3 caracteres String action =line.substring (homefront, endfront); // recupere el valor del comando 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:"); cliente .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 ( "})"); } descanso; } si (c =='\ n') {continuo =verdadero; } más si (c! ='\ r') {continuo =falso; }}} retraso (1); client.stop (); } 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 ("Dirección IP de mi sitio web:"); Serial.println (Ethernet.localIP ());}} void timeanddate () {// hora y fecha DateTime ahora =RTC.now (); DateTime future (now.unixtime () - 0); // la corrección de tiempo fue en 840 String hourstring; Cadena de minutos; String secondtring; if (future.hour () <10) {hourstring ='0' + String (future.hour ()) + ':';} else {hourstring =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 ());} cadena de tiempo =cadena de horas + cadena de minutos + cadena de segundos; Cadena de meses; Cadena de días; Cadena de años; 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 ()) + '/';} datetring =monthstring + daystring + future.year (); lcd.setCursor (0,0); lcd.print (cadena de tiempo); lcd.setCursor (10,0); lcd.print (cadena de fecha); mathtime1 =(ahora.unixtime ()); regreso; } sensor ultrasónico void () {// sensor ultrasónico {unsigned int uS =sonar.ping_median (5); // Enviar ping, obtener el tiempo de ping en microsegundos (EE. UU.). lcd.setCursor (9,1); lcd.print (""); lcd.setCursor (9,1); lcd.print (US / US_ROUNDTRIP_IN); // Convierta el tiempo de ping a la distancia en cm e imprima el resultado (0 =fuera del rango de distancia establecido) pulgadas =(uS / US_ROUNDTRIP_IN); sensor1 =pulgadas; if (DEBUG2) {Serial.print ("Distancia:"); Serial.println (pulgadas);}} return;} void dht22 () {// sensor de temperatura y humedad {if ((mathtime1 - mathtime4)> 2) { int chk =DHT.read22 (DHT22_PIN); fhumi =(DHT. humedad); ftemp =((DHT. temperatura * 1.8) +32); lcd.setCursor (9,2); impresión lcd (fhumi, 1); lcd.setCursor (12,3); lcd.print (ftemp, 1); mathtime4 =mathtime1; } // retraso (2000); // Retraso de 2 segundos para las lecturas if (DEBUG2) {Serial.println ("Temperature and Humidity:");} if (DEBUG2) {Serial.println (ftemp, 1);} if (DEBUG2) {Serial.println (fhumi , 1);}} return;} void annunciator () {// alarma de sumidero if (pulgadas <10) {digitalWrite (18, HIGH); escritura digital (19, ALTA); } else {digitalWrite (19, LOW);} // alarma de inundación if (digitalRead (28) ==HIGH) {digitalWrite (23, HIGH); escritura digital (25, ALTA); } else {digitalWrite (25, LOW);} // pérdida de potencia alarmif (digitalRead (30) ==HIGH) {digitalWrite (27, HIGH); escritura digital (29, ALTA); } else {digitalWrite (29, LOW);} // aux 1 alarmif (digitalRead (32) ==HIGH) {digitalWrite (31, HIGH); escritura digital (33, ALTA); } else {digitalWrite (33, LOW);} // aux 2 alarmif (digitalRead (34) ==HIGH) {digitalWrite (35, HIGH); escritura digital (37, ALTA); } else {digitalWrite (37, LOW);} // aux 3 alarmif (digitalRead (36) ==HIGH) {digitalWrite (39, HIGH); escritura digital (41, ALTA); } else {digitalWrite (41, LOW);} // aux 4 alarmif (digitalRead (38) ==HIGH) {digitalWrite (43, HIGH); escritura digital (45, ALTA); } else {digitalWrite (45, LOW);} // aux 5 alarmif (digitalRead (40) ==HIGH) {digitalWrite (47, HIGH); escritura digital (49, ALTA); } else {digitalWrite (49, LOW);} // restablecer 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; {para (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) // el cambio a 300 segundos envía el mensaje no más de cada 5 minutos {mathtime2 =mathtime1; if (DEBUG1) {Serial.println ("¡ENVIAR MENSAJE!");} Cliente EthernetClient; Serial.println ("Ethernet listo"); // imprime la dirección IP de la placa / escudo Ethernet:Serial.print ("Mi dirección IP de SENDMESSAGE:"); Serial.println (Ethernet.localIP ()); // dale al escudo de Ethernet un segundo para inicializar:delay (1000); if (DEBUG2) {Serial.print ("valor entrante:"); Serial.println (messagesend);} String repel =messagesend; char room [repel. length () + 1]; repel.toCharArray (habitación, repeler.length () + 1); if (DEBUG2) {Serial.print ("Este es el valor que se está enmarcando:"); Serial.println (habitación);} client.stop (); if (DEBUG) {Serial.println ("conectando ...");} if (client.connect (serverName, 80)) {if (DEBUG) {Serial.println ("conectado");} if (DEBUG) { Serial.println ("solicitud de envío");} client.print ("GET / pushbox? Devid ="); client.print (devid); client.print ("&room ="); if (DEBUG) {Serial.print ("Este es el valor que se envía:"); Serial.println (habitación);} cliente.print (habitación); client.println ("HTTP / 1.1"); client.print ("Host:"); client.println (nombreDeServidor); client.println ("Usuario-Agente:Arduino"); cliente.println (); } else {if (DEBUG) {Serial.println ("conexión fallida");}}}} return;} 
Sitio web JavaScript
necesita agregar los archivos js y css para ejecutar esto, residen en la computadora que está utilizando. I
    Home Monitor              //    // Gráficos e indicadores de objetos var tempChar, humChar; var tempGauge, humGauge; // Matrices que almacenan puntos de datos para los dos gráficos var tempData =new Array (); var humData =new Array (); // Crear datos "ficticios" en el pasado para los dos gráficos var startTime =(new Date ()). GetTime () - 270000; para (var i =0; i <10; i ++) {tempData.push ([startTime, 20]); humData.push ([hora de inicio, 50]); startTime + =30000; } // Cuando el documento esté listo, cree objetos y llene gráficos con datos "ficticios" $ (documento) .ready (function () {showCharts (); showGauges ();}); // Función que muestra la función de dos gráficos showCharts () {tempChar =$ .jqplot ('tempchartdiv', [tempData], {title:'Sump Level', series:[{showMarker:false, lineWidth:1, color:" blue "}], ejes:{xaxis:{renderizador:$. jqplot.DateAxisRenderer, tickOptions:{formatString:'% M:% S',}, tickInterval:15}, yaxis:{min:0, max:30, tickInterval:5,}}}); humChar =$ .jqplot ('humchartdiv', [humData], {título:'Temperatura', serie:[{showMarker:false, lineWidth:1, color:"red"}], ejes:{xaxis:{renderizador:$ .jqplot.DateAxisRenderer, tickOptions:{formatString:'% M:% S'}, tickInterval:10}, yaxis:{min:0, max:100, tickInterval:10}}}); } // Función que muestra la función de dos indicadores 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:falso, resaltados:[{from :0, a:12, color:'rgba (50, 255, 61, .70)'}, {desde:12, a:20, color:'rgba (205, 216, 0, .70)'}, {from:20, to:50, color:'rgba (255, 00, 0, .70)'},], colors:{plate:'# 824E00', majorTicks:'# f5f5f5', minorTicks:'#ddd ', título:' #fff ', unidades:' # 000 ', números:' #eee ', aguja:{inicio:' rgba (240, 128, 128, 1) ', final:' 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:falso , destacados:[{desde:0, hasta:50, color:'rgba (255, 0, 0, .70)'}, {desde:50, hasta:65, color:'rgba (205, 216, 0, .70) '}, {desde:65, hasta:80, color:' rgba (50, 255, 61, .70) '}, {desde:80, hasta:100, color:' rgba (255, 0, 0, .70) '},], colores:{placa:' # 824E00 ', majorTicks:' # f5f5f5 ', minorTicks:' #ddd ', título:' #fff ', unidades:' # 000 ', números:'#eee', aguja:{inicio:'rgba (240, 128, 128, 1)', final:'rgba (255, 160, 122, .9)'}}}); tempGauge.draw (); humGauge.draw (); }; // llamar a la función de actualización cada 3 segundos setInterval (updateValues, 3000); // función que recupera datos actualizados de Arduino y actualiza gráficos y medidores function updateValues ​​() {var actualTemp; var actualHum; var gotData =false; // obtener datos de Arduino, en formato JSON y usando JSONP para realizar una llamada entre dominios $ ('# status'). css ({"color":"yellow"}); $ ('# estado'). text ("Enviando solicitud ..."); var jqxhr =$ .ajax ({url:'http://10.9.9.12:1000/?callback=?', dataType:'jsonp', jsonpCallback:'datas'}) // si la solicitud fue exitosa ... .done (function (data) {$ ('# status'). css ({"color":"green"}); $ ('# status'). text ("Request Received!"); // guardar recuperado datos en dos variables y mostrarlos en la consola JS actualTemp =50 - data.sensor1; actualHum =data.sensor4; console.log ("---------- Obtuve nuevos datos -------- - "); console.log (" Temperatura:\ t "+ actualTemp); console.log (" Humedad:\ t "+ actualHum); console.log (" Nivel de sumidero:\ t "+ data.sensor1); console.log ("Alarma de inundación:\ t" + data.sensor2); console.log ("Pérdida de energía:\ t" + data.sensor3); console.log ("Temperatura:\ t" + data.sensor4); console.log ("Humedad:\ 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 ("Actualizando valores ..."); // actualiza c harts, eliminando el valor más antiguo 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 (); // actualizar medidores tempGauge.setValue (actualTemp); humGauge.setValue (actualHum); console.log ("... listo!"); console.log (""); // permite la transferencia de variables a la página web 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; }) // si hay un error, imprímalo en la consola JS .fail (function () {console.log ("No se pueden obtener datos nuevos :(");});}         

Home Monitor Desarrollado por Kevin Strain

Fecha y hora:

INDUSTRIAS MUDSHARK
Cambiando el mundo para un futuro mejor.

Estado:

Nivel de sumidero Valor: pulgadas desde la parte superior

Alarma de inundación Estado:

Energía Estado:

Temperatura Valor: &# 176 F

Humedad Valor: %

Entrada auxiliar 1 Estado:

Entrada auxiliar 2 Estado:

Entrada auxiliar 3 Estado:

Entrada auxiliar 4 Estado:

Entrada auxiliar 5 Estado:

Mensaje de correo electrónico enviado hace minutos

Esquemas

Interfaz y anunciador LED% 20BAR% 202.sch

Proceso de manufactura

  1. Monitor de presión arterial
  2. Creación de una red de sensores inalámbricos en su hogar
  3. Controle la temperatura de su hogar usando su Raspberry Pi
  4. RASPBERRY PI HOME AUTOMATION
  5. Haga una máquina de escribir para hacer tareas caseras en casa
  6. Hacer Monitor Ambilight usando Arduino
  7. Monitor de frecuencia cardíaca con IoT
  8. Monitor de voltaje del termopar del calentador de agua caliente
  9. Robot asistente doméstico autónomo
  10. Controlador Arduino Home activado por Alexa
  11. Monitor de frecuencia cardíaca MAX 30102 en LCD 16x2