정보나눔

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

날씨 정보를 루프문으로 돌리고 싶은데 어렵네요
김범식 | 2016-09-30

터치센서를 사용해서

터치센서를 누르면 날씨 정보를 새로 받아오는 소스를 만들고 싶은데

어렵네요, 아예 인터넷 접속 자체도 못하고 있는데

cc3000 데이터시트 봐도 하나도 모르겠어요 ㅠㅠ 찾아보란 말 말고

구체적으로 어디를 추가하거나 고쳐야하는지 알려주셨으면 좋겠습니다 ㅠ

 

#include <Adafruit_CC3000.h>
#include <ccspi.h>
#include <SPI.h>
#include <string.h>
#include "utility/debug.h"
#include <LiquidCrystal.h>

LiquidCrystal lcd(14,15,16,17,18,19);
#define ADAFRUIT_CC3000_IRQ   3
#define ADAFRUIT_CC3000_VBAT  5
#define ADAFRUIT_CC3000_CS    10
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
                                         SPI_CLOCK_DIVIDER);

#define WLAN_SSID       "dlink"
#define WLAN_PASS       ""
#define WLAN_SECURITY   WLAN_SEC_WPA2
#define IDLE_TIMEOUT_MS  3000
#define WEBSITE "api.openweathermap.org"
#define WEBPAGE "/data/2.5/weather?q=seoul&units=metric&mode=xml&APPID=a9528aac927cb3e66d65e56aefad6515"
uint32_t ip;

String location ="seoul";
String currentLine = ""; //서버에서 읽어온 데이터를 저장할 String
String weather= ""; //날씨 코드를 저장할 String
String Temper = ""; //온도 데이터를 저장할 String
boolean readWeather = false; //날씨 코드 데이터가 있는지 여부 판단
boolean readingTemp = false; //온도 데이터가 있는지 여부 판단
boolean parsingStatus = false; //버튼 상태에 따라 데이터를 읽어오기 위한 토글
int temp = 0;
int weatherCode;
int led1 = 2;
int led2 = 7;
int led3 = 8;
int led4 = 9;
int led5 = 11;
int button = 12; //버튼을 사용을 위한 핀
int buttonStatus; //버튼 상태를 담을 변수
unsigned long lastConnectionTime = 0;          
const unsigned long postingInterval = 10L * 1000L; //interval 시간

