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

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


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


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


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

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


쓰레드 하나의 프로그램 내에서 여러개의 실행흐름을 두기위한 모델로

각 독립적인 일의 단위



레포트

1.파이참 설치(Community)

2.이클립스를 이용한 파이썬 개발환경 구축

3.비주얼스튜디오는 제외

레포트.hwp

레포트.pdf



SQL(Structured Query Language 구조화된 )

DBMS가 대략적으로 하는 일

데이터베이스생성

테이블 생성


https://sqlite.org/download.html


SQL라이트 실행

데이터베이스생성

sqllite> .open Swa_DB

*대소문자 구분안함

명령어

.table : 현재 데이터베이스의 테이블 목록을 보여줌

.schema 테이블 이름 : 테이블의 열 및 데이터 형식등의 정보를 보여줌

.header on : SELECT문으로 출력할 때 헤더를 보여줌

.mode coloum : SELECT문으로 출력할 컬럼 모드로 해줌

.exit

테이블 생성 CREATE TABLE 테이블 이름(열이름1 데이터 형식, 열이름2 데이터형식...)

예1) CREATE TABLE Swa_Python(id char(4),username char(15),email char(15),birthYear int);

.table

.schema Swa_python

예2) create table Swa_python2(

id integer primary key autoincrement,

name text,

age integer);

.table

입력) insert into Swa_python2(name,age) values("김명준",25);

insert into Swa_python2(name,age) values("유현종",23);

insert into Swa_python2(name,age) values("김수환",24);

select * from Swa_python2;

SQLite 명령어 13개정도?


이름 전화번호 이메일

create table Swa_python3(

name text,

number text,

email text);

insert into Swa_python3(name,number,email) values("김수환","010-4567-9876","kkk1234@never.com");

select * from Swa_python3;


SELECT * FROM Table_name ORDER BY NAME ASC;

*Ascend : 오름차순 = ASC

*Descend : 내림차순 = DSC








상속(Inheritance) : 기존의 클래스가 가지고 있는 필드와 메소드를 그대로 물려받은 새로운 클래스를 만드는 것 






import sqlite3



#변수 선언 부분

con, cur = None, None

data1, data2, data3, data4 = "", "", "", ""

sql=""



#메인 코드 부분

con = sqlite3.connect("swaDB")

cur = con.cursor()



while(True) :

    data1 = input("사용자 ID ==> ")

    if data1 == "" :

        break;

    data2 = input("사용자 이름 ==> ")

    data3 = input("사용자 이메일 ==> ")

    data4 = input("사용자 출생년도 ==> ")

    sql = "INSERT INTO userTable VALUES('"+data1+"','"+data2+"','"+data3+"',"+ data4 + ")"

    cur.execute(sql)



con.commit()

con.close()


'먼지 낀 책장사이 > Python' 카테고리의 다른 글

파이썬으로 메일보내기 SMTP  (0) 2016.11.08
테이블 제작, 데이터입력  (0) 2016.11.08
쓰레드  (0) 2016.10.11
상속, 오버라이딩, 툴킷  (0) 2016.09.27
Raw파일 읽기, 클래스, 생성자  (0) 2016.09.20

a=(1+2j)-(3+4j)

a

(-2-2j)



import math

math.pi

3.14...


math.e

2.718...




abs(10)

10


round(1.4)

1

round(1.5)

2


math.factorial(3)

6

math.factorial(100)

100


math.degrees(math.pi)

180.0


math.sin(math radians(90))


try:                      #문제가 없을 경우에 실행할 코드

exept 예외형식1:    #문제가 생겼을때 실행할 코드

exept 예외형식2:    #문제가 생겼을때 실행할 코드

finally:                  #어떠한 일이 있더라도 실행된다.



import datetime

print(datetime.datetime.now())

2016-10-11 10:19:08.543717


import datetime

now = datetime.datetime.now()

print("%s년%s월%s일,%s시%s분%s초"%(now.year,now.month,now.day,now.hour,now.minute,now.second))



