Hola Amigos
Actualmente estoy tratando de hacer un sensor de niveles de liquido con 3 sensores que responden a comandos HEXADECIMALES sobre RS485
Basicamente tengo 3 sensores y un ARDUINO UNO con el shield de DFRObot conectados a la red 485.
Mi ARDUINO tendra la direccion 01 de la red y mis sensores 02,03 y 04 respectivamente.
Para preguntarle a los sensores por su data debo enviar el siguiente comando en HEXADECIMAL:
[prefijo pregunta para sensor] [direccion del sensor] [comando de pregunta de nivel] [checksum]
0x31 0x02 0x06 0x39 //Para sensor 2 el prefijo siempre es 31h y el comando siempre es 06h
0x31 0x03 0x06 0xFD //Para sensor 3
0x31 0x04 0x06 0x93 //Para sensor 4
Luego de esto cada sensor me debe responder algo similar a esto:
[prefijo respuesta sensor] [direccion sensor] [comando respondido] [temperatura °C] [nivel 1byte] [nivel 2byte] [frecuencia1byte] [frecuencia2byte] [checksum]
un ejemplo seria:
3E 02 06 1C 1D 0A E2 05 C4 //el prefijo respuesta siempre sera 3Eh
Tengo un primer sketch y aun no lo pruebo, pero tengo muchas dudas si le voy a enviar bien los comandos a las sondas(digo en hexadecimal) y si los estoy recibiendo bien tmb.
alguien podria ayudarme con la revision?
//Primer sketch de comunicacion con las sondas
int tka = 4;//Estos pines van a ser controlados externamente para saber por cual sonda pregunta el arduino
int tkb = 7;
int tkc = 8;
int EN = 2; //RS485 shield Enable terminal, High for Send , Low for Receive
byte data[8];
byte cont;
#define myaddress 01
void setup() {
Serial.begin(9600);
pinMode(tka,INPUT);
pinMode(tkb,INPUT);
pinMode(tkc,INPUT);
pinMode(EN,OUTPUT);
digitalWrite(EN,LOW);
}
void loop()
{
if (digitalRead(4)==HIGH){
Serial.flush();
//(byte prefix,byte address,byte command,byte checksum)
//Voy a Enviar (0x31, 0x02, 0x06, 0x39)
sendCMD(49,2,6,57);
//DESPUES DE ESTO DEBERIA PONER EN==LOW, PARA RECIBIR LA RESPUESTA DE LA SONDA, POR EL MOMENTO LO VOY A HACER SIN VERIFICAR EL CHECKSUM.
//OSEA EN BRUTO DEBERIA RECIBIR ALGO SIMILAR A: 0x3E, 0x02, 0x06, 0x1C, 0x1D, 0x0A, 0xE2, 0x05, 0xC4
//Siempre va a tener el mismo tamaño 9 bytes (byte prefix, byte address, byte command, byte tempe, byte lvl1, byte lvl2, byte freq1, byte frec2, byte checksum)
receiveINFO();
}
if (digitalRead(7)==HIGH){
Serial.flush();
//(byte prefix,byte address,byte command,byte checksum)
//Voy a Enviar (0x31, 0x02, 0x06, 0xFD)
sendCMD(49,3,6,253);
receiveINFO();
}
if (digitalRead(8)==HIGH){
Serial.flush();
//(byte prefix,byte address,byte command,byte checksum)
//Voy a Enviar (0x31, 0x02, 0x06, 0x93)
sendCMD(49,4,6,147);
receiveINFO();
}
}
//Funciones
byte receiveINFO()
{
byte byte_receive;
byte conteo=0;
while(Serial.available())
{
byte_receive=Serial.read();
if (byte_receive==62)
{
while(conteo<=9)
{
data[cont]==byte_receive;
cont=cont+1;
}
}
}
}
void sendCMD(byte prefix,byte address,byte command,byte checksum)
{
digitalWrite(EN,HIGH);
delay(1);
Serial.print(prefix,HEX);
Serial.print(address,HEX);
Serial.print(command,HEX);
Serial.print(checksum,HEX);
digitalWrite(EN,LOW);
}
SondasRS485.ino (2.04 KB)