/*************************************************** This is an example for the Adafruit CC3000 Wifi Breakout & Shield Designed specifically to work with the Adafruit WiFi products: ----> https://www.adafruit.com/products/1469 Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! Written by Limor Fried & Kevin Townsend for Adafruit Industries. BSD license, all text above must be included in any redistribution ****************************************************/ /* This sketch will attempt to establish an AP connection using the SmartConfig tool, and save the connection details for later use (with SmartConfigReconnect, etc.). If a connection is successfully established, the data will be stored as a connection profile in non-volatile memory on the CC3000, and the device will be configured to automatically connect to this profile on startup. To see how to safely use the CC3000 without erasing this SmartConfig data please consult the SmartConfigReconnect sketch, which uses an optional flag in Adafruit_CC3000.begin() to avoid erasing the connection profiles from memory, as well as a new .reconnect function. Using other non SmartConfig example sketches will erase the connection profile data on startup, but this sketch combined with SmartConfigReconnect hopefully illustrate how to use SmartConfig when hard-coded connection details aren't appropriate. SmartConfig is still beta and kind of works but is not fully vetted! It might not work on all networks! */ #include #include #include #include #include "utility/debug.h" // These are the interrupt and control pins #define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin! // These can be any two pins #define ADAFRUIT_CC3000_VBAT 5 #define ADAFRUIT_CC3000_CS 10 // Use hardware SPI for the remaining pins // On an UNO, SCK = 13, MISO = 12, and MOSI = 11 Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT, SPI_CLOCK_DIVIDER); // The SSID & Password are retrieved via the Smartconfig app /**************************************************************************/ /*! @brief Sets up the HW and the CC3000 module (called automatically on startup) */ /**************************************************************************/ void setup(void) { Serial.begin(115200); Serial.println(F("Hello, CC3000!\n")); displayDriverMode(); Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC); /* Initialise the module, deleting any existing profile data (which */ /* is the default behaviour) */ Serial.println(F("\nInitialising the CC3000 ...")); if (!cc3000.begin(false)) { Serial.println(F("Unable to initialise the CC3000! Check your wiring?")); while(1); } uint16_t firmware = checkFirmwareVersion(); if ((firmware != 0x113) && (firmware != 0x118)) { Serial.println(F("Wrong firmware version!")); for(;;); } displayMACAddress(); /* Try to use the smart config app (no AES encryption), saving */ /* the connection details if we succeed */ Serial.println(F("Waiting for a SmartConfig connection (~60s) ...")); if (!cc3000.startSmartConfig(false)) { Serial.println(F("SmartConfig failed")); while(1); } Serial.println(F("Saved connection details and connected to AP!")); /* Wait for DHCP to complete */ Serial.println(F("Request DHCP")); while (!cc3000.checkDHCP()) { delay(100); // ToDo: Insert a DHCP timeout! } /* Display the IP address DNS, Gateway, etc. */ while (! displayConnectionDetails()) { delay(1000); } Serial.println(F("\nTo use these connection details be sure to use")); Serial.println(F("'.begin(false, true)' with your Adafruit_CC3000")); Serial.println(F("code instead of the default '.begin()' values!")); /* You need to make sure to clean up after yourself or the CC3000 can freak out */ /* the next time your try to connect ... */ Serial.println(F("\nClosing the connection")); cc3000.disconnect(); } void loop(void) { delay(1000); } /**************************************************************************/ /*! @brief Displays the driver mode (tiny of normal), and the buffer size if tiny mode is not being used @note The buffer size and driver mode are defined in cc3000_common.h */ /**************************************************************************/ void displayDriverMode(void) { #ifdef CC3000_TINY_DRIVER Serial.println(F("CC3000 is configure in 'Tiny' mode")); #else Serial.print(F("RX Buffer : ")); Serial.print(CC3000_RX_BUFFER_SIZE); Serial.println(F(" bytes")); Serial.print(F("TX Buffer : ")); Serial.print(CC3000_TX_BUFFER_SIZE); Serial.println(F(" bytes")); #endif } /**************************************************************************/ /*! @brief Tries to read the CC3000's internal firmware patch ID */ /**************************************************************************/ uint16_t checkFirmwareVersion(void) { uint8_t major, minor; uint16_t version; #ifndef CC3000_TINY_DRIVER if(!cc3000.getFirmwareVersion(&major, &minor)) { Serial.println(F("Unable to retrieve the firmware version!\r\n")); version = 0; } else { Serial.print(F("Firmware V. : ")); Serial.print(major); Serial.print(F(".")); Serial.println(minor); version = major; version <<= 8; version |= minor; } #endif return version; } /**************************************************************************/ /*! @brief Tries to read the 6-byte MAC address of the CC3000 module */ /**************************************************************************/ void displayMACAddress(void) { uint8_t macAddress[6]; if(!cc3000.getMacAddress(macAddress)) { Serial.println(F("Unable to retrieve MAC Address!\r\n")); } else { Serial.print(F("MAC Address : ")); cc3000.printHex((byte*)&macAddress, 6); } } /**************************************************************************/ /*! @brief Tries to read the IP address and other connection details */ /**************************************************************************/ bool displayConnectionDetails(void) { uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv; if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv)) { Serial.println(F("Unable to retrieve the IP Address!\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; } }