Conecte o seu Arduino na rede wireless com o Wifi Shield CC3000 Keyes

Conecte o seu Arduino na rede wireless com o Wifi Shield CC3000 Keyes

Apresentamos neste post uma nova opção de shield para ligar o seu Arduino na rede Wifi 802.11, o Wifi Shield CC3000 Keyes. Com ele você pode se conectar às redes wifi padrão 802.11 b/g, sendo uma ótima alternativa para conectar o seu Arduino à internet:

Wifi Shield CC3000 Keyes

Este Wifi Shield com chip controlador CC3000 (datasheet) possui antena embutida, suporta criptografia nos padrões WEP, WPA ou WPA2 e tem também um slot microSD para armazenamento de dados. Se você precisar de uma área de cobertura maior, pode utilizar a conexão para antena externa.

Programando o Wifi Shield CC3000 Keyes

Vamos testar o CC3000 Keyes utilizando a biblioteca Adafruit_CC3000 (download), criando um webserver que vai ler o valor de um potenciômetro ligado à porta analógica A2 do Arduino e atualizando uma página acessada via browser. A biblioteca da Adafruit é bem completa e tem exemplos para geolocalização, servidor de chat, webclient e HTTP Server, entre outros.

Monte o circuito abaixo, utilizando um potenciômetro de qualquer valor:

Circuito Wifi Shield Arduino

No início do programa, altere as definições de SSID, senha e segurança de acordo com as especificações da sua rede wireless:

#define WLAN_SSID “FILIPEFLOP”
#define WLAN_PASS “1234567890”
#define WLAN_SECURITY WLAN_SEC_WPA2

//Programa : Wifi Shield CC3000 Keyes
//Biblioteca : Adafruit_CC3000
//Alteracoes e adaptacoes : FILIPEFLOP
     
#include <Adafruit_CC3000.h>
//#include <ccspi.h>
#include <SPI.h>
#include "utility/debug.h"
#include "utility/socket.h"
 
//Pinos
#define ADAFRUIT_CC3000_IRQ   3  //Pino de interrupcao
#define ADAFRUIT_CC3000_VBAT  5  
#define ADAFRUIT_CC3000_CS    10 //Preferencialmente pino 10 do Arduino Uno
 
//O clock pode ser alterado
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, 
                                         ADAFRUIT_CC3000_VBAT,SPI_CLOCK_DIVIDER); 
 
#define WLAN_SSID       "FILIPEFLOP"   //Nome da rede - Ate 32 caractereres
#define WLAN_PASS       "1234567890"     //Senha da rede
//Tipo de seguranca: WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
#define WLAN_SECURITY   WLAN_SEC_WPA2  //Tipo de seguranca
 
#define LISTEN_PORT           80      
#define MAX_ACTION            10      
#define MAX_PATH              64      
#define BUFFER_SIZE           MAX_ACTION + MAX_PATH + 20  
#define TIMEOUT_MS            500    
 
Adafruit_CC3000_Server httpServer(LISTEN_PORT);
 
uint8_t buffer[BUFFER_SIZE+1];
int bufindex = 0;
char action[MAX_ACTION+1];
char path[MAX_PATH+1];
 
void setup(void)
{
  pinMode(A2, INPUT); //Define o pino para o potenciometro
  Serial.begin(115200);
 
  Serial.println(F("\nInicializando..."));
  if (!cc3000.begin())
  {
    Serial.println(F("Shield nao encontrado. Verifique as conexoes !"));
    while(1);
  }
   
  Serial.print(F("\nTentando conectar-se a rede ")); Serial.println(WLAN_SSID);
  if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) 
  {
    Serial.println(F("Falha !"));
    while(1);
  }
  Serial.println(F("Conectado!"));
   
  Serial.println(F("Requisitando endereco DHCP"));
  while (!cc3000.checkDHCP())
  {
    delay(100); 
  }  
  //Exibe as informacoes da conexao
  while (! displayConnectionDetails()) 
  {
    delay(1000);
  }
  //Aguarda conexao do browser
  httpServer.begin();
   
  Serial.println(F("Aguardando conexao..."));
}
 
