Open top menu
terça-feira, fevereiro 10, 2015


Hoje vamos apresentar um projeto de automação com o Automation Shield, Bluetooh JY-MCU / HC-06 e um aplicativo de exemplo Android para acionamento das saídas.

Aplicativo Android para acionamento da placa
A nova versão do aplicativo mostra o estado das saídas da placa. A melhoria do código fonte do arduino é armazenar na EEPROM os últimos comandos do usuário, dessa forma, quando  a placa for reiniciada, ela será reestabelicida com os últimos comandos enviados pelo usuário.

A placa JY-MCU ou HC-06 Bluetooth pode ser encontrada com barra de terminais para conexão e faixa de tensão de alimentação entre 3.6 e 6V. Essa versão pode ser alimentada através do pino OUT + 5V do Shield.








Ou em uma versão sem barra de terminais e tensão de alimentação em 3.3V. Essa versão só pode ser alimentada através do pino 3V3 do Shield e deve ser utilizado um divisor de tensão entre os pinos TX (Arduino) e RX (módulo)




Lista de componentes
1 - Arduino NANO V3.0
1 - Placa Nano Automation Shield, a venda em nossa loja virtual.
1 - Fonte 12V x 3A.
1 - Placa JY-MCU ou HC-06 Bluetooth.
4 - Fios com conectores MODU para conexão do projeto.
1- Fita RGB
1 -  Resistor de 10K.
1 - Resistor de 20K.

Preparação da placa Bluetooh sem terminais.

Soldagem dos pinos.


Placa pronta com termo retrátil para isolamento das conexões.



GND - Preto
3,3V - Vermelho 
TX- Verde 
RX - Marrom 


Conexões do projeto

A conexão deve ser feita TX <-> RX entre o shield de Automação e a placa Bluetooh  JY-MCU. Se o módulo bluetooth trabalhar apenas com nível de sinal de 3,3 V será necessário utilizar um divisor de tensão no pino RX para não danificar o módulo. Conecte o pino TX do arduino com o pino RX do módulo com um resistor de 10K e o pino RX do módulo com um resistor de 20K ao GND.

Conexões das saídas

Código fonte do projeto
O código fonte do projeto é bem simples, dentro do loop do programa, ficamos esperando algum comando que venha pela porta serial, o caracter "|" define o início e fim do protocolo de envio de comandos. Durante o desenvolvimento, podemos testar nosso programa através do console serial do Arduino, e enviar os comandos, conforme exemplo abaixo:

|D11| Envia comando: Digital - Saida 1 - Sinal 1 -> Ligar Saida 1
|D10| Envia comando: Digital - Saida 1 - Sinal 0 -> Desligar Saida 1

|D21| Envia comando: Digital - Saida 2 - Sinal 1 -> Ligar Saida 2
|D20| Envia comando: Digital - Saida 2 - Sinal 0 -> Desligar Saida 2

|D31|
Envia comando: Digital - Saida 3 - Sinal 1 -> Ligar Saida 3
|D30|
Envia comando: Digital - Saida 3 - Sinal 0 -> Desligar Saida  3

|D41|
Envia comando: Digital - Saida 4 - Sinal 1 -> Ligar Saida 4
|D40|
Envia comando: Digital - Saida 4 - Sinal 0 -> Desligar Saida 4

|A60|
Envia comando: LED Vermelho - 0 (Desligado) -> Desligar Led Vermelho
|A69|
Envia comando: LED Vermelho - 9 (Maximo) -> Maxima pontencia Led Vermelho

O nível de potencia pode ser variado entre 0 (desligado) e 9 (máximo)
Led Verde
|A50|  ate |A59| 
Led Azul
|A30| até |A39|

Para evitar falhas no processo de upload, desconecte o Arduino do Shield ou remova as conexões com o Bluetooth. 

Código fonte Arduino

/*
  Software serial multple serial test

    https://drive.google.com/file/d/0B0t-Nu1Eo1b8OFdOWkg5QkMwMVE/view?usp=sharing

  VCC 3V
  GND  GND
  TX  RX
  RX  TX

  Protocolo
  |D21|
  |D20|

  |A64|

  Versão 1.1 -> Incluido persitencia de comandos na EEPROM e WACHTDOG

  */


#include <EEPROM.h>
#include <avr/wdt.h>

#define PIN_RED 6
#define PIN_GREEN 5
#define PIN_BLUE 3

int MemSaveSaida1 = 1;
int MemSaveSaida2 = 2;
int MemSaveSaida3 = 3;
int MemSaveSaida4 = 4;
int MemSaveRed    = 5;
int MemSaveBlue   = 6;
int MemSaveGreen  = 7;

int ValueSaveSaida1 = 0;
int ValueSaveSaida2 = 0;
int ValueSaveSaida3 = 0;
int ValueSaveSaida4 = 0;
int ValueSaveRed    = 0;
int ValueSaveBlue   = 0;
int ValueSaveGreen  = 0;

int inicioucomando;
String comando = "";

