구름 조명(완성)을 실험을 하는대 파싱 동작 날씨 별 날씨코드 분류 까지 완료 되면 파싱 동작이 멈추어야 하는대 멈추지 않고 다시 파싱 동작을 시작하는 문제 가 발생 하였습니다.
어디부분이 문제인지 궁금하여 질문드립니다.
#include
#include
#include "SPI.h"
#include "WiFi.h"
char ssid[] = "netis"; //와이파이 ID
char pass[] = "12345678900"; //와이파이 비밀번호
String location = "seattle"; //날씨를 가져오고자 하는 지역 선택
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의 상태값이 참일동안
currentLine = "";
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(" 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=ece3f16628536ea9b95ea7adc2a5b595");
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
}
}
}
}
|