void loop(void)
{
  //Armazena o valor lido do potenciometro
  int valor_potenciometro = analogRead(A2);
 
  Adafruit_CC3000_ClientRef client = httpServer.available();
  if (client) 
  {
    Serial.println(F("Client connected."));
    bufindex = 0;
    memset(&buffer, 0, sizeof(buffer));
    memset(&action, 0, sizeof(action));
    memset(&path,   0, sizeof(path));
    unsigned long endtime = millis() + TIMEOUT_MS;
     
    bool parsed = false;
    while (!parsed && (millis() < endtime) && (bufindex < BUFFER_SIZE)) 
    {
      if (client.available()) {
      buffer[bufindex++] = client.read();
    }
      parsed = parseRequest(buffer, bufindex, action, path);
   }
    
   if (parsed) 
   {
     Serial.println(F("Processing request"));
     Serial.print(F("Action: ")); Serial.println(action);
     Serial.print(F("Path: ")); Serial.println(path);
      if (strcmp(action, "GET") == 0) {
     client.fastrprintln(F("HTTP/1.1 200 OK"));
     client.fastrprintln(F("Content-Type: text/plain"));
     client.fastrprintln(F("Connection: close"));
     client.fastrprintln(F("Refresh: 0"));
     client.fastrprintln(F("Server: Adafruit CC3000"));
     client.fastrprintln(F(""));
     //Inicio do envio de dados para o browser
     client.fastrprintln(F("-----------------------------"));
     client.fastrprintln(F("         FILIPEFLOP          "));
     client.fastrprintln(F("-----------------------------"));
     client.fastrprintln(F(" "));
     client.fastrprint(F("Valor do potenciometro : "));
     client.println(valor_potenciometro);
     //client.fastrprintln((valor_potenciometro));
     client.fastrprintln(F(""));
   }
   else
   {
     client.fastrprintln(F("HTTP/1.1 405 Method Not Allowed"));
     client.fastrprintln(F(""));
   }
 }
 
    //Delay antes de desconectar
    delay(1000);
    Serial.println(F("Client disconnected"));
    client.close();
  }
  delay(500);
}
 
bool parseRequest(uint8_t* buf, int bufSize, char* action, char* path) {
  //Check if the request ends with rn to signal end of first line.
  if (bufSize < 2)
    return false;
  if (buf[bufSize-2] == '\r' && buf[bufSize-1] == '\n') {
    parseFirstLine((char*)buf, action, path);
    return true;
  }
  return false;
}
 
void parseFirstLine(char* line, char* action, char* path) {
  //Parse first word up to whitespace as action.
  char* lineaction = strtok(line, " ");
  if (lineaction != NULL)
    strncpy(action, lineaction, MAX_ACTION);
  //Parse second word up to whitespace as path.
  char* linepath = strtok(NULL, " ");
  if (linepath != NULL)
    strncpy(path, linepath, MAX_PATH);
}
 
//Leitura do endereco IP e outras informacoes de conexao
bool displayConnectionDetails(void)
{
  uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
   
  if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
  {
    Serial.println(F("Nao foi possivel ler o endereco IP!\r\n"));
    return false;
  }
  else
  {
    Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
    Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
    Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
    Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
    Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
    Serial.println();
    return true;
  }
}

Mostrando as informações do Wifi Shield no browser

Para mostrar as informações do Web Server criado com o Wifi Shield, você vai precisar do endereço IP obtido pela placa. Para isso, acesse o serial monitor e anote o endereço IP, conforme destacado:

Serial Monitor

As informações exibidas no Serial Monitor mostram que o Wifi Shield conseguiu se conectar com sucesso à rede wireless. Agora, basta abrir um browser e acessar o endereço IP que foi obtido no passo anterior. No nosso caso, o endereço 192.168.0.222:

Wifi Shield Browser

Gostou ? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo), comente e visite nossa loja FILIPEFLOP !

8
Conecte o seu Arduino na rede wireless com o Wifi Shield CC3000 Keyes
18 votos, 5.00 classificação média (100% pontuação)

Formado em Ciência da Computação pela Universidade de Mogi das Cruzes, atualmente responsável pelo departamento técnico da FILIPEFLOP.

Compartilhe este Post

