안녕하세요
wifi 쉴드로 날씨를 알려주는 구름조명을 따라하다가 블루투스로 지역설정을 바꾸고싶어서 코딩을 바꾸었는데요
블루투스부분 코딩과 날씨를 와이파이쉴드를 통해 파싱해와서 조명을 제어하는 부분을 따로 따로 실행시켰을 때
각각 잘 동작하였는데 둘을 같이 해서 완성을 시키려 하니까
첨부된 사진처럼 connecting to serverr..이 구문만 반복되고있고 날씨파싱과 그 이후 부분이 실행이 되질않는데 코드 부분에 문제가 있는지
전혀 모르겠습니다 ㅠ 도움을 좀 받을 수 있을까요? 코드는 아래와 같습니다.
#include "SPI.h"
#include "WiFi.h"
#include "Adafruit_WS2801.h"
#include "SoftwareSerial.h"
SoftwareSerial mySerial(5,6);
char ssid[] = "BITDOL"; //와이파이 SSID
char pass[] = "BITDOLLAN2015"; //와이파이 password
//인스턴스 변수 초기화
WiFiServer server(80);
WiFiClient client;
const unsigned long requestInterval = 60000; // 요구 시간 딜레이(1 min)
IPAddress hostIp;
uint8_t ret;
unsigned long lastAttemptTime = 0; // 마지막으로 서버에서 데이터를 전송받은 시간
String currentLine = "";
String weatherString = "";
String timeString = "";
String location = "Zurich";
boolean readingWeather = false;
boolean readingTime = false;
boolean stringComplete = false;
int weather;
int temp = 0;
int dataPin = 2;
int clockPin = 3;
int lednum = 20;
Adafruit_WS2801 strip = Adafruit_WS2801(lednum, dataPin, clockPin );
uint32_t Color(byte r, byte g, byte b)
{
uint32_t c;
c = r;
c <<= 8;
c |= g;
c <<= 8;
c |= b;
return c;
}
void setup() {
mySerial.begin(115200);
//각 변수에 정해진 공간 할당
Serial.begin(115200);
strip.begin();
strip.show();
delay(10);
//WiFi연결 시도
Serial.println("Connecting to WiFi....");
WiFi.begin(ssid, pass); //WiFi가 패스워드를 사용한다면 매개변수에 password도 작성
server.begin();
Serial.println("Connect success!");
Serial.println("Waiting for DHCP address");
//DHCP주소를 기다린다
while(WiFi.localIP() == INADDR_NONE) {
Serial.print(".");
delay(300);
}
Serial.println("\n");
printWifiData();
connectToServer();
}
void loop()
{
if(mySerial.available())
{
char c = mySerial.read();
Serial.println(c);
if(c== 'D'){
location = "DAEGU";
Serial.println("Search DEAGU");
}else if(c == 'W'){
location = "WASHINGTON";
Serial.println("Search WASHINGTON"); }
}
if (client.connected()) {
while (client.available()) {
//전송된 데이터가 있을 경우 데이터를 읽어들인다.
char inChar = client.read();
// 읽어온 데이터를 inChar에 저장한다.
currentLine += inChar;
//inChar에 저장된 Char변수는 currentLine이라는 String변수에 쌓이게 된다.
//라인피드(줄바꿈)문자열이 전송되면 데이터를 보내지 않는다.
if (inChar == '\n') {
//Serial.print("clientReadLine = ");
//Serial.println(currentLine);
currentLine = "";
}
if ( currentLine.endsWith(" readingWeather = true;
weatherString = " "; }
if (readingWeather) {
if (inChar != 'v') { //다음 전송될 문자가 'u'가 아니라면 계속 기압데이터를 받는다.
weatherString += inChar;
}
else { //다음 전송된 문자가 'u'라면 기압데이터를 출력한다.
readingWeather = false;
weather = getInt(weatherString);
weatherpixel();
Serial.print("weather code: ");
Serial.println(weather);
}
}
if ( currentLine.endsWith(" }
if (readingTime) {
if (inChar != '/') { //다음 전송될 문자가 '/'가 아니라면 계속적으로 시간데이터를 받는다
timeString += inChar;
}
else {
readingTime = false;
Serial.print("last update: ");
Serial.println(timeString.substring(2,timeString.length()-1));
}
}
if ( currentLine.endsWith("")) { //현재 스트링이 로 끝났다면 연결을 끊고 다시 서버와 연결을 준비한다.
delay(100); //10초뒤에 서버와 연결을 끊고 재연결을 시도한다.
client.stop();
// serialEvent();
// if (stringComplete) {
// Serial.println(location);
// // clear the string:
// stringComplete = false;
// }
connectToServer();
//Serial.println("Disconnected from Server.\n");
}
}
}
else if (millis() - lastAttemptTime > requestInterval) {
//연결을 실패했다면 requestInterval(60초)이후에 다시 연결을 시도한다.
connectToServer();
}
}
//서버와 연결
void connectToServer() {
Serial.println("");
Serial.println("connecting to server...");
String content = "";
if (client.connect(hostIp, 80)) {
Serial.println("Connected! Making HTTP request to api.openweathermap.org for "+location+"...");
//Serial.println("GET /data/2.5/weather?q="+location+"&mode=xml");
client.println("GET /data/2.5/weather?q="+location+"&mode=xml");
//위에 지정된 주소와 연결한다.
client.print("HOST: api.openweathermap.org\n");
client.println("User-Agent: launchpad-wifi");
client.println("Connection: close");
client.println();
Serial.println("Weather information for "+location);
}
//마지막으로 연결에 성공한 시간을 기록
lastAttemptTime = millis();
}
void printHex(int num, int precision) {
char tmp[16];
char format[128];
sprintf(format, "%%.%dX", precision);
sprintf(tmp, format, num);
Serial.print(tmp);
}
void printWifiData() {
// Wifi쉴드의 IP주소를 출력
Serial.println();
Serial.println("IP Address Information:");
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
//MAC address출력
byte mac[6];
WiFi.macAddress(mac);
Serial.print("MAC address: ");
printHex(mac[5], 2);
Serial.print(":");
printHex(mac[4], 2);
Serial.print(":");
printHex(mac[3], 2);
Serial.print(":");
printHex(mac[2], 2);
Serial.print(":");
printHex(mac[1], 2);
Serial.print(":");
printHex(mac[0], 2);
Serial.println();
//서브넷 마스크 출력
IPAddress subnet = WiFi.subnetMask();
Serial.print("NetMask: ");
Serial.println(subnet);
//게이트웨이 주소 출력
IPAddress gateway = WiFi.gatewayIP();
Serial.print("Gateway: ");
Serial.println(gateway);
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
ret = WiFi.hostByName("api.openweathermap.org", hostIp);
Serial.print("ret: ");
Serial.println(ret);
Serial.print("Host IP: ");
Serial.println(hostIp);
Serial.println("");
}
int getInt(String input){ //String데이터를 intger형으로 변환하는 함수
int i = 2;
while(input[i] != '"'){
i++;
}
input = input.substring(2,i);
char carray[20];
//Serial.println(input);
input.toCharArray(carray, sizeof(carray));
//Serial.println(carray);
temp = atoi(carray);
//Serial.println(temp);
return temp;
}
void weatherpixel(){
float rantime = random(20,50);
//thunder
if(weather>199 && weather<233)
type4();
//drop
if(weather>299 && weather<532){
type3();
}
else ;
//smoky
if(weather>700 && weather <782){
type2();
}
else ;
if(weather>801 && weather<805){
type2();
}
else ;
//sunny
if(weather>799 && weather<802){
type1();
}
else ;
}
void type1(){
rainbow(15);
}
void type2(){
uint16_t i, j;
for(j=0; j<256; j+=1) {
for(i=0; i int sum = i+j;
map(sum,0,300,120,190);
strip.setPixelColor(i, Wheel(sum),Wheel(sum),Wheel(sum));
}
strip.show();
delay(10);
}
}
void type3(){
uint16_t i, j;
for(j=0; j<256; j+=1) {
for(i=0; i int sum = i+j;
map(sum,0,300,120,190);
strip.setPixelColor(Wheel(sum), i,Wheel(sum),Wheel(sum));
}
strip.show();
delay(10);
}
}
void type4(){
uint16_t i, j,q;
for(q=0; q for(j=0; j<256; j+=1) {
for(i=0; i int sum = i+j;
map(sum,0,300,120,190);
strip.setPixelColor(i, Wheel(sum),Wheel(sum),0);
}
strip.show();
delay(10);
}
}
theaterChase(Color(255, 255, 0), 60); //흰색 출력
}
void rainbow(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256; j++) {
for(i=0; i strip.setPixelColor(i, Wheel((i+j) & 255));
}
strip.show();
delay(wait);
}
}
void theaterChase(uint32_t c, uint8_t wait) {
for (int j=0; j<10; j++) {
for (int q=0; q < 3; q++) {
for (int i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, c);
}
strip.show();
delay(wait);
for (int i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, 0);
}
}
}
}
uint32_t Wheel(byte WheelPos) {
if(WheelPos < 85) {
return Color(WheelPos * 3, 255 - WheelPos * 3, 0);
} else if(WheelPos < 170) {
WheelPos -= 85;
return Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else {
WheelPos -= 170;
return Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}
|