정보나눔

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

날씨 정보를 알려주는 무드 램프 만들기[완성]에 대해서 물어볼게있어요! ㅠ
이원규 | 2016-05-08

혼자서 아두이노 공부할겸 하고 있는데 소스상에 문제가 있는건지.. WIFI 연결후에 초록색 led 점등 까지 된이후에는 아무런 변화도없네요 ㅠㅠ 염치없지만 올릴 곳이 여기밖에없네요.. ㅠ 출력화면은 업로드한 사진과 같이 되고 변경사항이없어요.

 

소스 입니다.

#include <Adafruit_NeoPixel.h>
#include <avr/power.h>

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

char ssid[] = "AndroidHotspot9104";         //와이파이 ID
char pass[] = "48779104";     //와이파이 비밀번호
String location = "seoul";          //날씨를 가져오고자 하는 지역 선택
                          
WiFiClient client;
char server[] = "api.openweathermap.org";

IPAddress hostIp;

//neopixel LED를 10번핀에 연결
#define PIN 10                     
Adafruit_NeoPixel strip = Adafruit_NeoPixel(10, PIN, NEO_GRB + NEO_KHZ800);     //neopixel LED의 개수 설정 및 선언

String currentLine = "";            //서버에서 전송된 데이터 String 저장
String codeString = "";             //날씨 코드 저장 변수

boolean readingCode = false;        //코드 데이터가 있는지 여부 판단

int redVal;                         //RGB LED red 값 변수
int greenVal;                       //RGB LED green 값 변수
int blueVal;                        //RGB LED blue 값 변수

int weatherButton = 9;              //날씨 데이터 파싱 동작을 위한 버튼을 9번에 연결
int powerButton = 8;                //조명 on, off 동작을 위한 버튼을 8번에 연결

//on, off 버튼 토글 동작을 위한 변수
int oneTimeFlag;
boolean onOffStatus;

//날씨 파싱 동작을 위한 변수
boolean parsingStart = false;
int weatherCode;

int temp = 0;

void setup() {
  //버튼 셋팅(INPUT 설정)f
  pinMode(powerButton,INPUT_PULLUP);
  pinMode(weatherButton,INPUT_PULLUP);
 
  //neopixel setting
  #if defined (__AVR_ATtiny85__)
  if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
 
  strip.begin();
  strip.show();
 
  //각 변수에 정해진 공간 할당
  currentLine.reserve(100);
  codeString.reserve(10);
 
  Serial.begin(115200);
 
  //Wi-Fi 연결 시도
  delay(10);
  Serial.println("Connecting to WiFi....");
  WiFi.begin(ssid,pass);
  Serial.println("Connect success!");
  Serial.println("Waiting for DHCP address");
  while(WiFi.localIP() == INADDR_NONE) {
    Serial.print(".");
    delay(300);
  }
  printWifiData();  //Wi-Fi 정보 출력
  readyLED();       //Wi-Fi 연결 후 준비가 완료되었다면 초록빛 dimming
 
}

void loop() {
/*on, off 버튼 토글 설정
 off : onOffStatus = 0
 on : onOffStatus = 1*/
   
 int i = digitalRead(weatherButton);            //날씨 버튼 상태를 변수 i에 저장
 
          if(digitalRead(powerButton)==LOW){    //power 버튼이 눌러지면 onOffstatus의 상태값 토글
                if(oneTimeFlag==0){
                        oneTimeFlag = 1;
                        onOffStatus = !onOffStatus;
                }
        }
       else{
                oneTimeFlag = 0;
        }
 

 if(onOffStatus==0){                                    //onOffStatus의 상태가 0이면
     for(int i=0; i<strip.numPixels(); i++){
       strip.setPixelColor(i,0,0,0);
       strip.show();
     }
 }
 
 //날씨 데이터 파싱 및 RGB led 색상 조절 모드
 else{
   if(i == 0){                                          //weatherButton의 상태가 0이라면
     parsingStart = true;     //parsingStart의 상태값 변경
   }
  
   while(parsingStart){        //parsingStart의 상태값이 참일동안
     connectToServer();                                  //서버 연결(openweathermap API에 날씨데이터 호출)
     if(client.connected()){       //클라이언트에 연결되어 있다면
       delay(3000); //**
       while(client.available()){          //클라이언트에 들어온 데이터가 있다면
         char inChar = client.read();                   //들어온 데이터를 inChar에 저장
         currentLine += inChar;                 //inChar에 저장된 char 변수는 currenLine에 저장됨
         Serial.print(inChar);
         if(inChar == '\n'){                            //줄바꿈(\n) 문자열이 전송되면 데이터를 저장하지 않음
           currentLine = "";
         }
        
         //날씨 코드 데이터가 전송되었는지 확인
         if(currentLine.endsWith("<weather number=")){  //currentLine의 string이 <weather number=로 끝났다면
         readingCode = true;                            //날씨 코드 데이터를 받을 준비를 한다
         codeString = "";
         }
         if(readingCode){
           if(inChar != 'v'){                           //inChar string에 v가 전송될 때까지
             codeString += inChar;                      //codeString에 저장
           }
           else{                                        //전송된 문자가 v라면
             readingCode = false;                       //저장 중지
             weatherCode = getInt(codeString);          //저장한 날씨 코드 string을 integer로 변환
             //Serial.print("weather : ");                //시리얼 모니터로 날씨 코드 출력
             //Serial.println(codeString);
           }
         } 
       }
     }
     else{
       Serial.println("connect fail");           //클라이언트에 연결되지 않았다면 시리얼 모니터창에 connect fail 출력
       errorLED();                               //클라이언트에 연결되지 않았다면 빨간빛 dimming                     
       //weatherCode=0;
     }
      
     //날씨 코드 분류
     if(weatherCode>299 && weatherCode<532){        //rainny
      rainnyLED();
     }
     else if(weatherCode>599 && weatherCode<623){       //snow
      snowLED();
     }
     else if(weatherCode>700 && weatherCode<782){       //mist
      cloudyMistLED();
     }
     else if(weatherCode >799 && weatherCode<802){      //clear and sunny
      clearweatherLED();
     }
     else if(weatherCode>801 && weatherCode<805){       //cloudy  
      cloudyMistLED();
     }
  
     parsingStart = false;             //날씨 데이터를 파싱하고 LED로 날씨를 표현한 후 상태값 변경
     weatherCode=0;
   }
  
 
   //조명모드
     redVal = map(analogRead(A0),0,1023,0,255);
     greenVal = map(analogRead(A1),0,1023,0,255);
     blueVal = map(analogRead(A2),0,1023,0,255);
    
     for(int i=0; i<strip.numPixels(); i++){
       strip.setPixelColor(i,redVal,greenVal,blueVal);
       strip.show();
     }


 }
}