void setup(){
 // 공간 할당
currentLine.reserve(100);
weather.reserve(10);
Temper.reserve(10);
Serial.begin(115200);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
lcd.begin(16,2);
lcd.clear();
 
pinMode(button,INPUT_PULLUP); // 버튼 선언, 내부 풀업 저항을 사용합니다. 버튼이 안눌러졌을 때 1, 눌러졌을 때 0의 값을 가지게 됩니다.
 
 //Wi-Fi 연결 시도
 if (!cc3000.begin())
 {
 Serial.println(F("Couldn't begin()! Check your wiring?"));
 while(1);
 }
 
 Serial.print(F("\nAttempting to connect to "));
 Serial.println(WLAN_SSID);
 while(!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
 Serial.println(F("Fail"));
 }
 
 Serial.println(F("Connected!"));
 
 Serial.println(F("Request DHCP"));
 
 while (!cc3000.checkDHCP())
 {
 delay(100); // ToDo: Insert a DHCP timeout!
 }
 
 while (! displayConnectionDetails()) {
 delay(1000);
 }
 
 ip = 0;
 
 Serial.print(WEBSITE);
 Serial.print(F(" -> "));
 while (ip == 0) {
 if (! cc3000.getHostByName(WEBSITE, &ip)) {
 Serial.println(F("Couldn't resolve!"));
 }
 delay(500);
 }
 
 cc3000.printIPdotsRev(ip);
}
 
 
void loop(){
 
 buttonStatus = digitalRead(button);
 
 if(buttonStatus==0){ //버튼이 눌러졌을 때
 parsingStatus=true; //파싱 토글 상태 전환
 
 }
 
 while(parsingStatus){
 Adafruit_CC3000_Client www = cc3000.connectTCP(ip, 80);
 
 if (www.connected()) { // 클라이언트가 연결되었다면 날씨 데이터 호출
 www.fastrprint(F("GET "));
 www.fastrprint(WEBPAGE);
 www.fastrprint(F(" HTTP/1.1\r\n"));
 www.fastrprint(F("Host: "));
 www.fastrprint(WEBSITE);
 www.fastrprint(F("\r\n"));
 www.fastrprint(F("\r\n"));
 www.println();
 }
 
 else { // 클라이언트가 연결되지 않았다면 오류 메세지 출력
 Serial.println(F("Connection failed"));
 www = cc3000.connectTCP(ip,80);
 return;
 }
 
 while (www.connected()) { //클라이언트가 연결되어 있는지 여부 판단
 while (www.available()) { //클라이언트로 읽어오는 데이터가 있는지 여부 판단
 char c = www.read(); //읽어온 데이터를 c에 저장
 currentLine += c;
 
 if (c == '\n') { //줄 바꿈이 전송되면 저장하지 않음.
 currentLine = "";
 }
 
 //날씨 코드 데이터 저장
 if ( currentLine.endsWith("<weather number=")) { //현재 스트링이 "<weather number="로 끝나면 날씨 코드 데이터 저장 준비
 readWeather = true;
 weather = "";
 }
 if (readWeather) {
 if (c != 'v') { //v 이전까지 weatherCodeString에 저장
 weather += c;
 }
 else { //v가 전송되면 저장 중지
 readWeather = false;
 weatherCode = getInt(weather);          //저장한 날씨 코드 string을 integer로 변환
 Serial.print("weather : ");                //시리얼 모니터로 날씨 코드 출력
 Serial.println(weatherCode);
 }
 }
//온도  데이터 저장
 if ( currentLine.endsWith("<temperature value=")) { //현재 스트링이 "<temperature value="로 끝나면 온도 데이터 저장 준비
 readingTemp = true;
 Temper= "";
 }
 if (readingTemp) {
 if (c != 'm') { //m 이전까꺼지 tempString에 저장
 Temper += c;
 }
 else { //m이 전송되면 저장 중지
 readingTemp = false;
 }
 }
 
 if ( currentLine.endsWith("</current>")) { //현재 스트링이 "</current>"로 끝나면
 if(weatherCode>299 && weatherCode<532){        //rainny
     Serial.println("Rainny");
     digitalWrite(led1,HIGH);
      }
      else if(weatherCode>599 && weatherCode<623){       //snow
       Serial.println("Snow");
     digitalWrite(led2,HIGH);
      }
      else if(weatherCode>700 && weatherCode<782){       //mist
     Serial.println("Mist");
      digitalWrite(led4,HIGH);
      }
      else if(weatherCode >799 && weatherCode<802){      //clear and sunny
      Serial.println("Sunny");
       digitalWrite(led3,HIGH);
      }
      else if(weatherCode>801 && weatherCode<805){       //cloudy  
      Serial.println("Cloudy");
       digitalWrite(led5,HIGH);
      }
 delay(1000);
 weatherCode=0;
 www.close(); //클라이언트 연결 종료
 parsingStatus = false; //파싱 토글 상태 전환
 }
 }
 }
 }
}
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;
}
bool displayConnectionDetails(void)
{
 uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
 
 if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
 {
 Serial.println(F("Unable to retrieve the IP Address!\r\n"));
 return false;
 }
 else
 {
 cc3000.printIPdotsRev(ipAddress);
 cc3000.printIPdotsRev(netmask);
 cc3000.printIPdotsRev(gateway);
 cc3000.printIPdotsRev(dhcpserv);
 cc3000.printIPdotsRev(dnsserv);
 Serial.println();
 return true;
 }
}

이전글   |    read a rotary encoder with interrupts를 업로드하는데 아래와 ... 2016-09-29
다음글   |    전 글에 이어서 시리얼통신 질문 드려요 2016-09-30