정보나눔

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

아두이노 전역변수의 동적메모리 줄이기.
변한빈 | 2015-05-19

 

작품활동을 위해 블루투스와 Wifi를 혼용하여 사용하고 있는데.

 

동적메모리가 99%라서 IP출력할 때 글자가 깨져서나옵니다.

 

아두이노 와이파이쉴드가 있는데 여기에 그냥 SD카드만 넣고 컴파일 돌려도 거기에 자동저장되는지 궁금합니다.

 

혹은 소스를 가지고 용량을 줄이는 다른 조언 좀 부탁드릴게요...

 

소스는 다음과 같습니다.

=====================================================

#include <Servo.h>
#include <SoftwareSerial.h>
#include <SPI.h>
#include <WiFi.h>

char ssid[] = "kimsu";     // 연결하실 와이파이 SSID
char pass[] = "12345678";    // 네트워크 보안키

int status = WL_IDLE_STATUS;

WiFiServer server(80);     // 80포트를 사용하는 웹서버 선언

Servo myservo;

SoftwareSerial BTSerial(2, 3);    // SoftwareSerial
byte buffer[1024];     // 데이터를 수신 받을 버퍼
int bufferPosition;     // 버퍼에 데이타를 저장할 때 기록할 위치

void setup()
{
 myservo.attach(6);    // servo motor 6번 핀 설정
 myservo.write(10);    // 초기각도

 BTSerial.begin(9600);
 Serial.begin(9600);

 if (WiFi.status() == WL_NO_SHIELD)  // 현재 아두이노에 연결된 실드를 확인
 {
  while (true);    // 와이파이 실드가 아닐 경우 계속 대기
 }

 // 와이파이에 연결 시도
 while ( status != WL_CONNECTED)   // 연결될 때까지 반복
 {
  status = WiFi.begin(ssid, pass); // WPA/WPA2 연결
 }

 server.begin();

 printWifiStatus();    // 연결 성공시 연결된 네트워크 정보를 출력
}

void loop()
{
 WiFiClient client = server.available();  // 들어오는 클라이언트를 수신한다.

 if (client)  // 클라이언트를 수신 시
 {
  boolean currentLineIsBlank = true;

  if (BTSerial.available())  // 블루투스로 데이터 수신
  {

   while (client.connected ())
   {
    if (client.available())
    {
     char c = client.read();

     // 문자의 끝을 입력 받으면 http 요청이 종료되고, 답신을 보낼 수 있습니다.
     if (c == '\n' && currentLineIsBlank)
     {
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println("Connection: close");
      client.println("Refresh: 3.5");   // 3.5초당 페이지 refresh
      client.println();
      client.println("<!DOCTYPE HTML>");
      client.println("<meta charset=utf-8/>");
      client.print("<meta name=view content=width=device-width, ");
      client.println("initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no />");
      client.println("<html><body style=background-color:white>");
      client.println("<div data-role=content>");
      client.println("<br>");
      client.print("<font color=\"Black\"> <h1>경남 경찰서<h1>");
      client.println("</div>");
      client.println("</body>");
      client.println("</html>");

      byte data = BTSerial.read();
      buffer[bufferPosition++] = data;

      if(data == '1')    // 스위치가 닫혀있는 상태(누른 상태)
      {
       myservo.write(10);  // 10도, 초기각도
       delay(10);
       client.print("<font color=\"Black\"> <h1>EB전자은행 이상없음<h1>");

       myservo.write(180);  // 180도
       delay(5000);
       myservo.write(10);
      }


      if(data == '2')    // 스위치가 닫혀있는 상태(누른 상태)
      {
       myservo.write(10);  // 10도, 초기각도
       delay(10);
       client.print("<font color=\"Red\"> <h1>EB전자은행 긴급상황 발생<h1>" );

       myservo.write(180);  // 180도
       delay(5000);
       myservo.write(10);
      }

      if(data == '3')    // 스위치가 닫혀있는 상태(누른 상태)
      {
       client.print("<font color=\"Black\"> <h1>EB전자은행 이상없음<h1>");
      }

      break;
     }

     if (c == '\n')
     {
      currentLineIsBlank = true;
     }

     else if (c != '\r')
     {
      currentLineIsBlank = false;
     }

    }
   }
   delay(1);
   client.stop();
  } 
 }
}

void printWifiStatus()     // 연결된 네트워크 정보 출력
{
 IPAddress ip = WiFi.localIP();
 Serial.println(ip);    // 네트워크 ip 출력 
}

===========================================================

전역 변수는 (99%)의 동적 메모리중 2,034바이트를 사용, 14바이트의 지역변수가 남은. 최대는 2,048 바이트.
 

이전글   |    아두이노+카메라 자체적 사진촬영 2015-05-19
다음글   |    TA8050p 모터드라이브를 이용한 DC모터 구동에대해 질문있습니다... 2015-05-19