|     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:


.

App inventor 2 en español
Cómo programar los teléfonos móviles con Android.
Bluetooth, Arduino y App inventor 2 - Juan Antonio Villalpando

-- Tutorial de iniciación de App Inventor 2 en español --

Volver al índice del tutorial

___________________________

9B.- Bluetooth, Arduino y App Inventor. Básico. Arduino envía información a App Inventor.

- El Arduino genera cuatro valores aleatorios y se los envía por Bluetooth al Android.

_______________________________________________

1.- El Arduino genera varios valores aleatorios y se los envía a App Inventor.

p9B_2_bluetooth_basico.aia


- Arduino.
_______________________________________________

- Conexión.

- Bluetooth conectado a los puertos Serie "oficiales" RX-0 y TX-1 (Fíjate que se conectan de forma "cruzada").

- Debemos quitar el módulo para cargar la aplicación.

- Puedes consultar valores en el Serial Monitor.

- Si conectamos al Bluetooth en los terminales RX-0 y TX-1, como en este caso, no hace falta librería para el Bluetooth.
- El Bluetooth lo podríamos conectar en otros terminales distintos, en esta caso necesiataríamos una librería como indicaré en el siguiente tutorial.

- Este código simplemente genera 4 números aleatorios y los envía separados por "|", por ejemplo:

372|4|36|9

- El \n indica fin de línea, es decir que le comunica al receptor que ha acabado esta tanda de envío.

arduino_bt.ino

// Juan Antonio Villalpando
// juana1991@yahoo.com
// kio4.com
void setup() {
 Serial.begin(9600);
}

void loop() {
int aleatorio1 = random(0, 1000);
int aleatorio2 = random(1, 6);
int aleatorio3 = random(20, 200);
int aleatorio4 = random(0, 10);


Serial.print(aleatorio1);
Serial.print("|");
Serial.print(aleatorio2);
Serial.print("|");
Serial.print(aleatorio3);
Serial.print("|");
Serial.print(aleatorio4);
Serial.print("\n"); // Fin de línea. Importante.

delay(300);
}

- App Inventor.
_______________________________________________

1B.- El Arduino genera varios valores aleatorios y se los envía a App Inventor. Etiquetas separadas.

p9B_2_bluetooth_basico.aia

- Tenemos un dato de la forma:

datos = 372|4|36|9

y lo queremos presentar en 4 Etiquetas:

372
4
36
9

- [En caso que solo tengamos dos datos: 372|4, debemos modificar el código para que solo presente dos valores en las Etiquetas.]

_______________________________________________

- Diseño.

- Recuerda poner DelimiterByte = 10

_______________________________________________

- Bloques.

_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________

- Comentarios.

- El Arduino envía la información cada 300 milisegundos

- 372|4|36|9

- El Reloj del App Inventor debe tener un Intervalo cercano, he puesto el mismo:

Reloj1.Intervalo = 300

- Si se pone un número demasiado mayor, se irá llenando el buffer, es decir irán llegando valores y se irán guardando en un buffer e irán saliendo cuando puedan.

- Para ver eso, he puesto en la Etiqueta6.Texto = BytesDisponiblesParaRecibir.

- Veamos este experimento...

- Establece el Reloj en Reloj1.Intervalo = 800

- Observa que el valor de la Etiqueta6 va aumentando, esto quiere decir que están llegando valores que no da tiempo mostrarlos en la Etiqueta1, porque el Reloj es más lento (800) que la velocidad de envío (300). Así que según van llegando valores nuevos se van guardando en la cola de un buffer.

- El Reloj irá mostrando los valores a su ritmo (800), e irán llegando más valores desde el Arduino (300).

- Es decir, el Arduino está enviando valores rápidamente y el Reloj lo está mostrando más lento. Los valores que van llegando se ponen en una cola de un buffer, no se pierden, están en ese buffer y se mostrarán cuando le toque mostrarse.

