정보나눔

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

구름 날씨조명 (wifi,블루투스모듈사용)
임준범 | 2015-09-09

안녕하세요

wifi 쉴드로 날씨를 알려주는 구름조명을 따라하다가 블루투스로 지역설정을 바꾸고싶어서 코딩을 바꾸었는데요

블루투스부분 코딩과 날씨를 와이파이쉴드를 통해 파싱해와서 조명을 제어하는 부분을 따로 따로 실행시켰을 때 

각각 잘 동작하였는데 둘을 같이 해서 완성을 시키려 하니까 

첨부된 사진처럼 connecting to serverr..이 구문만 반복되고있고 날씨파싱과 그 이후 부분이 실행이 되질않는데 코드 부분에 문제가 있는지

전혀 모르겠습니다 ㅠ 도움을 좀 받을 수 있을까요? 코드는 아래와 같습니다.

#include "SPI.h"
#include "WiFi.h"
#include "Adafruit_WS2801.h"
#include "SoftwareSerial.h"

SoftwareSerial mySerial(5,6);

char ssid[] = "BITDOL";       //와이파이 SSID
char pass[] = "BITDOLLAN2015";   //와이파이 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 = "Zurich";


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

int weather;
int temp = 0;
int dataPin = 2;
int clockPin = 3;
int lednum = 20;

Adafruit_WS2801 strip = Adafruit_WS2801(lednum, dataPin, clockPin );

uint32_t Color(byte r, byte g, byte b)
{
  uint32_t c;
  c = r;
  c <<= 8;
  c |= g;
  c <<= 8;
  c |= b;
  return c;
}

void setup() {
  mySerial.begin(115200);
  //각 변수에 정해진 공간 할당
  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(mySerial.available())
  {
    char c = mySerial.read();
    Serial.println(c);
    
    if(c== 'D'){
    location = "DAEGU";
     Serial.println("Search DEAGU");  
    }else if(c == 'W'){
      location = "WASHINGTON";
      Serial.println("Search WASHINGTON");  }
  }

 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("         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("       }
      if (readingTime) {
        if (inChar != '/') { //다음 전송될 문자가 '/'가 아니라면 계속적으로 시간데이터를 받는다
          timeString += inChar;
        } 
        else {
          readingTime = false;
          Serial.print("last update: ");
          Serial.println(timeString.substring(2,timeString.length()-1));
        }
      }
        
             
      if ( currentLine.endsWith("")) { //현재 스트링이 로 끝났다면 연결을 끊고 다시 서버와 연결을 준비한다.
       
        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);
   //thunder
  if(weather>199 && weather<233)
     type4();
   //drop
  if(weather>299 && 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       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;
  for(j=0; j<256; j+=1) {
    for(i=0; i       int sum = i+j;
      map(sum,0,300,120,190);
     strip.setPixelColor(Wheel(sum), i,Wheel(sum),Wheel(sum));

    }
    strip.show();
    delay(10);
  }
}
void type4(){
   uint16_t i, j,q;
 for(q=0; q   for(j=0; j<256; j+=1) {
    for(i=0; i       int sum = i+j;
      map(sum,0,300,120,190);
     strip.setPixelColor(i, Wheel(sum),Wheel(sum),0);

    }
    strip.show();
    delay(10);
  }
 }
    theaterChase(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.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 Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

프로필사진

수박쨈 2015-09-14 08:45:05

connectToServer(); 부분이 setup()에는 있고 loop()안에 없는거 같네요.

그래서 Setup()에서 있는 connectToServer()를 통해 한번 Zurich값은 읽어오는데 다른 값은 읽어오지 못하는거 같습니다.

 

서버에 접속해서 지정한 로케이션 값의 날씨를 받아오는 함수인데 로케이션만 지정해주고 서버에 연결하지 않는다면 읽어오지 못할 수 있습니다.

이전글   |    LCD 사용 질문 2015-09-07
다음글   |    아두이노 지문인식 금고 질문있습니다 2015-09-10