Tengo un sensor de temperatura ADT7410 conectado a un ESP8266 que ejecuta nodemcu.
El problema que tengo es que solo puedo obtener buenos cambios de datos después de apagar y encender el ADT7410. Hasta eso, obtengo una lectura de temperatura fija razonable que no cambia incluso si caliento/enfrío el sensor o 0x0000 (un sensor desconectado da como resultado 0xFFFF). Intenté restablecer el IC sobre I2C pero no cambia nada.
El sistema consta de una placa base/placa secundaria. Este esquema muestra las conexiones entre las placas. Se han eliminado cosas no relacionadas en la placa base.
¿Cómo podría resolver esto para que el dispositivo comience a funcionar después de conectar la alimentación sin agregar un fet para apagar y encender la placa secundaria?
Código lua de NodeMCU:
---------------------
-- Wifi connection --
---------------------
function is_connected()
print(wifi.sta.status())
return wifi.sta.status() == 5
end
function block_connected()
while not is_connected() do
print("Waiting for connection")
tmr.delay(1000000)
end
print("WIFI connected!")
end
------------------
-- I2C & Sensor --
------------------
I2C_ID = 0
I2C_PIN_SDA = 2
I2C_PIN_SCL = 1
I2C_ADDRESS = 0x48
I2C_TEMP_REG_MSB = 0x00
I2C_TEMP_REG_LSB = 0x01
I2C_STATUS_REG = 0x02
I2C_CONF_REG = 0x03
function adt_reset()
i2c.start(I2C_ID)
i2c.address(I2C_ID, 0x00, i2c.TRANSMITTER)
i2c.write(I2C_ID, 0x06)
i2c.stop(I2C_ID)
end
function adt_setup()
i2c.start(I2C_ID)
i2c.address(I2C_ID, I2C_ADDRESS, i2c.TRANSMITTER)
i2c.write(I2C_ID, I2C_CONF_REG)
i2c.write(I2C_ID, 127)
i2c.stop(I2C_ID)
end
function read_reg(id, dev_addr, reg_addr)
i2c.start(id)
i2c.address(id, dev_addr ,i2c.TRANSMITTER)
i2c.write(id,reg_addr)
i2c.start(id)
i2c.address(id, dev_addr,i2c.RECEIVER)
c=i2c.read(id,1)
i2c.stop(id)
return string.byte(c)
end
function get_temp()
msb = read_reg(I2C_ID, I2C_ADDRESS, I2C_TEMP_REG_MSB)
print(msb)
lsb = read_reg(I2C_ID, I2C_ADDRESS, I2C_TEMP_REG_LSB)
print(lsb)
val = bit.lshift(msb, 8) + lsb
if bit.isset(msb, 7) then
return (val - 65536)/128
else
return val/128
end
end
---------------------
-- MQTT Connection --
---------------------
MQTT_HOST = "rabbitmq-sysd.containers.ikioma"
MQTT_PORT = 1883
MQTT_CLIENTID = "temp-" .. node.chipid()
MQTT_KEEPALIVE = 120
MQTT_USER = "guest"
MQTT_PASS = "guest"
MQTT_QOS = 1
MQTT_RETAIN = 0
mqtt_connected = false
m = mqtt.Client(MQTT_CLIENTID, MQTT_KEEPALIVE, MQTT_USER, MQTT_PASS)
function mqtt_connected()
print("MQTT connected")
mqtt_connected = true
m:publish("/connections", MQTT_CLIENTID, MQTT_QOS, MQTT_RETAIN)
end
function mqtt_disconnected()
print("MQTT disconnected")
mqtt_connected = false
end
function mqtt_get_connected()
return mqtt_connected
end
m:lwt("/lwt", MQTT_CLIENTID, MQTT_QOS, MQTT_RETAIN)
m:on("connect", function(con) print ("connected?") end)
m:on("offline", mqtt_disconnected)
mqtt_ip = ""
function mqtt_connect()
m:connect(mqtt_ip, MQTT_PORT, 0, 0, mqtt_connected)
end
function mqtt_connect_with_ip(ip)
mqtt_ip = ip
mqtt_connect()
end
function main_loop()
if mqtt_get_connected() then
m:publish("/" .. MQTT_CLIENTID, get_temp(), MQTT_QOS, MQTT_RETAIN, function(conn) print("sent") end)
if to_advertisement == 0 then
m:publish("/devices", MQTT_CLIENTID, MQTT_QOS, MQTT_RETAIN)
to_advertisement = ADVERTISE_INTERVAL
else
to_advertisement = to_advertisement - 1
end
else
mqtt_connect()
end
end
----------
-- MAIN --
----------
block_connected()
print(wifi.sta.getmac())
print(wifi.sta.getip())
i2c.setup(I2C_ID, I2C_PIN_SDA, I2C_PIN_SCL, i2c.SLOW)
adt_reset()
adt_setup()
sk = net.createConnection(net.TCP, 0)
sk:dns(MQTT_HOST, function(conn, ip) mqtt_connect_with_ip(ip) end)
sk = nil
ADVERTISE_INTERVAL = 10
to_advertisement = 0
-- run "loop" every 10s
tmr.alarm(0, 5000, 1, main_loop)
Sugeriría probar con otro fw, solo para verificar si no es un problema de NodeMCU. Así: https://github.com/cesanta/smart.js
Tiene una muestra para otro sensor de temperatura ( https://github.com/cesanta/smart.js/blob/master/platforms/esp8266/fs/MCP9808.js ), lo probé y me funciona.
Además, con smart.js puede probar el código C (no JS ni Lua).
Encontré mi problema. Era un valor de registro de configuración incorrecto.
La definición de los bits de configuración es la siguiente:
Lo que quise decir para configurar el sensor como estaba 0b10000000 (128)
, pero en su lugar escribí 127
, lo que significaba 0b01111111
. Un efecto de esto fue que Bits [6:5] == 11
apagó la parte de medición del dispositivo.
Funcionó bien cuando el dispositivo se restableció mediante un ciclo de encendido sin retransmitir el byte de configuración incorrecto. (Y después de arreglar el código)