정보나눔

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

오렌지보드WiFi PC업로드 후 전원 제거 후 재연결시 오류
임재덕 | 2017-06-09

오렌지보드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");
}

이전글   |    아두이노 스위치 LED 소스코드 질문 있습니다. ... 2017-06-09
다음글   |    비콘에 다른 센서 데이터 값을 함께 보낼수는 없나요?... 2017-06-09