터치센서를 사용해서
터치센서를 누르면 날씨 정보를 새로 받아오는 소스를 만들고 싶은데
어렵네요, 아예 인터넷 접속 자체도 못하고 있는데
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;
}
}
|