void setup()
{

  pinMode(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);

  inicioucomando = 0;
  comando = "";

  Serial.begin(9600);

  ValueSaveSaida1 = EEPROM.read(MemSaveSaida1);
  ValueSaveSaida2 = EEPROM.read(MemSaveSaida2);
  ValueSaveSaida3 = EEPROM.read(MemSaveSaida3);
  ValueSaveSaida4 = EEPROM.read(MemSaveSaida4);
  ValueSaveRed = EEPROM.read(MemSaveRed);
  ValueSaveBlue = EEPROM.read(MemSaveBlue);
  ValueSaveGreen = EEPROM.read(MemSaveGreen);

  digitalWrite(A0, ValueSaveSaida1);
  digitalWrite(A1, ValueSaveSaida2);
  digitalWrite(A2, ValueSaveSaida3);
  digitalWrite(A3, ValueSaveSaida4);

  analogWrite(5, ValueSaveRed);
  analogWrite(6, ValueSaveGreen);
  analogWrite(3, ValueSaveBlue);

  wdt_enable(WDTO_8S); //Watchdog 8 Segundos
}

void loop()
{
  aguardacomandos();
  wdt_reset(); //Reset WatchDog
  RetornaComandos();

}

void aguardacomandos()
{
  char ch;
  while (Serial.available()) {
    ch = Serial.read();
    if (ch == '|')
    {
      if (inicioucomando == 1)
      {
        inicioucomando = 0;
        disparacomando();
      }
      else
      {
        inicioucomando = 1;
      }
    }
    else
    {
      comando.concat(ch);
    }
  }
}

void disparacomando()
{

  Serial.println(comando);
  if (comando[0] == 'D')
  {
    int port = (comando[1] - '0');
    int value = (comando[2] - '0');

    if (port == 1)
    {
      ValueSaveSaida1 = value;
      EEPROM.write(MemSaveSaida1, ValueSaveSaida1);
      digitalWrite(A0, ValueSaveSaida1);
    }
    else if (port == 2)
    {
      ValueSaveSaida2 = value;
      EEPROM.write(MemSaveSaida2, ValueSaveSaida2);
      digitalWrite(A1, ValueSaveSaida2);
    }
    else if (port == 3)
    {
      ValueSaveSaida3 = value;
      EEPROM.write(MemSaveSaida3, ValueSaveSaida3);
      digitalWrite(A2, ValueSaveSaida3);
    }
    else if (port == 4)
    {
      ValueSaveSaida4 = value;
      EEPROM.write(MemSaveSaida4, ValueSaveSaida4);
      digitalWrite(A3, ValueSaveSaida4);
    }
  }
  else if (comando[0] == 'A')
  {
    int port = (comando[1] - '0');
    int value = (comando[2] - '0');
    value = value * 28;

    if ( port == 6 )
    {
      ValueSaveRed = value;
      EEPROM.write(MemSaveRed, ValueSaveRed);
      analogWrite(port, value);
    }
    else if ( port == 5 )
    {
      ValueSaveGreen = value;
      EEPROM.write(MemSaveGreen, ValueSaveGreen);
      analogWrite(port, value);
    }
    else if ( port == 3 )
    {
      ValueSaveBlue = value;
      EEPROM.write(MemSaveBlue, ValueSaveBlue);
      analogWrite(port, value);
    }
  }
  else
  {
    Serial.println("Error");
  }
  comando = "";
}

void RetornaComandos()
{
  String retorno = "|COMANDOS#";
  retorno.concat(ValueSaveSaida1);
  retorno.concat("#");
  retorno.concat(ValueSaveSaida2);
  retorno.concat("#");
  retorno.concat(ValueSaveSaida3);
  retorno.concat("#");
  retorno.concat(ValueSaveSaida4);
  retorno.concat("#");
  retorno.concat(ValueSaveRed);
  retorno.concat("#");
  retorno.concat(ValueSaveGreen);
  retorno.concat("#");
  retorno.concat(ValueSaveBlue);
  retorno.concat("#");

  Serial.println(retorno);
}



Código fonte Android

Não foi criada uma tela para seleção do dispositivo pareado para conexão. O programa busca pelo nome default (Linvor) ou (HC-06)  da placa JY-MCU para conexão. Se o dispositivo for renomeado ou estiver com nome diferente de Linvor ou HC-06, não ocorrerá a conexão, sendo então necessário renomear o dispositivo para um dos dois nome antes dos testes no aplicativo de exemplo.





O código fonte está disponível no github em: https://github.com/sergiomokshin/AutomationShield/tree/master/Bluetooth
  
A senha padrão do bluetooth é 1234, 123 ou 0000. Ele precisa ser pareado com o celular antes da abertura e utilização do aplicativo.

No vídeo abaixo podemos ver todo o processo de pareamento e acesso da placa pelo aplicativo.


A placa JY-MCU Bluetooth não é compatível com alguns dispositivos IPhone e IPad, o exemplo de hardware e software desse projeto é compatível apenas com dispositivos com sistema operacional Android.




Tagged
Different Themes
Written by Lovely

Aenean quis feugiat elit. Quisque ultricies sollicitudin ante ut venenatis. Nulla dapibus placerat faucibus. Aenean quis leo non neque ultrices scelerisque. Nullam nec vulputate velit. Etiam fermentum turpis at magna tristique interdum.

0 comentários