정보나눔

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

[질문]오렌지보드WIFI를 이용하여 날씨를 받아와서 LED점등하는 예제 좀 도와주세요 ㅜ
종석 | 2018-08-15

#include <SPI.h>
#include <Adafruit_WS2801.h>
#include <WizFi250.h>
#include "Adafruit_WS2801.h"
#ifdef __AVR_ATtiny85__
#include <avr/power.h>
#endif

#define VARID      "17ffc157ad6681462ea5060ea3d87582"

uint8_t dataPin  = 2;    // Yellow wire on Adafruit Pixels
uint8_t clockPin = 3;    // Green wire on Adafruit Pixels
//LED strip객체 생성. LED의 개수에 따라 앞 인자값을 변경한다.
Adafruit_WS2801 strip = Adafruit_WS2801(25, dataPin, clockPin);

char ssid[] = "Xiaomi(WIFI)";       // 와이파이SSID
char pass[] = "1q2w3e4r";        // 와이파이 비밀번호
int status = WL_IDLE_STATUS;

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

unsigned long lastConnectionTime = 0;         // 서버에 접속한 마지막 시간 (MilliSecond)
const unsigned long postingInterval = 1000L; // 서버에 데이터를 요청할 Delay (MilliSecond)

boolean readingVal;
boolean getIsConnected = false;
int val, temp;
int tempVal;

String rcvbuf;

// WiFiClient 오브젝트 선언
WiFiClient client;

void httpRequest();
void printWifiStatus();

void setup()
{
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000L)
  clock_prescale_set(clock_div_1); //clock을 16Mhz로 사용
#endif

  strip.begin();

  //LEDstrip loop를 실행시키기 위해 모든 LED를 off시키며 초기화
  strip.show();

  Serial.begin(115200);

  WiFi.init();

  if (WiFi.status() == WL_NO_SHIELD) {   // WiFi 보드에 문제가 있다면
    Serial.println("WiFi board error"); // 시리얼 모니터에 WiFi board error  출력
  }

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

    status = WiFi.begin(ssid, pass);     // WPA/WPA2 WiFi에 연결
  }

  Serial.println("You're connected to the network");

  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;
      //Serial.write(c);
    }

    if (readingVal) {
      if (c != ',' ) {
        valString += c;
        //Serial.write(c);
      }
      else {
        readingVal = false;
        tempVal = valString.toInt(); // 날씨 코드를 String에서 Integer로 변환
        Serial.print("날씨코드 : ");
        Serial.println(tempVal);  // 시리얼 모니터에 날씨 코드 출력
      }
    }
  }

  if (tempVal > 299 && tempVal < 532) {  //비
    for (int i = 0; i < 25; i++) {
      strip.setPixelColor(i, Color(255, 0, 0));
    }
  }
  else if (tempVal > 599 && tempVal < 623) { //눈
    for (int i = 0; i < 25; i++) {
      strip.setPixelColor(i, Color(0, 255, 0));
    }
  }
  else if (tempVal > 700 && tempVal < 782) { //안개(흐림)
    for (int i = 0; i < 25; i++) {
      strip.setPixelColor(i, Color(0, 0, 255));
    }
  }
  else if (tempVal > 799 && tempVal < 802) { //맑음
    for (int i = 0; i < 25; i++) {
      strip.setPixelColor(i, Color(255, 0, 0));
    }
  }
  else if (tempVal > 801 && tempVal < 805) { //구름많음
    for (int i = 0; i < 25; i++) {
      strip.setPixelColor(i, Color(0, 255, 0));
    }
  }

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

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

// 서버에 날씨 데이터 호출 함수
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=Seoul,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;

  }

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


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

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

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

사진도 첨부하고 싶은데 첨부가 안되어서 아쉽습니다 ㅜㅜ

열심히 혼자 여러 자료들을 보면서 만들 었는데

시리얼모니터로 확인 했을 때 날씨코드를 와이파이로 연결되서 받아들여오는 것은 잘 됩니다.

근데 무슨 이유에서 인지 모르겠는데 저가 생각하는 위에 소스 내용은 LED불이 비,눈,안개,맑음,구름(많음) 일 때 전체가 빨간색으로 들어오던 초록색으로 들어오던 파란색으로 들어오던 해야하는데

LED에 불이 안들어 옵니다.. 연결은 잘 되어 있고 이 소스 말고 https://www.kocoafab.cc/tutorial/view/225 의 소스를 그대로

가져와 쓰면 LED에 불이 안들어오는 것은 또 아니여서 고장은 아닌데 혹시 어떤 내용을 잘못하여 안나오는지 알 수 있을까요?

이전글   |    LED를 이용한 화살표 2018-08-12
다음글   |    rc카 제작관련 질문드립니다.. 2018-08-15