- Deja que la Etiqueta6, tenga un número por ejemplo 200. Ahora quita el cable de alimentación del Bluetooth, o apaga el Arduino.

- Verás que el Reloj seguirá mostrando números, esos números son los que estaban acumulados en el buffer, poco a poco irán saliendo, según el intervalo del Reloj.

- Así que experimentamos lo siguient, si el buffer está muy lleno, significa que no estamos visualizando los valores en tiempo real que está enviando el Arduino, sino que estamos visualizando los valores antiguos que están saliendo del buffer.

- En resumen:

- Debemos establecer los valores del IntervaloDelReloj más rápidos que los delay(---); del Arduino.

- Ya que si el Arduino envía los valores muy rápido, el Android no puede mostrarlos a esa velocidad, y va metiendo esos valores de llegada en un buffer y los va presentando cuando toque su turno, pero ya no será tiempo real.

---------------------------------------------

- En la parte de Diseño, en el ClienteBluetooth, en sus Propiedades observamos: ByteDelimitador = 10

- El 10 es el código ASCII de \n.

- Es decir, cada vez que llegue un \n, significa que se una línea nueva, \n es el final de línea. Fíjate que en el código del Arduino está el \n.

- Así que le estamos diciendo que cada vez que llegue un \n muestre el valor recibido.

_______________________

- En vez de poner:
Serial.print("\n");
para indicar fin de línea, se puede poner simplemente:
Serial.println();

- La diferencia es que "\n" envía solo el carácter 10
- y println(); envía el carácter 10 y el 13. Fin de línea y retorno del carro.

_________________________________________________________________________________________
_________________________________________________________________________________________
_________________________________________________________________________________________
_________________________________________________________________________________________

- Mejor opción. A better option.

1B.- El Arduino genera varios valores aleatorios y se los envía a App Inventor. Etiquetas separadas.

 

En el tutorial anterior (y en la mayoría de los tutoriales de esta web), he puesto como separador de datos el "|"

Serial.print(aleatorio1);
Serial.print("|");
Serial.print(aleatorio2);
Serial.print("|");
Serial.print(aleatorio3);
Serial.print("|");
Serial.print(aleatorio4);
Serial.print("\n"); // Fin de línea. Importante.

Es mejor utilizar como separador de datos la coma ","


Serial.print(aleatorio1);
Serial.print(",");
Serial.print(aleatorio2);
Serial.print(",");
Serial.print(aleatorio3);
Serial.print(",");
Serial.print(aleatorio4);
Serial.print("\n"); // Fin de línea. Importante.

- Ya que se simplifica el código de App inventor al utilizar lista.

Vamos a verlo... Cargamos en el Arduino:

arduino_bt_2.ino

// Juan Antonio Villalpando
// juana1991@yahoo.com
// kio4.com
void setup() {
 Serial.begin(9600);
}

void loop() {
int aleatorio1 = random(0, 1000);
int aleatorio2 = random(1, 6);
int aleatorio3 = random(20, 200);
int aleatorio4 = random(0, 10);


Serial.print(aleatorio1);
Serial.print(",");
Serial.print(aleatorio2);
Serial.print(",");
Serial.print(aleatorio3);
Serial.print(",");
Serial.print(aleatorio4);
Serial.print("\n"); // Fin de línea. Importante.

delay(300);
}

Otra forma:

arduino_bt_2.ino

// Juan Antonio Villalpando
// juana1991@yahoo.com
// kio4.com

String alea;
void setup() {
 Serial.begin(9600);
}

void loop() {
String aleatorio1 = (String) random(0, 1000);
String aleatorio2 = (String) random(1, 6);
String aleatorio3 = (String) random(20, 200);
String aleatorio4 = (String) random(0, 10);

alea = aleatorio1 + "," + aleatorio2 + "," + aleatorio3 + "," + aleatorio4;
Serial.println(alea);

delay(300);
}

