ADT7410 El sensor de temperatura I2C funciona solo después de un ciclo de encendido (ESP8266)

0

Tengo un sensor de temperatura ADT7410 conectado a un módulo de funcionamiento ESP8266.

El problema que tengo es que solo puedo obtener buenos datos cambiantes después de apagar y encender el ADT7410. Hasta que 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 a través de I2C, pero no cambia nada.

El sistema consiste en una placa base / placa base. Este esquema muestra las conexiones entre los tableros. Las cosas no relacionadas en la placa base se han eliminado.

¿Cómopodríaresolverestoparaqueeldispositivocomienceafuncionardespuésdeenchufarlaalimentaciónsinagregarunfetparaapagaryencenderlaplacasecundaria?


CódigoluaNodeMCU:

-----------------------Wificonnection-----------------------functionis_connected()print(wifi.sta.status())returnwifi.sta.status()==5endfunctionblock_connected()whilenotis_connected()doprint("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)
    
pregunta varesa

2 respuestas

0

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 configurar el sensor era 0b10000000 (128) , pero en lugar de eso 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 energía sin retransmitir el byte de configuración incorrecto. (Y después de arreglar el código)

    
respondido por el varesa
2

Yo sugeriría probar con otro fw, solo para comprobar si no es un problema de NodeMCU. Así: enlace

Tiene una muestra para otro sensor de temperatura ( enlace ), Lo intenté, y me funciona.

Además, con smart.js puedes probar el código C (no JS y no Lua).

    
respondido por el Alexander Alashkin

Lea otras preguntas en las etiquetas