el 01-15-2013 07:20 AM
Hola.
Tengo dos números de 2 bytes, que son valores de humedad y temperatura (del sensor SHT71), transmitidos por puerto serial.
Al valor de humedad necesito convertirlo en un valor de 14 bits de resolución, y al de temperatura en uno de 12 bits.
Cómo se hace ese procedimiento?
el 01-15-2013 08:29 AM
Asumiendo que lo que sale de la serial es una cadena de caracteres, puedes usar un type cast para convertir dos caracteres en un integer:
el 01-15-2013 08:50 AM
Hola,
1 bytes son 8 bits.
Si tienes 2 bytes, son 16bits, si la variable es de 14 bits significa que los dos primeros bit son 0, y que al pasarlo a decimal tienes un numero entre 0 y 2^14 -1 (16383), igualmente si la variable es de 12 bits significa que los 4 bits son 0, y que al pasarlo a decimal tienes un número entre 0 y 2^12 -1 (4095).
Lo primero que tienes que hacer es identificar cuales son esos bytes en la trama serial, y con un join de los dos bytes o un type cast, obtener ese numero (creo que ya esto lo tienes hecho de otro post). A partir de ese número según la característica de tu sensores debes aplicar una conversión de ese número al valor real de la variable en unidades de ingenieria, que puede ser a través de una calibración lineal o de alguna otra fórmula, según recuerdo en el datasheet de tu sensor hay unas fórmulas explicitas de como obtener ese valor, para lo cual tienes que hacer unas multiplicaciones y sumas de dicho valor con otros que estan en una tabla en el mismo datasheet, corrigeme si me equivoco y avisame si necesitas ayuda en eso.
Saludos,
el 01-16-2013 09:21 AM
Esto dice el datasheet:
Two bytes of measurement data and one byte of CRC checksum (optional) will then be transmitted. The microcontroller must acknowledge each byte by pulling the DATA line low. All values are MSB first, right justified (e.g. the 5th SCK is MSB for a 12bit value, for a 8bit result the first byte is not used).
el 01-16-2013 12:00 PM
Two bytes of measurement data and one byte of CRC checksum (optional) will then be transmitted. The microcontroller must acknowledge each byte by pulling the DATA line low. All values are MSB first, right justified (e.g. the 5th SCK is MSB for a 12bit value, for a 8bit result the first byte is not used).
Yo lo traduzco algo así:
Dos bytes de data medida y un byte de suma de chequeo CRC, codigo de redundancia ciclica, (opcional) seran transmitidos. El microcontrolador debe confirmar cada byte tirando la line de Datos a bajo. Todos los valores son MSB (bit mas significativo) primero, justificados a la derecha. (ejemplo: el quinto bit es el MSB para un valor con resolucion 12 bits, para un resultado de 8 bits el primer byte no es usado).
Tu paquete debería ser algo:
1er Byte 2do Byte CheckSum(Optional
BBBBBBBB BBBBBBBB BBBBBBBB
En el caso de 12 bytes sin checksum:
XXXXBBBB BBBBBBBB
En el caso de 8 bytes sin checksum:
XXXXXXXX BBBBBBBB
Donde las X's son dont care (cualquier valor), osea no influyen en tu lectura. Es posible que las X sean siempre 0, pero como no lo dice no seria bueno asumirlo, en dicho caso para 12 bits, puedes hacer un AND del primer byte con 00001111 (HExadecimal = 0x0F, Decimal = 15) para eliminar esos 4 primeros bits en caso de que tengan un valor distinto de 0. En el caso de 14 bytes, te interesa eliminar los dos primeros bits, y hacerle un AND con 00111111 (Hexadecimal = 0x3F, Decimal = 64).
Si te llega XXXX0101 10001011, eso es el numero binario 010110001011, y cuando lo pases a decimal será 1419.
No se exactamente cual era tu duda.
Saludos,
el 01-16-2013 06:20 PM
Hola Luis.
La explicación anterior es muy útil.
La forma como el sensor transmite los bytes se muestra en las figuras 11 y 12.
Según la tabla 5: Status Register, se debe seleccionar los bits de resolución de acuerdo al valor del lsb.
La pregunta es:
Teniendo los 2 bytes de cada variable:
1er Byte 2do Byte
BBBBBBBB BBBBBBBB
Cómo hago para evaluar el valor del lsb para decidir cuántos bits de resolución se deben tener en cuenta para luego convertir a humedad y temperatura?
Adjunto el enlace del datasheet
el 01-17-2013 12:02 PM
Hola,
La respuesta a "Cómo hago para evaluar el valor del lsb para decidir cuántos bits de resolución se deben tener en cuenta para luego convertir a humedad y temperatura?" es 42.
Es decir, no entiendo tu pregunta, fórmulala mejor y con gusto tratare de ayudarte en lo que pueda.
En "Table 5: Status Register Bits" el bit 0, segun el valor que le coloques es el que te dice con cuantos bits de resolución estas trabajando.
’1’ = 8bit RH / 12bit Temp.resolution
’0’ = 12bit RH / 14bit Temp. resolution
Saludos,
el 01-17-2013 02:27 PM
Hola Luis.
Si el sensor genera los siguientes Bytes: 10100101 1000101x, dónde x es el bit mesnos significativo lsb, ¿cómo se evalúa el valor de ese lsb para decidir cuál resolución escoger de acuerdo a la tabla 5?
Saludos.
el 01-17-2013 03:55 PM
Hola,
Si tienes dos bytes, significa que estas leyendo el valor de humedad, no el de configuracion (a menos que el segundo sea de checksum en cuyo caso deberias ver el lsb en el primer byte).
Si quieres saber que resolución o configurarla, tienes que leer o escribir el status register.
After the command Status Register Read or Status Register Write – see Table 4 – the content of 8 bits of the status register may be read out or written
Por default (a menos que tu lo hayas cambiado), el status register dice que usa 12bit RH 14bit Temp.
Suponiendo que si estas leyendo el status register, aquí te dejo dos formas como puedes verificar si tiene un valor de 1 o 0.
Espero esto te ayude un poco mas. Fijate que el index para leer los bits (si usas number to boolean array) estan de derecha a izquierda, naturalmente yo pensaba que era al contrario, pero hice la prueba y pude ver que es como lo coloque en la imagen.
Saludos,