'분류 전체보기' 카테고리의 글 목록 (14 Page) :: 잡다한 프로그래밍
반응형

1. 수위측정센서란?

수위 측정 센서란 다음 그림처럼 도체와 절연체로 이루어진 센서로 물이 어느정도 찼는지를 측정하는 센서이다.

  • 접촉식 수위센서는 니켈 같은 도체로 구성된 금속판이 절연체에 띄엄띄엄 떨어져 있고, 개방된 회로라고 하고, 전 류가 흐르지 않음.
  • 반면에, 액체가 접촉하게 되면 띄어져 있는 도체가 연결되기 때문에 저항값이 무한대인 개방된 회로보다 저항값이 줄어들고 전류가 흐를 수 있게 됨.
  • 이를 통해 물에 접촉하는 표면적이 많을수록 출력 저항값이 적어지는 것을 알 수 있고, 센서를 세워서 연결했을 때,센서의 저항값은 액체 높이에 반비례함.
  • 접촉식 수위센서 뿐만 아니라, 수분센서, 강우량 센서 등 액체의 직접적인 접촉에 의한 대부분의 센서들은 이와 같은 저항값에 따른 수분량을 파악함.

수위측정센서 설명


2. 수위측정센서 실습하기

수위 측정 센서를 통해 물이 얼마나 찼는지 측정한다. 사전준비물은 다음과 같다

준비물

준비가 완료되었다면 다음과 같이 회로를 구성합니다.

회로도

회로 구성을 완료하였다면 다음과 같이 코드를 작성합니다.

int water_sensor = 0;

void setup(){
	Serial.begin(9600);
}

void loop(){
	water_sensor = analogRead(A0);
    Serial.println(water_sensor);
}

코드 작성을 완료하였다면 수위를 측정할 수 있습니다.

반응형
반응형

1. 온습도 센서란?

  • 온도와 습도를 동시에 측정이 가능한 센서
  • Arduino Plaground에서 라이브러리 제공
  • 온도와 습도를 동시에 측정하는 것은 아니고 서로 배타적으로 측정값을 읽어옴

온습도 센서


2. 온습도 센서 실습하기

온습도 센서를 통해 온습도를 읽어오는 실습을 진행한다. 사전 준비물은 다음과 같다.

사전 준비물

 

준비를 마쳤다면 DHT11 온습도 라이브러리를 다운로드한다

http://playground.arduino.cc/main/DHT11Lib 링크를 통해 라이브러리를 다운로드한다

다운로드 1
다운로드2
다운로드3

다운을 완료하였다면 다음과 같이 라이브러리를 추가한다

1. C:/Program Files (x86)/Arduino/libraries/DHT11 폴더를 생성
2. 다운로드한 dht11.h, dht11.cpp 파일 새로 생성한 폴더로 복사
3. 아두이노 개발환경에서 새로 설치한 라이브러리를 인식시키기 위해서는 아두이노 개발환경
   프로그램을 종료하고 다시 시작함

라이브러리 추가

 

추가를 완료하였다면 다음과 같이 코드를 작성한다.

#include <dht11.h>
#define DHT11PIN 2
dht11 DHT11;
void setup()
{
	Serial.begin(9600);
}
void loop()
{
	Serial.println("\n");
	int chk = DHT11.read(DHT11PIN);
	Serial.print("Read sensor: ");
	switch (chk)
	{
		case DHTLIB_OK: Serial.println(“OK”);
			break;
		case DHTLIB_ERROR_CHECKSUM:
			Serial.println(“Checksum error”);
			break;
		case DHTLIB_ERROR_TIMEOUT:
			Serial.println(“Time out error”);
			break;
		default: Serial.println("Unknown error");
			break;
	}
	
    Serial.print("Humidity (%): ");
	Serial.println((float)DHT11.humidity, 2);
	Serial.print("Temperature (°C): ");
	Serial.println((float)DHT11.temperature, 2);
	delay(2000);
}

 

코드 작성을 완료하였다면 다음과 같은 결과를 확인할 수 있다.

