Arduino en español
Circuitos con Arduino - Juan Antonio Villalpando
-- Tutorial de iniciación a Arduino --
Volver al índice del tutorial
___________________________
27D.- Bluetooth y HC-12 SI4463. 433 MHz. App Inventor.
p9AA_bluetooth_radiofrecuencia.aia
- Este tutorial es la continuación de 27D_BT_HC-12_SI4463.htm, en este caso vamos a conectar el módulo HC-12 al móvil mediante un cable OTG y un módulo conversor USB-UART.
- También necesitaremos la extensión SerialOTG.aix que podemos obtener en:
___________________________
- Configuración del módulo mediante los comandos AT.
- Para configurarlo el debemos conectar el terminal SET al pin 9 del Arduino.
- Vamos a configurar el módulo a FU3 con 9600, canal 050.
AT
AT+RX
AT+V
AT+FU3
AT+C050
AT+B9600
jConfiguracion_AT.ino |
// Juan A. Villalpando
// kio4.com
#include <SoftwareSerial.h>
SoftwareSerial HC12(10,11); // HC12(TX,RX)
// Terminal SET al pin 9.
char rx_byte = 0;
String rx_str = "";
char rx_byte2 = 0;
String rx_str2 = "";
void setup() {
Serial.begin(9600);
HC12.begin(9600); // Cambiar segun este configurado
pinMode(9, OUTPUT); // Terminal SET al pin 9.
}
void loop() {
if (Serial.available() > 0) {
rx_byte = Serial.read();
rx_str += rx_byte;
if (rx_byte == '\n') {
digitalWrite(9, LOW); // Para configurar
delay(100);
Serial.print(rx_str);
HC12.print(rx_str);
digitalWrite(9, HIGH); // Quitamos configurar.
rx_str = "";
}
}
if (HC12.available() > 0) {
rx_byte2 = HC12.read();
rx_str2 += rx_byte2;
if (rx_byte2 == '\n') {
Serial.print(rx_str2);
rx_str2 = "";
}
}
}
|
- Vamos poco a poco.
___________________________
1.- El móvil con el HC-12 envía una secuencia de números. Arduino los muestra en una pantalla OLED y en el Monitor Serie.
- Creamos una aplicación para el móvil que genera un secuencia de números.
- Mediante la extensión SerialOTG enviamos esos números al puerto USB del móvil.
- En el puerto USB del móvil conectamos un cable OTG, éste lo conectamos a un conversor USB - UART y este conversor lo conectamos a un módulo HC-12 que actuará como transmisor.
- En el Arduino conectamos el otro módulo HC-12 que actuará como receptor.
___________________________
- Conversores USB - UART (Rx/Tx). Cable OTG.
- Aquí tenemos varios conversores USB - UART, nos servirán para convertir la información USB que sale del móvil a UART (Rx/Tx) para suministrársela al módulo HC-12.
- Vamos a utilizar el CP2102. También necesitaremos un cable OTG como indico en la imagen.


___________________________
- Conexiones con pantalla OLED.
- Podemos alimentar al Arduino receptor con una batería, pilas,.... y de esta manera podemos salir a un campo para comprobar distancias.
- También podemos conectarlo al ordenador.
- Si no tienes pantalla OLED, conecta el Arduino al ordenador y observa los números en el Monitor Serie.

___________________________
- Código para el receptor con pantalla OLED.
- Utilizaremos la librería U8g2.zip
jReceptor_OLED.ino |
// Juan A. Villalpando
// kio4.com
#include <SoftwareSerial.h>
SoftwareSerial HC12(10,11); // HC12(TX,RX)
#include <Wire.h>
#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);
char rx_byte2 = 0;
String rx_str2 = "";
void setup() {
Serial.begin(9600);
HC12.begin(9600);
u8g2.begin();
}
void loop() {
if (HC12.available() > 0) {
rx_byte2 = HC12.read();
rx_str2 += rx_byte2;
if (rx_byte2 == '\n') {
// Serial.print(rx_str2);
// Elimina último caracter, '\n'
rx_str2 = rx_str2.substring(0, rx_str2.length() - 1);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso28_tr);
u8g2.drawStr(5,32,rx_str2.c_str()); // 31,24
u8g2.sendBuffer();
// int doble = 2 * rx_str2.toInt();
// HC12.println(doble); // Devuelve el valor.
rx_str2 = "";
}
}
}
|
_________________________
- Código para el receptor con pantalla LCD.
- Si en vez de poner una pantalla OLED quieres poner una LCD, este sería el código.
- Las pantallas LCD se ven mejor que las OLED pero consumen más energía.
- En este código, si el mensaje enviado tiene más de16 caracteres, se muestran en dos filas.
jBluetooth_Receptor_LCD.ino |
// Juan A. Villalpando
// kio4.com
#include <SoftwareSerial.h>
SoftwareSerial HC12(10,11); // HC12(TX,RX)
#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);
char rx_byte2 = 0;
String rx_str2 = "";
String fila1 = "";
String fila2 = "";
void setup() {
Serial.begin(9600);
HC12.begin(9600);
lcd.begin(16,2);// Columnas y filas de LCD.
}
void loop() {
if (HC12.available() > 0) {
rx_byte2 = HC12.read();
rx_str2 += rx_byte2;
if (rx_byte2 == '\n') {
// Serial.print(rx_str2);
// Elimina último caracter, '\n'
rx_str2 = rx_str2.substring(0, rx_str2.length() - 1);
fila1 = rx_str2.substring(0,16);
fila2 = rx_str2.substring(16,32);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(fila1);
lcd.setCursor(0,1);
lcd.print(fila2);
// HC12.println(rx_str2); // Devuelve el valor.
rx_str2 = "";
}
}
}
|
|
 |
