Problemas con Gy-906 (MLX90614)

Buenas noches.
He comprado este sensor para poder tomar medidas de temperatura.
El problema es que me retorna un error el cual siempre me devuelve 1037.55 como temperatura del objeto.
He leido por ahi que es un error.
Lo tengo conectado a un arduino nano al cual tambien tengo conectado un emisor bluetooth.

¿A que se debe que siempre obtenga el mismo valor?

El codigo es bien simple.

#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
char val = 'F';
int ciclo =  300;
char inicio = 'F';
void setup() { 
Serial.begin(9600);
mlx.begin();  
}
void loop() { 
if( Serial.available() ) {  
 val = Serial.read();
 if (val == 'S'){
  for ( int i = 0;i <= ciclo; i++){
     Serial.println(i);
   while(val != 'N'){  
    val = Serial.read();
     delay(100);
   }
   val='S';   
  }
 }
val ='F';
Serial.println('F');
delay (100);
}
}

Y me da la sensacion que el problema no viene de el.

Gracias y buenas noches.
Javier

Hola @zepjau con este 5 post en casi 5 hilos y ninguno terminado. Vienes tiras una pregunta y no editas porque nunca has leído las normas ni respondes.
Bueno, no voy a responder a esta consulta hasta que prestes atención y des razones de tus consultas inconclusas.
Si alguien quiere responder. es libre.

Normas del foro

Lo primero, mis disculpas.
No es mi intencion saltarme las normas.
Si sigo haciendo algo incorrecto, ahora mismo no sé en que me he equivocado salvo el codigo.

Vamos a comenzar con algo probado y no con este código.

Mira la página de Adafruit

El ejemplo es mixtest.ino o sea este que pongo a continuación.

#include <Wire.h>
#include <Adafruit_MLX90614.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

void setup() {
  Serial.begin(9600);

  Serial.println("Adafruit MLX90614 test");  

  mlx.begin();  
}

void loop() {
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC()); 
  Serial.print("*C\tObject = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C");
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempF()); 
  Serial.print("*F\tObject = "); Serial.print(mlx.readObjectTempF()); Serial.println("*F");

  Serial.println();
  delay(500);
}

esta todo resuelto no entiendo para que leer todo como si no existiera la librería.

Si, gracias.
Estas pruebas ya las he realizado y he probado todo tipo de opciones (que he visto) incluso leyendo algo por ahi he alimentado el circuito con un powerbank para ver si era ese el problema.

He probado tambien pasar un proceso de escaneo de I2c para ver si averiguaba la direccion y ha sido ahora que observo que no ve la placa o por lo menos eso me dice.

La placa que he probado es GY-906 y es esta la que me da problemas.

Muchas gracias de todas formas.

Un saludo,
Javier.

Hi,
Con esta placa tienes que tener mucho cuidado. Algunos vendedores dicen que es de 5 voltios y no es cierto. Las especificacciones del sensor dice que usa 3.3 voltios. El modulo que tu usas es de 3 voltios, Algunas viene con reguladores y puedes usarlos con 5 voltios. Si no tiene reguladores entonces solamente las puedes alimentar con 3.3 voltios sino se vas a danar el modulo. Algunas vienen con el addres de 76 o 77. Como ya corristes el programa que te dice el address entonces el problema puede ser los pines que estas usando para comunicarte. Recuerda que si usas el arduino tienes que tener los pines que suplan 3.3 voltios. Si usas uno que los pines son de 5 voltios necesitas usar un divisor usando resistencias. Por ultimo trata la libreria de #include <SparkFunMLX90614.h> . Esta es la que yo uso en mis modulos y no he tenido problemas. Pero primero tienes que determinar porque el programa que te da el address no trabaja.

1 Like

Estoy de acuerdo con @tauro, misma recomendación leí en la página de Adafruit. Tal vez simplemente lo has dañado aplicando 5V, cosa que no sabemos.

Gracias.

Si, casi seguro que me lo he cargado.
Lo puse a 5 v ya que el vendedor asi lo indicaba 3.3 - 5 v.
Crei que tenia un regulador en la misma placa por eso actué asi.

Veré si compro otro y a probar de nuevo.

Buenas noches.
Javier

Yo tengo el mismo problema y creo que es por la conexión en bus IIC con el sensor de temperatura, yo tengo conectado el sensor con una pantalla oled 128x64 y el error no me aparece hasta que comienzo a dibujar en la pantalla

Screenshot_20190623_201248.png

Screenshot_20190623_201248.png

Hi,
El sensor de IR que usas es un modulo o es el sensor solamente. Si es un modulo algunos vienen con las resistencias de 4.7K en el SDA y en el SCL ya instaldas.Los que no las tienen se las tienes que instalar externamente.

