오렌지보드WiFi를 이용중인데요.
PC에서 업로드한 당시에는 스케치가 잘 구동이 되는데 전원 제거 후 다시 전원 입력 시 스케치가 구동되지 않는 오류가 있어서 문의드립니다.
아래는 코드입니다.
#include <Servo.h>
#include <SPI.h>
#include "WizFi250.h"
#define TRIG1 10
#define ECHO1 9
#define TRIG2 6
#define ECHO2 5
int IRpin = A0;
int IRvalue = 0;
Servo servo;
#define DEVICEID "vE0E7E865918676D"
char ssid[] = "이한솔의 iPhone"; //연결할 네트워크의 SSID(이름)
char pass[] = "zz7i4tshubyoj"; //연결할 네트워크의 비밀번호
int status = WL_IDLE_STATUS; //와이파이의 연결상태를 파악하기 위한 변수
char server[] = "api.pushingbox.com";
unsigned long lastConnectionTime = 0; //마지막 서버연결시간이 밀리세컨드로 표시
const unsigned long postingInterval = 5000L; //업데이트 간격, 밀리세컨드단위
boolean getIsConnected = false;
String msg;
WiFiClient client;
void httpRequest(); //서버로 HTTP연결을 하는 함수
void printWifiStatus(); //연결된 네트워크의 IP주소와 신호강도를 보여주는 함수
void setup() {
Serial.begin(115200);
Serial.println(F("\r\nSerial Init"));
pinMode(TRIG1, OUTPUT); //핀모드를 통해 트리거와 에코 출력, 입력 설정
pinMode(ECHO1, INPUT); //트리거는 초음파를 내보내는 것을 제어
//에코는 돌아오는 초음파를 받는 것을 제어
pinMode(TRIG2, OUTPUT); //1은 외부 2는 내부
pinMode(ECHO2, INPUT);
pinMode(7, OUTPUT); //LED핀 출력지정
servo.attach(8); //서보사용선언
servo.write(0); //서보모터의 초기 각도를 0도로 맞춰둠.
pinMode(IRpin, INPUT);
Serial.println("\r\nSerial Init");
WiFi.init();
if(WiFi.status() == WL_NO_SHIELD){ //WiFi.status()로 리턴값을 확인하여 쉴드가 연결 안되었을 경우
Serial.println("WiFi shield not present"); //쉴드가 준비되지 않았다는 문자를 모니터에 출력
while(true);
}
while(status != WL_CONNECTED){ // 연결될 때까지 반복한다.
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
}
Serial.println("You're connected to the network"); //연결에 성공했다는 메시지를 띄운다.
printWifiStatus(); //네트워크 상태를 표시해준다.
}
void loop() {
digitalWrite(TRIG1, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG1, LOW);
int distance1 = pulseIn(ECHO1, HIGH)/58; //쓰레기통과 물체와의 거리
//펄스인함수가 초음파가 되돌아오는 시간을 측정
//돌아오는 시간을 58로 나누 면 cm로 거리가 환산
if(distance1<15)
{
servo.write(55); //15cm보다 작게되면 열리도록 설정한다.
delay(5000);
}
else
{
servo.write(0); //15cm보다 거리가 먼 경우는 닫히도록 설정한다.
delay(1000); //1초 동안의 지연시간을 준다.
}
delay(100); //0.1초의 지연시간을 둔다.
digitalWrite(TRIG2, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG2, LOW);
int distance2 = pulseIn(ECHO2, HIGH)/58; //펄스인함수로 펄스가 high에서 low가 되는 시간 측정
//반환값을 58로 나누어 cm로 변환
IRvalue = analogRead(IRpin);
if(distance2<3.5)
{
if(IRvalue <= 200) //광센서의 아날로그 값이 200이하인 경우 수광부 감지 0으로 판단
{ //장애물이 감지된 것으로 간주한다.
digitalWrite(7, HIGH);
}
}
else
{
digitalWrite(7, LOW);
}
while(client.available()){
char c = client.read();
if(c != NULL){
if(msg.length() >20)
msg = "";
msg += c;
Serial.write(c);
}
}
if(millis() - lastConnectionTime > postingInterval){
if (distance2 < 3.5){
if(IRvalue <= 200){
httpRequest();
}
}
}
msg="";
delay(100);
}
void httpRequest(){
Serial.println();
client.stop(); //새롭게 서버로 연결하기 전에 연결된 서버를 닫는다.
if(client.connect(server, 80)){
Serial.println("Connecting. . .");
//서버로 요청전송
client.print("GET /pushingbox?devid=");
client.print(DEVICEID);
client.print(" HTTP/1.1\r\n");
client.print("Host: api.pushingbox.com\r\n");
client.print("User-Agent: Arduino\r\n");
client.print("\r\n\r\n");
//연결이 되었던 시간을 알려준다.
lastConnectionTime = millis();
getIsConnected = true;
}
else{
Serial.println("Connection failed");
getIsConnected = false;
}
}
void printWifiStatus(){
//네트워크 이름 출력
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
//네트워크 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");
}
|