'작업대'에 해당되는 글 12

  1. 2019.04.26 Asus Rog 소프트웨어
  2. 2017.08.16 3D프린터로 제작한 GPD win 그립케이스
  3. 2017.08.05 흔한 역관광
  4. 2016.10.25 IoT 수위레벨제어장치(C언어,MySQL,PHP,자바) 2
  5. 2016.09.23 앱인벤터를 통한 전용 구동어플 제작
  6. 2016.09.23 DB에 저장된 데이터 출력
  7. 2016.09.21 데이터베이스 연동을 위한 APM 설치
  8. 2016.08.29 오버워치,PC게임을 카드보드(스마트폰VR)로 플레이하는법
  9. 2016.08.26 IoT 수위레벨 제어장치 전용어플 1
  10. 2016.08.26 이더넷실드를 이용한 FTP 방식


 


요릭이 재밌어서 아무라인이나 다녔는데 AD carry가 어떻게 되냐며 거품무는 어린친구들

 

 

 

 

     >     

서포터 소나(PD kusiro)부패물약 스타트로 라인전에서는 아무것도 안하더니

라인을 버리고 자리를 비움 - 덕분에 혼자서 묵묵히 라인을 지키다 0/5/1 

 

 

 

 

 

 

 

게임끝나고 요릭원딜 영상 보여줬더니

https://youtu.be/kablBTN2o5s

 

 

 



https://www.op.gg/summoner/userName=순보각주면사망

자기 친구(PD kusiro)의 트롤링에도 뜬금없이 일반게임에서 비주류 챔프 하는 것에 대해 나를 욕하더니 영상을 보고도 다음판에 적팀으로 만나자 전채채팅으로 욕설도배 ㅎㅎ




-전채채팅으로 걸레물던 시비르 라인전 솔킬-



영상에 적혀있던 본명부르면서 도발하던 녀석, 입털더니 허무하게 죽음


실력으로 지고도 정신 못차림. 죽자마자 이번엔 친구 탓하려고 핑도배 하는게 리플레이에 잡혔다, 입에 걸레를 물더니 팀원탓이 생활화 되었구나



모바일정보통신과라는 특징을 살려 졸업작품으로 스마트폰과 다양한 웹플랫폼에서 열람 가능한 IoT수위측정장치를 제작했습니다.

산업현장이나 대형건물에서 사용되는 생활용수를 확인하기 위해  직접 저수조를 확인하지 않아도 수위를 체크할 수 있고 온도를 함께 측정함으로써 동파를 방지하는 것이 목적입니다. 초음파센서를 이용하여 상단에 부착하기만 하면 설비의 규격에 관계없이 측정이 가능한 점이 특징입니다.


컨트롤을 위한 처리작업은 아두이노 보드에 사용되는 Atmega328프로세서를 이용했으며 C언어를 기반으로 하여 프로그래밍 한 뒤 (하드웨어에 대한설명)


수위가 변화되는 상태를 실시간으로 보여드리기 위한 방법으로 평소 쉽게 접할 수 있는 스마트폰에서 쓰이는 OS죠? 안드로이드의 블루투스기능을 먼저 생각했습니다. 자바를 이용한 이클립스에서 개발을 시작하여 추후 컴파일이 용이한 앱인벤터로 옮겨 어플리케이션을 제작했습니다.


실시간으로 확인하는 것으로 그치지 않고 데이터베이스에 측정값을 주기적으로 업로드할 것을 제안했습니다. 이 과정에서 블루투스가 가진 성능의 부족함을 메꾸거나 와이파이모듈을 이용하였고 블루투스로 연동할 당시의 기능이 이 부분(앱에서 BT선택, 온도 수위부분 레이블 가리키며)입니다. 제작이 진행되면서 현재는 비활성화한 상태이지만 개발 과정을 보여드리기 위해 남겨 놓았습니다.

리눅스에서 사용되는 대표적인 웹서버소프트웨어인 Apache를 이용하여 서버를 구축하였고 MySQL에서 데이터베이스의 틀을 갖춘 뒤 PHP를 이용하여 DB에 계측데이터를 올려보내고 이와 동시에 저장된 내용을 웹브라우저에서 열람할 수 있도록 제작하였습니다.


KopoA.aia

앱인벤터 프로젝트 파일

KopoA.apk

안드로이드 설치파일




먼저 우리조 서버와 데이터가 준비되지 않아 준비해놓은 데이터로 출력테스트를 했습니다.


