정보나눔

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

cc3000을 사용한다고 연락했던 사람입니다.
유혁준 | 2015-07-31

#include "SPI.h"
#include "WiFi.h"

#define WLAN_SSID       "TP-LINK_0DF298"   // cannot be longer than 32 characters!
#define WLAN_PASS       "89873373"

char ssid[] = "TP-LINK_0DF298";       //와이파이 SSID
char pass[] = "89873373";   //와이파이 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() {
  //각 변수에 정해진 공간 할당
  currentLine.reserve(100);
  tempString.reserve(10);
  humString.reserve(10);
  timeString.reserve(20);
  Serial.begin(115200); 

  delay(10);
  //WiFi연결 시도
  Serial.println("Connecting to WiFi...."); 
  WiFi.begin(ssid, pass);  //WiFi가 패스워드를 사용한다면 매개변수에 password도 작성

  server.begin();
  Serial.println("Connect success!");
  Serial.println("Waiting for DHCP address");
  //DHCP주소를 기다린다
  while(WiFi.localIP() == INADDR_NONE) {//여기서 걸립니다. INADDR_NONE 는 어떤일을하는 함수인가요?
    Serial.print(".");
    delay(300);
  }

  Serial.println("\n");
  printWifiData();
  connectToServer();

}

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("<temperature value=")) {
        //현재 스트링이 "<temperature value="로 끝났다면 온도데이터를 받을 준비를 한다.
        readingTemp = true;
        tempString = "";
      }   

      //<temperature value=뒤에 오는 문자열을 tempString에 저장한다.
      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("<humidity value=")) {
        //현재 스트링이 "<humidity value ="로 끝났다면 습도 데이터를 받을 준비를 한다.
        readingHum = true;
        humString = "";
      }

      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("<lastupdate value=")) {
        // 현재 스트링이 "<lastupdata value="로 끝났다면 마지막 업데이트 시간 데이터를 받을 준비를 한다.
        readingTime = true;
        timeString = "";
      }

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

      if ( currentLine.endsWith("<pressure value=")) {
        // 현재 스트링이 "<pressure value="로 끝났다면 기압 데이터를 받을 준비를 한다.
        readingPressure = true;
        pressureString = "";
      }   

      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("</current>")) { //현재 스트링이 </current>로 끝났다면 연결을 끊고 다시 서버와 연결을 준비한다.
        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;
}

 

 

이미지가 추가 되질 않습니다.

일단 시리얼 화면 텍스트를 복사 하여 붙였습니다.

Connecting to WiFi....
Connect success!
Waiting for DHCP address
........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

 

프로필사진

판다마니아 2015-07-31 14:23:16

INADDR_NONE 는 와이파이 연결시 ip주소를 할당할 때 에러가 발생하면 리턴하는 값입니다.

 

지금 발생하는 문제가 와이파이를 통해 접속을 할때 접속이 되지 않아서 발생합니다. 한번 와이파이 주소와 와이파이 비밀번호를 확인해보시고, 혹시 공유기 설정을 보시고 와이파이 모듈이 연결되어있는지 확인해보세요

프로필사진

유혁준 2015-07-31 15:33:32

cc3000

http://www.gameplusedu.com/shop/goods/goods_view.php?goodsno=832&category=003017

제품을 사용합니다. adafruit에서 제공해준 cc3000용 example은 잘됩니다. dhcp도 잘 가지고 옵니다. 하지만 spi랑 wifi 헤더 파일을 가지고 한 소스인 위 소스는 dhcp 를 가지고 오지 못하는데 이유가 무엇인지 잘 모르겠습니다. 핀 역할때문인거같기도 합니다만 그렇게 아두이노데 대해 잘 알고 있는 편이 아니라서...

프로필사진

APPLE 2015-07-31 17:29:54

 

CC3000 데이터 시트의 일부입니다. 와이파이 칩 CC3000이 MCU와 통신하는 방법으로 SPI 인터페이스를 사용하기 때문에

SPI 헤더가 함께 포함되어야 하는 걸로 알고있습니다. 

 

개인적인 경험으로는 멀쩡하게 잘 되다가도 간혹 어쩔 때 재접속을 하면 저런 현상이 발생합니다. 저는 주로 스마트폰 개인용 핫스팟을

이용해서 사용했는데 핫스팟을 껏다 켜주거나 보드 리셋을 하면 정상동작 하더군요..

프로필사진

전창호 2015-11-08 15:51:05

저도 cc3000모델을 사용하는데 예제 웹클라이언트에서는 주소를 잘 가져오는데 저 소스로 하면 안되더라고요 ㅠㅠ

저도 아두이노랑 와이파이쉴드에 대해 잘 모르는편이라서.. ㅜㅜㅜ

이전글   |    블루투스를 이용해서 안드로이드로 센서값 전송을 실습하려고 합니다.... 2015-07-31
다음글   |    아두이노 MPU센서 초기값 설정하는 문제로 질문했었던 사람입니다.... 2015-07-31