'작업대 > 프로젝트' 카테고리의 다른 글
IoT 수위레벨제어장치(C언어,MySQL,PHP,자바) (2) | 2016.10.25 |
---|---|
앱인벤터를 통한 전용 구동어플 제작 (0) | 2016.09.23 |
DB에 저장된 데이터 출력 (0) | 2016.09.23 |
데이터베이스 연동을 위한 APM 설치 (0) | 2016.09.21 |
IoT 수위레벨 제어장치 전용어플 (1) | 2016.08.26 |
IoT 수위레벨제어장치(C언어,MySQL,PHP,자바) (2) | 2016.10.25 |
---|---|
앱인벤터를 통한 전용 구동어플 제작 (0) | 2016.09.23 |
DB에 저장된 데이터 출력 (0) | 2016.09.23 |
데이터베이스 연동을 위한 APM 설치 (0) | 2016.09.21 |
IoT 수위레벨 제어장치 전용어플 (1) | 2016.08.26 |
요릭이 재밌어서 아무라인이나 다녔는데 AD carry가 어떻게 되냐며 거품무는 어린친구들
>
서포터 소나(PD kusiro)가 부패물약 스타트로 라인전에서는 아무것도 안하더니
라인을 버리고 자리를 비움 - 덕분에 혼자서 묵묵히 라인을 지키다 0/5/1
게임끝나고 요릭원딜 영상 보여줬더니
https://www.op.gg/summoner/userName=순보각주면사망
자기 친구(PD kusiro)의 트롤링에도 뜬금없이 일반게임에서 비주류 챔프 하는 것에 대해 나를 욕하더니 영상을 보고도 다음판에 적팀으로 만나자 전채채팅으로 욕설도배 ㅎㅎ
-전채채팅으로 걸레물던 시비르 라인전 솔킬-
영상에 적혀있던 본명부르면서 도발하던 녀석, 입털더니 허무하게 죽음
실력으로 지고도 정신 못차림. 죽자마자 이번엔 친구 탓하려고 핑도배 하는게 리플레이에 잡혔다, 입에 걸레를 물더니 팀원탓이 생활화 되었구나
오버워치,PC게임을 카드보드(스마트폰VR)로 플레이하는법 (0) | 2016.08.29 |
---|
모바일정보통신과라는 특징을 살려 졸업작품으로 스마트폰과 다양한 웹플랫폼에서 열람 가능한 IoT수위측정장치를 제작했습니다.
산업현장이나 대형건물에서 사용되는 생활용수를 확인하기 위해 직접 저수조를 확인하지 않아도 수위를 체크할 수 있고 온도를 함께 측정함으로써 동파를 방지하는 것이 목적입니다. 초음파센서를 이용하여 상단에 부착하기만 하면 설비의 규격에 관계없이 측정이 가능한 점이 특징입니다.
컨트롤을 위한 처리작업은 아두이노 보드에 사용되는 Atmega328프로세서를 이용했으며 C언어를 기반으로 하여 프로그래밍 한 뒤 (하드웨어에 대한설명)
수위가 변화되는 상태를 실시간으로 보여드리기 위한 방법으로 평소 쉽게 접할 수 있는 스마트폰에서 쓰이는 OS죠? 안드로이드의 블루투스기능을 먼저 생각했습니다. 자바를 이용한 이클립스에서 개발을 시작하여 추후 컴파일이 용이한 앱인벤터로 옮겨 어플리케이션을 제작했습니다.
실시간으로 확인하는 것으로 그치지 않고 데이터베이스에 측정값을 주기적으로 업로드할 것을 제안했습니다. 이 과정에서 블루투스가 가진 성능의 부족함을 메꾸거나 와이파이모듈을 이용하였고 블루투스로 연동할 당시의 기능이 이 부분(앱에서 BT선택, 온도 수위부분 레이블 가리키며)입니다. 제작이 진행되면서 현재는 비활성화한 상태이지만 개발 과정을 보여드리기 위해 남겨 놓았습니다.
리눅스에서 사용되는 대표적인 웹서버소프트웨어인 Apache를 이용하여 서버를 구축하였고 MySQL에서 데이터베이스의 틀을 갖춘 뒤 PHP를 이용하여 DB에 계측데이터를 올려보내고 이와 동시에 저장된 내용을 웹브라우저에서 열람할 수 있도록 제작하였습니다.
Asus Rog 소프트웨어 (0) | 2019.04.26 |
---|---|
앱인벤터를 통한 전용 구동어플 제작 (0) | 2016.09.23 |
DB에 저장된 데이터 출력 (0) | 2016.09.23 |
데이터베이스 연동을 위한 APM 설치 (0) | 2016.09.21 |
IoT 수위레벨 제어장치 전용어플 (1) | 2016.08.26 |
Asus Rog 소프트웨어 (0) | 2019.04.26 |
---|---|
IoT 수위레벨제어장치(C언어,MySQL,PHP,자바) (2) | 2016.10.25 |
DB에 저장된 데이터 출력 (0) | 2016.09.23 |
데이터베이스 연동을 위한 APM 설치 (0) | 2016.09.21 |
IoT 수위레벨 제어장치 전용어플 (1) | 2016.08.26 |
먼저 우리조 서버와 데이터가 준비되지 않아 준비해놓은 데이터로 출력테스트를 했습니다.
테스트해본 조건은 '최근날짜부터 나열'해서 '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++; } ?>
IoT 수위레벨제어장치(C언어,MySQL,PHP,자바) (2) | 2016.10.25 |
---|---|
앱인벤터를 통한 전용 구동어플 제작 (0) | 2016.09.23 |
데이터베이스 연동을 위한 APM 설치 (0) | 2016.09.21 |
IoT 수위레벨 제어장치 전용어플 (1) | 2016.08.26 |
이더넷실드를 이용한 FTP 방식 (0) | 2016.08.26 |
졸업작품이 서버연동만을 남겨둔 지금 더 기다려봤자 진행이 없을 것 같아
직접 데이터베이스를 설치해보기로 했습니다.
APM이란?
리눅스OS에서의 사용되는 웹 서버 소프트인 Apache, PHP, MySQL을 가리키며
APMsetup이라는 한국인 개발자가 만든 원클릭 설치 프로그램을 사용합니다.
-공식사이트(http://www.apmsetup.com)가 더이상 운영되지않아 네이버, 오픈소스 자료실에서 다운로드가 가능합니다.
http://software.naver.com/software/summary.nhn?softwareId=MFS_111815
마지막 버전은 APMSETUP7로 릴리즈순으로 가장 아래에서 3221-APMSETUP7_2010010300.exe를 사용합니다.
설치를 마치고 실행하면 아래와 같은 창이 뜨며 곧바로 공지를 보여주나 더이상 체크되지 않습니다.
공지창을 닫은 뒤에 뜨는 업데이트를 묻는 창도 마찬가지입니다. 아니오를 눌러 매니저가 꺼지지 않게 합니다.
앱인벤터를 통한 전용 구동어플 제작 (0) | 2016.09.23 |
---|---|
DB에 저장된 데이터 출력 (0) | 2016.09.23 |
IoT 수위레벨 제어장치 전용어플 (1) | 2016.08.26 |
이더넷실드를 이용한 FTP 방식 (0) | 2016.08.26 |
0826일자 참고용 주석 (0) | 2016.08.25 |
컴퓨터를 구입하면서 이번 그래픽 카드는 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
지포스 드라이버와 함께 설치되는 게임 매니저 프로그램으로 게임스트림이 포함되어 있습니다.
Tridef 3D의 화면을 game stream모드에서 가장 맨앞에 보여주기위한 미리보기용 기능만 사용
Trinus Server
적용하는 방법
테스트환경
윈도우10, GTX 1060, Android 5.0 Lolipop, Bobo VR Z4
목표)
초음파센서와 온도센서를 통한 수조내부의 물높이, 수온측정 > 어플로 확인이 용이, 데이터베이스에 저장하므로써 그래프로 통계기능 추가예정
구현내용)
LCD 수위,수온 표시
와이파이실드를 통한 확인페이지 출력
어플상에서 각 4바이트씩 8바이트값을 받아와서 나눠 출력
DB에 저장된 데이터 출력 (0) | 2016.09.23 |
---|---|
데이터베이스 연동을 위한 APM 설치 (0) | 2016.09.21 |
이더넷실드를 이용한 FTP 방식 (0) | 2016.08.26 |
0826일자 참고용 주석 (0) | 2016.08.25 |
아두이노를 이용한 초음파 수위측정 #1 (0) | 2016.08.24 |
http://cafe.naver.com/arduinostory/31761
#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;
}
DB에 저장된 데이터 출력 (0) | 2016.09.23 |
---|---|
데이터베이스 연동을 위한 APM 설치 (0) | 2016.09.21 |
IoT 수위레벨 제어장치 전용어플 (1) | 2016.08.26 |
0826일자 참고용 주석 (0) | 2016.08.25 |
아두이노를 이용한 초음파 수위측정 #1 (0) | 2016.08.24 |