¡Enciende un ventilador cuando la temperatura sea demasiado alta! - Tutorial de diablillo eléctrico

En nuestro último tutorial de Electric Imp , aprendimos cómo medir la temperatura, la humedad y el confort térmico general con Ubidots . En esta ocasión vamos a realizar un sencillo control de encendido y apagado del ventilador. Registraremos la temperatura en Ubidots y activaremos un evento cuando supere los 30 ºC para que Electric Imp encienda un ventilador, y luego un disparador para apagarlo cuando la temperatura esté por debajo de 27 ºC.

Realmente funciona de maravilla, así que allá vamos:

Materiales

  • Tres cables hembra a hembra

  • resistencia de 10k

  • Sensor de humedad y temperatura DHT11

-Un pequeño fan

-Una cola PowerSwitch

Alambrado

Así es como se deben conectar todos los componentes:

…y sólo queda una cosa: ¡conecta tu ventilador!

Codificación

  • Inicie sesión en Electric Imp IDE y tome nota de la URL de su Imp:

Copie los siguientes dos códigos. En el código del Agente, usaremos una función para manejar las solicitudes HTTP a Ubidots , no olvide colocar el token y la identificación de las variables de su Ubidots .

  • Código de agente:
device.on("temp", function(value) { //server.log("Intentando publicar en Ubi el valor:"); //server.log(value); encabezados locales = { "Content-Type": "application/json", "X-Auth-Token": "NBbF3PWPxWc2IaO40aXOKnhIu8tOv92rYN3ibiEc7Jh6GV3KZUUCHtXuNz7Y" } // Reemplace el token con el suyo local url = "http: ubidots .com/api/v1.6/variables/53d2beb376254246 30223dac/ valores"; // Reemplace el ID de variable con el suyo cadena local = {"valor": valor}; solicitud local = http.post(url, encabezados, http.jsonencode(cadena)); respuesta local = request.sendsync(); }); device.on("hum", function(value) { //server.log("Intentando publicar en Ubi el valor:hola"); //server.log(value); encabezados locales = { "Tipo de contenido" : "application/json", "X-Auth-Token": "NBbF3PWPxWc2IaO40aXOKnhIu8tOv92rYN3ibiEc7Jh6GV3KZUUCHtXuNz7Y" } // Reemplaza el token con la tuya local url = "http: ubidots .com/api/v1.6/variables/53e541e5762542 2c7d900a1d /values"; // Reemplace el ID de variable con el suyo cadena local = {"value": value}; solicitud local = http.post(url, encabezados, http.jsonencode(string)); respuesta local = request.sendsync() ; }); function requestHandler(solicitud, respuesta) { try { // comprueba si el usuario envió el led como parámetro de consulta if ("relay" en request.query) { server.log("entre"); // si lo hicieron, y led=1... establece nuestra variable en 1 if (request.query.relay == "1" || request.query.relay == "0") { // convierte el parámetro de consulta led a un número entero local RelayState = request.query.relay.tointeger(); // envía el mensaje "led" al dispositivo y envía ledState como datos device.send("relay", RelayState); } } // envía una respuesta diciendo que todo estaba bien. respuesta.enviar(200, "OK"); } catch (ex) { respuesta.send(500, "Error interno del servidor: " + ex); } } // registra el controlador HTTP http.onrequest(requestHandler);
  • Código del dispositivo:

Tenga en cuenta la última parte del código donde hay una función para encender/apagar el ventilador con la cola Powerswitch.

constante SPICLK = 937,5; // Clase para leer el sensor de temperatura/humedad DHT11 // Estos sensores utilizan un protocolo propietario de un solo cable. El imp // emula este protocolo con SPI. // Para usar: // - vincula MOSI a MISO con una resistencia de 10k // - vincula MISO a la línea de datos en el sensor clase DHT11 { static STARTTIME_LOW = 0.001000; // 1 ms de tiempo bajo para inicio estático STARTTIME_HIGH = 0.000020; // 20 us min tiempo máximo para inicio estático STARTTIME_SENSOR = 0.000080; // 80 us bajo / 80 us alto "ACK" del sensor en INICIO static MARKTIME = 0.000050; // 50 us pulso bajo entre 0 o 1 marcas static ZERO = 0.000026; // 26 us alto para "0" estático UNO = 0.000075; // 70 us alto para "1" spi = null; clkspeed = nulo; tiempo de bits = nulo; bytetime = nulo; start_low_bits = nulo; start_low_bytes = nulo; start_high_bits = nulo; start_high_bytes = nulo; start_ack_bits = nulo; start_ack_bytes = nulo; mark_bits = nulo; marca_bytes = nulo; cero_bits = nulo; cero_bytes = nulo; uno_bits = nulo; one_bytes = nulo; // constructor de clase // Entrada: // _spi: un periférico SPI preconfigurado (por ejemplo, spi257) // _clkspeed: la velocidad a la que se ha configurado el SPI para ejecutarse // Retorno: (Ninguno) constructor(_spi, _clkspeed) { this.spi = _spi; this.clkspeed = _clkspeed; tiempo de bits = 1,0 / (velocidad de clk * 1000); tiempo de bytes = 8,0 * tiempo de bits; start_low_bits = STARTTIME_LOW / bittime; inicio_low_bytes = (inicio_low_bits / 8); start_high_bits = STARTTIME_HIGH / bittime; inicio_alto_bytes = (inicio_alto_bits / 8); start_ack_bits = STARTTIME_SENSOR / bittime; start_ack_bytes = (start_ack_bits / 8); mark_bits = MARKTIME / bittime; marca_bytes = (marca_bits / 8); zero_bits = CERO / bittime; cero_bytes = (cero_bits / 8); one_bits = UNO / bittime; un_bytes = (un_bits / 8); } // función auxiliar // dado un blob largo, encontrar tiempos entre transiciones y analizar // valores de temperatura y humedad. Asume un valor de retorno de 40 bits (16 humedad / 16 temperatura / 8 suma de comprobación) // Entrada: // hexblob (blob de longitud arbitraria) // Retorno: // tabla que contiene: // "rh": humedad relativa (flotante) / / "temp": temperatura en grados centígrados (flotante) // si la lectura falla, rh y temp devolverán 0 function parse(hexblob) { local laststate = 0; último bitidx local = 0; gotack local = falso; rawidx local = 0; resultado local = blob(5); // Humedad de 2 bytes, temperatura de 2 bytes, suma de comprobación de 1 byte humedad local = 0; temperatura local = 0; // iterar a través de cada bit de cada byte de la señal devuelta for (byte local = 0; byte < hexblob.len(); byte++) { for (bit local = 7; bit >= 0; bit--) { thisbit local = (blob hexadecimal [byte] & (0x01 << bit))? 1:0; if (thisbit! = laststate) { if (thisbit) { // transición de bajo a alto; observe cuánto tiempo permanece alto laststate = 1; últimobitidx = (8 * byte) + (7 - bit); } else { // transición de alto a bajo; último estado = 0; idx local = (8 * byte) + (7 - bit); hora alta local = (idx - lastbitidx) * bittime; // ahora tenemos un poco de información válida. Averigua qué símbolo es. byte de resultado local = (rawidx / 8); bit de resultado local = 7 - (rawidx % 8); //server.log(format("bit %d del byte %d",resultbit, resultbyte)); if (hightime < ZERO) { // esto es un cero if (gotack) { // no registre ningún dato antes de que se vea el ACK resultado[resultbyte] = resultado[resultbyte] & ~(0x01 << resultbit); rawidx++; } } else if (hightime < UNO) { // este es un if (gotack) { resultado[resultbyte] = resultado[resultbyte] | (0x01 << bit de resultado); rawidx++; } } else { // este es un INICIO ACK gotack = true; } } } } } //server.log(format("parsed: 0x %02x%02x %02x%02x %02x",resultado[0],resultado[1],resultado[2],resultado[3],resultado [4])); húmedo = (resultado[0] * 1.0) + (resultado[1] / 1000.0); if (resultado[2] & 0x80) { // resultado de temperatura negativa[2] = ((~resultado[2]) + 1) & 0xff; } temp = (resultado[2] * 1.0) + (resultado[3] / 1000.0); if (((resultado[0] + resultado[1] + resultado[2] + resultado[3]) & 0xff) != resultado[4]) { return {"rh":0,"temp":0}; } else { return {"rh":húmedo,"temp":temp}; } } // lee el sensor // Entrada: (ninguna) // Retorno: // tabla que contiene: // "rh": humedad relativa (flotación) // "temp": temperatura en grados centígrados (flotación) // si se lee falla, rh y temp devolverán 0 function read() { local bloblen = start_low_bytes + start_high_bytes + (40 * (mark_bytes + one_bytes)); startblob local = blob(bloblen); for (local i = 0; i < start_low_bytes; i++) { startblob.writen(0x00,'b'); } for (local j = start_low_bytes; j < bloblen; j++) { startblob.writen(0xff,'b'); } //server.log(format("Enviando %d bytes", startblob.len())); resultado local = spi.writeread(startblob); devolver análisis (resultado); } } relé <- hardware.pin8; spi <-hardware.spi257; rele.configure(DIGITAL_OUT); función setRelay(relayState){ server.log("relayState:" + reléState); relé.write (estado de relé); } agente.on("retransmisión", setRelay); función mainLoop(){imp.wakeup(1.0, mainLoop); clkspeed <- spi.configure (MSB_FIRST, SPICLK); dht11 <- DHT11(spi, clkspeed); datos <- dht11.read(); server.log(format("Humedad relativa: %0.1f",data.rh)+" %"); server.log(format("Temperatura: %0.1f C",data.temp)); agente.enviar("temp",datos.temp); agente.send("hum",data.rh); }bucle principal();

Configurar eventos Ubidots

  • En su cuenta Ubidots , cree una fuente de datos con dos variables: temperatura y humedad

  • Haga clic en la sección "Eventos" y agregue uno:

  • Elija Electric imp como fuente y temperatura (temp) como variable.

  • Ponga una condición cuando la temperatura supere los 30ºC.

  • Elija Solicitar URL” y escriba su URL Imp más “?relay=1”

  • Agrega otro evento con este condicional.

  • Elija "Solicitar URL" y escriba su URL Imp más "?relay=0"

Concluyendo

En este proyecto pudimos controlar un ventilador eléctrico desde internet con Electric Imp. Así como controlamos un ventilador usando datos de temperatura, también puedes registrar cualquier otro dato y tomar acciones basadas en ellos. Por ejemplo, puedes abrir la puerta de tu garaje cada vez que tu gato se acerque a un sensor de movimiento (¡lo que significa que quiere salir!).

No olvides revisar algunas de nuestras últimas publicaciones:

Si eres nuevo en Ubidots , ¡mira esta excelente pieza inicial y regístrate gratis hoy!