Leer UART 16 bits de un sensor ultrasónico detector de nivel de agua

capitanp

Miembro irreconocible
Buenas buenas, estoy tratando de almacenar el valor de 16 bits que me envía el sensor ultrasonico SR04T el cual me envia cada 100ms los 4 bytes del dato en HEXA de forma

0XFF - HIGH DATA - LOW DATA - SUMA

Suma seria como una verificacion de los datos SUMA = ( 0XFF + HIGH DATA + LOW DATA)

Lo capturo con un arduino en el pin 0

Código:
int incomingByte = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {

  if (Serial.available() > 0) {
    // leo
    incomingByte = Serial.read();
  //muestro
    Serial.println(incomingByte, HEX);
    delay(1000);
  }
}


De lo que no me avispo es como unir HIGH DATA y LOW DATA para hacer una palabra de 16bits, alguno que me tire un guiño, gracias


Captura de pantalla 2021-05-09 a la(s) 00.22.45.pngCaptura de pantalla 2021-05-09 a la(s) 00.24.59.png
 
podría ser rotar 8 veces a la izquierda el high byte en un int16 y después sumar el los byte
Int 16 valor;

Valor = high<<8;
Valor = valor +low;
Se me ocurre algo mejor para evitar meter basura:

valor= ((high<<8 ) & 0xFF00 | low );

la idea es usar una mascara AND para evitar meter basura en el rotado a la izquierda del primer byte y la OR para meter el segundo byte.
 
Última edición:
Acá expliqué una forma de hacerlo sin mascaras ni rotaciones:
 
Termine haciendo esto de un ejemplo del autor del dispositivo, reconoce el primer byte (0xff, 255) , luego pega y corre los dos siguientes bytes


Código:
}

void loop() {
  int avg = 0;
for (int i=0;i<10;i++) {
  int temp = readSerial();
  if (temp >= 255 || temp <= 0) { i = i -1;}
   else { avg = avg + temp; }
}
 int distance = avg;
Serial.print(distance);Serial.println(" mm.");


Ahora ando corto de tiempo despues subo mas avances ya tengo el cono donde alojar el transductor ultrasonico para que tenga mejor precisión y estoy agregando un lcd
 
Atrás
Arriba