Coloca tu sensor directamente al bus I2C o mejor dicho quita la pantalla OLED y pruébalo a ver si arroja el error?

Si retiro la pantalla, imprime bien la temperatura,

tauro0221:
Hi,
El sensor de IR que usas es un modulo o es el sensor solamente. Si es un modulo algunos vienen con las resistencias de 4.7K en el SDA y en el SCL ya instaldas.Los que no las tienen se las tienes que instalar externamente.

Tengo el modulo con las resistencias

Hi,
Que pasa si remueve el sensor y corre la pantalla sola. Otra cosa haz corrido la routina que busca los address de los modulos que estan conectados en el I2C. Correla para ver cual son los address de ambos.

La pantalla funciona bien con o sin el sensor, es decir, dibuja , ya use el script para verificar las direcciones y funciono bien (sensor 0x5A y pantalla 0x3C * 2 => 0x78 )

el código que uso es el siguiente:

  • reescribí la parte que hacia la librería de adafruit (sensor) para verificar
#include "header.h"

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

U8G2_SH1106_128X64_NONAME_2_HW_I2C display(U8G2_R0, 18,19);

int test_counter = 0;
void setup() {
  Serial.begin(19200);
  Serial.println("[ MIMOC ]");

  display.begin();
  Wire.begin();  


  display.setI2CAddress(0x78);
  // mlx.begin();
  
  // Asing mode a used pines
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  assoc_led();
  // get temperature
  Serial.println("Temperature ->");
  uint16_t result = 0;
  float temp = 0;
  Wire.beginTransmission(0x5A);
  Wire.send(0x7);
  Wire.endTransmission(false);

  Wire.requestFrom(0x5A, 3);
  // while (!Wire.available()) {}
  delay(100);
  result = Wire.read();
  result |= Wire.read() << 8;
  Serial.println(result);
  temp = (float)result * .02;
  temp -= 273.15;
  Serial.println(temp);
  Serial.println();

  draw();
}

void assoc_led() {
  if(millis() - assoc_led_last_update < 500) return;
  digitalWrite(LED_BUILTIN, assoc_led_status ? HIGH : LOW);
  assoc_led_status = !assoc_led_status;
  assoc_led_last_update = millis();
}

void draw() {
  if(millis() - assoc_led_last_update < 500) return;
  display.firstPage();
  do {
    display.setCursor(0,15);
    display.setFont(u8g2_font_ncenB14_tr);
    display.drawBox(test_counter % 114, test_counter % 54, 10, 10);
    test_counter++;
  } while (display.nextPage());
}

Adjunto una imagen del montaje

Hi,
Sugerencia porque en vez de usar la instrucion wire no usas para leer la temperatura del objeto en C result = mlx.readObjectTempC().
Si quires leer la temperatura ambiental en C entonces usas
result = mlx.readAmbientTempC().

1 Like

En mi caso creo que el problema es la pantalla, al final lo solucione con añadiendo el sigiente código al después de dibujar en la pantalla.

Wire.end(); 
Wire.begin();

Gracias

También tenía el mismo problema y al revisar el módulo, las salidas SCL y SDA no estaban soldadas. Después de soldarlas funcionó muy bien.

A mi me ocurria lo mismo con el módulo GY-906 y parece que he dado con una solución:

Observé que si intercambiaba SDA y SCL (colocandolos al revés) y luego volvía a conectarlos correctamente el dispositivo comenzaba a leer las temperaturas correctamente. Eso si, hasta que quitas la alimentación y ya deja de funcionar. La solución automatizada que he tomado ha sido poner en LOW los pines A4 y A5 (SDA y SCL respectivamente) y meter un delay de 100 ms despues.
Si alguien sabe la explicación a esto, estaría bien. Dejo el sketch:

#include <Wire.h>
#include <Adafruit_MLX90614.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

void setup() {
Serial.begin(9600);

// añadido para que funciones el sensor de temperatura JLSM
pinMode(A4,OUTPUT);
pinMode(A5,OUTPUT);
digitalWrite(A4,LOW);
digitalWrite(A5,LOW);
delay(100);
///////////////////////////////////////////////////////JLSM

mlx.begin();
}

void loop() {
Serial.print("Ambiente = ");
Serial.print(mlx.readAmbientTempC());
Serial.print("ºC\tObjeto = ");
Serial.print(mlx.readObjectTempC());
Serial.println(“ºC”);
delay(500);
}

2 Likes

Hi,
Una pregunta si no me equivoco el modulo no tiene resistencia de pullup en la senales de SDAy SCK. Hay que anadirle las resistencia de 4k7 a ambas senales.La salida de las senales son lo que se conoce como “open collector” segund las especificaciones del fabricante.

2 posts were split to a new topic: Problemas con Gy-906