테스트해본 조건은 '최근날짜부터 나열'해서 '3일내'의 데이터만 출력

$result = mysqli_query($conn,"SELECT * FROM dblogin WHERE CreateDate >= DATE_ADD(NOW(), INTERVAL -3 day) ORDER BY CreateDate DESC;");



이유 : " . mysqli_connect_error();
}
		$result = mysqli_query($conn,"SELECT * FROM dblogin
				WHERE CreateDate >= DATE_ADD(NOW(), INTERVAL -3 day) 
				ORDER BY CreateDate DESC;");
		echo "";
		$n = 1;
		while($row = mysqli_fetch_array($result))
{
			echo "<tr>";
			echo "<td>" . $row['gldx'] . "</td>";
			echo "<td>" . $row['uldx'] . "</td>";
			echo "<td>" . $row['gps_lat'] . "</td>";
			echo "<td>" . $row['gps_lon'] . "</td>";
			echo "<td>" . $row['CreateDate'] . "</td>";
			echo "</tr>";
			$n++;
}
?>




졸업작품이 서버연동만을 남겨둔 지금 더 기다려봤자 진행이 없을 것 같아
직접 데이터베이스를 설치해보기로 했습니다.


APM이란?

리눅스OS에서의 사용되는 웹 서버 소프트인 Apache, PHP, MySQL을 가리키며

APMsetup이라는 한국인 개발자가 만든 원클릭 설치 프로그램을 사용합니다.

-공식사이트(http://www.apmsetup.com)가 더이상 운영되지않아 네이버, 오픈소스 자료실에서 다운로드가 가능합니다.




http://software.naver.com/software/summary.nhn?softwareId=MFS_111815

https://kldp.net/apmsetup

마지막 버전은 APMSETUP7로 릴리즈순으로 가장 아래에서 3221-APMSETUP7_2010010300.exe를 사용합니다.




설치를 마치고 실행하면 아래와 같은 창이 뜨며 곧바로 공지를 보여주나 더이상 체크되지 않습니다.


공지창을 닫은 뒤에 뜨는 업데이트를 묻는 창도 마찬가지입니다. 아니오를 눌러 매니저가 꺼지지 않게 합니다.





컴퓨터를 구입하면서 이번 그래픽 카드는 AMD에서 지포스로 넘어왔습니다.

그동안 탐내던 엔비디아 전용 Game stream인 MoonLight를 사용할 수 있게 되었죠.









테스트 환경은 Zotac GTX1060 Mini 6GB / 5Ghz Wifi 입니다.


보시는 바와 같이 화면전송을 하면서도 딜레이가 거의 느껴지지 않습니다.


그래픽카드 차원에서 성능저하없이 게임화면을 송출하는 방식이라고 합니다





또한 이번 10xx대 지포스 제품 소개를 보면 VR ready라는 문구가 붙어있습니다.


엔비디아 홈페이지 GTX 1060 - VR ready 소개내용


본 게시글은 위 사진의 기능을 사용하진 않았지만 많은 돈을 들이지 않고도

VR환경을 체험하고자 스마트폰과 카드보드규격의 VR마운트를 사용했습니다.


















준비물


구글 카드보드

카드보드 규격의 스마트폰용 VR마운트로 Bobo Z4를 사용하였습니다.


1080p 해상도 스마트폰

눈을 가까이 두고 렌즈가 확대하는 방식이므로 적어도 1080p 해상도를 가진 스마트폰을 준비


5Ghz 와이파이

고해상도의 화면을 딜레이 없이 전송하기 위해서는 와이파이의 속도가 빠를수록 좋습니다. 


GeForce GTX 650 이상의 엔비디아 그래픽카드

엔비디아 게임스트림 기능이 탑재된 최소한의 그래픽 카드를 준비하셔야합니다.








설치해야 할 것


안드로이드
Moonlight

NVIDIA SHIELD 의 기능인 Game stream을 앱으로 구현하여 일반 안드로이드 스마트폰이나 태블릿에서도 스트리밍.

https://play.google.com/store/apps/details?id=com.limelight


TrinusVR

머리의 움직임에 따라 시야를 보여주는 헤드트레킹의 기능을 하며 마우스로 구현되기 때문에 FPS에만 사용가능





PC
GeForce Experience

지포스 드라이버와 함께 설치되는 게임 매니저 프로그램으로 게임스트림이 포함되어 있습니다.


TriDef 3D
PC에서 VR화면을 구현해주는 유료프로그램, 여기서는 체험버전을 사용했습니다.

Open Broadcaster Software

Tridef 3D의 화면을 game stream모드에서 가장 맨앞에 보여주기위한 미리보기용 기능만 사용

https://obsproject.com/


Trinus Server

헤드트레킹을 마우스로 구현해주는 기능, PC에서 서버를 열어줘야합니다.








적용하는 방법

http://cafe.naver.com/vrmaniac/30569을 참고하여 작성했습니다.








테스트환경
윈도우10, GTX 1060, Android 5.0 Lolipop, Bobo VR Z4

'작업대 > 생활팁' 카테고리의 다른 글

흔한 역관광  (0) 2017.08.05

 

projectproto_2.aia

목표)

초음파센서와 온도센서를 통한 수조내부의 물높이, 수온측정 > 어플로 확인이 용이, 데이터베이스에 저장하므로써 그래프로 통계기능 추가예정


구현내용)