from datetime import datetime
now = datetime.now()
print("%s년%s월%s일,%s시%s분%s초"%(now.year,now.month,now.day,now.hour,now.minute,now.second())


#net_1_1

import socket

host_name = socket.gethostname()

IP_address = socket.gethostbyname(host_name)

print("host_name : %s,IP_address : %s"%(host_name,IP_address))



#net_1_2
import socket
remote_host = "www.google.co.kr"
print("IP address of %s : %s"%(remote_host,socket.gethostbyname(remote_host)))

#net_1_4

import socket

# protocol_name = 'tcp','udp'

# port_number = 25, 53, 80

print("port : 25 ---> service name : %s"%socket.getservbyport(25,'tcp'))

print("port : 53 ---> service name : %s"%socket.getservbyport(53,'tcp'))

print("port : 80 ---> service name : %s"%socket.getservbyport(80,'tcp'))


#threading

import threading

count = 0

def on_timer():

    global count

    count += 1

    print(count)

    timer = threading.Timer(1,on_timer)

    timer.start()

    if count == 100:

        print("cancling timer ...")

        timer.cancel()

print("Starting timer...")

on_timer()



상속(Inheritance) : 기존의 클래스가 가지고 있는 필드와 메소드를 그대로 물려받은 새로운 클래스를 만드는 것 

#threading

import threading

from datetime import datetime

def on_timer():

    now = datetime.now()

    print("%s년%s월%s일,%s시%s분%s초"%(now.year,now.month,now.day,now.hour,now.minute,now.second))

    timer = threading.Timer(1,on_timer)

    timer.start()

    key = int(now.minute)

    if key == 0:

        print("cancling timer ...")

        timer.cancel()

print("Starting timer...")

on_timer()




'먼지 낀 책장사이 > Python' 카테고리의 다른 글

테이블 제작, 데이터입력  (0) 2016.11.08
SQLite  (0) 2016.10.18
상속, 오버라이딩, 툴킷  (0) 2016.09.27
Raw파일 읽기, 클래스, 생성자  (0) 2016.09.20
문자열, 구구단, 그림그리기  (0) 2016.09.13


- 전처리기(Preprocessor) - #

'#include<stdio.h>'를 보면 특수 문자 '#'이 삽입되어 있다.

이것은 전처리기를 의미한다. 즉, 컴파일러가 컴파일을 수행하기 전에 먼저 처리하라는 의미이다.

* stdio는 Standard Input Output(표준입출력)의 줄임말


- 헤더 파일

헤더 파일(Header File)은 확장자 H를 갖는 파일이다.

'#include <stdio.h>' 에서 stdio.h는 헤더 파일을 의미한다.(Standard Input Output(표준입출력)의 준말이다)


헤더 파일은 표준 라이브러리 함수(printf(), scanf()등)들의 동작을 따로 정의해 놓은 파일을 의미하며,

이들 파일을 잘 이용하면 표준 라이브러리 함수들을 쉽게 호출해서 쓸 수 있다.


- main() 함수

main() 함수는 프로그램 실행 시 운영체제에 의해서 맨 처음 호출되고 맨 나중에 종료된다.


main()  함수의 선언 형태

int main (void)


int는 integer의 줄임 말로 정수를 의미

void는 비어 있다는 의미

'int main (void)'를 전체적으로 해석해 보면 입력(void형)없이 main( 함수를 호출해서 출력은 정수(int형)로 하라는 의미


- 표준 라이브러리 함수와 헤더 파일은 프로그래밍을 편하게해준다.


- 세미콜론은 문장의 끝을 의미하는 마침표와도 같은 존재이다.


- return은 반환과 종료의 의미를 갖는다.

함수의 기능 역역에 있는 return의 의미는 두가지 이다.


첫째로 함수를 호출한 영역으로 값을 반환하다는 의미

둘째로 main() 함수를 종료한다는 의미


#include

int main(void)

{

printf("Hello C world \n");

return 0;

}

//운영체제에 0을 반환하고 main() 함수를 종료해라

//(운영체제는 반화값 0을 통해 프로그램이 정상적으로 종료되었는지 아닌지를 판단)



#include

int main(void)

{

printf("Hello C world \n");

return;

}

//반환할 것이 없으니 main() 함수를 그냥 종료해라



상속(Inheritance) : 기존의 클래스가 가지고 있는 필드와 메소드를 그대로 물려받은 새로운 클래스를 만드는 것 

## 클래스 선언
class Car :
    speed = 0

    def upSpeed(self, value) :
        self.speed = self.speed + value
        
    def downSpeed(self, value) :
        self.speed = self.speed - value

class Sedan(Car) :
    seatNum = 0

    def getSeatNum(self) :
        return self.seatNum

class Truck(Car) :
    capacity = 0
    
    def getCapacity(self) :
        return self.capacity

# 변수 선언
sedan1, truck1 = None, None

# 메인 코드 부분
sedan1 = Sedan()
truck1 = Truck()

sedan1.upSpeed(100)
truck1.upSpeed(80)

sedan1.seatNum=5
truck1.capacity=50

print("승용차의 속도는 %d km, 좌석수는 %d개입니다." % (sedan1.speed, sedan1.getSeatNum() ))
print("트럭의 속도는 %d km, 총중량은 %d개입니다." % (truck1.speed, truck1.getCapacity() ))


승용차의 속도는 100 km, 좌석수는 5개입니다.
트럭의 속도는 80 km, 총중량은 50개입니다.





오버라이딩(Overriding) : 상위 클래스 하위클래스에서 재정의


## 클래스 선언
class Car :
    speed = 0
    def upSpeed(self, value) :
        self.speed += value

        print("현재 속도(슈퍼 클래스) : %d km" % self.speed)
        
class Sedan(Car) :
    def upSpeed(self, value) :
        self.speed += value

        if self.speed > 150 :
            self.speed = 150

        print("현재 속도(서브 클래스) : %d km" % self.speed)

class Truck(Car) :
    pass

# 변수 선언
sedan1, truck1 = None, None

# 메인 코드 부분
truck1 = Truck()
sedan1 = Sedan()

print("트럭 --> ", end="")
truck1.upSpeed(200)

print("승용차 --> ", end="")
sedan1.upSpeed(200)


트럭 --> 현재 속도(슈퍼 클래스) : 200 km

승용차 --> 현재 속도(서브 클래스) : 150 km





from tkinter import *

window = Tk()
window.title("윈도창 연습")
# 이 부분에서 화면을 구성하고 처리
window.geometry("400x100")
window.resizable(width=FALSE, height=FALSE)

window.mainloop()



from tkinter import *

window = Tk()

# 함수 정의 부분
def myFunc() :
    if chk.get() == 0 :
        messagebox.showinfo("","체크버튼이 꺼졌어요.")
    else :
        messagebox.showinfo("","체크버튼이 켜졌어요.")

# 메인 코드 부분
chk = IntVar()
cb1 = Checkbutton(window, text="클릭하세요", variable=chk, command=myFunc)

cb1.pack()

window.mainloop()


'먼지 낀 책장사이 > Python' 카테고리의 다른 글

SQLite  (0) 2016.10.18
쓰레드  (0) 2016.10.11
Raw파일 읽기, 클래스, 생성자  (0) 2016.09.20
문자열, 구구단, 그림그리기  (0) 2016.09.13
가변 매개변수, 모듈  (0) 2016.09.06

http://promotion.gmarket.co.kr/planview/plan.asp?sid=147533


 지방에 살고 있을 무렵 게임행사라는 것은 저에게는 먼 이야기였습니다. IT개발자의 꿈을 가지고 서울로 진학한 뒤 각종 게임행사를 체험할 수있었고 블리자드 현장이벤트에 참여하게 되었습니다. 직접 눈으로보니 게임이 외적인 부분으로도 즐길 수 있는 문화산업이라는 점에 감동받았습니다. 이것은 블리자드 팬심으로 이어졌고 공허의 유산 런칭행사, 월드오브 워크래프트 군단 전시회 카라잔 롯데월드 야간이벤트 등 블리자드에서 열리는 현장행사를 꾸준히 찾아갔습니다. 그리고 이번 기회, 한국장학재단의 신청제한에 좌절했었지만 꿈꾸었던 현지 블리즈컨에 꼭 찾아가고 싶습니다.


 게임시스템과 더불어 가장 깊이 즐기는 건 캐릭터와 그 세계관을 풀어내는 스토리텔링이라고 생각합니다. 제가 가장 좋아하는 인물은 스타크래프트의 탈다림 승천자 알라라크이며 주인공과 반목하는 악역에도 불구하고 세력에 가담하고 내뱉는 자신감 넘치는 대사나 거친 몸짓이 모두 매력적이었습니다. 캐릭터의 매력은 외모만이 아니라 어떻게 살아왔는지의 배경설정, 그로 인해 가지게 된 성격, 이를 풀어내는 스토리진행이 완성시킨다고 생각합니다. 인물의 ‘상호대사’는 선택을 할 때 더욱 집중하고 하게 만들었고 이것은 타 매체에서 할 수 없는 게임에서만 가능한 점이라고 생각합니다. 알라라크는 공허의 유산에서 등장했지만 히어로즈 오브 더 스톰, 트위치 보이스팩 등 다양한 진출을 보여줍니다. 게이머의 팬심을 읽어내 캐릭터을 잘 살려낸 블리자드의 강점일 것이며 그 현장을 눈으로 새기고싶습니다.

 현재 게임은 즐기기 위해 플레이 한다는 본질이 잊혀지고 있었습니다. 이를 오버워치와 블리자드 현장이벤트가 상기시켰다고 생각합니다. 플레이어를 먼저 생각하는 오버워치를 비롯한 블리자드 게임에서 악의를 가진 플레이어는 제재되는 것을 보여주고, 같은 경험을 공유하는 현장이벤트를 통해 게임이 가졌던 오락의 의미를 되새기는 분위기가 국내게임시장에도 큰 영향을 주고 있다고 확신합니다. 게임문화를 이끌어나가는 서비스와 현장이벤트가 앞으로도 많아졌으면 좋겠습니다.

'나침반을 꺼내 > 하고싶은건' 카테고리의 다른 글

글로리맥스  (0) 2023.12.16
키스킨 출력테스트  (0) 2023.03.15
제품박스 번역  (0) 2023.02.07

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를 사용합니다.




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


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


Citrus.raw


from tkinter import *
## 변수 ##
window = None
canvas = None
XSIZE, YSIZE = 256, 256
## 메인코드 ##

window=Tk()
window.title("흑백 사진 보기")
canvas = Canvas(window, height=XSIZE, width=YSIZE)

paper=PhotoImage(width=XSIZE, height=YSIZE)
canvas.create_image((XSIZE/2,YSIZE/2), image=paper,state="normal")

#이부분에서 읽어올 파일 경로
fp=open('E:\swa\Citrus.raw','rb')       ## fp? =파일포지션

for i in range(0, XSIZE) :
    for k in range(0,YSIZE)  :
        data = int(ord(fp.read(1)))
        paper.put("#%02x%02x%02x" % (data,data,data) , (k, i))

fp.close()
canvas.pack()
window.mainloop()









class : 현실의 사물을 컴퓨터 안에서 구현하기 위하여 고안된 개념(설계도)

함수까지 포함

instance : 설계도에 의해 만들어진 실체

structure : 변수를 정의(형이 다른 데이터 집합)

array : 동질적인 데이터의 집합

클래스 안에 구현한 함수 메소드(methode)


#클래스 예제
#source_code11-2
#클래스 정의 부분
class Car :
    color = ""
    speed = 0

    def upSpeed(self, value) :  
        self.speed += value
        ##(A,) 괄호 앞부분이 자기자신에게 접근. 이때 정의한 대로 다음줄에서 A.speed로
    def downSpeed(self, value) :
        self.speed -= value

# 메인 코드 부분
myCar1 = Car()
myCar1.color = "빨간색"
myCar1.speed = 0

myCar2 = Car()
myCar2.color = "파란색"
myCar2.speed = 0

myCar3 = Car()
myCar3.color = "노란색"
myCar3.speed = 0

myCar1.upSpeed(30)
print("자동차1의 색상은 %s이며, 현재속도는 %d km 입니다." % (myCar1.color, myCar1.speed))
myCar2.upSpeed(60)
print("자동차2의 색상은 %s이며, 현재속도는 %d km 입니다." % (myCar2.color, myCar2.speed))
myCar3.upSpeed(0)
print("자동차3의 색상은 %s이며, 현재속도는 %d km 입니다." % (myCar3.color, myCar3.speed))

자동차1의 색상은 빨간색이며, 현재속도는 30 km 입니다.

자동차2의 색상은 파란색이며, 현재속도는 60 km 입니다.

자동차3의 색상은 노란색이며, 현재속도는 0 km 입니다.








#클래스 입력
#source_code11-2
#클래스 정의 부분
class Car :
    color = ""
    speed = 0

    def upSpeed(self, value) : 
        self.speed += value
        ##(A,) 앞부분이 자기자신에게 접근. 이때 정의한 대로 다음줄에서 A.speed로
    def downSpeed(self, value) :
        self.speed -= value

# 메인 코드 부분
myCar1 = Car()
myCar2 = Car()
myCar3 = Car()

while True:
    myCar1.color = input("자동차 1의 색상 입력 : ")
    myCar1.speed = int(input("자동차 1의 가속도 입력(km) : "))
    Continue = str(input("다음 차량으로 넘어가시겠습니까?(y/n) : "))
    if Continue == "y":
                  break
    if Continue == "n":
                  print("다시 입력")
                  continue
print("자동차1의 색상은 %s이며, 현재속도는 %d km 입니다." % (myCar1.color, myCar1.speed))

while True:
    myCar2.color = input("자동차 2의 색상 입력 : ")
    myCar2.speed = int(input("자동차 2의 가속도 입력(km) : "))
    Continue = str(input("다음 차량으로 넘어가시겠습니까?(y/n) : "))
    if Continue == "y":
                  break
    if Continue == "n":
                  print("다시 입력")
                  continue
print("자동차2의 색상은 %s이며, 현재속도는 %d km 입니다." % (myCar2.color, myCar2.speed))

while True:
    myCar3.color = input("자동차 3의 색상 입력 : ")
    myCar3.speed = int(input("자동차 3의 가속도 입력(km) : "))
    Continue = str(input("다음 차량으로 넘어가시겠습니까?(y/n) : "))
    if Continue == "y":
                  break
    if Continue == "n":
                  print("다시 입력")
                  continue
print("자동차3의 색상은 %s이며, 현재속도는 %d km 입니다." % (myCar3.color, myCar3.speed))

d








# 생성자는 인스턴스를 생성하면 무조건 호출되는 메소드
# 클래스 정의 부분
class Car :
    color = ""
    speed = 0

    def __init__(self) :
        self.color = "빨강"

    def upSpeed(self, value) :
        self.speed += value
        
    def downSpeed(self, value) :
        self.speed -= value

# 메인 코드 부분
myCar1 = Car("빨강",30)
myCar2 = Car("파랑",20)
myCar3 = Car("노랑",60)

print("자동차1의 색상은 %s이며, 현재속도는 %d km 입니다." % (myCar1.color, myCar1.speed))
print("자동차2의 색상은 %s이며, 현재속도는 %d km 입니다." % (myCar2.color, myCar2.speed))
print("자동차2의 색상은 %s이며, 현재속도는 %d km 입니다." % (myCar3.color, myCar3.speed))

d

d








class Car :
    name = "아우디"
    speed = 0
    count = "10억"

    def __init__(self, name, speed) :
        self.name = name
        self.speed = speed

    def getName(self) :
        return self.name

    def getSpeed(self):
        return self.speed

#변수선언
car1, car2 = None, None

#메인 코드 부분
car1 = Car("아우디", 0)
car2 = Car("벤츠", 30)


print("%s의 현재 속도는 %d입니다." % (car1.getName(), car1.getSpeed() ))
print("%s의 현재 속도는 %d입니다." % (car2.getName(), car2.getSpeed() ))
print("%s차의  가격은 %s입니다." % (car1.name, Car.count))

d

'먼지 낀 책장사이 > Python' 카테고리의 다른 글

쓰레드  (0) 2016.10.11
상속, 오버라이딩, 툴킷  (0) 2016.09.27
문자열, 구구단, 그림그리기  (0) 2016.09.13
가변 매개변수, 모듈  (0) 2016.09.06
연산자, while 반복, for문, 리스트/사전/튜플  (0) 2016.08.30