|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  Raspberry Pi Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  AutoIt (Programación) Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


.

Arduino en español
Circuitos con Arduino - Juan Antonio Villalpando

-- Tutorial de iniciación a Arduino --

Volver al índice del tutorial

___________________________

27C.- Radio Frecuencia. FS1000A y JY-JS03. 433 MHz. Distancia. Errores.

- En estos ejemplos no voy a utilizar App Inventor ni Bluetooth.

- Simplemente el módulo Transmisor enviará automáticamente datos al módulo Receptor, se vizualizarán en una pantalla LCD.

- Este montaje está destinado a comprobar a qué distancia se pueden comunicar.

- En este ejemplo los dos módulos están alimentados con pilas para poder hacer las comprobaciones en el exterior.

 

___________________________
1.- Envío de paquete de datos y comprobación de consistencia.

- Lo primero que se me ocurrió en enviar datos del TX al RX y comprobar si esos datos han llegado correctamente.

- El Transmisor envía un paquete de la forma: 4-83-23-110

- El primer elemento, es el número de paquetes se están enviando, va evolucionando progresivamente: 1, 2, 3, 4, 5... hasta el 9999 y vuelve a 0.

- El segundo y tercer número son números aleatorios comprendidos entre 10 y 99. alea1 y alea2.

- El tercer cuarto número es la suma de los tres anteriores, por ejemplo 4 + 83 + 23 = 110

- Se envía el Paquete = "4-83-23-110"

Transmisor.ino

// Juan A. Villalpando
// kio4.com
// Código del Emisor.
// Conectar el módulo al terminal 12 del Arduino.

#include <RH_ASK.h>
#include <SPI.h> 

RH_ASK rf_driver;

String Paquete = "";
int paquetes = 0;
int alea1;
int alea2;
int suma_TX;
String suma_r;

void setup() { 
  Serial.begin(9600);
  rf_driver.init();
}
                                  
void loop() { 
  paquetes++;
  if (paquetes >= 9999){paquetes = 0;}
  alea1 = random(10,99);
  alea2 = random(10,99);
  suma_TX = paquetes + alea1 + alea2;
  Paquete = (String) paquetes + "-" + (String) alea1 + "-" + (String) alea2 + "-" + (String) suma_TX;
  Serial.println(Paquete);
  char *msg = Paquete.c_str();
  rf_driver.send((uint8_t *)msg, strlen(msg));
  rf_driver.waitPacketSent();
  delay(100);
} 

- El Receptor recibe en Paquete = "4-83-23-110"

- Descompone esa cadena de caracteres:

paquetes = 4
alea1 = 83
alea2 = 23
suma_TX = 110

Realiza la suma_RX de paquetes + alea1 + alea2, en caso que sea igual a la suma_TX es que el paquete ha llegado correctamente, en este caso las dos sumas dan 110.

- En caso que llegara erróneamente "4-83-24-110" el paquete habría llegado de forma errónea ya que 4+83+24 no es 110.

jReceptor.ino

// Juan A. Villalpando
// kio4.com
// Código del Receptor.
// Conectar el módulo al terminal 11 del Arduino.

#include <RH_ASK.h>
#include <SPI.h> 
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
 
RH_ASK rf_driver;
String Paquete;
int paquetes = 0;
int alea1;
int alea2;
int suma_TX; // Suma del Transmisor.
int suma_RX; // Suma recibida.
int ind1;
int ind2;
int ind3;
int ind4;
int errores = 0;
 
void setup(){
    Serial.begin(9600);
    rf_driver.init();
    lcd.begin(16,2);// Columnas y filas de LCD.
}
 
