정보나눔

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

오렌지보드wifi에 외부전원을 인가시 발생하는 문제점
피카츄 | 2017-05-31

오렌지보드 와이파이를 이용해서 SG90 서보모터(가스 밸브 역할)를 Ubidots클라우드로 제어하려고 합니다. 버튼 클릭 시 서보모터가 0더에서 90도로 회전하며 오프 시 90도에서 0도로 회전합니다. 또한 일산화탄소 감지 센서 및 불꽃 센서로부터 화재 감지시(일정한 수치 이상 될 시) 또는 진동 모듈로부터 지진 감지시(일정 규모 이상의 지진) 서보모터가 90도 회전하도록 설계하였습니다.

여기서 문제점은 컴퓨터에서 오렌지 보드에 프로그램을 업로드하고 시리얼 모니터를 띄웠을 때 와이파이 연결이 되어 정상 작동이되는데 업로드한 오랜지보드와이파이보드를 외부전원을 사용할 시 서보모터가 제 마음대로 움직이기도 하고 제대로 제어가 되지 않습니다. 초기 0도에 위치해야히은데 90도에 서보모터가 위치하는등 여러 문제가 있습니다. 외부전원으로는 9V건전지도 사용해보고 5.1v,2A 보조배터리(5핀)입력도 써봤지만 동일한 문제가 발생하였습니다. 어떻게 해결하면 좋을까요? 소스코드는 다음과 같습니다.

//////////////////////화재용(부엌)//////////////////////////
//불꽃 센서 : A1
//일산화탄소 센서 : A0
//서보모터 : D7
#include
#include "WizFi250.h"
#include
Servo myservo;

//const int gasPin = A0; //가스센서 아웃을 아두이노 A0로 설정

//Ubidots information
#define TOKEN      "l2lZ59yLCVIMM1mOn8xilu9iUBzlpr"
#define VARID_TEMP      "592af13876254263ee4dabce"

//Parse JSON
#define PARSE       "\"value\""
#define ENDPARSE    ","

char ssid[] = "iptime";       // your network SSID (name)
char pass[] = "123456789";        // your network password
int status = WL_IDLE_STATUS;       // the Wifi radio's status

//Hardware Pin status
#define gasPin      A0


char server[] = "thing.ubidots.com";

unsigned long lastConnectionTime = 0;         // last time you connected to the server, in milliseconds
const unsigned long postingInterval = 3 * 1000L; // delay between updates, in milliseconds

String rcvbuf;

// Initialize the Ethernet client object
WiFiClient client;

void postData(String VARID, float data);
void printWifiStatus();
char * floatToString(char * outstr, double val, byte precision, byte widthp);

void setup()
{
  // initialize serial for debugging
  Serial.begin(115200);
  Serial.println(F("\r\nSerial Init"));
  myservo.attach(7);  //서보 9번핀

  WiFi.init();

  // check for the presence of the shield
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // don't continue
    while (true);
  }

  // attempt to connect to WiFi network
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network
    status = WiFi.begin(ssid, pass);
  }

  Serial.println("You're connected to the network");

  printWifiStatus();
  myservo.write(5);

}

void loop() {
       int Fire;
  Fire = analogRead(1);
      Serial.println("=========================");
Serial.print("gasPin = ");
    Serial.println(analogRead(gasPin)); //센서값을 시리얼모니터로 전송
    Serial.print("Fire = ");
    Serial.println(Fire,DEC);
    Serial.println("=========================");
if (analogRead(gasPin) > 100 && Fire<200)   // 가스 검출 시(자신의 센서 감도에 알맞게 조절필요)
    {                                     
        //tone(12,2000,1000); // 피에조 ON (주파수 2000으로 1초간 울리기)  
        //if(Fire<200){

          while(1){
                myservo.write(100); //이게 90도 움직이게함. 
          }
 
      
              
    }
  while (client.available()) {
    char c = client.read();
    if ( c != NULL ) {
      if (rcvbuf.length() > 10)
        rcvbuf = "";
      rcvbuf += c;
      Serial.write(c);
    }
  }
  
  if (millis() - lastConnectionTime > postingInterval) {
    postData(VARID_TEMP, gasPin);
  }
  rcvbuf = "";
}

void postData(String VARID, float data) {
  uint8_t content_len[6] = {0};
  String TxData;
  char charDATA[20] = "";
  floatToString(charDATA, data, 2, 7 );

  String dataString = "{\"value\": ";
  dataString += charDATA;
  dataString += '}';

  client.stop();
  if (client.connect(server, 80)) {
    Serial.println("send POST");

    // send the HTTP PUT request
    client.print("POST /api/v1.6/variables/");
    client.print(VARID);
    client.println("/values HTTP/1.1");
    client.println("Host: things.ubidots.com");
    client.print("X-Auth-Token: ");
    client.println(TOKEN);
    client.print("Content-Length:");
    client.println(itoa(dataString.length(), (char*)content_len, 10));
    client.println("Content-Type: application/json");
    client.println("Connection: close\r\n");
    client.print(dataString);
    client.println("\r\n");

    // note the time that the connection was made
    lastConnectionTime = millis();
  }
  else {
    // if you couldn't make a connection
    Serial.println("Connection failed");
  }
}

void printWifiStatus() {
  // print the SSID of the network you're attached to
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength
  long rssi = WiFi.RSSI();
  Serial.print("Signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

char * floatToString(char * outstr, double val, byte precision, byte widthp)
{
  char temp[16];
  byte i;

  // compute the rounding factor and fractional multiplier
  double roundingFactor = 0.5;
  unsigned long mult = 1;
  for (i = 0; i < precision; i++)
  {
    roundingFactor /= 10.0;
    mult *= 10;
  }
  temp[0] = '\0';
  outstr[0] = '\0';

  if (val < 0.0)
  {
    strcpy(outstr, "-\0");
    val = -val;
  }

  val += roundingFactor;

  strcat(outstr, itoa(int(val), temp, 10)); //prints the int part
  if ( precision > 0)
  {
    strcat(outstr, ".\0"); // print the decimal point
    unsigned long frac;
    unsigned long mult = 1;
    byte padding = precision - 1;

    while (precision--)
      mult *= 10;

    if (val >= 0)
      frac = (val - int(val)) * mult;
    else
      frac = (int(val) - val ) * mult;

    unsigned long frac1 = frac;

    while (frac1 /= 10)
      padding--;

    while (padding--)
      strcat(outstr, "0\0");

    strcat(outstr, itoa(frac, temp, 10));
  }

  // generate space padding
  if ((widthp != 0) && (widthp >= strlen(outstr)))
  {
    byte J = 0;
    J = widthp - strlen(outstr);

    for (i = 0; i < J; i++)
    {
      temp[i] = ' ';
    }

    temp[i++] = '\0';
    strcat(temp, outstr);
    strcpy(outstr, temp);
  }
  return outstr;
}

이전글   |    음성 인식 쉴드 MOVI는 어디서 구매하나요? 2017-05-31
다음글   |    아두이노 컴파일 에러 질문있어요 2017-05-31