Está en la página 1de 12

Introducción

Este módulo de nodo de sensor RS-485 se puede utilizar en


diversas aplicaciones, como agricultura inteligente, monitoreo
del medio ambiente, automatización del hogar ... etc. Es un
dispositivo de Internet de las cosas. Este nodo de sensor RS-485
proporciona una entrada analógica de 6 canales y una entrada
digital de humedad y temperatura SHT1x. El protocolo RS485
admite hasta 254 nodos a 1200 m de distancia entre cada nodo.
Esto permite una cobertura de amplio rango para monitorear el
medio ambiente. Un diseño sin tornillos permite una fácil
conexión de cables sin bufanda, confiable y estable.
El estándar RS-485 se utiliza eficazmente a largas distancias y
en entornos eléctricamente ruidosos. Se pueden conectar
múltiples receptores a dicha red en una configuración lineal
multipunto. Estas características hacen que estas redes sean
útiles en entornos industriales y aplicaciones similares. RS-485
permite la configuración de redes locales económicas y enlaces
de comunicaciones multipunto. Ofrece velocidades de
transmisión de datos de 35 Mbit / s hasta 10 my 100 kbit / sa
1200 m.
El bus RS-485 es el método de comunicación más popular en la
industria. En comparación con el bus RS-232, es capaz de
transferir información a mayor distancia con un costo menor.
Establecer un "Internet de las cosas" mediante la integración de
RS-485 con Ethernet, que es el más disponible en el mundo, con
la esperanza de que este método coordine todos los dispositivos
con bajo costo y alta eficiencia.
Solicitud
● Agricultura inteligente
● Seguridad Pública
● Monitoreo ambiental
● Salud individual
● Automatización del hogar
Especificación
● MCU: Atmega8
● Voltaje de entrada: 12V
● Tasa de baudios: 9600
● Dirección de esclavo: 0x01 - 0x7F
● RS-485 comunicación de larga distancia, confiable y estable
● Conexión múltiple (hasta 127 módulos)
● Presione para conectar cables, rápido y fácil
● 1 interfaz de sensor de temperatura y humedad SHT1x
● Interfaz de sensor analógico de 6 canales
● 8 pequeños interruptores para configurar la dirección del esclavo
directamente
● Humedad: 0-100% RH (± 4.5% RH)
● Temperatura: -40-128,8 ℃ (± 0,5 ℃)
● Tamaño: 82x50 mm
Extender con el rodillo

Más detalles
Operación automática o manual: este bit es para configurar las
direcciones de los dispositivos esclavos por software o
hardware.
● A: configure la dirección del esclavo a través del software, cuando está en
el lado A, los Bits para configurar la dirección del esclavo no serán válidos.
● M: configurar la dirección del esclavo a través del hardware, cuando está
en el lado M significa que puede configurar la dirección del esclavo a través
de los 7 pequeños interruptores. Éxito para configurar después de 30
segundos.
Bits para configurar la dirección del esclavo: 0x01 ~ 0x7F, solo
sea efectivo en el lado M
Directiva de producto
● Verifique toda la directiva de datos en tiempo real actual - 0x21
Mando:

Cabeza Direcció Longitud Palabra Suma de


de n del del de comprob
palabra dispositi cuadro comando ación
vo
0x55 0xAA 0x11 0x00 0x21
Este comando comprobará todos los datos del dispositivo actual. Hay 10 datos
de registro en total. Un dato de registro es de 16 dígitos, que consta de 8
dígitos altos y 8 dígitos bajos.
Devuelve lo siguiente:

Orden de Ilustració Registrar Rango


contenid n de datos de
o registro registro
1 establec 0x00 1 para
er 0x01 automáti
manualm co; 0
ente / para
automáti manual
camente
el estado
de la
dirección
2 Medida 0x00 0,0 a
de 0x02 100,0%
humedad (HR)
3 Medida 0x00 -40,0 a
de 0x03 128,0
temperat (℃)
ura
4 Estado 0x00 1 por
de error 0x04 error; 0
SHT1X para
normal
5 Medición 0x00 0 hasta
analógic 0x05 1023
a1
6 Medición 0x00 0 hasta
analógic 0x06 1023
a2
7 Medición 0x00 0 hasta
analógic 0x07 1023
a3
8 Medición 0x00 0 hasta
analógic 0x08 1023
a4
7 Medición 0x00 0 hasta
analógic 0x07 1023
a3
8 Medición 0x00 0 hasta
analógic 0x08 1023
a4
9 Medición 0x00 0 hasta
analógic 0x09 1023
a5
10 Medición 0x00 0 hasta
analógic 0x10 1023
a6
'' 'Descripción de la instrucción: el valor del contenido consta de 2 bytes; 0,0 a
100,0 grados representan 0 a 1000; -40,0 a 128,0 grados soporte para -400 a
1280 ''
Valor devuelto:

Cabeza Direcció Longitud Palabra Contenid Suma de


de n del del de o comprob
palabra dispositi cuadro comando ación
vo
0x55 0xAA 0x11 0x14 0x21 H
Muestra:
Enviar instrucción:

Cabeza Direcció Longitud Palabra Suma de


de n del del de comprob
palabra dispositi cuadro comando ación
vo
0x55 0xAA 0x11 0x00 0x21
Instrucción de devolución:

Cabeza Direcció Longitud Palabra Contenid Contenid Contenid


de n del del de o1 o2 o3
palabra dispositi cuadro comando
vo
0x55 0xAA 0x11 0x14 0x21 0x00 0x00
0x00 0x00
Contenid Contenid Contenid Contenid Contenid Contenid Contenid
o4 o5 o6 o7 o8 o9 o10
0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x01 0x66 0x99 0x66 0x99 0x66 0x99
• Establecer dirección para el modelo --0x55
Mando:

Cabeza Direcció Longitud Palabra Contenid Suma de


de n del del de o comprob
palabra dispositi cuadro comando ación
vo
0x55 0xAA 0xAB 0x01 0x55 0x22
Cabeza Direcció Longitud Palabra Contenid Suma de
de n del del de o comprob
palabra dispositi cuadro comando ación
vo
0x55 0xAA 0xAB 0x01 0x55 0x22
Valor devuelto:

Cabeza Direcció Longitud Palabra Contenid Suma de


de n del del de o comprob
palabra dispositi cuadro comando ación
vo
0x55 0xAA 0xAB 0x01 0x55 0x22
Descripción de la instrucción: 0xAB es la dirección de transmisión, es
decir, es la dirección compartida de todos los modelos. Envíe 0x55 a la
dirección 0xAB para establecer la dirección del modelo en el estado del
modelo incierto
Según la nueva dirección del dispositivo, el modelo devolverá
0x55 después de que la dirección se haya configurado
correctamente; En el estado manual, el envío de 0x55 no puede
configurar la dirección del dispositivo actual, si el producto
puede configurar la dirección del dispositivo de forma manual y
automática. Luego, el valor de retorno es 0xFE que ilustra el
producto en el estado de la dirección de configuración manual.
Valor devuelto:

Cabeza Direcció Longitud Palabra Contenid Suma de


de n del del de o comprob
palabra dispositi cuadro comando ación
vo
0x55 0xAA 0xAB 0x01 0x55 0xFF
Muestra:
Enviar instrucción:

Cabeza Direcció Longitud Palabra Contenid Suma de


de n del del de o comprob
palabra dispositi cuadro comando ación
vo
0x55 0xAA 0xAB 0x01 0x55 0x11
esta muestra se utiliza para configurar la dirección del dispositivo como 0x11.
En el estado de configuración de dirección manualmente
Enviar instrucción:

Cabeza Direcció Longitud Palabra Contenid Suma de


de n del del de o comprob
palabra dispositi cuadro comando ación
vo
0x55 0xAA 0xAB 0x01 0x55 0x11
Cabeza Direcció Longitud Palabra Contenid Suma de
de n del del de o comprob
palabra dispositi cuadro comando ación
vo
0x55 0xAA 0xAB 0x01 0x55 0x11
Instrucción de devolución:

Cabeza Direcció Longitud Palabra Contenid Suma de


de n del del de o comprob
palabra dispositi cuadro comando ación
vo
0x55 0xAA 0xAB 0x01 0x55 0xFF
Diagrama de conexión

Código de muestra
/*
# The Sample code for test the data of Analogue_Test and SHT1X Module

# Editor : Lisper
# Date : 2013.12.9
# Ver : 1.3
# Product: Analogue_Test and SHT1X Module
# SKU : DFR0233
# Description:
# Read the Analog value and the data of humidity & temperature

# Hardwares:
1. Arduino UNO
2. IO Expansion Shield V5
3. Analogue_Test and SHT1X Module

# Interface: RS485
# Note: Connect the Analogue_Test and SHT1X Module with IO Expansion
Shield V5 through RS485
Set the address of the module in manual,range from 0x02 to 0x7F,take effect
after 30 seconds
*/

#define uint unsigned int


#define uchar unsigned char
#define ulong unsigned long
#define addr 0x02 //set address of the device for 0x02
uchar cmd[50];
uchar receive_ACK[100];
int EN = 2;