void loop(){
    uint8_t buf[16] = {""}; // Tamaño del buffer 16.
    uint8_t buflen = sizeof(buf);
    if (rf_driver.recv(buf, &buflen)){
    Paquete = (char*)buf;
        ind1 = Paquete.indexOf('-');
        paquetes = Paquete.substring(0, ind1).toInt();
        ind2 = Paquete.indexOf('-', ind1+1);
        alea1 = Paquete.substring(ind1+1, ind2).toInt();
        ind3 = Paquete.indexOf('-', ind2+1);
        alea2 = Paquete.substring(ind2+1, ind3).toInt();
        ind4 = Paquete.indexOf('-', ind3+1);
        suma_TX = Paquete.substring(ind3+1).toInt();
        suma_RX = paquetes + alea1 + alea2;
        if(suma_TX != suma_RX) {errores ++ ;}
    Serial.println(Paquete);  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(Paquete); 
    lcd.setCursor(0,1); 
    lcd.print(errores);         
    }
}

___________________________
2.- Envío de paquete de datos y comprobación de secuencia.

- En el ejemplo anterior se comprueba la consistencia, es decir si el dato que ha llegado es correcto.

- Pero no indica si se ha perdido Paquetes en el envío.

- Si pones en el Emisor un delay pequeño, por ejemplo delay(1), observará que algunos paquetes no llegan, por ejempo, aquí no ha llegado el paquete 912:
910-20-52-982
911-78-87-1076
913-58-30-1001
914-25-74-1013
915-76-41-1032
916-12-27-955
917-29-21-967
918-22-46-986
919-95-12-1026

- Vamos a realizar otro código en el Receptor donde compruebe si ha llegado un paquete.

- Guardaremos el número del paquete actual en paquetes_anterior.

- Cuando llegue un paquete lo compararemos con el número del paquetes_anterior, si paquetes es distinto a paquetes_anterior + 1 resultará que el paquete anterior no ha llegado, y se sumara un errores.

- En la pantalla aparece el número de errores desde que se reinicia el Receptor.

jReceptor.ino

// Juan A. Villalpando
// kio4.com
// Código del Receptor.
// Conectar el módulo al terminal 11 del Arduino.

#include <RH_ASK.h>
#include <SPI.h> 
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
 
RH_ASK rf_driver;
String Paquete;
int paquetes = 0;
int alea1;
int alea2;
int suma_TX; // Suma del Transmisor.
int suma_RX; // Suma recibida.
int ind1;
int ind2;
int ind3;
int ind4;
int errores = -1;
int paquetes_primero = 0;
int paquetes_anterior = 0;

    
void setup(){
    Serial.begin(9600);
    rf_driver.init();
    lcd.begin(16,2);// Columnas y filas de LCD.
    uint8_t buf[16] = {""}; // Tamaño del buffer 16.
    uint8_t buflen = sizeof(buf);
    
    while(!rf_driver.recv(buf, &buflen)){
    Serial.print(".");
    delay(200);
    }
    Serial.println();
    Paquete = (char*)buf;
    ind1 = Paquete.indexOf('-');
    paquetes_primero = Paquete.substring(0, ind1).toInt();
    Serial.println(paquetes_primero);
}
 
void loop(){
    uint8_t buf[16] = {""}; // Tamaño del buffer 16.
    uint8_t buflen = sizeof(buf);
    if (rf_driver.recv(buf, &buflen)){
    Paquete = (char*)buf;
        ind1 = Paquete.indexOf('-');
        paquetes = Paquete.substring(0, ind1).toInt();
        ind2 = Paquete.indexOf('-', ind1+1);
        alea1 = Paquete.substring(ind1+1, ind2).toInt();
        ind3 = Paquete.indexOf('-', ind2+1);
        alea2 = Paquete.substring(ind2+1, ind3).toInt();
        ind4 = Paquete.indexOf('-', ind3+1);
        suma_TX = Paquete.substring(ind3+1).toInt();
        suma_RX = paquetes + alea1 + alea2;
        errores =  errores + (paquetes - paquetes_anterior - 1);
        paquetes_anterior = paquetes;
    Serial.println(Paquete);  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(Paquete); 
    lcd.setCursor(0,1); 
    lcd.print(errores - paquetes_primero);         
    }
}

________________________________

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información