결과

반응형
반응형

1. AOP란?

만약 다음과 같이 Bean으로 만들 클래스 내부에 로깅, 트랜잭션, 실제 코드인 비즈니스 로직이 함께 있다고 생각해보자. 로깅, 트랜잭션, 비즈니스 로직 순서대로 작동하겠지만 이는 좋은 코드라고 할 수 없다. 따라서 로깅, 트랜잭션과 비즈니스 로직을 분리하기 위해 AOP가 존재한다

Bank 클래스

AOP는 다음 그림처럼 선처리, 후처리(런타임시 짜집기함)를 가능하게 지원하기 때문에 메인 Bean을 만드는 클래스를 따로 두고 로깅, 트랜잭션을 선처리 후처리로 다음과 같은 구조를 만드는 것이다.

 

다음 그림처럼 a.f()가 실직적인 타겟이되는 joinpoint가 되고 그림 앞에 보라색, 주황색이 선처리 후처리를 담당하는 어드바이스가 된다. 어드바이스는 joinpoint는 Pointcut이 가리키게 된다

다음 그림을 보면 조금더 이해하기 쉽다

AOP 구조 설명


2. AOP실습

#1) spring-aspect를 이용한 실습

1. pom.xml dependency추가

다음과 같은 디펜던시를 추가하면, Maven Dependencies에 spring-aspects라이브러리가 추가된 것을 확인할 수 있다.

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>4.2.5.RELEASE</version>
		</dependency>

 

2. Logger 클래스 추가

다음과 같은 Logger클래스를 추가한다.

public class Logger{
	public void aboutToSound() {
		System.out.println("Before: about to sound");
	}
}

 

3. animal.xml Namespaces 수정 및 aop추가

다음과 같이 Namespaces에 aop를 추가한다

aop 추가

aop추가를 완료하였다면 다음과 같은 코드를 추가한다 <aop:aspect ref="Logger">를 통해 Logger클래스를 Aspect로 이용하겠다는 의미이며, <aop:pointcut expression="execution(void kr.ac.hansung.helloDI.*.sound())" id="selectSound" />를 통해 helloDI패키지의 sound() 함수를 joinpoint로 지정하겠다는 의미이다. 이때 *은 와일드카드로서 어떤 클래스든 상관없다는 의미를 가진다. <aop:before method="aboutToSound" pointcut-ref="selectSound" />는 before어드바이스를 추가하겠다는 의미로 aboutToSound라는 메서드를 이용하며 ref로는 위에 선언한 pointcut의 id를 가진다. 따라서 pointcut은 jointpoint를 가르키고 advice는 그 pointcut을 가리킨다

	<aop:config>
		<aop:aspect ref="Logger" id="myAspect">
			<aop:pointcut
				expression="execution(void kr.ac.hansung.helloDI.*.sound())"
				id="selectSound" />
			<aop:before method="aboutToSound"
				pointcut-ref="selectSound" />
		</aop:aspect>
	</aop:config>

 

4. 실행

메인 함수를 실행하면 다음과 같은 결과를 확인할 수 있다. 메인 함수에서는 Logger빈을 사용하지 않았지만 다음과 같이 before advice가 실행된 것을 확인할 수 있다.

실행

 

#2) AOP 에노테이션을 이용한 실습

1. animal.xml수정

다음과 같이 animal.xml을 수정한다 기존 코드를 주석 처리하고 <aop:aspectj-autoproxy>를 추가함으로 에노테이션을 사용하겠다고 명시한다.

<!-- 	<aop:config>
		<aop:aspect ref="Logger" id="myAspect">
			<aop:pointcut
				expression="execution(void kr.ac.hansung.helloDI.*.sound())"
				id="selectSound" />
			<aop:before method="aboutToSound"
				pointcut-ref="selectSound" />
		</aop:aspect>
	</aop:config> -->

	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

 

2. Logger 클래스 수정

