티스토리 뷰
학교 프로젝트로 간단한 옷장관련 시스템을 만들었습니다.
첫 아두이누 작품이었고 또 많이 허접하지만 올려봅니다...ㅎ
사용 센서와 시스템의 개요는 위와 같습니다.
위와 같이 시나리오를 짜고 코딩을 시작했습니다.
도트매트릭스(MAX7219)와 LED, 팬의 경우에는 레지스터 코딩을 했고
디지털 온습도 센서, 서보모터는 라이브러리를 사용했습니다.
#include "DHT.h"
#include <Servo.h>
const uint8_t font[128][8] = {
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0000 (nul)
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0001
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0002
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0003
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0004
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0005
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0006
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0007
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0008
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0009
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000A
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000B
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000C
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000D
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000E
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000F
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0010
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0011
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0012
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0013
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0014
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0015
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0016
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0017
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0018
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0019
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001A
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001B
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001C
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001D
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001E
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001F
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0020 (space)
{ 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00}, // U+0021 (!)
{ 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0022 (")
{ 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00}, // U+0023 (#)
{ 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00}, // U+0024 ($)
{ 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00}, // U+0025 (%)
{ 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00}, // U+0026 (&)
{ 0x20, 0x50, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0027 (')
{ 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00}, // U+0028 (()
{ 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00}, // U+0029 ())
{ 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00}, // U+002A (*)
{ 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00}, // U+002B (+)
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+002C (,)
{ 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00}, // U+002D (-)
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+002E (.)
{ 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00}, // U+002F (/)
{ 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00}, // U+0030 (0)
{ 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00}, // U+0031 (1)
{ 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00}, // U+0032 (2)
{ 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00}, // U+0033 (3)
{ 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00}, // U+0034 (4)
{ 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00}, // U+0035 (5)
{ 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00}, // U+0036 (6)
{ 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00}, // U+0037 (7)
{ 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+0038 (8)
{ 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00}, // U+0039 (9)
{ 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+003A (:)
{ 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+003B (//)
{ 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00}, // U+003C (<)
{ 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00}, // U+003D (=)
{ 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00}, // U+003E (>)
{ 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00}, // U+003F (?)
{ 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00}, // U+0040 (@)
{ 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00}, // U+0041 (A)
{ 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00}, // U+0042 (B)
{ 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00}, // U+0043 (C)
{ 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00}, // U+0044 (D)
{ 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00}, // U+0045 (E)
{ 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00}, // U+0046 (F)
{ 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00}, // U+0047 (G)
{ 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00}, // U+0048 (H)
{ 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0049 (I)
{ 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00}, // U+004A (J)
{ 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00}, // U+004B (K)
{ 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00}, // U+004C (L)
{ 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00}, // U+004D (M)
{ 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00}, // U+004E (N)
{ 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00}, // U+004F (O)
{ 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00}, // U+0050 (P)
{ 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00}, // U+0051 (Q)
{ 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00}, // U+0052 (R)
{ 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00}, // U+0053 (S)
{ 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0054 (T)
{ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00}, // U+0055 (U)
{ 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0056 (V)
{ 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}, // U+0057 (W)
{ 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00}, // U+0058 (X)
{ 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00}, // U+0059 (Y)
{ 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00}, // U+005A (Z)
{ 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00}, // U+005B ([)
{ 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00}, // U+005C (\)
{ 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00}, // U+005D (])
{ 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00}, // U+005E (^)
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // U+005F (_)
{ 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0060 (`)
{ 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00}, // U+0061 (a)
{ 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00}, // U+0062 (b)
{ 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00}, // U+0063 (c)
{ 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00}, // U+0064 (d)
{ 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00}, // U+0065 (e)
{ 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00}, // U+0066 (f)
{ 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0067 (g)
{ 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00}, // U+0068 (h)
{ 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0069 (i)
{ 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E}, // U+006A (j)
{ 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00}, // U+006B (k)
{ 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+006C (l)
{ 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00}, // U+006D (m)
{ 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00}, // U+006E (n)
{ 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00}, // U+006F (o)
{ 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F}, // U+0070 (p)
{ 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78}, // U+0071 (q)
{ 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00}, // U+0072 (r)
{ 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00}, // U+0073 (s)
{ 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00}, // U+0074 (t)
{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00}, // U+0075 (u)
{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0076 (v)
{ 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00}, // U+0077 (w)
{ 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00}, // U+0078 (x)
{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0079 (y)
{ 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00}, // U+007A (z)
{ 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00}, // U+007B ({)
{ 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00}, // U+007C (|)
{ 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00}, // U+007D (})
{ 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+007E (~)
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // U+007F
};
//DIN : PB0 : 53
//CS : PB2 : 51
//CLK : PB1 : 52
//fan : PB4 : 10
#define TRIG 6 //TRIG 핀 설정 (초음파 보내는 핀)
#define ECHO 7 //ECHO 핀 설정 (초음파 받는 핀)
#define DHTPIN 8 // DHT11이 연결된 핀
#define SERVOPIN 9 // 서모보터가 연결된 핀
#define DHTTYPE DHT11 // DHT 11, DHT시리즈중 11을 선택합니다.
Servo servo; // 서보 제어변수
DHT dht(DHTPIN, DHTTYPE); // DHT 설정
unsigned long Time = 0.0; // 시간 저장
float Matrix_tem = 0.0;
bool Open = false;
long distance = 0;
int cnt = 0;
uint8_t Buffer[100][8];
uint8_t Display[4][8];
uint8_t Buffer_len = 0;
uint8_t a = 0, b = 0;
String str = " ";
void setup() {
// 시리얼 통신 활성화
Serial.begin(9600);
// 포트 활성화
DDRB = 0xff; // 출력모드
DDRD = 0xff; // 입력모드
PORTB = 0x00;
PORTD = 0x00;
Time = millis(); // 실행시간 저장
dht.begin(); // 온습도 측정시작
servo.attach(SERVOPIN); // 서보 모터 초기화
// 초음파 센서 초기화
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
/**********************MAX 7219********************/
ADMUX = B01000000;
ADCSRA = B10001100;
set_Max7219(0x09, 0x00); // Decode Mode - No decode for digits
set_Max7219(0x0a, 0x01); // Intensity - 3/32
set_Max7219(0x0b, 0x07); // Scan Limit - All Output Port Enable
set_Max7219(0x0c, 0x01); // Shutdown - Normal Operation
set_Max7219(0x0f, 0x00); // Display Test
set_Max7219(0x00, 0x00);
set_Max7219(0x00, 0x00);
set_Max7219(0x00, 0x00);
create_Buffer();
}
void loop() {
uint8_t i, j;
if (millis() - Time >= 2000) {
Time = millis();
dht_();
wave_();
}
for (i = 1 ; i < 9 ; i++) {
PORTB &= ~(1 << 2); // CS를 Low로 설정
for (j = 0 ; j < 4 ; j++) {
write_byte(i);
write_reverse_byte(Display[j][i - 1]);
}
PORTB |= (1 << 2); // CS를 High로 설정
}
create_Display();
delay(50);
}
/**********************MAX 7219********************/
// 버퍼에 데이터 삽입
void create_Buffer() {
uint8_t i, j;
Buffer_len = str.length();
for (i = 0 ; i < str.length(); i++) {
for (j = 0 ; j < 8 ; j++) {
Buffer[i][j] = font[str[i]][j];
}
}
}
// 디스플레이에 데이터 삽입
void create_Display() {
uint8_t i, j;
for (i = 0 ; i < 4 ; i++) {
for (j = 0 ; j < 8 ; j++)
Display[i][j] = (Buffer[(a + i) % Buffer_len][j] >> b) | (Buffer[(a + i + 1) % Buffer_len][j] << (8 - b));
}
b++; // 쉬프트 연산 누적
if (b == 8) { // 8번 쉬프트 : 시작하는 문자가 바뀐다.
a++; // 시작하는 문자 갱신
b = 0; // 쉬프트 연산 초기화
if (a == Buffer_len) { // 마지막 문자를 출력했을 경우
a = 0; // 첫글자의 인덱스로 초기화
}
}
}
// 옵션 세팅
void set_Max7219(uint8_t address, uint8_t data) {
PORTB &= ~(1 << 2); // CS를 Low로 설정
write_byte(address);
write_byte(data);
PORTB |= (1 << 2); // CS를 High로 설정
}
// 바이트 삽입
void write_byte(uint8_t data) {
uint8_t i;
for (i = 0 ; i < 8 ; i++) {
if ((1 << (7 - i)) & data)
PORTB |= (1 << 0); // 데이터 삽입
else
PORTB &= ~(1 << 0); // 데이터 삽입
PORTB |= (1 << 1); // CLK를 High로 설정
PORTB &= ~(1 << 1); // CLK를 Low로 설정
}
}
// 역방향으로 바이트 삽입
void write_reverse_byte(uint8_t data) {
uint8_t i;
for (i = 0 ; i < 8 ; i++) {
if ((1 << i) & data)
PORTB |= (1 << 0); // 데이터 삽입
else
PORTB &= ~(1 << 0); // 데이터 삽입
PORTB |= (1 << 1); // CLK를 High로 설정
PORTB &= ~(1 << 1); // CLK를 Low로 설정
}
}
/**********************다른 센서********************/
//초음파 측정함수
void wave_() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(2);
digitalWrite(TRIG, LOW);
long duration = pulseIn (ECHO, HIGH); //물체에 반사되어돌아온 초음파의 시간을 변수에 저장합니다.
distance = duration * 17 / 1000;
//Serial.println(distance);
if (distance < 20)
{
LED_on();
str.replace(str, " " + String(Matrix_tem) + "'C");
create_Buffer();
}
else {
cnt++;
if (cnt == 6) {
LED_off();
str.replace(str, " ");
create_Buffer();
cnt = 0;
}
}
}
// LED 키기
void LED_on() {
LED_off();
if (Matrix_tem > 27)
PORTD |= (1 << 0); // 빨간색 LED 출력
else if (Matrix_tem > 24)
PORTD |= (1 << 1); // 노란색 위 LED 출력
else if (Matrix_tem > 17)
PORTD |= (1 << 2); // 노란색 아래 LED 출력
else
PORTD |= (1 << 3); // 초록색 LED 출력
}
// LED 끄기
void LED_off() {
for (int i = 0; i <= 4; i++)
PORTD &= ~(1 << i); // LED출력 중지
}
// 온습도 측정 함수
void dht_() {
float h = dht.readHumidity(); // 습도 측정
float t = dht.readTemperature(); // 온도 측정
// 측정 오류시 리턴
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// 값 보정
float c = dht.computeHeatIndex(t, h, false);
Matrix_tem = c;
// 습도가 50이상이면 환기 실행
if (h > 55) {
Ventilation();
}
else {
Ventilation_over();
}
//출력
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
//Serial.print("Temperature: ");
//Serial.print(t);
//Serial.print(" *C ");
Serial.print("Heat index: ");
Serial.print(c);
Serial.println(" *C ");
}
// 환기
void Ventilation()
{
PORTB |= (1 << 4); // 팬작동
//환기 구가 닫혀있다면 열음
if (!Open) {
for (int angle = 100; angle < 180; angle++)
{
servo.write(angle);
delay(10);
}
Open = true;
}
}
// 환기 종료
void Ventilation_over()
{
PORTB &= ~(1 << 4); // 팬 정지
//환기 구가 열려있다면 닫음
if (Open) {
for (int angle = 180; angle > 100; angle--)
{
servo.write(angle);
delay(10);
}
Open = false;
}
}
[참고자료]
감사합니다.
공부한 내용을 복습/기록하기 위해 작성한 글이므로 내용에 오류가 있을 수 있습니다.
'기타' 카테고리의 다른 글
ESG란? (0) | 2022.07.12 |
---|---|
[자격증] 정보처리기사 후기(feat. 전공자, 접수방법, 문제집) (0) | 2022.07.08 |
Windows 고정아이피 유동아이피로 바꾸기 (0) | 2022.01.27 |
앱디자인 참고자료 (0) | 2022.01.21 |
픽셀아트 무료 사이트 추천 - Piskel (0) | 2022.01.20 |
댓글