#if defined(ARDUINO) && ARDUINO >= 100


#include "Arduino.h"
#define printByte(args) Serial.write(args)
#define printlnByte(args) Serial.write(args),Serial.println()
#else
#include "WProgram.h"
#define printByte(args) Serial.print(args,BYTE)
#define printlnByte(args) Serial.println(args,BYTE)
#endif

void setup() {
Serial.begin(9600);
pinMode(2, OUTPUT); // TTL -> RS485 chip driver pin
}

void loop() {
static ulong timepoint = 0;
if (millis() - timepoint > 1000) {
read_command();
timepoint = millis();
}
if (Serial.available() > 0) data_return();
// delay(1000);

/************************Send command to Analogue_Test and SHT1X


Module*************************/
void read_command()
{
int i;
char sum_cmd = 0;
digitalWrite(EN, HIGH); // Turn the drvier pin to HIGH -> Turn on code
transmitting mode for the RS485 interface
// Turn the driver pin to LOW -> Turn on reading mode for the RS485 interface
delay(10);
cmd[0] = 0x55;
cmd[1] = 0xaa;
cmd[2] = addr;
cmd[3] = 0x00;
cmd[4] = 0x21;
for (i = 0; i < 5; i++) {
sum_cmd += cmd[i];
}
cmd[5] = sum_cmd;

for (i = 0; i < 6; i++) {

printByte(cmd[i]);// command send to device


#if defined(ARDUINO) && ARDUINO >= 100
Serial.flush();// complete the transmission of outgoing serial data
#endif
delay(10);
}
digitalWrite(EN, LOW);
}
/************Feedback data of the Analog value and humidity & temperature
************/\

void data_return()
{
digitalWrite(EN, LOW); // Turn the driver pin to LOW -> Turn on reading mode
for the RS485 interface
delay(10);
int i = 0;
unsigned long timer = millis();

while (true) {
if (Serial.available()) {
receive_ACK[i] = Serial.read();
i++;
}
if (millis() - timer > 100) {
break;
Serial.println("Finish reading!");
}
}
print_data () ;

/*************************************************************************/
// Display the original data

// for(int j = 0; j < 26; j++){


// Serial.print(receive_ACK[j],HEX); // return command
// Serial.print(" ");
// }
// Serial.println(" ");
}

void show_0x21_command(void)
{
sht1x_data();
Analog_test_data();

/************Deal with datas from Sht1x humidity & temperature


sensor************/

void sht1x_data()
{
uint humidity;
uint temperature;
humidity = receive_ACK[7] * 256 + receive_ACK[8];
temperature = receive_ACK[9] * 256 + receive_ACK[10];
Serial.print("H:");
Serial.print(humidity / 10, DEC);
Serial.print(" ");
Serial.print("T:");
Serial.println(temperature / 10, DEC);
}

/********************Deal with datas from 6 Analog Sensors****************/


void Analog_test_data()
{
char register_addr;
uint Analog_data;
register_addr = 13;
Serial.print("Analog Value:");
for (int n = 1; n < 7; n++) {
Analog_data = receive_ACK[register_addr] * 256 + receive_ACK[register_addr
+ 1];
register_addr = register_addr + 2;
Serial.print(Analog_data, DEC);
Serial.print(" ");
}
Serial.println(" ");
delay(1000);
}

/*************************** by lisper *********************************/


//print humidity and temperature
void print_data () {
if (checksum ()) { // if check sum is right
Serial.println ();
float humidity = read_uint8_t (receive_ACK, 7) / 10.0;
Serial.print ("humidity=");
Serial.println (humidity, 2);

float temperature = (read_uint8_t (receive_ACK, 9) / 10.0);


Serial.print ("temperature=");
Serial.println (temperature, 2);
}
else {
Serial.print ("\ncheck sum error! sum=");
Serial.println (getsum_add (receive_ACK, 25), HEX);
}
}

//if check sum is ok


boolean checksum () {
uint8_t checksum = getsum_add (receive_ACK, 25);
if (checksum == receive_ACK[25])
return true;
else
return false;
}

//read 2 byte to uint16_t


uint16_t read_uint8_t (uint8_t *buffer, uint8_t sub) { // Big-Endian, first byte
is high byte
return ((uint16_t)(buffer[sub]) << 8) + buffer[sub + 1];
}

//get check sum, add from 0 to length-1


uint8_t getsum_add (uint8_t *buffer, uint8_t length) {
uint8_t sum;
for (int i = sum = 0; i < length; i++) {
sum += buffer[i];
}
return sum;
}
/*******************************************************************************/

También podría gustarte