다음과 같이 Logger 클래스를 수정한다 @Aspect로 클래스가 Aspect라는 걸 명시하고 @Pointcut을 통해 sound() 메서드를 joinpoint로 지정하겠다는 것을 명시하고 @Before로 이전 어드바이스를 추가한다.

@Aspect
public class Logger{
	
	@Pointcut("execution(void kr.ac.hansung.helloDI.*.sound()")
	private void selectSound() {}
	
	@Before("selectSound()")
	public void aboutToSound() {
		System.out.println("Before: about to sound");
	}
}

 

3. 실행

모두 완료하였다면 다음과 같은 실행화면을 볼 수 있다

실행화면

반응형
반응형

1. 릴레이란?

  • ON/OFF 기능을 할 수 있는 일종의 스위치
  • 낮은 전류로 높은 전류를 제어 가능
  • 아두이노에서는 5V를 사용하지만 5V 이상의 전류를 제공해야 할 때 릴레이를 사용
  • 평상시는 NC와 COM단자가 연결되어 있고, SIG핀으로 전류가 흐를 시 NO와 COM단자가 연결된다.

릴레이


2. 릴레이 사용법

고 전압을 사용할 시 전원을 모두 제거하고 사용해야 하고 되도록 사용방법만 익히고 실제로 해보지 않는 걸 추천합니다.

 

만약 다음 그림과 같이 연결되어있다면 평상시에는 NC와 COM이 연결되어있기 때문에 현재 NO, COM이 연결된 아래 그림은 전구에 불이 켜지지 않을 것이다 하지만 7번 핀에 전류가 흐를 경우 NO와 COM이 연결되므로 전구에 불이 켜질 것이다. 이처럼 낮은 전류로 높은 전류를 컨트롤하기 위해 릴레이를 사용한다

릴레이 연결

반응형
반응형

https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 해결방법

최장, 최단 자주 사용했던 dfs를 이용하여 해결하면 될것이라고 생각했으나 기존 2차원 배열을 활용하던 방법과 달리 그래프를 어떤 방식으로 해결해야하는지에 대한 에러사항이 생김. 공부를 통해 방법을 찾았고 첫번째 방법은 기존 방법과 비슷하게 이차원 배열에, 두번째 방법은 vector를 활용하여 연결리스트 형태로 구현하는 방식이다. 문제의 그래프는 무방향 그래프 이므로 다음과 같이 구현했다


2. 코드

#include<iostream>
#include<string.h>
#include<vector>

using namespace std;
int T;
int N;
int M;
int MAX;

bool check[20];

void dfs(int now, int length, vector<int> *value) {
	if (length > MAX) {
		MAX = length;
	}

	check[now] = true;

	for (int i = 0; i < value[now].size(); i++) {
		int next = value[now][i];
		if (check[next]) continue;
		else {
			dfs(next, length + 1, value);
		}
	}

	check[now] = false;
}

int main(int argc, char** argv)
{
	cin >> T;
	for (int i = 0; i < T; i++) {
		cin >> N >> M;

		vector<int> v[20];
		for (int j = 0; j < M; j++) {
			int x;
			int y;
			cin >> x >> y;
			v[x].push_back(y);
			v[y].push_back(x);
		}
		MAX = 0;
		for (int k = 1; k <= N; k++) {
			memset(check, false, sizeof(check));
			dfs(k, 1, v);
		}

		cout << "#" << i+1 <<" " <<MAX << endl;
	}
}
반응형
반응형

1. 조도센서란?

  • 빛 감지센서
  • 저렴한 가격과 활용도를 가지고 많이 사용함
  • CDS 센서는 광에 쏘여지면 저항 값이 감소하는 광도전효과를 이용한 센서
  • CDS라고 불리는 이유는 CDS를 만드는 주 재료가 카드뮴, 황의 화합물인 황화 카드뮴이기 때문
  • 주위가 밝으면 저항이 줄어들고 주위가 어두우면 저항이 커지는 특징
  • 주위가 밝으면 CDS 저항이 줄어들어 Analog Input 핀에 높은 전압
  • 주위가 어두워 지면 CDS 저항이 커져 Analog Input 핀에 낮은 전압

