○ IoT 스마트홈 구조물 설계 및 제작
○ 스마트홈 아두이노 회로 제작
RFID를 이용한 스마트 도어락(소현)
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN); //rfid 객체 생성
#include <Servo.h> // 서보 라이브러리를 지정
#define servoPin 8 // 서보 모터핀을 지정
Servo servo; // 서보 라이브러리 변수를 선언
int pos=0; // 현재 각도를 저장할 변수를 지정한다
int RLED=7; // 빨간색 LED단자를 아두이노 7번과 연결
int GLED=6; // 초록색 LED단자를 아두이노 6번과 연결
void setup()
{
pinMode(RLED, OUTPUT); // RED LED를 출력으로 지정
pinMode(GLED, OUTPUT); // GREEN LED를 출력으로 지정
servo.attach(servoPin); // 서보모터 핀을 설정한다
servo.write(0); // 서보모터 0도 위치로 초기화
Serial.begin(9600); // 시리얼 통신 시작
SPI.begin(); // SPI 통신 시작
rfid.PCD_Init(); // rfid(MFRC522) 초기화
Serial.println("Approximate your card to the reader...");
Serial.println();
}
void loop()
{
// 새카드 접촉이 있을 때만 다음 단계로 넘어감
if ( ! rfid.PICC_IsNewCardPresent())
{
return;
}
// 카드 읽힘이 제대로 되면 다음으로 넘어감
if ( ! rfid.PICC_ReadCardSerial())
{
return;
}
// UID 값을 16진 값으로 읽고 저장한 후 시리얼 모니터로 표시함
Serial.print("UID tag :");
String content= "";
byte letter;
for (byte i = 0; i < rfid.uid.size; i++)
{
Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(rfid.uid.uidByte[i], HEX);
content.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(rfid.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Message : ");
content.toUpperCase();
if (content.substring(1) == "10 4A 0E 15")// 엑세스 승인 하고자하는 UID 기록
{
// 인증이 되면 Green LED와 함께 서보모터를 작동시킨다.
Serial.println("Authorized access");
Serial.println();
digitalWrite(GLED,HIGH);
servo.write(180); // 서보모터의 각도를 변경한다
delay(3000); // 서보 모터의 각도가 변하는 것을 기다려 준다.
servo.write(0); // 시간지연 후 문을 닫는다
digitalWrite(GLED,LOW); // 시간지연 후 LED 끈다
}
else { // 서보모터는 작동 없이 Red LED만 켜고 끈다
Serial.println(" Access denied"); // 그외 UID는 승인 거부 표시
digitalWrite(RLED,HIGH);
delay(3000);
digitalWrite(RLED,LOW);
}
}
움직임 감지로 인한 조명 제어(현관)(지희) https://m.blog.naver.com/sisosw/221472630847
@서지희
#include <Stdio.h>
int pir=2; //PIR모션센서
int led=13; //LED
int pirState = LOW; //시작 시, 어떠한 움직임도 감지되지 않았다고 가정
void setup(){
pinMode(pir, INPUT); //디지털 2번핀을 입력모드로 설정
pinMode(led, OUTPUT); //디지털 3번핀을 출력모드로 설정
Serial.begin(9600); //시리얼 통신 시작, 통신 속도는 9600
}
void loop(){
int val = digitalRead(pir); //PIR 모션센서로부터 입력값을 얻어옴
Serial.println(val); // 시리얼 모니터에 val값을 출력
if(val == HIGH) { //PIR 모션센서 입력값(val)이 HIGH이면
if(pirState == LOW){
digitalWrite(led, HIGH); // LED ON
Serial.println("Motion detected!");
pirState = HIGH;
}
} else { //LOW인 경
if(pirState == HIGH){
digitalWrite(led, LOW);
Serial.println("Motion ended!");
pirState = LOW;
}
}
}
스마트 온습도계(영주)
온습도 센서 및 LCD
(193) [아두이노] DHT11 온·습도 센서로 온도와 습도 측정하기 with LCDI2C - YouTube (온습도 센서)
(193) How to interface LCD display to Arduino without potentiometer/Arduino project/ - YouTube (LCD)
회로
#include <DHT.h>
#include <DHT_U.h>
//주변환경의 온도와 습도를 측정하여 시리얼모니터에 출력하기
#include <DHT.h>
#define DHTPIN 7
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
//온도와 습도 값을 측정하고 변수에 저장하기
float humi, temp;
temp = dht.readTemperature();
humi = dht.readHumidity();
//센서가 층정하지 못 할 경우 측정 종료
if(isnan(humi)||isnan(temp)) {
Serial.println("Failed to read from DHT sensor!!");
return;
}
//측정된 온도와 습도 출력하기
Serial.print("온도 : ");
Serial.print(temp);
Serial.println("℃");
Serial.print("습도 : ");
Serial.print(humi);
Serial.println("%");
}
LED 벽시계(지희)
https://m.blog.naver.com/icbanq/221791244900
#include <Arduino.h>
#ifndef SEGMENT_DISPLAY_H
#define SEGMENT_DISPLAY_H
extern int seg_pin[8];
extern int digit_pin[4];
extern int seg_value[10][8];
extern boolean state;
extern unsigned long timer0_millis;
extern int hour, min, sec;
void setupSegment();
void switchFn();
void segClear();
void segOutput(int d, int Number, int dp);
#endif
int seg_pin[8] = {13, 12, 11, 10, 9, 8, 7, 6};
int digit_pin[4] = {5, 4, 3, 2};
int seg_value[10][8] = {
{1, 1, 1, 1, 1, 1, 0, 0}, // 0
{0, 1, 1, 0, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1, 0}, // 2
{1, 1, 1, 1, 0, 0, 1, 0}, // 3
{0, 1, 1, 0, 0, 1, 1, 0}, // 4
{1, 0, 1, 1, 0, 1, 1, 0}, // 5
{1, 0, 1, 1, 1, 1, 1, 0}, // 6
{1, 1, 1, 0, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1, 0}, // 8
{1, 1, 1, 1, 0, 1, 1, 0}}; // 9
boolean state = false;
unsigned long timer0_millis;
int hour, min, sec;
void setupSegment()
{
for (int i = 0; i < 10; i++)
{
pinMode(seg_pin[i], OUTPUT);
}
for (int j = 0; j < 4; j++)
{
pinMode(digit_pin[j], OUTPUT);
digitalWrite(digit_pin[j], HIGH);
}
}
void switchFn()
{
state = !state;
}
void segClear()
{
for (int i = 0; i < 8; i++)
{
digitalWrite(seg_pin[i], LOW);
}
}
void segOutput(int d, int Number, int dp)
{
segClear();
digitalWrite(digit_pin[d], LOW);
for (int i = 0; i < 7; i++)
{
digitalWrite(seg_pin[i], seg_value[Number][i + 1]);
}
digitalWrite(seg_pin[7], dp);
delayMicroseconds(1000);
digitalWrite(digit_pin[d], HIGH);
}
void loop()
{
// 시리얼 데이터 처리
if (Serial.available())
{
String inString = Serial.readStringUntil('\\n');
int index1 = inString.indexOf(':');
int index2 = inString.indexOf(':', index1 + 1);
int index3 = inString.length();
// 예외 처리: 각 부분이 유효한지 확인
if (index1 != -1 && index2 != -1 && index3 != -1)
{
hour = inString.substring(0, index1).toInt();
min = inString.substring(index1 + 1, index2).toInt();
sec = inString.substring(index2 + 1, index3).toInt();
timer0_millis = ((long)hour * 3600 + min * 60 + sec) * 1000;
}
}
// 24시간 경과 시 초기화
if (millis() >= 86400000)
{
timer0_millis = 0;
}
// 현재 시간 계산
unsigned long readTime = millis() / 1000;
sec = readTime % 60;
min = (readTime / 60) % 60;
hour = (readTime / (60 * 60)) % 24;
// 12시간 표시 모드 설정
if (state == true)
{
hour = hour % 12;
}
// 세그먼트 표시
segOutput(3, sec % 10, 0);
segOutput(2, sec / 10, 0);
segOutput(1, min % 10, 1);
segOutput(0, min / 10, 0);
}
스마트 전등 스위치 제어(다음 주)
○ 전등 스위치 몸통 제작
○ 스마트 전등 스위치 개발 및 원격 제어 앱 개발 후 연결
와이파이 모듈을 교수님으로부터 제공받은 후, 다음 주에 개발할 예정
아두이노 개발
n개의 아두이노 원격 제어 스위치 제작
원격 제어 앱 개발
n개의 아두이노 스위치를 한꺼번에 제어하기 위한 앱 개발
○ 스마트홈 아두이노 회로 추가 제작
조도센서를 이용하여 제어하는 스마트 전등 구현
○ 최종 결과물 제작
스마트홈 구조물 + 내부 아두이노 합체, 방 전등 스위치 완성