//Wi-Fi 서버 연결 함수
void connectToServer() {
  client.stop();
  if (client.connect(server, 80)) {
    Serial.println("connecting...");
    // send the HTTP PUT request:
    client.println("GET /data/2.5/weather?q="+location+"&mode=xml&APPID={05f470ce18c28cf755011cd4790dc5eb}");
    client.println("HOST: api.openweathermap.org\n");
    client.println("User-Agent: ArduinoWiFi/1.1");
    client.println("Connection: close");
    client.println();
  }
  else {
    Serial.println("connection failed");
    errorLED();         //서버에 연결하지 못했다면 빨간빛 dimming
  }
}

//Wi-Fi data 출력
void printWifiData() {
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // Wi-Fi 쉴드 IP 주소 출력
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // 수신 신호 강도 출력
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

//정수 변환을 위한 함수
int getInt(String input){
  int i = 2;
  while(input[i] != '"'){
    i++;
  }
  input = input.substring(2,i);
  char carray[20];
  input.toCharArray(carray, sizeof(carray));
  temp = atoi(carray);
  return temp;
}


//LED 패턴 함수
//clear and sunny, 무지개빛 출력
void clearweatherLED() {
  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(20);
  }
}


//cloudy and mist, 흰색빛으로 dimming
void cloudyMistLED(){
 uint16_t i, j;
  for(int k=0; k<3; k++){
    for(j=0; j<256; j++) {
      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(8);
    }
  }
}

//rainny and thunder, 노란색 빛으로 dimming후 blink
void rainnyLED(){
 uint16_t i, j;
  for(int k=0; k<2; k++){
    for(j=0; j<256; j++) {
      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(7);
    }
  }
  theaterChase(strip.Color(255, 255, 0), 40);
}

//snow, 흰색으로 theaterChase
void snowLED(){
  for (int j=0; j<7; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, strip.Color(255, 255, 255));    //turn every third pixel on
        delay(30);
      }
      strip.show();    
      delay(30);    
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//connect error, 빨간색 빛으로 dimming
void errorLED(){
 uint16_t i, j;
  for(int k=0; k<3; k++){
    for(j=0; j<256; j++) {
      for(i=0; i<strip.numPixels(); i++) {
        int sum = i+j;
        map(sum,0,300,120,190);
       strip.setPixelColor(i, Wheel(sum),0,0);
      }
      strip.show();
      delay(2);
    }
  }
}

//ready, 녹색 빛으로 dimming
void readyLED(){
   uint16_t i, j;
    for(j=0; j<256; j++) {
      for(i=0; i<strip.numPixels(); i++) {
        int sum = i+j;
        map(sum,0,300,120,190);
       strip.setPixelColor(i, 0,Wheel(sum),0);
      }
      strip.show();
      delay(8);
    }
}


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

void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();
    
      delay(wait);
    
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

 

이전글   |    usb연결 질문드립니다 2016-05-06
다음글   |    처음부터 포인트를 100점 정도 주시면 좋겠네요. (-:... 2016-05-09