조도센서 설명


2. 조도센서 실습하기

조도센서를 통한 LED ON/OFF실습에 필요한 사전준비물은 다음과 같다

사전 준비물

준비가 완료 되었다면 다음과 같이 회로를 구성한다. 조도센서는 극성이 없으므로 +, - 를 구분할 필요가 없다.

회로 구성

회로 구성이 완료 되었다면 다음과 같이 코드를 작성한다. A0으로 Analog Input을 이용하여 조도센서 값을 읽어오고, 읽어온 값이 100이상일경우 LED를 OFF하고 100보다 작을경우 LED를 ON하는 코드이다

int lightPin = A0;
int ledPin=11;
void setup()
{
	Serial.begin(9600);
	pinMode( ledPin, OUTPUT );
}
void loop()
{
	Serial.println(analogRead(lightPin)/4);
	if ( analogRead(lightPin)/4 >= 100 )
		digitalWrite(ledPin, LOW);
	else
		digitalWrite(ledPin, HIGH);
	delay(10);
}
반응형
반응형

1. 터치센서란?

터치센서는 아래 사진과 같으며 정전 용량형 터치 스위치 모듈이다. 보통 상태일 때는 Low 출력, 터치가 되었을 때는 High를 출력한다. VCC = +5V, GND = GND, SIG = 디지털 핀에 연결하여 사용하면 된다

터치센서


2. 터치센서 실습하기

터치센서와 LED를 사용하여 실습을 진행한다. 실습에 필요한 사전 준비물은 다음과 같다

사전 준비물

준비가 완료 되었다면 다음과 같이 회로를 구성한다

회로구성

회로 구성이 끝났다면 다음과 같이 코드를 작성한다. 터치센서에서 읽어 들인 touch값이 Low일 때 led를 끄고 High일 때 LED를 키는 코드이다

int touch = 3; // D3
int led = 9; // D9
void setup()
{
	pinMode(touch, INPUT);
	pinMode(led, OUTPUT);
}
void loop() {
	if( digitalRead(touch) == LOW )
		digitalWrite(led, LOW);
	else
		digitalWrite(led, HIGH);
}
반응형
반응형

1. ADC란?

Analog Digital Converter로서 연속적인 신호인 아날로그 신호를 부호화된 디지털 신호로 변환하는 장치를 의미한다. A\DC는 온도, 압력, 음성, 영상신호, 전압 등을 실생활에서 연속적인 아날로그 신호를 측정하여 그 신호를 컴퓨터로 입력하고 디지털로 변환하는 것을 의미한다. 여기서 우리가 사용할 가변저항이 ADC역할을 한다.

ADC그림


2. 가변저항 실습하기

가변저항과 LED를 사용하여 Analog Input / Output 실습을 진항한다. 실습에 필요한 사전 준비물은 다음과 같다.

  • 가변저항이란 : 저항의 값이 고정되어있지 않고 회전 스위치를 이용하여 임의의 저항값으로 변경이 가능한 저항

실습 준비물

가변저항은 다음과 같이 GND, A0, 5V로 구성되어있다

가변저항 설명

준비가 끝났다면 다음과 같이 회로를 구성한다 5V GND를 가변저항과, LED에 가변저항 A0은 아두이노 A0부분에, LED의 + 부분은 9번핀에 연결한다

회로구성

회로를 구성하였다면 다음과 같이 코드를 작성한다. 이때 sensorValue를 보면 sensorPin/4를 하는데 4로 나눠주는 이유는 0~1024 까지나 오는 결과 값을 analogRead에 맞게 0~255로 바꾸기 위해 4로 나눠주는 것이다

int sensorPin = A0;
int led = 9;
void setup()
{
	pinMode(led, OUTPUT);
	Serial.begin(9600);
}
	void loop()
{
	int sensorValue = 0;
	sensorValue = analogRead(sensorPin)/4;
	analogWrite(led, sensorValue);
	Serial.println(sensorValue);
	delay(10);
}
반응형

+ Recent posts