Enviar código Hexadecimal a sensor (UART-TTL)

Hola,

Necesito enviar y recibir códigos hexadecimal desde/hacia un Arduino Leonardo a un sensor PM2005(Laser Particle Sensor). El sensor utiliza el protocolo UART-TTL (0 - 3.3V)

Por ejemplo: Los códigos que se envían al sensor son del tipo: 11030C021EC0 Los códigos que se reciben son del tipo: 16020C01DB y mensajes Hex tipo: 0B

Estoy utilizando los pines 0 y 1 del arduino con Serial1. Pero no logro ver la información que requiero.

Respecto a los HEX que envío desde el arduino al sensor, he intentado con array ya que de otra forma (int, log int, etc) el compilador da error de formato, debido al tamaño del HEX que quiero enviar.

Arduino Leonardo permite reaizar este tipo de conexiones con Hexadecimales de este tamañao via UART-TTL (3.3v) ??, gracias.

Todo muy lindo pero y el código?

Arduino Leonardo permite reaizar este tipo de conexiones con Hexadecimales de este tamañao via UART-TTL (3.3v) ??

El Leonardo tiene su UART a 5V, asi que tendrás que usar un conversor de niveles a 3.3V si es lo que necesitas.

Quedamos a la espera de tu códgigo

Muchas gracias !!!
Aquí el último intento que he hecho para enviar uno de los datos HEX desde el Arduino.

#include <stdio.h>



int respuesta_sensor;

// Estos on los códigos Hexadecimal que son enviados al sensor
// Con cualquier otro tipo de dato que no sea areglo de tipo char, el HEX se trunca por tamaño
// como por ejemplo utilizando dato tipo byte o transformando un arreglo con sprintf 

char abrir_mediciones[15]="0x11030C021EC0";
char cerrar_mediciones[15]="0x11030C011EC1";
char leer_mediciones[13]="0x11020B01E1";

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


void loop() {

// Estoy utilizando Pin 0 (RX) y pin 1 (TX) en  Arduino Leonardo

Serial.print("Abrir mediciones: ");
for(int i=0; i<13; i++)
{
Serial1.write(abrir_mediciones[i]);
Serial.print(abrir_mediciones[i]);
  }

// Enviando al sensor el mensaje 11030C021EC0 la respuesta debiese ser 16020C02DA
// Pero con este codigo no se obtiene la respuesta esperada y al omitir la condicion de if(Serial1.available()) se lee FFFFFFFF

if(Serial1.available()){
 respuesta_sensor = Serial1.read(); 
 Serial.print("\nRespuesta sensor: ");
 Serial.println(respuesta_sensor, HEX);
}
 
  Serial.println();
  delay(2000);
    
}

Que tal asi?

byte respuesta_sensor;

// Estos on los códigos Hexadecimal que son enviados al sensor
// Con cualquier otro tipo de dato que no sea areglo de tipo char, el HEX se trunca por tamaño
// como por ejemplo utilizando dato tipo byte o transformando un arreglo con sprintf 

unsigned long abrir_mediciones  = 0x11030C021EC0;  // 12 bits
unsigned long cerrar_mediciones = 0x11030C011EC1;  // 12 bits
unsigned long leer_mediciones   = 0x11020B01E1;    // 11 bits

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


void loop() {

// Estoy utilizando Pin 0 (RX) y pin 1 (TX) en  Arduino Leonardo

    Serial.print("Abrir mediciones: ");
    Serial1.print(abrir_mediciones); // envías toda la trama
    Serial.print(abrir_mediciones);  // envias toda la trama
  

// Enviando al sensor el mensaje 11030C021EC0 la respuesta debiese ser 16020C02DA
// Pero con este codigo no se obtiene la respuesta esperada y al omitir la condicion de if(Serial1.available()) se lee FFFFFFFF

    if(Serial1.available()){
        respuesta_sensor = Serial1.read();   // recibes como byte y presentas
        Serial.print("\nRespuesta sensor: ");
        Serial.println(respuesta_sensor, HEX);
    }

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

Gracias, probé el código con tus modificaciones y al compilar aparece el mismo warning, para cada una de las variables tipo "unsigned long":

7:35: warning: large integer implicitly truncated to unsigned type [-Woverflow]
unsigned long abrir_mediciones  = 0x11030C021EC0;  // 12 bits

Al ejecutar envía al puerto serial el mensaje truncado: C021ECO

cambiaa unsigned int 16 bits, me equivoqué con unsigned long 32 bits.

Hola. Prueba con array de bytes, no como una cadena.

byte abrir_mediciones[6] = {0x11, 0x03, 0x0C, 0x02, 0x1E, 0xC0};
Serial1.write(abrir_mediciones, 6);

Al cambiar tipo de dato a unsigned int aparece el mismo warning y corta el HEX.

7:34: warning: large integer implicitly truncated to unsigned type [-Woverflow]
unsigned int abrir_mediciones  = 0x11030C021EC0;  // 12 bits

A la hora de enciar datos directamente al puerto serie usa

Serial.write no el printf.

Es mi experiencia, sobre todo cuando uses Visual Studio .net

Por cierto, en el cual acabé un tutorial antes mismo.

Muchas Gracias a todos por la ayuda, aquí va el código que finalmente funcionó correctamente con sus aportes.

byte respuesta_sensor[5];
byte valor_medida[11];

byte abrir_mediciones[6] = {0x11, 0x03, 0x0C, 0x02, 0x1E, 0xC0};
byte cerrar_mediciones[6] = {0x11, 0x03, 0x0C, 0x01, 0x1E, 0xC1};
byte leer_mediciones[5] ={0x11, 0x02, 0x0B, 0x01, 0xE1};


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


void loop() {

// Se utiliza utilizando Pin 0 (RX) y pin 1 (TX) en  Arduino Leonardo
// En el sensor se utiliza pin 7 (RX) y pin 6 (TX) 


//=========================================
// Proceso para ABRIR las mediciones
//=========================================

  Serial1.write(abrir_mediciones, 6);
  for(int i=0; i<=4; i++){
  if(Serial1.available()){ 
    respuesta_sensor[i] = Serial1.read();
    }  
  }

  
    delay(60000); // Realiza mediciones cada 1 min



//=========================================
// Proceso para Leer las mediciones
//=========================================
  
  Serial1.write(leer_mediciones, 5);
  Serial.print("\nLectura: ");  
  for(int i=0; i<=11; i++){
  if(Serial1.available()){
    valor_medida[i] = Serial1.read();   // recibes como byte y presentas
    Serial.print(valor_medida[i],HEX);
     }  
    }



//=========================================
// Proceso para Cerrar las mediciones
//=========================================

  Serial1.write(cerrar_mediciones, 6);
  for(int i=0; i<=4; i++){
  if(Serial1.available()){
    respuesta_sensor[i] = Serial1.read();   // recibes como byte y presentas
    }    
  }

}