Y en App Inventor:

p9B_2_bluetooth_basico2.aia
_______________________________________________

- Bloques.

- Fíjate que al estar los datos recibidos separados por coma, por ejemplo: (23,5, 82,7) podemos tratarlos como lista y obtener los valores de sus elementos, sin necesidad del "|"

 

_______________________________________________

2.- Un potenciómetro en el Arduino envía valores por Bluetooth a App Inventor.

p9B_bluetooth_basico.aia
_______________________________________________

- Conexión.

- Bluetooth conectado a los puertos Serie "oficiales" RX-0 y TX-1 (Fíjate que se conectan de forma "cruzada").

 

- Debemos quitar el módulo para cargar la aplicación.

- Puedes consultar valores en el Serial Monitor.

- Si conectamos al Bluetooth en los terminales RX-0 y TX-1, como en este caso, no hace falta librería para el Bluetooth.
- El Bluetooth lo podríamos conectar en otros terminales distintos, en esta caso necesiataríamos una librería como indicaré en el siguiente tutorial.

- Este código

- El \n indica fin de línea, es decir que le comunica al receptor que ha acabado esta tanda de envío.

arduino_bt_potenciometro.ino

// Juan Antonio Villalpando
// juana1991@yahoo.com
// kio4.com

void setup(){
  Serial.begin(9600);
}

void loop (){
    // El terminal central del potenciómetro va a A0 del Arduino
    int i = analogRead(A0);
    Serial.print(i);
    Serial.print("\n"); // Fin de línea. Importante.
    delay(300);    
}

- App Inventor.
_______________________________________________

- En este caso como solo envía un valor utilizamos solamente la Etiqueta1 para visualizarlo.

p9B_bluetooth_basico.aia

- Establece un Reloj1.Intervalo = 300.

_______________________________________________

- Comentarios.

- Al mover el potenciómetro, observarás su valor en la Etiqueta1.

- El valor obtenido estará comprendido entre 0 y 1024 (aproximadamente).

- Si quieres cambiar esos valores utiliza la orden Map del Arduino.

- Observa que si pones un intervalo del Reloj muy alto se irán acumulando valores en el buffer, eso se ve en la Etiqueta2.

_________________________________________________________________________________________
_________________________________________________________________________________________
_________________________________________________________________________________________
_________________________________________________________________________________________

_______________________________________________

3.- Un sensor de ultrasonido envía la distancia por Bluetooth a App Inventor.

p9B_bluetooth_basico.aia
______________________________________________

- Conexión.

- Bluetooth conectado a los puertos Serie "oficiales" RX-0 y TX-1 (Fíjate que se conectan de forma "cruzada").

- Debemos quitar el módulo para cargar la aplicación.

- Puedes consultar valores en el Serial Monitor.

- Si conectamos al Bluetooth en los terminales RX-0 y TX-1, como en este caso, no hace falta librería para el Bluetooth.
- El Bluetooth lo podríamos conectar en otros terminales distintos, en esta caso necesiataríamos una librería como indicaré en el siguiente tutorial.

- Este código

- El \n indica fin de línea, es decir que le comunica al receptor que ha acabado esta tanda de envío.

arduino_bt_ultrasonido.ino

// Juan Antonio Villalpando
// juana1991@yahoo.com
// kio4.com

const int trig =  8;
const int echo =  9;

const int delay_time = 1000; // Retardo de cada medida

void setup() {
    Serial.begin(9600);
    pinMode(trig, OUTPUT);
    pinMode(echo, INPUT);
}

void loop() {
    float duracion;
    float distancia; 
    digitalWrite(trig, HIGH);
    delayMicroseconds(1000); 
    digitalWrite(trig, LOW);
    duracion = pulseIn(echo, HIGH); 
    
    distancia = (duracion / 2) * 0.034;
    //distancia = tiempo de ida y vuelta del sonido dividido entre dos, por la velocidad del sonido.
    delay(delay_time);

    int DatoaEnviar = (int) (distancia * 100);
    Serial.print(DatoaEnviar);
    Serial.print("\n"); // Fin de línea. Importante.

    delay(300);
}

