정보나눔

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

날씨정보 받아오기
garbage333 | 2018-10-04

#include <WizFi250.h>
#include <WizFi250Client.h>
#include <WizFi250Server.h>
#include <WizFi250Udp.h>
#include <WizFi250_definitions.h>
#include <SPI.h>
#include <Servo.h>
#include <Adafruit_NeoPixel.h>

#define VARID "개인api"    // OpenWeatherMap 개인 API ID

Servo myservo;    // 서보모터 객체생성

Adafruit_NeoPixel strip = Adafruit_NeoPixel(4, 5, NEO_GRB + NEO_KHZ800);    // NeoPixel LED 개수 설정 및 선언

char ssid[] = "wifi name";   // WIFI 이름 설정
char pass[] = "wifi password";   // WIFI 비밀번호 
int status = WL_IDLE_STATUS;

char server[] = "api.openweathermap.org";

unsigned long lastConnectionTime = 0;           // 서버에 접속한 마지막 시간 (Milli Sec)
const unsigned long postingInterval = 1000L;    // 서버에 데이터 요청 딜레이 (Milli Sec)

boolean readingVal;
boolean getIsConnected = false;
int val, temp;
int tempVal;
int pos = 0;
int count = 0;

String rcvbuf;

// 와이파이 클라이언트 오브젝트 선언

WiFiClient client;

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 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);
  }
}

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);
    }
  }
}

// WiFi 연결 상태 정보 출력 함수
void printWifiStatus() {
  // print the SSID of the network you're attached to
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength
  long rssi = WiFi.RSSI();
  Serial.print("Signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

// 서버에 날씨 데이터 호출 함수
void httpRequest() {
  Serial.println();

  // close any connection before send a new request
  // this will free the socket on the WiFi shield
  client.stop();

  // 제대로 서버에 연결되었을 경우
  if (client.connect(server, 80)) {
    Serial.println("Connecting...");

    // HTTP 요청을 보냄
    client.print("GET /data/2.5/weather?q=Daejeon,kr&appid=");
    client.print(VARID);
    client.println(" HTTP/1.1");
    client.println("Host: api.openweathermap.org");
    client.println("Connection: close");
    client.println();

    // note the time that the connection was made
    lastConnectionTime = millis();
    getIsConnected = true;

    // neopixel LED에 흰색불 점등
    for (int i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, 255, 255, 255);
      strip.show();
    }
  }

  // 제대로 서버에 연결이 되지 않았으면 Connection failed 메세지와 함께 neopixel LED에 적색불 점멸
  else {
    Serial.println("Connection failed");
    getIsConnected = false;
    errorLED();
  }
}

void setup() 
{
  myservo.attach(6);
  myservo.write(10);

  strip.begin();
  strip.show();

  Serial.begin(115200);
  Serial.println(F("\r\n\Serial Init"));

  WiFi.init();

  if(WiFi.status() == WL_NO_SHIELD)   // 와이파이 보드 문제 시
  {
    Serial.println("WiFi board error");   // 시리얼 모니터에 메세지 출력
    while(true);
    errorLED();   // NeoPixel LED에 적색불 점멸
  }

  while ( status != WL_CONNECTED)   // 와이파이 보드에 문제가 없어서 와이파이 연결 시도
  {
    Serial.print("Attempting to connect to WPA SSID : ");
    Serial.println(ssid);   // 연결할 WIFI 이름 출력

    status = WiFi.begin(ssid, pass);    // 와이파이 연결
    if(count > 0)   // 2번 이상 연결 실패 시
    {   // 적색불 점등
      for(int i = 0; i< strip.numPixels(); i++)
      {
        strip.setPixelColor(i, 255, 0, 0);
        strip.show();
      }
    }
    count++;  // 연결 실패 시 count 증가
  }
  Serial.println("네트워크에 연결 되었습니다!");
  readyLED();
  printWifiStatus();
}

void loop() 
{
  String valString;

  while(client.available())
  {
    //  id 뒤에 오는 문자열을 날씨 코드로 저장
    if(rcvbuf.endsWith("{\"id\":"))
    {
      readingVal = true;
      valString = "";
    }

    char c = client.read();

    if(c != NULL)
    {
      if(rcvbuf.length() > 30)
        rcvbuf = "";
      rcvbuf += c;  
    }
    else
    {
      readingVal = false;
      tempVal = valString.toInt();  // 날씨코드를 문자열에서 정수형으로 변환
      Serial.println(tempVal);    // 시리얼모니터에 날씨코드 출력
    }
  }

  //전송 받은 날씨 데이터에 따라 서보 모터의 각도 변경
  if (tempVal > 299 && tempVal < 532) {  //rainny
    pos = 160;
  }
  else if (tempVal > 599 && tempVal < 623) { //snow
    pos = 10;
  }
  else if (tempVal > 700 && tempVal < 782) { //mist
    pos = 50;
  }
  else if (tempVal > 799 && tempVal < 802) { //clear and sunny
    pos = 85;
  }
  else if (tempVal > 801 && tempVal < 805) { //cloudy
    pos = 120;
  }
    myservo.write(pos);
  delay(100);

  //날씨 코드 초기화
  tempVal = 0;

  if (millis() - lastConnectionTime > postingInterval) { // interval 시간이 충족되었다면
    httpRequest(); //데이터 호출
  }
  rcvbuf = "";
}

 

위와같이 코드 작성했는데 시리얼모니터로 보면 

 

Connecting to api.openweathermap.org

Connecting...

 

이렇게 지속적으로 나타나는거 보면 연결은 된 것 같은데

날씨정보를 받아오지 못하는 것 같습니다.. 서보모터 각도가 변하지를 않아서..

혹시 코드 수정할 부분이 있나요..?

 

이전글   |    INA219 센서를 이용한 소비전력 확인 배선 문의... 2018-10-04
다음글   |    아두이노와 안드로이드 블루투스 통신 질문입니다.... 2018-10-04