___________________________
- Diseño.

___________________________
- Bloques.
- Si en el Temporizador ponemos el bloque falso, escribimos un texto y pulsamos el Botón de EnviarTexto, se enviará el texto.
- Si ponemos el bloque cierto, automáticamente se irán enviando una secuencia de números 1, 2, 3, 4,...

___________________________
___________________________
___________________________
2.- El Arduino con el HC-12 envía una secuencia de números. El móvil con otro HC-12 recibe esos números y los muestra en su pantalla.
- Las conexiones de los elementos son las mismas que las que hemos visto anteriormente.
jEmisor_OLED.ino |
// Juan A. Villalpando
// kio4.com
#include SoftwareSerial.h>
SoftwareSerial HC12(10,11); // HC12(TX,RX)
#include <Wire.h>
#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);
char rx_byte2 = 0;
String rx_str2 = "";
void setup() {
Serial.begin(9600);
HC12.begin(9600);
u8g2.begin();
}
void loop() {
if (HC12.available() > 0) {
rx_byte2 = HC12.read();
rx_str2 += rx_byte2;
if (rx_byte2 == '\n') {
// Serial.print(rx_str2);
// Elimina último caracter, '\n'
rx_str2 = rx_str2.substring(0, rx_str2.length() - 1);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso28_tr);
u8g2.drawStr(5,32,rx_str2.c_str()); // 31,24
u8g2.sendBuffer();
// int doble = 2 * rx_str2.toInt();
// HC12.println(doble); // Devuelve el valor.
rx_str2 = "";
}
}
}
|
_______________________________________
3.- Pruebas a larga distancia. FU4. 1800 metros.
- Una vez visto el alcancen en el modo FU3, que debe ser unos 1000 metros, vamos a comprobar el mismo código en el modo FU4, para ver si llegamos a los 1800 metros.
- Para lograr esa distancia deben verse los dos dispositivos, no debe haber árboles, edificios,... entre uno y otro.
- Al configurarlo en el modo FU4 se establecerá una velocidad de 1200 bps, lo que hará que los datos se desplacen por el aire a 5000 bps. En este modo el receptor tendrá una sensibilidad de -117 dBm. El consumo 16 mA. Si añadimos al Arduino tendremos un consumo de unos 60 mA. El espaciado entre el envío de un dato y otro será de más de 1 segundo.
- Para ello cargamos en los dos Arduinos el programa de configuración, el que he llamado Configuracion_AT.ino y está al principio de esta página.
- Para ponerlos en el modo FU4, recuerda que debes conectar el terminal SET del módulo HC12 al pin 9 del Arduino.
AT
AT+RX
AT+FU4
AT+RX
Atención, ahora no veremos los datos en el Monitor Serie, ya que el modo FU4 ha cambiado sus baudios a 1200. Para volver a verlo, vamos al código de Configuracion_AT.ino y cambiamos estas líneas:
void setup() {
Serial.begin(1200);
HC12.begin(1200);
}
- Ponemos al Monitor Serie a 1200.
AT+RX
OK+B1200
OK+RC001
OK+RP:+20dBm
OK+FU4
- Cuidado con esto de las velocidades, puede ocurrir que no veas nada en el Monitor Serie y es porque no has cambiado correctamente los baudios.
- Ya lo tenemos en modo FU4, ahora modificamos un poco los códigos del Emisor y Receptor, ponemos las velocidades a 1200. Quitamos el cable SET.
- Cargamos el código del Emisor y Receptor en el Arduino correspondiente. Salimos al campo a medir distancia.
________________________________
|