Cómo medir el confort térmico y eléctrica Imp Ubidots (5 / 10 paso)

Paso 5: Código

Vamos a comenzar la codificación. Cuando se trabaja con imp eléctrico, tendrá dos secciones de código: uno para el dispositivo y otro para el agente. Gracias a Thomas Byrne para proporcionar la clase para manejar el sensor DHT11 en Github. Aquí viene el código del dispositivo (un poco largo ya que tiene la clase para manejar la DHT11):

 <br><p>const SPICLK = 937.5;<br>// Class to read the DHT11 temperature/humidity sensor // These sensors us a proprietary one-wire protocol. The imp // emulates this protocol with SPI. // To use: // - tie MOSI to MISO with a 10k resistor // - tie MISO to the data line on the sensor class DHT11 { static STARTTIME_LOW = 0.001000; // 1 ms low time for start static STARTTIME_HIGH = 0.000020; // 20 us min high time for start static STARTTIME_SENSOR = 0.000080; // 80 us low / 80 us high "ACK" from sensor on START static MARKTIME = 0.000050; // 50 us low pulse between 0 or 1 marks static ZERO = 0.000026; // 26 us high for "0" static ONE = 0.000075; // 70 us high for "1" spi = null; clkspeed = null; bittime = null; bytetime = null; start_low_bits = null; start_low_bytes = null; start_high_bits = null; start_high_bytes = null; start_ack_bits = null; start_ack_bytes = null; mark_bits = null; mark_bytes = null; zero_bits = null; zero_bytes = null; one_bits = null; one_bytes = null; // class constructor // Input: // _spi: a pre-configured SPI peripheral (e.g. spi257) // _clkspeed: the speed the SPI has been configured to run at // Return: (None) constructor(_spi, _clkspeed) { this.spi = _spi; this.clkspeed = _clkspeed; bittime = 1.0 / (clkspeed * 1000); bytetime = 8.0 * bittime; start_low_bits = STARTTIME_LOW / bittime; start_low_bytes = (start_low_bits / 8); start_high_bits = STARTTIME_HIGH / bittime; start_high_bytes = (start_high_bits / 8); start_ack_bits = STARTTIME_SENSOR / bittime; start_ack_bytes = (start_ack_bits / 8); mark_bits = MARKTIME / bittime; mark_bytes = (mark_bits / 8); zero_bits = ZERO / bittime; zero_bytes = (zero_bits / 8); one_bits = ONE / bittime; one_bytes = (one_bits / 8); } // helper function // given a long blob, find times between transitions and parse to // temp and humidity values. Assumes 40-bit return value (16 humidity / 16 temp / 8 checksum) // Input: // hexblob (blob of arbitrary length) // Return: // table containing: // "rh": relative humidity (float) // "temp": temperature in celsius (float) // if read fails, rh and temp will return 0 function parse(hexblob) { local laststate = 0; local lastbitidx = 0; local gotack = false; local rawidx = 0; local result = blob(5); // 2-byte humidity, 2-byte temp, 1-byte checksum local humid = 0; local temp = 0; // iterate through each bit of each byte of the returned signal for (local byte = 0; byte < hexblob.len(); byte++) { for (local bit = 7; bit >= 0; bit--) { local thisbit = (hexblob[byte] & (0x01 << bit)) ? 1:0; if (thisbit != laststate) { if (thisbit) { // low-to-high transition; watch to see how long it is high laststate = 1; lastbitidx = (8 * byte) + (7 - bit); } else { // high-to-low transition; laststate = 0; local idx = (8 * byte) + (7 - bit); local hightime = (idx - lastbitidx) * bittime; // we now have one valid bit of info. Figure out what symbol it is. local resultbyte = (rawidx / 8); local resultbit = 7 - (rawidx % 8); //server.log(format("bit %d of byte %d",resultbit, resultbyte)); if (hightime < ZERO) { // this is a zero if (gotack) { // don't record any data before the ACK is seen result[resultbyte] = result[resultbyte] & ~(0x01 << resultbit); rawidx++; } } else if (hightime < ONE) { // this is a one if (gotack) { result[resultbyte] = result[resultbyte] | (0x01 << resultbit); rawidx++; } } else { // this is a START ACK gotack = true; } } } } } //server.log(format("parsed: 0x %02x%02x %02x%02x %02x",result[0],result[1],result[2],result[3],result[4])); humid = (result[0] * 1.0) + (result[1] / 1000.0); if (result[2] & 0x80) { // negative temperature result[2] = ((~result[2]) + 1) & 0xff; } temp = (result[2] * 1.0) + (result[3] / 1000.0); if (((result[0] + result[1] + result[2] + result[3]) & 0xff) != result[4]) { return {"rh":0,"temp":0}; } else { return {"rh":humid,"temp":temp}; } } // read the sensor // Input: (none) // Return: // table containing: // "rh": relative humidity (float) // "temp": temperature in celsius (float) // if read fails, rh and temp will return 0 function read() { local bloblen = start_low_bytes + start_high_bytes + (40 * (mark_bytes + one_bytes)); local startblob = 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("Sending %d bytes", startblob.len())); local result = spi.writeread(startblob); return parse(result); } } rele <- hardware.pin9; spi <- hardware.spi257;</p><p>while(1){ clkspeed <- spi.configure(MSB_FIRST, SPICLK); dht11 <- DHT11(spi, clkspeed); data <- dht11.read(); server.log(format("Relative Humidity: %0.1f",data.rh)+" %"); server.log(format("Temperature: %0.1f C",data.temp)); agent.send("temp",data.temp); imp.sleep(1);</p><p>}</p> 