21 Comentários

  1. Denis - 3 de abril de 2017

    Boa tarde Adilson, vc tem esse cc3000 para venda, se nao tiver quando chega e qual o valor?

  2. Denis - 2 de abril de 2017

    Boa tarde Adilson, com esse programa ai consigo comunicar com a internet em qualquer lugar, tipo mandar um sinal para minha casa la do meu serviço que fica em outra cidade

  3. valter motta mathias - 7 de dezembro de 2016

    Eu tenho um projeto sobre acessibilidade para pessoas com deficiência visual,gostaria de saber se tem como eu mandar informacao via wireless e receber ela no shield cc3000 por exemplo.

  4. Isaias - 11 de junho de 2016

    Boa noite pessoal !!!
    Eu tenho o Arduíno Mega 2560 e o CC3000 wifi shield Keyes, mas não estou conseguindo programar os dois com o meu sinal Wifi. tentei o código do blog aqui mas diz que este código só é compativel ao arduino uno.

    Será que devo mudar as pinagens
    pois os exemplos que tento só tenho a resposta de WiFi shield not present.

    Alguém de vcs tem um código que poderia me servir
    Grande abraço
    Aguardo contato de ajuda…

  5. Thiago Gaita - 18 de maio de 2016

    Parabéns pelo trabalho. Utilizando este código, fiz um webserver em HTML, porém tento fazer o código buscar em uma pagina web um arquivo java e ele não retorna mais. Alguém sabe se ela não aceita java ou se tenho que botar algo a mais? Sds. Thiago Gaita

  6. Jhordano - 4 de maio de 2016

    Olá! Parabéns pelo ótimo material. Já acompanho o blog há um tempo e sempre ajudou muito. Dessa vez, tentei seguir o tutorial para a shield wifi cc3000 e, infelizmente não está funcionando… No trecho do código abaixo, dá impressão que não está executando a função cc3000.begin(), quando chega ali fica travado e não demonstra nada no monitor, só a mensagem “Inicializando…” Alguém passou por isso e encontrou a solução?

    Obrigado!
    Serial.println(F(“\nInicializando…”));
    if (!cc3000.begin()) <—– QUANDO CHEGA AQUI FICA PARADO, NÃO RETORNA MAIS NADA
    {
    Serial.println(F("Shield nao encontrado. Verifique as conexoes !"));
    while(1);
    }

  7. Elisandro - 4 de maio de 2016

    O problema que estou tento com esse módulo é quando utilizo o LCD de 128×64(U8glib), quando mando conectar no wifi eu simplesmente perco o controle do lcd, ele fica como que sem conexão com o lcd com o contraste mais fraco e congelado.
    Estou utilizando um arduino mega e o lcd conectado em portas bem diferentes do shield wifi.

  8. Breno Marques - 2 de dezembro de 2015

    É possível utilizar o Wifi e SD do SHIELD CC3000 KEYES no mesmo sketch com o Arduino UNO?

    Ao incluir somente as bibliotecas abaixo para utilizar o Wifi e SD no mesmo sketch, a mensagem abaixo é exibida:

    #include
    #include
    #include

    Sketch uses 31,956 bytes (99%) of program storage space. Maximum is 32,256 bytes.
    Global variables use 1,925 bytes (93%) of dynamic memory, leaving 123 bytes for local variables. Maximum is 2,048 bytes.
    Low memory available, stability problems may occur.

    Esse módulo é compatível com o Arduino Uno?

    Obrigado.

    Breno Marques.

    • FILIPEFLOP - 3 de dezembro de 2015

      Bom dia Breno,

      Sim, o módulo é compatível com Arduino Uno. A mensagem informa que devido à pouca memória disponível você pode ter problemas de instabilidade no Arduino, como por exemplo algum reset imprevisto.

      Você pode alterar o programa para que ele utilize menos memória, ou alterar a biblioteca para desabilitar funções que você não utiliza.

      Abraço!

      Adilson – Equipe FILIPEFLOP

  9. Davison - 28 de novembro de 2015

    Eu tou tentando dar um ping pra algum site e não funciona, vocês já tiveram algum problema com isso?

  10. Breno Marques - 23 de novembro de 2015

    Filipe, primeiro parabéns por esse trabalho e também pelo ótimo processo de vendas.

    Comprei esse Wifi Shield na sua loja e já fiz vários testes com sucesso, mas está acontecendo um travamento na segunda chamada do método cc3000.connectTCP(ip, 8080). Obs: Realizo a segunda chamada quando acontece algum problema na conexão.

    Sendo assim, quando possível, gostaria de saber se esse problema também aconteceu nos seus testes?

    Fiz algumas pesquisas e encontrei a “solução” abaixo incluindo um delay:
    delay(1000);
    www = cc3000.connectTCP(ip, 8080);
    delay(1000);

    O problema foi amenizado, mas mesmo assim, depois de 3 chamadas o travamento acontece novamente.

    Também encontrei sugestões para atualizar a firmware do chip CC3000 para corrigir esse travamento, a que recebi tem o firmware v1.12, e gostaria de saber se você já realizou essa atualização?

    Esse problema não impede o andamento do meu projeto, mas sei que terei problema no futuro, dessa forma, agradeço qualquer sugestão para corrigir esse problema.

    • Gilmar Oliveira - 18 de dezembro de 2015

      Breno, vc conseguiu resolver o problema do travamento apos a 3a conexão?

      • Breno Marques - 19 de dezembro de 2015

        Gilmar,

        Sim, depois de atualizar o firmware! Dentro da biblioteca da Adafruit CC3000 tem o procedimento entre os exemplos: driverpatch_1_14.

        Mas mesmo assim, não estou utilizando esse Shield porque somente as bibliotecas da Adafruit CC3000 + SD.h utilizam 31,956 bytes (99%) da memoria do meu Arduino e não conseguir utilizar Wifi + SD juntos!

        Estou utilizando o ESP8266 Modelo ESP-01 e o leitor de MicroSD da Catalex. Os primeiros testes foram positivos, mas ainda estou homologando esses componentes no meu projeto.

        O SHIELD CC3000 KEYES vai ficar na gaveta até resolver esse problema.

        Breno Marques.

  11. Nelvir - 3 de novembro de 2015

    Vou precisar de uma câmara para transmitir imagens on line, vocês podem me indicar uma compatível com o Arduíno Mega?

  12. Nelvir - 3 de novembro de 2015

    Muito interessante a Wifi Shield, vou analisar e usar no meu tcc. Será muito útil com certeza.

Deixe uma resposta