코코아팹 예제에 있는 것에서 아이디어를 얻어 gps로 지역 정보를 받고 그 지역에 날씨를 wifi로 기상청으로 받아와서 led로 날씨 정보를 나타내는 구름을 만드려고 합니다.
gps와 wifi가 각각 구현되었고, 이것을 하나의 코드로 합쳐서 구현하려고 하는데 wifi만 작동되거나 잘 안 될경우도 있습니다ㅠ..(잘작동되지 않는경우가 대부분이에요ㅠㅠ)
무엇이 문제인지 코드 한 번 올려봅니다ㅠㅠ고수님들 도와주세요..!!
1)gps코드 (+lcd)
#include
#include
#include
LiquidCrystal lcd (8,9,4,5,6,7); //pin initialization for lcd
SoftwareSerial ss(2,3); //software serial pin for skm53 shield
TinyGPS gps;
//variables for gps
boolean newData=false;
float flat,flon;
int year;byte month,day,hour,minute,second;
boolean state=0;
void setup()
{
lcd.begin(16,2);
lcd.print("Acquiring GPS...");
Serial.begin(9600);
ss.begin(9600);
}
void loop()
{
while(ss.available())
{
char c=ss.read();
if(gps.encode(c))
{
newData=true;
gps.f_get_position(&flat,&flon);
gps.crack_datetime(&year,&month,&day,&hour,&minute,&second);
hour=hour+9; //hour +9 for GMT+9 time zone
}
}
if (newData)
{
lcd.clear();
if (state == 0) //display latitude and longitude
{
lcd.setCursor(0, 0);
lcd.print("Lat:");
lcd.setCursor(6, 0);
lcd.print(flat);
lcd.setCursor(0, 1);
lcd.print("Lon:");
lcd.setCursor(6, 1);
lcd.print(flon);
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Loca:");
lcd.setCursor(0, 1);
if (3737.40952 <= flat <= 3741.5215 && 12702.87736 <= flon <= 12705.64192) {
lcd.print("NOWON");
}
else if (3737.6053 <= flat <= 3740.02234 && 12658.9464 <= flon <= 12700.87978) {
lcd.print("GANGBUK");
}
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Date:");
lcd.setCursor(6, 0);
lcd.print(day);
lcd.print("/");
lcd.print(month);
lcd.print("/");
lcd.print(year);
lcd.setCursor(0, 1);
lcd.print("Time:");
lcd.setCursor(6, 1);
lcd.print(hour);
lcd.print(":");
lcd.print(minute);
lcd.print(":");
lcd.print(second);
delay(2000);
}
newData = false;
delay(10);
}
}
2)wifi코드
#include
#include
#include
#include "utility/debug.h"
#define ADAFRUIT_CC3000_IRQ 3
#define ADAFRUIT_CC3000_VBAT 5
#define ADAFRUIT_CC3000_CS 10
uint32_t ip;
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT, SPI_CLOCK_DIVIDER); // you can change this clock speed but DI
#define WLAN_SSID "Daseul_iPhone" //와이파이 SSID
#define WLAN_PASS "********" //와이파이 password
#define WLAN_SECURITY WLAN_SEC_WPA2
#define IDLE_TIMEOUT_MS 3000
#define WEBSITE "www.kma.go.kr"
#define WEBPAGE "/wid/queryDFSRSS.jsp?zone=1162058500"
void setup() {
//각 변수에 정해진 공간 할당
Serial.begin(9600);
delay(100);
//WiFi연결 시도
Serial.println(F("\nInitialising the CC3000 ..."));
if (!cc3000.begin())
{
Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
while(1);
}
displayMACAddress();
Serial.print(F("\nAttempting to connect to ")); Serial.println(F(WLAN_SSID));
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
Serial.println(F("Failed!"));
while(1);
}
Serial.println(F("Connected!"));
/* Wait for DHCP to complete */
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);
Serial.print(F("\n\rPinging ")); cc3000.printIPdotsRev(ip); Serial.print("...");
uint8_t replies = cc3000.ping(ip, 5);
Serial.print(replies); Serial.println(F(" replies"));
if (replies)
Serial.println(F("Ping successful!"));
Serial.println(F("\n\r++++++++++++++++++++++++++++++++"));
}
void loop() {
Serial.println("loop");
Adafruit_CC3000_Client client = cc3000.connectTCP(ip, 80);
if (client.connected()) {
client.fastrprint(F("GET "));
client.fastrprint(WEBPAGE);
client.fastrprint(F(" HTTP/1.1\r\n"));
client.fastrprint(F("Host: ")); client.fastrprint(WEBSITE); client.fastrprint(F("\r\n"));
client.fastrprint(F("\r\n"));
client.println();
} else {
Serial.println(F("Connection failed"));
return;
}
Serial.println(F("-------------------------------------"));
int out = 0;
while (client.connected()){
if (client.available() && out < 1){
//라인을 기준으로 문자열을 저장한다.
String line = client.readStringUntil('\n');
//시간
int temp11= line.indexOf("");
if(temp11>0) {
String tmp_str="";
String wt_hour = line.substring(line.indexOf(tmp_str)+tmp_str.length(),temp11);
Serial.print("hour is ");
Serial.println(wt_hour);
String line2 = client.readStringUntil('\n');
String line3 = client.readStringUntil('\n');
//온도
int temp= line3.indexOf("");
if(temp>0) {
String tmp_str="";
String wt_temp = line3.substring(line3.indexOf(tmp_str)+tmp_str.length(),temp);
Serial.print("temperature is ");
Serial.println(wt_temp);
String line4 = client.readStringUntil('\n');
String line5 = client.readStringUntil('\n');
String line6 = client.readStringUntil('\n');
String line7 = client.readStringUntil('\n');
String line8 = client.readStringUntil('\n');
String line9 = client.readStringUntil('\n');
//날씨 정보
int wfEn= line9.indexOf("");
if(wfEn>0) {
String tmp_str="";
String wt_twfEn = line9.substring(line9.indexOf(tmp_str)+tmp_str.length(),wfEn);
Serial.print("weather is ");
Serial.println(wt_twfEn);
Serial.println("====================");
out = out + 1;
break;
}
}
}
}
}
Serial.println("finish");
}
void displayMACAddress(void)
{
uint8_t macAddress[6];
if(!cc3000.getMacAddress(macAddress))
{
Serial.println(F("Unable to retrieve MAC Address!\r\n"));
}
else
{
Serial.print(F("MAC Address : "));
cc3000.printHex((byte*)&macAddress, 6);
}
}
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
{
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
Serial.println();
return true;
}
}
3)합친것
#include
#include
#include
#include
#include
#include
#include "utility/debug.h"
LiquidCrystal lcd (8,9,4,5,6,7); //pin initialization for lcd
SoftwareSerial ss(2,3); //software serial pin for skm53 shield
TinyGPS gps;
#define ADAFRUIT_CC3000_IRQ 3
#define ADAFRUIT_CC3000_VBAT 5
#define ADAFRUIT_CC3000_CS 10
uint32_t ip;
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT, SPI_CLOCK_DIVIDER);
#define WLAN_SSID "Daseul_iPhone" //와이파이 SSID
#define WLAN_PASS "*********" //와이파이 password
#define WLAN_SECURITY WLAN_SEC_WPA2
#define IDLE_TIMEOUT_MS 3000
#define WEBSITE "www.kma.go.kr"
#define WEBPAGE "/wid/queryDFSRSS.jsp?zone=1162058500"
//GPS 변수들
boolean newData=false;
float flat,flon;
int year;byte month,day,hour,minute,second;
boolean state=0;
void setup()
{
lcd.begin(16,2);
lcd.print("Acquiring GPS...");
ss.begin(9600);
Serial.begin(9600);
delay(100);
//WiFi연결 시도
Serial.println(F("\nInitialising the CC3000 ..."));
if (!cc3000.begin())
{
Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
while(1);
}
displayMACAddress();
Serial.print(F("\nAttempting to connect to ")); Serial.println(F(WLAN_SSID));
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY))
{
Serial.println(F("Failed!"));
while(1);
}
Serial.println(F("Connected!"));
/* Wait for DHCP to complete */
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);
Serial.print(F("\n\rPinging ")); cc3000.printIPdotsRev(ip); Serial.print("...");
uint8_t replies = cc3000.ping(ip, 5);
Serial.print(replies); Serial.println(F(" replies"));
if (replies)
{
Serial.println(F("Ping successful!"));
}
Serial.println(F("\n\r++++++++++++++++++++++++++++++++"));
}
void loop()
{
Serial.println("loop");
Adafruit_CC3000_Client client = cc3000.connectTCP(ip, 80);
if (client.connected())
{
client.fastrprint(F("GET "));
client.fastrprint(WEBPAGE);
client.fastrprint(F(" HTTP/1.1\r\n"));
client.fastrprint(F("Host: ")); client.fastrprint(WEBSITE); client.fastrprint(F("\r\n"));
client.fastrprint(F("\r\n"));
client.println();
}
else
{
Serial.println(F("Connection failed"));
return;
}
Serial.println(F("-------------------------------------"));
int out = 0;
while (client.connected())
{
if (client.available() && out < 1)
{
//라인을 기준으로 문자열을 저장
String line = client.readStringUntil('\n');
//시간
int temp11 = line.indexOf("");
if(temp11 > 0)
{
String tmp_str = "";
String wt_hour = line.substring(line.indexOf(tmp_str) + tmp_str.length(),temp11);
Serial.print("hour is ");
Serial.println(wt_hour);
String line2 = client.readStringUntil('\n');
String line3 = client.readStringUntil('\n');
//온도
int temp = line3.indexOf("");
if(temp > 0)
{
String tmp_str = "";
String wt_temp = line3.substring(line3.indexOf(tmp_str)+tmp_str.length(),temp);
Serial.print("temperature is ");
Serial.println(wt_temp);
String line4 = client.readStringUntil('\n');
String line5 = client.readStringUntil('\n');
String line6 = client.readStringUntil('\n');
String line7 = client.readStringUntil('\n');
String line8 = client.readStringUntil('\n');
String line9 = client.readStringUntil('\n');
//날씨 정보
int wfEn = line9.indexOf("");
if(wfEn > 0)
{
String tmp_str = "";
String wt_twfEn = line9.substring(line9.indexOf(tmp_str)+tmp_str.length(),wfEn);
Serial.print("weather is ");
Serial.println(wt_twfEn);
Serial.println("====================");
out = out + 1;
break;
}
}
}
}
}
ss.listen();
while(ss.available())
{
char c=ss.read();
if(gps.encode(c))
{
newData=true;
gps.f_get_position(&flat,&flon);
gps.crack_datetime(&year,&month,&day,&hour,&minute,&second);
hour=hour+9; //hour +9 for GMT+9 time zone
}
}
if (newData)
{
lcd.clear();
if (state == 0) //display latitude and longitude
{
lcd.setCursor(0, 0);
lcd.print("Lat:");
lcd.setCursor(6, 0);
lcd.print(flat);
lcd.setCursor(0, 1);
lcd.print("Lon:");
lcd.setCursor(6, 1);
lcd.print(flon);
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Loca:");
lcd.setCursor(0, 1);
if (3737.40952 <= flat <= 3741.5215 && 12702.87736 <= flon <= 12705.64192) {
lcd.print("NOWON");
}
else if (3737.6053 <= flat <= 3740.02234 && 12658.9464 <= flon <= 12700.87978) {
lcd.print("GANGBUK");
}
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Date:");
lcd.setCursor(6, 0);
lcd.print(day);
lcd.print("/");
lcd.print(month);
lcd.print("/");
lcd.print(year);
lcd.setCursor(0, 1);
lcd.print("Time:");
lcd.setCursor(6, 1);
lcd.print(hour);
lcd.print(":");
lcd.print(minute);
lcd.print(":");
lcd.print(second);
delay(2000);
}
newData = false;
delay(10);
}
Serial.println("finish");
}
void displayMACAddress(void)
{
uint8_t macAddress[6];
if(!cc3000.getMacAddress(macAddress))
{
Serial.println(F("Unable to retrieve MAC Address!\r\n"));
}
else
{
Serial.print(F("MAC Address : "));
cc3000.printHex((byte*)&macAddress, 6);
}
}
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
{
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
Serial.println();
return true;
}
}
|