- App Inventor.
_______________________________________________

- En este caso como solo envía un valor utilizamos solamente la Etiqueta1 para visualizarlo.

p9B_bluetooth_basico.aia

- Establece un Reloj1.Intervalo = 300.

- Adapta la distancia en centímetros a valores más realistas.

_________________________________________________________________________________________
_________________________________________________________________________________________
_________________________________________________________________________________________
_________________________________________________________________________________________

_______________________________________________

4.- Sensor de humedad y temperatura envía datos por Bluetooth a App Inventor. LCD.

p9B_bluetooth_basico.aia
______________________________________________

- Conexión.

- Bluetooth conectado a los puertos Serie "oficiales" RX-0 y TX-1 (Fíjate que se conectan de forma "cruzada").

- Debemos quitar el módulo para cargar la aplicación.

- Puedes consultar valores en el Serial Monitor.

- Si conectamos al Bluetooth en los terminales RX-0 y TX-1, como en este caso, no hace falta librería para el Bluetooth.
- El Bluetooth lo podríamos conectar en otros terminales distintos, en esta caso necesiataríamos una librería como indicaré en el siguiente tutorial.

- Este código

- El \n indica fin de línea, es decir que le comunica al receptor que ha acabado esta tanda de envío.

- Arduino solo enviará la Temperatura o la Humedad.

- Es necesaria la librería DHT11.zip

- Esta es otra librería DHT por si no te funciona la anterior: DHT.zip. (llámala DHT11)

- Baja este archivo, lo descomprimes y lo pegas la carpeta DTH en C:/Archivos de programa(x86)/Arduino/libraries/

arduino_bt_humedad_temperatura.ino

// Juan Antonio Villalpando
// juana1991@yahoo.com
// kio4.com

#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);

#include "DHT.h" 
#define DHTPIN 2 
#define DHTTYPE DHT11 
DHT dht(DHTPIN, DHTTYPE);

void setup() {
lcd.begin(16,2);// Columnas y filas de LCD 
Serial.begin(9600);
dht.begin();
}

void loop(){
float humedad = dht.readHumidity();
float temperatura = dht.readTemperature();
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print("Temper. = ");
lcd.print(temperatura);
lcd.setCursor(0,1); // Siguiente renglón.
lcd.print("Humedad = ");
lcd.print(humedad);
delay(100); 

// Bluetooth
    int humed = (int) (humedad);
    int temper = (int) (temperatura);
    Serial.print(humed);
    Serial.print("|");
    Serial.print(temper);
    Serial.print("\n"); // Fin de línea. Importante.

    delay(300); 
}

- App Inventor.
_______________________________________________

p9B_2_bluetooth_basico.aia

- En este caso envía dos valores:

55|28

- Debemos cambiar la aplicación para que solo se visualicen dos Etiquetas con los datos.

_________________________________________________________________________________________
_________________________________________________________________________________________
_________________________________________________________________________________________
_________________________________________________________________________________________

_______________________________________________

5.- Giroscopio envia datos por Bluetooth. LCD.

p9B_3_bluetooth_basico_giro.aia
______________________________________________

- Conexión.

- Bluetooth conectado a los puertos Serie "oficiales" RX-0 y TX-1 (Fíjate que se conectan de forma "cruzada").

Debemos quitar el módulo para cargar la aplicación.

- Puedes consultar valores en el Serial Monitor.

- Si conectamos al Bluetooth en los terminales RX-0 y TX-1, como en este caso, no hace falta librería para el Bluetooth.
- El Bluetooth lo podríamos conectar en otros terminales distintos, en esta caso necesiataríamos una librería como indicaré en el siguiente tutorial.