LCD 수위,수온 표시

와이파이실드를 통한 확인페이지 출력

어플상에서 각 4바이트씩 8바이트값을 받아와서 나눠 출력


TH_ftp.zip



http://cafe.naver.com/arduinostory/31761


http://swa.esy.es/

http://31.170.164.122


#include <SPI.h>

#include <Ethernet.h>

#include <minWire.h>

#include <minRTClib.h>

#include <dht.h>



//-------------------------------------DS-1307

RTC_DS1307 rtc;

DateTime  tod;


//-------------------------------------DHT-11

#define DHT11_PIN A0

#define UPLOAD_INTERVAL (uint32_t)60*1000     //1�п� �ѹ� sesnor read. Arduino default�� 16bit int, (uint32_t)�� ���صθ� -5536���� �ǹ�����.


dht DHT;


float humidity;

float temperature;


void DHTPoll();

//-------------------------------------Ethernet

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x25, 0xC4 };


IPAddress server(31, 170, 164, 122);             //   FTP 서버 IP 입니다. 

EthernetClient client;

EthernetClient dclient;


char outBuf[128];

char outCount;


//-------------------------------------Sensor Identification

char fileName[32];

char sectorID[8] = "T0001";

char sensorID[8] = "S0001";


//-------------------------------------working

uint32_t lastPollTime = 0;


/*-----------------------------------------------------------------------------

   S E T  U P

  -----------------------------------------------------------------------------*/

void setup(){

  Serial.begin(9600);

  Wire.begin();

  rtc.begin();

  Ethernet.begin(mac);

  //rtc.adjust(DateTime(2014, 9, 27, 15, 02, 0));

}

/*-----------------------------------------------------------------------------

   L O O P

  -----------------------------------------------------------------------------*/

void loop(){


  //for test

  if(Serial.read() != -1) DHTPoll();


  if((millis() - lastPollTime) >= UPLOAD_INTERVAL){

    lastPollTime = millis();

    DHTPoll();

  }

}

/*-----------------------------------------------------------------------------

   D H T - 1 1   h a n d l e r

  -----------------------------------------------------------------------------*/

void DHTPoll() {

  if(DHT.read11(DHT11_PIN) == DHTLIB_OK) {

    humidity = DHT.humidity;

    temperature = DHT.temperature;

    makeSensorLog();


    if(doFTP()) Serial.println(F("FTP Upload OK"));

    else Serial.println(F("FTP Upload FAIL"));

  }

}


/*-----------------------------------------------------------------------------

   F T P  File Form


  SectorId_YYMMDD.log


    <SensorID> hh:mm tt.tC hh.h%


    tt.t : temperature

    hh.h : humidity

  -----------------------------------------------------------------------------*/


/*-----------------------------------------------------------------------------

   F T P  Upload

  -----------------------------------------------------------------------------*/

