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

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!rn"));
    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 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? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

28 Comentários

  1. Estou querendo pegar sinais digitais e enviar via wifi e visualizar no browser mas não estou nada que posso me ajudar, se alguem puder, gostaria de uma ajuda….obrigado

    1. Olá Nilson!

      Dê uma olhada nesse post que fizemos:
      https://www.filipeflop.com/blog/modulo-ethernet-enc28j60-arduino/

      Abraços!

      André – Equipe FilipeFlop

  2. Olá!
    Sei que estou um pouco desatualizado trabalhando com esse Shield em 2018, mas comprei há alguns anos e somente agora consegui tempo para “brincar” com o dispositivo. Já informo que minha plaquinha não é exatamente a mesma do presente post. De cor azul traz notações de “cc3000 wifi shield uno&mega compatible”. Já tentei alguns exemplos, e apesar de conectar ao wifi com sucesso, no momento de responder a uma solicitação http através do acesso via browser mostra as informações “Client connected” e posteriormente “Client disconnected”. No browser não carrega nada. O problema parece estar no “parseRequest”, que sempre retorna nulo na variável e no browser não é mostrado a informação “HTTP/1.1 405 Method Not Allowed”. Outra particularidade é que no console não formata corretamente as informações. Alguém pode me auxiliar em um possível problema? Será que código deve ser alterado para atender alguma particularidade dos browsers atuais? Porque será que o “Serial.print(F” não fica correto em meu console? Se alguém puder me ajudar ou apresentar um tutorial compatível com meus problemas agradeço. Abraços. Att, Daniel.

    1. Estou com o mesmo problema! Alguém pode ajudar por favor?

      STANLEY CÉSAR PASTERNAK DE OLIVEIRA
    2. na questão formatação mude a velocidade da conexão !
      pinMode(A2, INPUT); //Define o pino para o potenciometro
      Serial.begin(115200);
      para
      pinMode(A2, INPUT); //Define o pino para o potenciometro
      Serial.begin(9600);

    3. na nessa questão estou com o mesmo problema responder a uma solicitação http através do acesso via browser mostra as informações “Client connected” e posteriormente “Client disconnected”. No browser não carrega nada.

  3. Esta shield está descontinuada? Verifiquei inúmeros comentários descrevendo problemas com esta placa.

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

  5. 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

  6. 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.

  7. 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…

  8. 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

  9. 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);
    }

    1. Bom dia,

      Você está utilizando o CC3000 da Keyes ou da Sparkfun ?

      Abraço

      Adilson – Equipe FILIPEFLOP

      1. Olá Adilson!

        Não tem o nome na placa, de qualquer forma tirei uma foto dele (disponível neste link https://www.dropbox.com/s/qo7a2m6fknyp4dd/2016-05-04%2018.10.40.jpg?dl=0)

        Obrigado!
        Abraço!

        1. Boa tarde,

          Nós temos duas placas CC3000, uma da Sparkfun e uma da Keyes. Nenhuma delas é igual à essa que vc tem… Você tentou os dois exemplos do blog ?

          Abraço!

          Adilson – Equipe FILIPEFLOP

      2. Bom Dia Adilson,

        Estou com o mesmo problema descrito acima e estou utilizando o CC3000 da Keyes.
        O código para na função cc3000.begin().

        Alguma solução foi encontrada?

    2. Esse código é pra UNO
      pro MEGA vc tem que “mudar a pinagem” depois de ardua pesquisa e quase desistir eu fiz os seguintes passos
      -ligue jumpers do icsp do shield ao MEGA
      -ligue jumpers nos pinos 3,4,5 e 10 do shield nos 3,4,5 e 10 do MEGA
      -PULO DO GATO: Os pinos 11,12 e 13 do shield vc liga nas portas 51,50 e 52 do MEGA https://www.arduino.cc/en/Reference/SPI

      o MISO, MOSI e SCK do UNO e do MEGA são diferentes aí vc tem que fazer essa “gambiarra” aí é só rodar e ser feliz

  10. 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.

  11. É 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.

    1. 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

      1. Adilson, obrigado pela resposta.

        O SHIELD CC3000 KEYES é compatível com o Arduino Mega 2560 R3?

        Breno Marques.

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

  13. 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.

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

      1. 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.

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

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