- El \n indica fin de línea, es decir que le comunica al receptor que ha acabado esta tanda de envío.

- Librería: MPU6050_tockn-master.zip

giroscopio_BT.ino

#include <MPU6050_tockn.h>
#include <Wire.h>
MPU6050 mpu6050(Wire);

void setup() {
  Serial.begin(9600);
  Wire.begin();
  mpu6050.begin();
  // mpu6050.calcGyroOffsets(true);
}

void loop() {
    mpu6050.update();

    Serial.print(mpu6050.getAccX());
    Serial.print("|");
    Serial.print(mpu6050.getAccY());
    Serial.print("|");
    Serial.print(mpu6050.getAccY());
    Serial.print("\n"); // Fin de línea.  

  delay(100);
 }

- Se pueden obtener todos estos datos, aunque en este ejemplo solo visualizamos los getAccX, Y y Z

mpu6050.getTemp()
mpu6050.getAccX()
mpu6050.getAccY()
mpu6050.getAccZ()


mpu6050.getGyroX()
mpu6050.getGyroY()
mpu6050.getGyroZ()

mpu6050.getAccAngleX()
mpu6050.getAccAngleY()

mpu6050.getGyroAngleX()
mpu6050.getGyroAngleY()
mpu6050.getGyroAngleZ()

mpu6050.getAngleX()
mpu6050.getAngleY()
mpu6050.getAngleZ()

- Para calibrarlo descomentamos esta línea y observamos el SerialMonitor

mpu6050.calcGyroOffsets(true);

- Una vez visto los valores de calibración los ponemos aquí, ejemplo:

mpu6050.setGyroOffsets(1.45, 1.23, -1.32);

 

- Si tienes una pantalla LCD, cambia el código para ver los valores en la pantalla.

- App Inventor.
_______________________________________________

p9B_3_bluetooth_basico_giro.aia

- En este caso envía tres valores.

_________________________________________________________________________________________
_________________________________________________________________________________________
_________________________________________________________________________________________

_______________________________________________

6.- JoyStick envia datos por Bluetooth.

p9B_4_bluetooth_basico_joystick.aia
______________________________________________

- Conexión.

- Bluetooth conectado a los puertos Serie "oficiales" RX-0 y TX-1 (Fíjate que se conectan de forma "cruzada").

Debemos quitar el módulo para cargar la aplicación.

joystick_BT.ino

// Juan Antonio 
// KIO4.COM

#define AD0 A0
#define AD1 A1
int SW2 = 2;
int valor;

void setup() {
 Serial.begin(9600);
 pinMode(SW2, INPUT);
 digitalWrite(SW2, HIGH);
}

void loop() {
  valor = analogRead(AD0);
  Serial.print(valor);
  Serial.print("|");
  valor = analogRead(AD1);
  Serial.print(valor);
  Serial.print("|");
    boolean boton = digitalRead(SW2);
    if (boton == HIGH){Serial.print("0"); 
    }else{Serial.print("1");}
    Serial.print("\n");
  delay(100);
}

- App Inventor.
_______________________________________________

- El JoyStrick envía tres valores por Bluetooth de la forma: 675|342|1

- Correspondiente a los ejes X, Y y botón pulsado.

- App Inventor toma ese datos lo descompone en sus tres partes:

x = 675
y = 342
s = 1

- Y mediante una regla de 3 lo pasa a dimensiones de la pantalla, observa que en mi caso he dividido entre 1060 y 820. Tanto en la salida de datos del Arduino como en el código de App Inventor, puedes modificar los valores de llegada para adaptarlos a las dimensiones de la pantalla.

- Al mover el JoyStick se reciben esos datos y se mueve la bola roja central por el Lienzo. Si se pulsa el JoyStrick el fondo del Lienzo cambia de color.

_______________________________________________
- Diseño.

_______________________________________________
- Bloques.