Artículos Relacionados

Registrador de temperatura para piel

Registrador de temperatura para piel

Como parte de CSCI 7000 computación CU Boulder física para el buen curso creé una temperatura de piel medida/registro de dispositivo usable y confort térmico del usuario (caliente, tibio, neutral, fresco, frío). La meta es eventualmente desarrollar u
Fácil de construir digital termómetro e higrómetro para uso en interiores

Fácil de construir digital termómetro e higrómetro para uso en interiores

IntroducciónNivel de temperatura y humedad interior son dos parámetros fundamentales que determinan el nivel de comodidad para los ocupantes de la habitación. En los principales lugares de trabajo, estos parámetros son controlados y mantenidos en niv
ThermoSeat

ThermoSeat

Como ingenieros de Diseño Industrial en la DelftUniversidad tecnológica, analizamos una tecnología emergente para el curso de tecnologías para el diseño de concepto, donde las nuevas tecnologías vienen a luz y aplicada a productos.La tecnología emerg
SmartMesh - Arduino y Android controlado neumático fachada

SmartMesh - Arduino y Android controlado neumático fachada

Este proyecto fue parte de Multimodal Media locura 2014, organizado por la Cátedra para ordenador asistido por arquitectura diseño automatizado (CAAD) y Media Computing Group de la Universidad de RWTH Aquisgrán. Para pieles más inteligentes, por favo
Una lámpara inteligente "cómoda"

Una lámpara inteligente "cómoda"

Clicca qui por la versione italianaEn primer lugar, considerar este enlace para más detalles: http://www.mdpi.com/1424-8220/16/3/338La elegante lámpara es una lámpara de escritorio aparentemente no diferente de los demás que se encuentran en las ofic
Sensor de nivel de la piscina

Sensor de nivel de la piscina

Hace unos años nos mudamos a una casa con una piscina pequeña. Es una vieja, construida hace tiempo en los años 70. He sustituido las bombas y actualizado el controlador de la piscina pero mantenimiento de la piscina a un nivel adecuado, bien, sufrió
TempBug: termómetro conectado a internet

TempBug: termómetro conectado a internet

En enero pasado, tuvimos algunos problemas con el calor en mi oficina. Específicamente, el tipo de problemas en donde el calor no es, que suba y todavía no no encendido. Esto se encendió por más de unos días y terminó un día o dos después de que cons
Sensor de temperatura inalámbrico simple actualización de sitio web con electric imp y termistor

Sensor de temperatura inalámbrico simple actualización de sitio web con electric imp y termistor

[Edición 2014] El planificador que fue utilizado por Imp eléctrico ya no es usado y no está disponible ya. [/Edit]Este es un pequeño proyecto para empezar con la eléctrica imp y un termistor para que pueda ver cómo puede obtener las lecturas de tempe
Termómetro de barbacoa Chef IMP: Internet-Connected

Termómetro de barbacoa Chef IMP: Internet-Connected

cuando era un niño, cocinar nuestras vacaciones pavo o asado con uno de los termómetros poco pop-up que usted simplemente pega en el pájaro, que aparece (probablemente) cuando el pájaro está hecho, o por lo menos seguro para comer. Teníamos un montón
NeoWeather: Ambient Weather Indicator

NeoWeather: Ambient Weather Indicator

Todos no podemos tener el escritorio al lado de la ventana. En mi caso, mi compañero de trabajo en el escritorio frente al mío tiene el asiento de la ventana. Cuando llega el momento de hacer la caminata por la calle para conseguir algo, nunca estoy
Permite hacer A $20 droides

Permite hacer A $20 droides

construcción de su propio estilo de R2d2 astromecánico puede obtener muy caro muy rápido y muy complejo para construir. Desafié a idear una forma de construir un droide astromecánico de estilo que es relativamente barato de construir y no tienes que
Red de notificación de la danza

Red de notificación de la danza

puesto que terminar la escuela regularmente escucho amigos diciendo "estoy triste por no tomar más electrónica / programación / web dev clases y aprender cómo usarlo." En los 3 años que llevo fuera de la escuela, siento que he aprendido habilida
Internet Enabled Solar Tracker

Internet Enabled Solar Tracker

Se trata de un seguidor Solar. Un tamaño completo, nube conectada, smartphone accesible rastreador Solar construido principalmente de 2x4s y madera contrachapada, empleando madera peg engranajes, postes de la cortina reciclada, tuercas, pernos y vari
Papel Piecing una almohada mirando 3D

Papel Piecing una almohada mirando 3D

Papel remendar, también conocida como Fundación juntando las piezas, es un método de acolchar en que papel se utilizan piezas de corte en el patrón requerido para estabilizar a la tela para coser. Estos patrones de papel ayuda a crear muchos edredón