정보나눔

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

날씨 조명 질문드립니다.
김태형 | 2015-08-12

시리얼 모니터로 띄웠는데 마지막에 날씨정보 데이터가 나오지 않네요

프로필사진

쿨리오76 2015-08-12 16:34:29

코코아팹 방문자들 상당히 고수들인거 같아요~~

프로필사진

판다마니아 2015-08-12 16:46:24

안녕하세요 방금 연락 받은 사람입니다.

 

제가 직접 와이파이 쉴드로 테스트 한 결과 밑에 창과 같이 결과가 나왔습니다.

(맨 밑에 나오는 코드가 날씨 정보 코드입니다. 801)

 

이 밑의 소스 코드가 제가 테스트 할때 사용한 코드 입니다. 이코드를 사용해보시고 계속 같은 문제가 있으시면 한번 와이파이를 바꿔서 연결해 보시기 바랍니다.

(이 코드는 서울에 날씨 정보를 가져오도록 locate를 바꾼 코드 입니다.)

 

#include "SPI.h"
#include "WiFi.h"
#include <Adafruit_NeoPixel.h>

char ssid[] = "AndroidHotspot6971";       //와이파이 SSID
char pass[] = "00001111";   //와이파이 password 

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


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

IPAddress hostIp;
uint8_t ret;
unsigned long lastAttemptTime = 0;            // 마지막으로 서버에서 데이터를 전송받은 시간

String currentLine = "";
String weatherString = "";   
String timeString = "";
String location = "Seoul";

boolean readingWeather = false; 
boolean readingTime = false;
boolean stringComplete = false;

int weather;
int temp = 0;
int pin = 9;
int lednum = 11;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(lednum, pin, NEO_GRB + NEO_KHZ800);

void setup() {
  //각 변수에 정해진 공간 할당
  Serial.begin(115200);    
 strip.begin();
 strip.show();
  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) {
    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("<weather number=")) {
        // 현재 스트링이 "<pressure value="로 끝났다면 기압 데이터를 받을 준비를 한다.
        readingWeather = true; 
        weatherString = "";
      }      

      if (readingWeather) {
        if (inChar != 'v') { //다음 전송될 문자가 'u'가 아니라면 계속 기압데이터를 받는다.
          weatherString += inChar;
        } 
        else { //다음 전송된 문자가 'u'라면 기압데이터를 출력한다.
          readingWeather = false;
          weather = getInt(weatherString);
          weatherpixel();
          Serial.print("weather code: ");
          Serial.println(weather);
        }
      }
      
      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("</current>")) { //현재 스트링이 </current>로 끝났다면 연결을 끊고 다시 서버와 연결을 준비한다.
       
        delay(100); //10초뒤에 서버와 연결을 끊고 재연결을 시도한다.
        client.stop(); 
//         serialEvent();
//         if (stringComplete) {
//          Serial.println(location); 
//    // clear the string:
//          stringComplete = false;
//          }
        connectToServer();
        //Serial.println("Disconnected from Server.\n");
      }
    }   

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

//서버와 연결
void connectToServer() {
  Serial.println("");
  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;
}

void weatherpixel(){
   float rantime = random(20,50);
   //drop
  if(weather>199 && weather<532){   
    type3();
  }
  else ;
  //smoky
  if(weather>700 && weather <782){
    type2();
  }
  else ;
  if(weather>801 && weather<805){
    type2();
  }
  else ;
  //sunny
  if(weather>799 && weather<802){   
     type1();
   }
   else ;
}


void type1(){
  rainbow(15);
  }

void type2(){
   uint16_t i, j;
  for(j=0; j<256; j+=1) {
    for(i=0; i<strip.numPixels(); i++) {
      int sum = i+j;
      map(sum,0,300,120,190);
     strip.setPixelColor(i, Wheel(sum),Wheel(sum),Wheel(sum));

    }
    strip.show();
    delay(10);
  }
}

void type3(){
   uint16_t i, j,q;
 for(q=0; q<random(1,4);q++){
  for(j=0; j<256; j+=1) {
    for(i=0; i<strip.numPixels(); i++) {
      int sum = i+j;
      map(sum,0,300,120,190);
     strip.setPixelColor(i, Wheel(sum),Wheel(sum),0);

    }
    strip.show();
    delay(10);
  }
 }
    theaterChase(strip.Color(255, 255, 0), 60); //흰색 출력 
}


void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) { 
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c); 
      }
      strip.show();
     
      delay(wait);
     
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0); 
      }
    }
  }
}

uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

 

 

 

 

이전글   |    질문드릴 게 있어서 글을 씁니다. 2015-08-12
다음글   |    코코아팹의 오렌지보드 BLE를 처음 소개합니다~... 2015-08-12