#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...
이렇게 지속적으로 나타나는거 보면 연결은 된 것 같은데
날씨정보를 받아오지 못하는 것 같습니다.. 서보모터 각도가 변하지를 않아서..
혹시 코드 수정할 부분이 있나요..?
|