Enviar Datos Desde Arduino y Recibirlos en El Pc
-
Upload
monyk-zerymar-solis -
Category
Documents
-
view
74 -
download
0
description
Transcript of Enviar Datos Desde Arduino y Recibirlos en El Pc
ENVIAR DATOS DESDE ARDUINO Y RECIBIRLOS EN EL PC:
Vamos a enviar un valor de 0 a 1023 que obtendremos girando el potenciómetro conectado a
la placa Arduino, los valores se enviaran cada segundo. Para ello utilizaremos el siguiente
código:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
//Enviar datos con modulo Bluetooth para Arduino http://zygzax.com/
#include <SoftwareSerial.h>
SoftwareSerial blue(2, 3);
int pot=0;
void setup(){
blue.begin(9600);
blue.println("Conectado");
}
void loop(){
pot=analogRead(0);
blue.println(pot);
delay(1000);
}
Para conectarnos con el módulo bluetooth desde el ordenador tendremos que añadirlo como
si se tratase de un teléfono móvil o cualquier otro dispositivo bluetooth normal y corriente,
utilizando la clave de emparejamiento 1234.
En el programa de desarrollo de Arduino seleccionaremos el puerto serie que corresponde a
la comunicación bluetooth con este módulo, en mi caso (Sistema operativo Mac) el puerto es:
“/dev/tty.HC-07-DevB”.
El último paso para leer la información que está transmitiendo nuestra placa Arduino es abrir
el monitor serie del programa de desarrollo de Arduino y seleccionar “9600 baud” y ya
deberíamos ver la información.
ENVIAR DATOS DESDE EL PC A ARDUINO
Ahora vamos a enviar un “1” para encender el LED conectado a la placa Arduino y un “0” para
apagarlo. Si enviamos una cadena de caracteres el programa leerá cada uno de ellos por
orden (001101 –> Apagado-Apagado-Encendido-Encendido-Apagado-Encendido).
El código es el siguiente:
?
12345678910111213141516171819202122232425262728
//Recibir datos con modulo Bluetooth para Arduino http://zygzax.com/#include <SoftwareSerial.h>char rec;SoftwareSerial blue(2,3);void setup(){ pinMode(13,OUTPUT); blue.begin(9600); blue.println("Conectado");}void loop() { if(blue.available()){ rec=blue.read(); switch(rec){ case '0': digitalWrite(13,LOW); delay(500); blue.println("Led off"); break; case '1': digitalWrite(13,HIGH); delay(500); blue.println("Led on"); break; default: delay(500); blue.print(rec); blue.println(" no es una orden valida. Introduzca 0 o 1"); } }}
2930
El método para conectarnos a través de bluetooth con nuestra placa arduino es exactamente
igual al seguido para leer la información pero en este caso no recibiremos ningún mensaje
sino que escribiremos un 1 y se lo enviaremos, veremos que nos devuelve un mensaje
confirmando que se ha recibido la orden y que se ha encendido el led. Para apagarlo
enviaremos un 0.
Interfaz de configuración de comandos AT en HC-05El puerto serie en modo de configuración para el HC-05 debe configurarse de la siguiente
manera: 34800 bps, 8 bits de datos, Sin paridad, Sin control de flujo. Para entrar al modo
de comandos AT seguimos los siguientes pasos:
1. Poner a estado alto en el pin 34 (PIO11)
2. Conectar la alimentación del módulo (o resetearlo de preferencia)
3. Enviar un comando AT\r\n para comprobar que estemos en modo de comando AT.
La siguiente lista es una compilación de los comandos que consideramos importantes
AT\r\n Comando de prueba, debe responder con OK\r\n
AT+ROLE=1\r\n Comando para colocar el módulo en modo Maestro (Master)
AT+ROLE=0\r\n Comando para colocar el módulo en modo Esclavo (Slave)
AT+VERSION?\r\n Obtener la versión del firmware
AT+UART=115200,1,2\r\n Configurar el modo de funcionamiento del puerto serie en
“modo puente”
AT+PIO=10,1\r\n Colocar el pin de IO de propósito general a nivel alto
Existen otros comandos AT que están documentados en la hoja de datos que proveen
nuestros amigos de iTeadStudio. Podemos encontrar la hoja de datos (datasheet) del HC-05
en la siguiente dirección:
http://biblioteca.geekfactory.mx/Bluetooth_Bee_Pro/datasheet_hc-05.pdf
Es importante notar que al módulo HC-05 no le agradan los caracteres \r o \n sueltos al
finalizar un comando. Siempre debemos mandarle \r\n para finalizar cada comando, por
lo que debemos configurar nuestro programa de terminal serial para que siempre
envíe \r\n al final de cada linea. Si utilizamos el “Monitor Serial” del IDE de arduino hay
que configurarlo de la siguiente forma:
Interfaz de configuración de comandos AT en HC-06El HC-06 tiene un firmware distinto y también un funcionamiento distinto en cuanto a su
modo de configuración. Para poder configurar el HC-06 es necesario que esteNO este
emparejado ni siendo usado por ningun dispositivo. De igual forma que el HC-05 es
necesario conectarlo a la PC y usar un programa de terminal para darle instrucciones de
configuración (Comandos AT), aunque también podemos escribir un programa de arduino o
en un microcontrolador para configurarlo.
Para conectarlo con la PC utilizamos un adaptador USB serial como se muestra en la foto:
Realizando pruebas con un módulo HC-06 y una tarjeta USB serial con FT-232RL
El módulo HC-06 acepta un set muy básico de comandos (algo raros por cierto), que permite
pocas configuraciones, pero que sin duda será util para personalizar este económico módulo y
configurarlo para satisfacer las necesidades de la aplicación.
Los comandos que soporta son:
Prueba de funcionamiento:
Envíar: AT
Recibe: OK
Configurar el Baudrate:
Envíar: AT+BAUD<Numero>
El parámetro número es un caracter hexadecimal de ‘1’ a ‘c’ que corresponden a los
siguientes Baud Rates: 1=1200, 2=2400, 3=4800, 4=9600, 5=19200, 6=38400, 7=57600,
8=115200, 9=230400, A=460800, B=921600, C=1382400
Recibe: OK<baudrate>
Configurar el Nombre de dispositivo Bluetooth:
Envíar: AT+NAME<Nombre>
Recibe: OKsetname
Configurar el código PIN de emparejamiento:
Envíar: AT+PIN<pin de 4 digitos>
Recibe: OK<pin de 4 digitos>
Obtener la version del firmware:
Enviar: AT+VERSION
Recibe: Linvor1.8
Si ya hemos trabajado con comandos AT observaremos que los comandos estan lejos del
estándar, lo más obvio es que:
No es necesario finalizar el comando con \r\n, pero si es necesario ingresar los comandos con
todos los caracteres seguidos sin pausas. NO hay necesidad de dar “enter” para finalizar un
comando. El modulo tiene un Temporizador que hace necesario introducir el comando de una
sola vez, sin pausas entre los caracteres.
Por lo anterior, si utilizamos un emulador de terminal hay que pegarlos en leste y no escribirlos
uno a uno con el teclado. También podemos usar el “monitor serial” de Arduino configurado
como se muestra en la imágen más arriba en este artículo.
Hay que tener cuidado de introducir TODAS LAS LETRAS DEL COMANDO en
MAYUSCULAS, ya que de lo contrario, no funcionarán.
Las respuestas no parecen respuestas estándar a comandos AT.
Conexión básica con ArduinoLas conexiones para realizar con arduino son bastante sencillas. Solamente requerimos
colocar como mínimo la alimentación y conectar los pines de transmisión y recepción serial
(TX y RX). Hay que recordar que en este caso los pines se debe conectar cruzados TX
Bluetooth -> RX de Arduino y RX Bluetooth -> TX de Arduino. La siguiente imágen muestra
las conexiones básicas para que funcione el módulo
Conexión de un módulo HC-06 a Arduino. Hay que revisar la correspondencia de pines en la serigrafía, ya
que puede variar dependiendo del proveedor o lote.
En este caso estamos utilizando el hardware de UART, por lo que la comunicación con la PC
no será posible. Para poder utilizar la UART para comunicarse con la PC mediante USB, es
necesario utilizar un UART emulado por software, de manera que los pines de comunicación
con el módulo bluetooth queden en pines distintos.
El código para la comunicación a través del bluetooth es idéntico al que utilizaríamos para
comunicarnos con la PC vía USB. El siguiente ejemplo permite encender o apagar el led de la
tarjeta arduino mediante el módulo bluetooth. El código funciona de la siguiente manera:
Al envíar el caracter E, se pone en estado alto la salida del pin 13
Al enviar el caracter A, se pone en estado lógico bajo la salida del pin 13
123456789101
/************************* http://geekfactory.mx ******************************* * * Sketch de prueba para modulos de bluetooth HC-05 y HC-06. Este programa puede * controlar el led de la tarjeta arduino a través de la conexión bluetooth. El * programa puede ampliarse para controlar una mayor cantiad de salidas. * * ESTE SKETCH USA EL PUERTO SERIE (UART), MISMO QUE ES UTILIZADO PARA * LA COMUNICACIÓN USB. EL USO DE BLUETOOTH O USB ES MUTUAMENTE EXCLUSIVO * (NO SE PUEDEN USAR AMBOS AL MISMO TIEMPO). * * PARA USAR LA CONEXIÓN USB Y BLUETOOTH AL MISMO TIEMPO ES NECESARIO EMULAR UNA
11213141516171819202122232425262728293031323334353637383940
* UART POR SOFTWARE. * * El funcionamiento es sencillo: * * Enviar un caracter 'A' para encender el led * Enviar un caracter 'a' para apagar el led * */ char rxChar; // Variable para recibir datos del puerto serieint ledpin = 13;// Pin donde se encuentra conectado el led (pin 13) // Configurar el arduinovoid setup(){
// Pin 13 como salidapinMode(ledpin, OUTPUT);// Comunicación serie a 9600 baudiosSerial.begin(9600);
} // Ciclo infinito, programa principalvoid loop(){
// Si hay datos disponibles en el bufferif( Serial.available() ){
// Leer un byte y colocarlo en variablerxChar = Serial.read();
// Procesar comando de un solo byteif( rxChar == 'A' ){
digitalWrite(ledpin, HIGH);Serial.println("ON");
}else if ( rxChar == 'a' ){
digitalWrite(ledpin, LOW);Serial.println("OFF");
}}
// Podemos hacer otras cosas aquídelay(100);
}
4142434445464748495051525354555657
ConclusiónComo podemos observar, los módulos HC-05 y HC-06 son bastante sencillos de configurar
para usarse con el microcontrolador de nuestra preferencia. El HC-06 es el modelo más
sencillo, presentando menos opciones para su configuración, pero siendo bastante util y
económico para conectar nuestros dispositivos con microcontroladores a la PC, tablets,
celulares, etc. El HC-05 por otra parte, nos permite hacer algunas cosas que su hermano
menor no permite, como enlaces punto a punto entre dos módulos y también teniendo un
juego de comandos más completo y un poco más “formal”, con algunas características
interesantes como el control de pines de GPIO.
ARDUINO BLUETOOTH
Modulo Bluetooth HC-05:
Primero tenemos que configurar el modulo Bluetooth. En este caso tenemos el Modulo HC-05.
El modulo de bluetooth HC-05 soporta los voltajes de entrada de 3.3 y 5V.
Circuito:
Sketch para configurar comandos AT:
#include <SoftwareSerial.h>
#define RxD 10
#define TxD 11
#define RST 5
#define KEY 4
SoftwareSerial BTSerial(RxD, TxD);
void setup()
{
pinMode(RST, OUTPUT);
pinMode(KEY, OUTPUT);
digitalWrite(RST, LOW);
digitalWrite(KEY, HIGH);
digitalWrite(RST, HIGH);
delay(500);
BTSerial.flush();
delay(500);
BTSerial.begin(38400);
Serial.begin(9600);
Serial.println("Enter AT commands:");
BTSerial.print("AT\r\n");
delay(100);
}
void loop()
{
if (BTSerial.available())
Serial.write(BTSerial.read());
if (Serial.available())
BTSerial.write(Serial.read());
}
En el monitor serial, modificamos los valores de velocidad a “9600 baud” y a “Ambos Nl y
CR”, en este momento observaremos en la pantalla que dice: “Enter AT commands:” , si nosotros
mandamos el comando AT, nos debe responder OK.
Para configurar nuestro dispositivo bluetooth:
Saber el nombre del modulo.
AT+NAME?
Cambiar el nombre, en el ejemplo siguiente se cambia por “MINOMBRE”. AT+NAME=
MINOMBRE
Un dato muy importante el HC-05 funciona como esclavo y maestro.
Como esclavo: espera que desde otro dispositivo nos conectemos.
Como maestro: el HC-05 se conecta a otro dispositivo.
Saber cómo está configurado con el comando: AT+ROLE?
Si nos contesta “0″ esta en modo esclavo.
Si nos contesta “1″ esta en modo maestro.
Por defecto viene en modo esclavo.
Cambiarlo al modo esclavo: Comando:AT+ROLE=0
Cambiarlo al modo maestro: Comando:AT+ROLE=1
Saber la contraseña del HC-05 Comando: AT+PSWD?
Por defecto suele venir la “1234″ o la “0000″.
Muestra la configuración con la placa Arduino, por defecto viene configurado a una
velocidad de 9600. Comando: AT+UART?
Arduino bluetooth + Motor Servo
sketch:
#include <SoftwareSerial.h>
#include <Servo.h> // Libreria de servos
#define RxD 0
#define TxD 1
#define RST 5 // Encendido del Modulo
#define KEY 4
Servo myservo1; // variable servo
byte recepcion=0; // almacena el valor enviado desde el emisor
int myAngle1; // utilizada para pasar el valor a grados
SoftwareSerial BTSerial(RxD, TxD);
byte pinEstado = 0;
void setup()
{
pinMode(RST, OUTPUT);
pinMode(KEY, OUTPUT);
// Estado inicial
digitalWrite(RST, LOW);
// Modo Comunicacion
digitalWrite(KEY, LOW);
// Encendemos el modulo.
digitalWrite(RST, HIGH);
// Configuracion del puerto serie por software
// para comunicar con el modulo HC-05
BTSerial.begin(9600);
BTSerial.flush();
delay(500);
// Configuramos el puerto serie de Arduino para Debug
Serial.begin(9600);
//Serial.println("Ready");
myservo1.attach(9);
}
void loop(){
if (BTSerial.available()>3){
byte b[4];
b[0]= BTSerial.read();
b[1]= BTSerial.read();
b[2]= BTSerial.read();
b[3]= BTSerial.read();
int numero = (b[3] & 0xFF) + ((b[2] & 0xFF) << 8) + ((b[1] & 0xFF) << 16)
+ ((b[0] & 0xFF) << 24);
recepcion = numero;
BTSerial.flush();
myAngle1=recepcion; // Volcado del dato recibido del emsior
myservo1.write(myAngle1);
Serial.println(recepcion);
}
}
Arduino Bluetooth + dimmer 220v
sketch:
#include <SoftwareSerial.h>
#define RxD 0
#define TxD 1
#define RST 5 // Encendido del Modulo
#define KEY 4
byte recepcion=0; // almacena el valor enviado desde el emisor
SoftwareSerial BTSerial(RxD, TxD);
byte pinEstado = 0;
int LedPin = 13; // LED conectado en placa al pin digital 13
int Led1 = 9; // Entrada Led1 del PaperDimmer
int Led2 = 10; // Entrada Led2 del PaperDimmer
int Led3 = 11; // Entrada Led3 del PaperDimmer
// DEFINICION DE VARIABLES
int Temp = 20; // Espera siempre mayor que 20 (50Hz => 20ms)
int ValorPot = 0; // Valor leído del potenciómetro
int ValPapertrino = 0; // Valor transmitido al PaperDimmer
boolean ValLedPin = HIGH; // Valor de la salida LedPin13 del Arduino
int ValLed1 = 0; // Valor de la entrada Led1 del PaperDimmer
int ValLed2 = 0; // Valor de la entrada Led2 del PaperDimmer
int ValLed3 = 0; // Valor de la entrada Led3 del PaperDimmer
// FUNCION INICIAL
void setup() {
pinMode(RST, OUTPUT);
pinMode(KEY, OUTPUT);
// Estado inicial
digitalWrite(RST, LOW);
// Modo Comunicacion
digitalWrite(KEY, LOW);
// Encendemos el modulo.
digitalWrite(RST, HIGH);
// Configuracion del puerto serie por software
// para comunicar con el modulo HC-05
BTSerial.begin(9600);
BTSerial.flush();
delay(500);
// Configuramos el puerto serie de Arduino para Debug
Serial.begin(9600);
// Inicializar las salidas:
pinMode(LedPin, OUTPUT);
pinMode(Led1, OUTPUT);
pinMode(Led2, OUTPUT);
pinMode(Led3, OUTPUT);
}
// CICLO PRINCIPAL
void loop()
{
if (BTSerial.available()>3){
byte b[4];
b[0]= BTSerial.read();
b[1]= BTSerial.read();
b[2]= BTSerial.read();
b[3]= BTSerial.read();
int numero = (b[3] & 0xFF) + ((b[2] & 0xFF) << 8) + ((b[1] & 0xFF) << 16)
+ ((b[0] & 0xFF) << 24);
recepcion = numero;
BTSerial.flush();
if (numero>0){
ValLedPin=!ValLedPin; // invierte el valor del pin13
digitalWrite(LedPin,ValLedPin); // y muestra que el programa funciona
delay(Temp);
ValorPot = numero;
ValPapertrino = ValorPot/(100/7); // Escala el valor del pot a 0-7
ValLed1 = ValPapertrino & 1; // Enmascara el valor del triac con 001
if (ValLed1 == 1) { // si tiene un valor de 1
digitalWrite(Led1,HIGH); // activa la entrada Led1 del PaperDimmer
}
else { // si el valor es distinto a 1
digitalWrite (Led1,LOW); // desactiva Led1
}
ValLed2=ValPapertrino & 2; // Enmascara el valor del triac con 010
if (ValLed2 == 2) { // si tiene un valor de 2
digitalWrite (Led2,HIGH); // activa la entrada Led2 del PaperDimmer
}
else { // si el valor es distinto a 2
digitalWrite(Led2,LOW); // desactiva Led2
}
ValLed3=ValPapertrino & 4; // Enmascara el valor del triac con 100
if (ValLed3 == 4) { // si tiene un valor de 4
digitalWrite (Led3,HIGH); // activa la entrada Led3 del paperDimmer
}
else { // si el valor es distinto a 4
digitalWrite (Led3,LOW); // desactiva Led3
}
}
}
}
Dimmer 220v con Arduino y Puredata
Sketch Dimmer 220v Serial:
Sketch dimmer 220v:
// DEFINICION ENTRADAS/SALIDAS
int LedPin = 13; // LED conectado en placa al pin digital 13
int Led1 = 9; // Entrada Led1 del PaperDimmer
int Led2 = 10; // Entrada Led2 del PaperDimmer
int Led3 = 11; // Entrada Led3 del PaperDimmer
// DEFINICION DE VARIABLES
int Temp = 20; // Espera siempre mayor que 20 (50Hz => 20ms)
int ValorPot = 0; // Valor leído del potenciómetro
int ValPapertrino = 0; // Valor transmitido al PaperDimmer
boolean ValLedPin = HIGH; // Valor de la salida LedPin13 del Arduino
int ValLed1 = 0; // Valor de la entrada Led1 del PaperDimmer
int ValLed2 = 0; // Valor de la entrada Led2 del PaperDimmer
int ValLed3 = 0; // Valor de la entrada Led3 del PaperDimmer
// FUNCION INICIAL
void setup() {
Serial.begin(9600);
// Inicializar las salidas:
pinMode(LedPin, OUTPUT);
pinMode(Led1, OUTPUT);
pinMode(Led2, OUTPUT);
pinMode(Led3, OUTPUT);
}
// CICLO PRINCIPAL
void loop() {
byte brightness;
if (Serial.available()) {
brightness = Serial.read();
if (brightness>0){
ValLedPin=!ValLedPin; // invierte el valor del pin13
digitalWrite(LedPin,ValLedPin); // y muestra que el programa funciona
delay(Temp);
ValorPot = brightness; // Lee el valor del potenciómetro
ValPapertrino = ValorPot/(255/7); // Escala el valor del pot a 0-7
ValLed1 = ValPapertrino & 1; // Enmascara el valor del triac con 001
if (ValLed1 == 1) { // si tiene un valor de 1
digitalWrite(Led1,HIGH); // activa la entrada Led1 del PaperDimmer
}
else { // si el valor es distinto a 1
digitalWrite (Led1,LOW); // desactiva Led1
}
ValLed2=ValPapertrino & 2; // Enmascara el valor del triac con 010
if (ValLed2 == 2) { // si tiene un valor de 2
digitalWrite (Led2,HIGH); // activa la entrada Led2 del PaperDimmer
}
else { // si el valor es distinto a 2
digitalWrite(Led2,LOW); // desactiva Led2
}
ValLed3=ValPapertrino & 4; // Enmascara el valor del triac con 100
if (ValLed3 == 4) { // si tiene un valor de 4
digitalWrite (Led3,HIGH); // activa la entrada Led3 del paperDimmer
}
else { // si el valor es distinto a 4
digitalWrite (Led3,LOW); // desactiva Led3
}
}
}
}
Arduino Dimmer 220v + potenciometro 10k
Sketch:
// DEFINICION ENTRADAS/SALIDAS
int LedPin = 13; // LED conectado en placa al pin digital 13
int Led1 = 2; // Entrada Led1 del PaperDimmer
int Led2 = 3; // Entrada Led2 del PaperDimmer
int Led3 = 4; // Entrada Led3 del PaperDimmer
int PotPin = 0; // La entrada analógica 0 para el potenciometro
// DEFINICION DE VARIABLES
int Temp = 100; // Espera siempre mayor que 20 (50Hz => 20ms)
int ValorPot = 0; // Valor leído del potenciómetro
int ValPapertrino = 0; // Valor transmitido al PaperDimmer
boolean ValLedPin = HIGH; // Valor de la salida LedPin13 del Arduino
int ValLed1 = 0; // Valor de la entrada Led1 del PaperDimmer
int ValLed2 = 0; // Valor de la entrada Led2 del PaperDimmer
int ValLed3 = 0; // Valor de la entrada Led3 del PaperDimmer
// FUNCION INICIAL
void setup() {
// Inicializar las salidas:
pinMode(LedPin, OUTPUT);
pinMode(Led1, OUTPUT);
pinMode(Led2, OUTPUT);
pinMode(Led3, OUTPUT);
}
// CICLO PRINCIPAL
void loop() {
ValLedPin=!ValLedPin; // invierte el valor del pin13
digitalWrite(LedPin,ValLedPin); // y muestra que el programa funciona
delay(Temp);
ValorPot = analogRead(PotPin); // Lee el valor del potenciómetro
ValPapertrino = ValorPot/(1024/7); // Escala el valor del pot a 0-7
ValLed1 = ValPapertrino & 1; // Enmascara el valor del triac con 001
if (ValLed1 == 1) { // si tiene un valor de 1
digitalWrite(Led1,HIGH); // activa la entrada Led1 del PaperDimmer
}
else { // si el valor es distinto a 1
digitalWrite (Led1,LOW); // desactiva Led1
}
ValLed2=ValPapertrino & 2; // Enmascara el valor del triac con 010
if (ValLed2 == 2) { // si tiene un valor de 2
digitalWrite (Led2,HIGH); // activa la entrada Led2 del PaperDimmer
}
else { // si el valor es distinto a 2
digitalWrite(Led2,LOW); // desactiva Led2
}
ValLed3=ValPapertrino & 4; // Enmascara el valor del triac con 100
if (ValLed3 == 4) { // si tiene un valor de 4
digitalWrite (Led3,HIGH); // activa la entrada Led3 del paperDimmer
}
else { // si el valor es distinto a 4
digitalWrite (Led3,LOW); // desactiva Led3
}
}
Neurosky + Arduino via bluetooth
Configurar modulo Bluetooth HC-o5 con Neurosky
Comando: AT+UART=57600,0,0 // Cambiamos la velocidad a la que opera el modulo,
originalmente lo teníamos a 9600 y lo cambiamos a 57600.
Para la conexión de nuestra diadema al HC-05, prestar atención a los siguientes pasos:
Configuramos el modulo HC-05 como modo maestro Comando: AT+ROLE=1
Cambiamos la contraseña para que se puedan conectar, para este caso de la diadema
Mindwave es necesario que la contraseña sea (0000). AT+PSWD=0000
Preparamos el modulo para que se conecte a una dirección especifica,
//0 = Dirección especifica de dispositivo.
//1 = A cualquier dispositivo que se encuentre dispobible.
Para este caso será a una dirección específica. Comando: AT+CMODE=0 Se conecta el bluetooth
a la dirección Mac del esclavo, los ceros a la izquierda se omiten. La dirección MAC, como se
menciono anteriormente, viene en un valor hexadecimal el cual se depuro quedando en este
ejemplo como “74-e5-43-89-60-5c″ y se debe introducir en el formato ####,##,!!!!!!.Para este
ejemplo queda de la siguiente manera: Comando: AT+BIND=74e5,43,89605c.
Circuito:
Sketch Arduino:
#define LED 13
#define BAUDRATE 57600
#define DEBUGOUTPUT 0
#define GREENLED1 3
#define GREENLED2 4
#define GREENLED3 5
#define YELLOWLED1 6
#define YELLOWLED2 7
#define YELLOWLED3 8
#define YELLOWLED4 9
#define REDLED1 10
#define REDLED2 11
#define REDLED3 12
#define powercontrol 10
// checksum variables
byte generatedChecksum = 0;
byte checksum = 0;
int payloadLength = 0;
byte payloadData[64] = {
0};
byte poorQuality = 0;
byte attention = 0;
byte meditation = 0;
// system variables
long lastReceivedPacket = 0;
boolean bigPacket = false;
//////////////////////////
// Microprocessor Setup //
//////////////////////////
void setup() {
pinMode(GREENLED1, OUTPUT);
pinMode(GREENLED2, OUTPUT);
pinMode(GREENLED3, OUTPUT);
pinMode(YELLOWLED1, OUTPUT);
pinMode(YELLOWLED2, OUTPUT);
pinMode(YELLOWLED3, OUTPUT);
pinMode(YELLOWLED4, OUTPUT);
pinMode(REDLED1, OUTPUT);
pinMode(REDLED2, OUTPUT);
pinMode(REDLED3, OUTPUT);
pinMode(LED, OUTPUT);
Serial.begin(BAUDRATE); // USB
}
////////////////////////////////
// Read data from Serial UART //
////////////////////////////////
byte ReadOneByte() {
int ByteRead;
while(!Serial.available());
ByteRead = Serial.read();
#if DEBUGOUTPUT
Serial.print((char)ByteRead); // echo the same byte out the USB serial (for debug purposes)
#endif
return ByteRead;
}
/////////////
//MAIN LOOP//
/////////////
void loop() {
// Look for sync bytes
if(ReadOneByte() == 170) {
if(ReadOneByte() == 170) {
payloadLength = ReadOneByte();
if(payloadLength > 169) //Payload length can not be greater than 169
return;
generatedChecksum = 0;
for(int i = 0; i < payloadLength; i++) {
payloadData[i] = ReadOneByte(); //Read payload into memory
generatedChecksum += payloadData[i];
}
checksum = ReadOneByte(); //Read checksum byte from stream
generatedChecksum = 255 - generatedChecksum; //Take one's compliment of generated checksum
if(checksum == generatedChecksum) {
poorQuality = 200;
attention = 0;
meditation = 0;
for(int i = 0; i < payloadLength; i++) { // Parse the payload
switch (payloadData[i]) {
case 2:
i++;
poorQuality = payloadData[i];
bigPacket = true;
break;
case 4:
i++;
attention = payloadData[i];
break;
case 5:
i++;
meditation = payloadData[i];
break;
case 0x80:
i = i + 3;
break;
case 0x83:
i = i + 25;
break;
default:
break;
} // switch
} // for loop
#if !DEBUGOUTPUT
// *** Add your code here ***
if(bigPacket) {
if(poorQuality == 0)
digitalWrite(LED, HIGH);
else
digitalWrite(LED, LOW);
Serial.print("PoorQuality: ");
Serial.print(poorQuality, DEC);
Serial.print(" Attention: ");
Serial.print(attention, DEC);
Serial.print(" Time since last packet: ");
Serial.print(millis() - lastReceivedPacket, DEC);
lastReceivedPacket = millis();
Serial.print("\n");
switch(attention / 10) {
case 0:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, LOW);
digitalWrite(GREENLED3, LOW);
digitalWrite(YELLOWLED1, LOW);
digitalWrite(YELLOWLED2, LOW);
digitalWrite(YELLOWLED3, LOW);
digitalWrite(YELLOWLED4, LOW);
digitalWrite(REDLED1, LOW);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 1:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, LOW);
digitalWrite(YELLOWLED1, LOW);
digitalWrite(YELLOWLED2, LOW);
digitalWrite(YELLOWLED3, LOW);
digitalWrite(YELLOWLED4, LOW);
digitalWrite(REDLED1, LOW);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 2:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, LOW);
digitalWrite(YELLOWLED2, LOW);
digitalWrite(YELLOWLED3, LOW);
digitalWrite(YELLOWLED4, LOW);
digitalWrite(REDLED1, LOW);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 3:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, LOW);
digitalWrite(YELLOWLED3, LOW);
digitalWrite(YELLOWLED4, LOW);
digitalWrite(REDLED1, LOW);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 4:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(YELLOWLED3, LOW);
digitalWrite(YELLOWLED4, LOW);
digitalWrite(REDLED1, LOW);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 5:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(YELLOWLED3, HIGH);
digitalWrite(YELLOWLED4, LOW);
digitalWrite(REDLED1, LOW);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 6:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(YELLOWLED3, HIGH);
digitalWrite(YELLOWLED4, HIGH);
digitalWrite(REDLED1, LOW);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 7:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(YELLOWLED3, HIGH);
digitalWrite(YELLOWLED4, HIGH);
digitalWrite(REDLED1, HIGH);
digitalWrite(REDLED2, LOW);
digitalWrite(REDLED3, LOW);
break;
case 8:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(YELLOWLED3, HIGH);
digitalWrite(YELLOWLED4, HIGH);
digitalWrite(REDLED1, HIGH);
digitalWrite(REDLED2, HIGH);
digitalWrite(REDLED3, LOW);
break;
case 9:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(YELLOWLED3, HIGH);
digitalWrite(YELLOWLED4, HIGH);
digitalWrite(REDLED1, HIGH);
digitalWrite(REDLED2, HIGH);
digitalWrite(REDLED3, HIGH);
break;
case 10:
digitalWrite(GREENLED1, HIGH);
digitalWrite(GREENLED2, HIGH);
digitalWrite(GREENLED3, HIGH);
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(YELLOWLED3, HIGH);
digitalWrite(YELLOWLED4, HIGH);
digitalWrite(REDLED1, HIGH);
digitalWrite(REDLED2, HIGH);
digitalWrite(REDLED3, HIGH);
break;
}
}
#endif
bigPacket = false;
}
else {
// Checksum Error
} // end if else for checksum
} // end if read 0xAA byte