정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

cc3000을 사용하여 날씨정보를 받아오려합니다.
김범식 | 2016-05-27

 

웨더클락http://kocoafab.cc/make/view/596 을 만들어보기위해 우선 날씨정보를 받아오는 부분부터 하려고 했으나

올려주신 http://kocoafab.cc/make/view/359 와이파이쉴드가 달라 cc3000에 맞게 라이브러리를 수정해줘야함은 알겠으나

cc3000 예제를 비교해보면서 해보고 있지만 인터넷 정보도 적고해서 어려움이 많습니다. 고쳐야할 부분이 어디일까요...

코딩 짠거에서 DHCP 다음부터는 전혀 넘어가질 않습니다.

어디가 문제인지 구체적으로 잘 알려주시면 감사하겠습니다ㅠ

#include
#include
#include
#include
#include "utility/debug.h"
#include "SPI.h"
#include "WiFi.h"
#define WLAN_SECURITY   WLAN_SEC_WPA2
#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); // you can change this clock speed

char ssid[] = "dlink";       //와이파이 SSID
char pass[] = "";   //와이파이 password
String location = "Gangnam"; //날씨정보를 보고싶은 지역


//인스턴스 변수 초기화
WiFiServer server(80);
WiFiClient client;

const unsigned long requestInterval = 60000;  // 요구 시간 딜레이(1 min)

IPAddress hostIp;
uint8_t ret;
unsigned long lastAttemptTime = 0;            // 마지막으로 서버에서 데이터를 전송받은 시간
String currentLine = "";          // 서버에서 전송된 데이터 String저장
String tempString = "";           // 온도 저장 변수
String humString = "";            // 습도 저장 변수
String timeString = "";           // 시간 정보 변수
String pressureString = "";       // 압력 정보 변수
boolean readingTemp = false;      //온도 데이터가 있는지 여부 판단
boolean readingHum = false;       //습도 데이터가 있는지 여부 판단
boolean readingTime = false;      //시간 데이터가 있는지 여부 판단
boolean readingPressure = false;  //압력 데이터가 있는지 여부 판단
int temp = 0;