byte doFTP(){


  //--------------------

  // command port connection (21)

  //--------------------

  if (client.connect(server,21)) {

    Serial.println(F("Command connected"));

  } 

  else {

    Serial.println(F("Command connection failed"));

    return 0;

  }

  if(!eRcv(0)) return 0;


  //--------------------

  // USER

  //--------------------

  client.println(F("USER swa"));         //사용자 아이디

  if(!eRcv(0)) return 0;


  //--------------------

  // PASS

  //--------------------

  client.println(F("PASS 951753"));                //사용자 비밀번호

  if(!eRcv(0)) return 0;


  //--------------------

  // CWD

  // goto log folder

  //--------------------

  client.println(F("CWD /Temp_Humidity_log/"));        //파일을 저장할 경로

  if(!eRcv(0)) return 0;


  //--------------------

  // SIZE

  // check file exist

  //--------------------

  makeLogFileName();

  client.print(F("SIZE "));

  client.println(fileName);

  byte openType = eRcv(1);


  //--------------------

  // PASV

  // Passive mode, get data port number

  //--------------------

  client.println(F("PASV"));

  if(!eRcv(0)) return 0;


  char *tStr = strtok(outBuf,"(,");

  int array_pasv[6];

  for ( int i = 0; i < 6; i++) {

    tStr = strtok(NULL,"(,");

    array_pasv[i] = atoi(tStr);

    if(tStr == NULL)Serial.println(F("Bad PASV Answer"));    

  }


  unsigned int hiPort,loPort;

  hiPort = array_pasv[4] << 8;

  loPort = array_pasv[5] & 255;


  Serial.print(F("Data port: "));

  hiPort = hiPort | loPort;

  Serial.println(hiPort);


  //--------------------

  // Upload

  //--------------------

  if (dclient.connect(server,hiPort)) {

    Serial.println(F("Data connected"));

  } 

  else {

    Serial.println(F("Data connection failed"));

    client.stop();

    return 0;

  }


  if(openType) client.print(F("APPE "));  

  else client.print(F("STOR "));

  

  client.println(fileName);

  if(!eRcv(0)){

    dclient.stop();

    return 0;

  }


  Serial.println(F("Writing"));


  makeSensorLog();

  dclient.write(outBuf,strlen(outBuf));


  dclient.stop();

  Serial.println(F("Data disconnected"));

  if(!eRcv(0)) return 0;


  client.println(F("QUIT"));

  if(!eRcv(0)) return 0;


  client.stop();

  Serial.println(F("Command disconnected"));


  return 1;

}


byte eRcv(byte errRet){

  byte respCode;

  byte thisByte;


  while(!client.available()) delay(1);


  respCode = client.peek();


  outCount = 0;


  while(client.available())

  {  

    thisByte = client.read();    

    Serial.write(thisByte);


    if(outCount < 127)

    {

      outBuf[outCount] = thisByte;

      outCount++;      

      outBuf[outCount] = 0;

    }

  }

  if(respCode >= '4')

  {

    if(!errRet)efail();

    return 0;  

  }


  return 1;

}



void efail()

{

  byte thisByte = 0;


  client.println(F("QUIT"));


  while(!client.available()) delay(1);


  while(client.available())

  {  

    thisByte = client.read();    

    Serial.write(thisByte);

  }


  client.stop();

  Serial.println(F("Command disconnected"));

}


//-----------------------------------------------------------------------------

void makeLogFileName(void){


  int i;

  char *pc = fileName;


  for(i=0;i<strlen(sectorID);i++){

    *pc++ = sectorID[i];

  }

  *pc++ = '_';


  DateTime now = rtc.now();

  simpleInt2Arry((byte)(now.year() - 2000), pc);

  pc += 2;

  simpleInt2Arry(now.month(), pc);

  pc += 2;  

  simpleInt2Arry(now.day(), pc);  

  pc += 2;    

  *pc++ = '.';

  *pc++ = 'l';

  *pc++ = 'o';

  *pc++ = 'g';  

  *pc = 0x00;    

}

//-----------------------------------------------------------------------------

void makeSensorLog(void){

  byte i;


  char *pc = outBuf;


  *pc++ = '<';

  for(i=0;i<strlen(sensorID);i++){

    *pc++ = sensorID[i];

  }

  *pc++ = '>';  

  *pc++ = ' ';


  DateTime now = rtc.now();

  simpleInt2Arry(now.hour(), pc);

  pc += 2;  

  *pc++ = ':';

  simpleInt2Arry(now.minute(), pc);  

  pc += 2;    

  *pc++ = ' ';


  dtostrf(temperature, 5, 1, (char *)pc);  //-12.3C

  pc = outBuf + strlen(outBuf);

  *pc++ = 'C';

  *pc++ = ' ';  


  dtostrf(humidity, 5, 1, (char *)pc);  //100.3%

  pc = outBuf + strlen(outBuf);

  *pc++ = '%';


  *pc++ = 0x0d;  

  *pc++ = 0x0a;  

  *pc = 0x00;  

}  


//-----------------------------------------------------------------------------

void simpleInt2Arry(byte i, char* pc){

  *(pc + 1) = (i % 10) + 0x30;

  i /= 10;

  *pc = (i % 10) + 0x30;

}