_________________________________________________________________________________________
_________________________________________________________________________________________
_________________________________________________________________________________________

_______________________________________________

7.- Teclado con bus I2C envía valor por Bluetooth.

p9B_4_bluetooth_basico_teclado.aia
______________________________________________

- En el tutorial:
49B.- Teclado táctil adaptado a I2C. Adaptador de 8 conexiones a Bus I2C con PCF8574.

- vimos como configurar un teclado con 16 teclas, conectado a un módulo I2C.

- Gracias al módulo I2C utilizamos menos terminales en el Arduino para conectar el teclado.

- Cada módulo I2C tiene una dirección, en el tutorial indicado hay un programita de Arduino para obtener la dirección de cada elemento I2C.

- Para que el teclado funcione con I2C es necesario cargar la librería Keypad_I2C que se encuentra en el tutorial.

- En este ejemplo vamos a pulsar teclas y enviar su valor por Bluetooth.

- Además mediante Botones en App Inventor podemos encender/apagar el LED13.

- Conexión.

- Bluetooth conectado a los puertos Serie "oficiales" RX-0 y TX-1 (Fíjate que se conectan de forma "cruzada").

Debemos quitar el módulo para cargar la aplicación.

teclado_BT.ino

// Juan A. Villalpando
// KIO4.COM

#include <Wire.h>
#include <Keypad_I2C.h>

char val;
#define LED13 13

const byte ROWS = 4; 
const byte COLS = 4; 
 
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
 
byte rowPins[ROWS] = {0,1,2,3}; 
byte colPins[COLS] = {4,5,6,7};
 
int i2caddress = 0x27; // Debes cambiar esta dirección por la de tu módulo.
 
Keypad_I2C kpd = Keypad_I2C( makeKeymap(keys), rowPins, colPins, ROWS, COLS, i2caddress);
 
void setup(){
  Serial.begin(9600);
  kpd.begin();
  pinMode(LED13, OUTPUT);
}
 
void loop(){
// Leer datos.
if( Serial.available() ) {
  val = Serial.read();
  
  if( val == '1' )
  { digitalWrite(LED13, HIGH);}
  
  if( val == '2' )
  { digitalWrite(LED13, LOW);}
}
// Enviar datos.
  char key = kpd.getKey();
  if (key){
    Serial.print(key);
    Serial.print("\n"); // Fin de línea. Importante.
  }
  delay(100);
}

_____________________________________________
- Diseño.

- ByteDelimitador = 10

- En el Reloj, IntervaloDelReloj = 50

_____________________________________________
- Bloques.

_____________________________________________________________________

8.- Un pulsador en Arduino envía "Pulsado" o "No pulsado" por Bluetooth.

p9A4_bluetooth_pulsador.aia

_________________
- Diseño.

_________________
-
Bloques.

- En esta ocasión conectamos directamente escribiendo la Mac de nuestro Bluetooth.

- Podemos conocer la Mac, poniendo previamente el bloque DireccionesYNombres en la Etiqueta1.

_________________
- Conexión Arduino.

- La resistencia puede ser de unos 10 K

_________________
-
Código.

pulsador_bluetooth.ino


// Juan Antonio Villalpando
// juana1991@yahoo.com
// kio4.com

int Pin10 = 10; // Pulsador
int LED13 = 13; // LED13
int pulsa;

void setup() {
  pinMode(Pin10, INPUT);   // Pulsador es entrada.
  pinMode(LED13, OUTPUT);  // LED es salida.
  Serial.begin(9600);
}

void loop() {
  pulsa = digitalRead(Pin10); // Lee el pulsador
if (pulsa == HIGH) { 
    digitalWrite(LED13, HIGH);
    Serial.print("Pulsado\n");
} 

if (pulsa == LOW) { 
    digitalWrite(LED13, LOW);
    Serial.print("No Pulsado\n");
} 
delay(100);
}

 

__________________________________

 
- 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