void setup(void)
{
  currentLine.reserve(100);
  tempString.reserve(10);
  humString.reserve(10);
  timeString.reserve(20);
uint32_t ip;
  Serial.begin(115200);
  Serial.println(F("Hello, CC3000!\n"));

  /* Initialise the module */
  Serial.println(F("\nInitializing..."));
  if (!cc3000.begin())
  {
    Serial.println(F("Couldn't begin()! Check your wiring?"));
    while(1);
  }
 
  // Optional SSID scan
  // listSSIDResults();
 
  Serial.print(F("\nAttempting to connect to ")); Serial.println(ssid);
  if (!cc3000.connectToAP(ssid, pass, WLAN_SECURITY)) {
    Serial.println(F("Failed!"));
    while(1);
  }
  
  Serial.println(F("Connected!"));
 
  /* 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);
  }

  ip = 0;

  cc3000.printIPdotsRev(ip);
}

void loop()
{
  if (client.connected()) {
    while (client.available()) {
      //전송된 데이터가 있을 경우 데이터를 읽어들인다.
      char inChar = client.read();
      // 읽어온 데이터를 inChar에 저장한다.
      currentLine += inChar;
      //inChar에 저장된 Char변수는 currentLine이라는 String변수에 쌓이게 된다.
     
      //라인피드(줄바꿈)문자열이 전송되면 데이터를 보내지 않는다.
      if (inChar == '\n') {
        //Serial.print("clientReadLine = ");
        //Serial.println(currentLine);
        currentLine = "";
      }
     
      //온도 데이터가 전송되었는지 확인
      if ( currentLine.endsWith("         //현재 스트링이 "       }     

      //       if (readingTemp) {
        if (inChar != 'm') { //전송될 문자가 'm'이 올때까지 온도값으로 인식
          tempString += inChar;
        }
        else { //전송된 문자가 'm'이라면 온도데이터를 그만 저장하고 온도값 출력
          readingTemp = false;

          Serial.print("-  Temperature: ");
          Serial.print(getInt(tempString)-273);
          Serial.println((char)176);    //degree symbol
        }
      }

      if ( currentLine.endsWith("         //현재 스트링이 "       }

      if (readingHum) {
        if (inChar != 'u') {//전송될 문자열이 'u'가 아니라면 계속 습도값을 받게 된다.
          humString += inChar;
        }
        else { //다음에 전송된 문자열이 'u'라면 습도값을 그만 받고 값을 출력한다.
          readingHum = false;
          Serial.print("-  Humidity: ");
          Serial.print(getInt(humString));
          Serial.println((char)37);
        }
      }

      if ( currentLine.endsWith("         // 현재 스트링이 "       }

      if (readingTime) {
        if (inChar != '/') { //다음 전송될 문자가 '/'가 아니라면 계속적으로 시간데이터를 받는다
          timeString += inChar;
        }
        else {
          readingTime = false;
          Serial.print("-  Last update: ");
          Serial.println(timeString.substring(2,timeString.length()-1));
        }
      }

      if ( currentLine.endsWith("         // 현재 스트링이 "       }     

      if (readingPressure) {
        if (inChar != 'u') { //다음 전송될 문자가 'u'가 아니라면 계속 기압데이터를 받는다.
          pressureString += inChar;
        }
        else { //다음 전송된 문자가 'u'라면 기압데이터를 출력한다.
          readingPressure = false;

          Serial.print("-  Pressure: ");
          Serial.print(getInt(pressureString));
          Serial.println("hPa");
        }

      }

      if ( currentLine.endsWith("")) { //현재 스트링이 로 끝났다면 연결을 끊고 다시 서버와 연결을 준비한다.
        delay(10000); //10초뒤에 서버와 연결을 끊고 재연결을 시도한다.
        client.stop();
        connectToServer();
        //Serial.println("Disconnected from Server.\n");
      }
    }  

  }
  else if (millis() - lastAttemptTime > requestInterval) {
    //연결을 실패했다면 requestInterval(60초)이후에 다시 연결을 시도한다.
    connectToServer();
  } 
}

//서버와 연결
void connectToServer() {
  Serial.println("connecting to server...");
  String content = "";
  if (client.connect(hostIp, 80)) {
    Serial.println("Connected! Making HTTP request to api.openweathermap.org for "+location+"...");
    //Serial.println("GET /data/2.5/weather?q="+location+"&mode=xml");
    client.println("GET /data/2.5/weather?q="+location+"&mode=xml");
    //위에 지정된 주소와 연결한다.
    client.print("HOST: api.openweathermap.org\n");
    client.println("User-Agent: launchpad-wifi");
    client.println("Connection: close");

    client.println();
    Serial.println("Weather information for "+location);
  }
  //마지막으로 연결에 성공한 시간을 기록
  lastAttemptTime = millis();
}


void printHex(int num, int precision) {
  char tmp[16];
  char format[128];

  sprintf(format, "%%.%dX", precision);

  sprintf(tmp, format, num);
  Serial.print(tmp);
}

void printWifiData() {
  // Wifi쉴드의 IP주소를 출력
  Serial.println();
  Serial.println("IP Address Information:"); 
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  //MAC address출력
  byte mac[6]; 
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  printHex(mac[5], 2);
  Serial.print(":");
  printHex(mac[4], 2);
  Serial.print(":");
  printHex(mac[3], 2);
  Serial.print(":");
  printHex(mac[2], 2);
  Serial.print(":");
  printHex(mac[1], 2);
  Serial.print(":");
  printHex(mac[0], 2);
  Serial.println();
  //서브넷 마스크 출력
  IPAddress subnet = WiFi.subnetMask();
  Serial.print("NetMask: ");
  Serial.println(subnet);

  //게이트웨이 주소 출력
  IPAddress gateway = WiFi.gatewayIP();
  Serial.print("Gateway: ");
  Serial.println(gateway);

  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  ret = WiFi.hostByName("api.openweathermap.org", hostIp);

  Serial.print("ret: ");
  Serial.println(ret);

  Serial.print("Host IP: ");
  Serial.println(hostIp);
  Serial.println("");
}

int getInt(String input){  //String데이터를 intger형으로 변환하는 함수
  int i = 2;

  while(input[i] != '"'){
    i++;
  }
  input = input.substring(2,i);
  char carray[20];
  //Serial.println(input);
  input.toCharArray(carray, sizeof(carray));
  //Serial.println(carray);
  temp = atoi(carray);
  //Serial.println(temp);
  return temp;
}
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;
  }
}

이전글   |    nodemcu 베터리 연결 2016-05-27
다음글   |    블루투스 Dc 모터 때문에 문의 드려요~ 2016-05-28