DC 모터

void setup()
{
  Serial.begin(9600);
  pinMode(9,INPUT);
}

void loop()
{
  int val = analogRead(A0);
  //아날로그 입력값 : 0 ~ 1023
  //아날로그 출력값 : 0 ~ 255
  //map()함수를 이용해서 범위가 다른 값들을 변환하여 활용해보자
  int convertVal = map(val,0,1023,0,255);
  
  //analog Read값을 Write로 변환시킨다.
  
  Serial.println(convertVal);
  analogWrite(9,convertVal);
  delay(100);
}

void setup()
{
  Serial.begin(9600);
  //pwm을 지원하는 9번, 10번핀을 출력모드로 설정(dc모터와 연결)
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  //스위치 입력을 받기 위해 8번 핀을 입력 모드로 설정
  pinMode(8,INPUT);
}

void loop()
{
  int val = analogRead(A0);
  //아날로그 입력값 : 0 ~ 1023
  //아날로그 출력값 : 0 ~ 255
  
  //map()함수를 이용해서 범위가 다른 값들을 변환하여 활용해보자
  int convertVal = map(val,0,1023,0,255);
  Serial.println(convertVal);
  
  //스위치값 입력 받기
  int switchVal = digitalRead(8);
  if(switchVal==HIGH){
	analogWrite(10,convertVal);
	analogWrite(9,LOW);
  }else{
	analogWrite(9,convertVal);
	analogWrite(10,LOW);
  }
  Serial.println(switchVal);
  
  delay(100);
}

Servo 모터
서보 모터는 속도와 각도를 모두 제어하는 모터이다.
서보 모터를 동작시키는 코드를 작성하려면 먼저 라이브러리
#include <Servo.h>를 해야한다.
이때 주의 사항은 아두이노 우노의 경우 9, 10번 핀에 analogWrite기능을 지원하지 않는다. 따라서 8번 핀에 연결한다.
특징 : 서보 모터는 0 ~ 180도 까지만 움직일 수 있다.

//8번 핀을 서보 모터 제어에 사용하기 위해 매핑
//attach()함수는 서보모터에 연결된 디지털 핀번호를
//아두이노에 알려주는데 이 과정을 매핑이라고 한다.

#include <Servo.h>

Servo myServo;
int count=0;

void setup()
{
  Serial.begin(9600);
  myServo.attach(8);
  
  //아두이노에 알려주는데 이 과정을 매핑이라고 한다.
}

void loop()
{
  //서보모터 각도를 0 ~ 180까지 바꿔보자
  for(int i=0;i<180;i++)
  {
	myServo.write(i);
	delay(50);
  }
  count++;
  if(count==3)
  {
    myServo.detach();
  }

  
}

초음파 센서
1초 동안 진동한 횟수를 주파수 또는 진동수라고 하며, 헤르츠 (Hz)라는 단위로 나타낸다. 사람은 주파수가 약 16~20,000Hz 일 때 소리를 들을 수 있다. 주파수가 이보다 높은 음파는 사람이 들을 수 없는데, 이를 초음파 (ultrasonic) 라고 한다. 돌고래나 박쥐는 초음파를 활용해 장애물이나 사냥감을 찾아낸다. 이런 원리를 활용한 장치가 초음파 센서이다. 초음파 센서는 임의로 20kHz~200MHz 대역의 초음파를 만들어 물체와의 거리를 측정할 수 있다.

트리거와 에코
트리거는 초음파 센서에서 초음파 신호를 발생시키는 장치이고, 에코는 초음파 신호를 수신하는 장치이다. 트리거가 초음파를 발생시키면 초음파 신호는 뻗어 나가다가 물체를 만나면 반사되어 되돌아온다. 에코는 물체에 반사되어 되돌아오는 초음파 신호를 수신해 초음파 신호가 발생한 시점부터 수신한 시점까지의 시간을 마이크로초 (microsecond, μs) 단위로 반환한다.

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

void loop()
{
  pinMode(9,OUTPUT);
  digitalWrite(9,LOW);
  delayMicroseconds(2); //2마이동안 지연
  digitalWrite(9,HIGH);
  delayMicroseconds(5); //5마이크로 초 동안 지연
  digitalWrite(9,LOW);
  
  //초음파 신호 수신
  pinMode(9,INPUT);
  double duration = pulseIn(9,HIGH);
  //pulseIn()함수는 초음파 신호가 에코에 도달했을 때의
  //시간을 측정해 반환하는 함수로 마이크로초 단위초 반환한다.
  //거리(m) = 속력 (m/s) * 시간(s)
  //측정거리 (cm) = 340m/s (초음파 속력) * 시간(초)
  
  double cm = duration * 340/10000/2;
  //왕복거리이기 때문에 나누기 2를 해주고 단위에 맞춰서 나누기 10000을 해준다.
  Serial.println("cm"+ (String)cm);
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
PL/SQL
PL/SQL은 SQL로 얻을 수 없는 
절차적 언어의 기능을 가지고 있다.
PL/SQL : Oracle's Procedual Language extension to SQL

# PL/SQL 사용 이유

1. 반복 처리를 할 수 있다.(Loop)
2. 비교 처리를 할 수 있다.(IF)
3. Error 처리를 할 수 있다.(예외처리)
4. SQL문을 캡슐화 할 수 있다.
   (데이터의 보안 및 무결성)
5. 변수 선언을 할 수 있다.
6. 실행할 때 마다 분석된 결과를 
   실행 만 하기 때문에 성능이 빠르다.
7. Network Traffic이 감소된다.
 여러 sql문장을 block으로 묶고 
 한번에 블럭 전부를 서버로 전송하기
 때문에 통신량을 줄일 수 있다.

PL/SQL으로 작성된 블럭을 오러클 서버로 보내면 그 안에 있는 PL/SQL 엔진이 sql문과 non-sql문을 구분하여 
non-sql문은 PL/SQL 엔진 내의 Proceduer statement executor가 수행하고, sql문은 SQL statement executor가 처리하게 된다.
즉 non-sql문은 client환경에서 처리되고 sql문은 서버에서 실행하게 된다. 따라서 pl/sql을 사용하게 되념 서버쪽에서의 
작업양이 줄게되므로 성능을 향상 시킬 수 있는 이점이 있다.

CREATE ON REPLACE PROCEDURE 프로시저명
IS
  변수 선언문
BEGIN
  실행문:
  (EXCEPTION)
    예외처리
END:
/

--정수를 is parameter로 전달되면
홀수, 짝수인지 분별해서 출력하는 프로시저를 작성

CREATE OR REPLACE PROCEDURE EVEN_ODD(PNUM IN NUMBER)
IS
  VSTR VARCHAR2(30);
BEGIN
  IF MOD(PNUM,2) = 0 
    THEN VSTR := 'EVEN';
  ELSE
    VSTR:='ODD';
  END IF;
  DBMS_OUTPUT.PUT_LINE(PNUM||'은 '||VSTR||'입니다');
END;
/

SET SERVEROUTPUT ON

EXECUTE EVEN_ODD(435);

1) 스칼라 타입
--부서정보를 insert하는 프로시저를 작성하세요 스칼라 타입의 데이터 사용

CREATE OR REPLACE PROCEDURE DEPT_ADD(PNO IN NUMBER,
PNAME IN VARCHAR2, PLOC IN VARCHAR2)
IS
	VSTR VARCHAR2(300) := 'HELLO';
BEGIN
	INSERT INTO DEPT(DEPTNO,DNAME,LOC)
    VALUES(PNO,PNAME,PLOC);
    VSTR:=PNAME||'부서를 등록했습니다.';
    DBMS_OUTPUT.PUT_LINE(VSTR);
END;
/

SELECT * FROM DEPT;
EXECUTE DEPT_ADD(50,'EDUCATION','SEOUL');

2) %TYPE
--사번을 in parameter로 받으면 해당 사원의 이름, 부서번호, 업무, 입사일을 출력하는 프로시저를 작성

CREATE OR REPLACE PROCEDURE EMP_INFO(PNO IN EMP.EMPNO%TYPE)
IS
  VNAME EMP.ENAME%TYPE;
  VDNO EMP.DEPTNO%TYPE;
  VJOB EMP.JOB%TYPE;
  VDATE EMP.HIREDATE%TYPE;
BEGIN
  SELECT ENAME, DEPTNO, JOB, HIREDATE
  INTO VNAME, VDNO, VJOB, VDATE
  FROM EMP
  WHERE EMPNO = PNO;
  DBMS_OUTPUT.PUT_LINE('사번: '||PNO);
  DBMS_OUTPUT.PUT_LINE('이름: '||VNAME);
  DBMS_OUTPUT.PUT_LINE('부서번호: '||VDNO);
  DBMS_OUTPUT.PUT_LINE('업무: '||VJOB);
  DBMS_OUTPUT.PUT_LINE('입사일: '||VDATE);
  DBMS_OUTPUT.PUT_LINE('ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ');
END;
/

EXECUTE EMP_INFO(7369);

3) %ROWTYPE
--상품번호를 in parameter로 받아서 상품의 카테고리 코드 이름, 제조사, 판매가를 보여주는 프로시저를 작성하세요

CREATE OR REPLACE PROCEDURE PROD_INFO(PNO IN PRODUCTS.PNUM%TYPE)
IS
  VPROD PRODUCTS%ROWTYPE;
  VCNAME CATEGORY.CATEGORY_NAME%TYPE;
  --테이블명%ROWTYPE ==> 지정된 테이블의 구조와 동일한 구조를 갖는 변수가 된다.
BEGIN
  SELECT CATEGORY_FK,PRODUCTS_NAME,COMPANY,OUTPUT_PRICE
  INTO VPROD.CATEGORY_FK,VPROD.PRODUCTS_NAME,VPROD.COMPANY,VPROD.OUTPUT_PRICE
  FROM PRODUCTS
  WHERE PNUM=PNO;
  --카테고리 테이블에서 카테고리명을 가져오는 문장
  SELECT CATEGORY_NAME
  INTO VCNAME
  FROM CATEGORY
  WHERE CATEGORY_CODE=VPROD.CATEGORY_FK;
  --
  
  DBMS_OUTPUT.PUT_LINE('ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ');
  DBMS_OUTPUT.PUT_LINE('카테고리  상품명  제조사  판매가  카테고리명');
  DBMS_OUTPUT.PUT_LINE('ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ');
  DBMS_OUTPUT.PUT_LINE(VPROD.CATEGORY_FK||' '||VPROD.PRODUCTS_NAME||' '||VPROD.COMPANY||' '||VPROD.OUTPUT_PRICE||' '||VCNAME);
END;
/

EXECUTE PROD_INFO(10);

--부서번호를 in parameter로 받고 급여 인상률도 in parameter로 받아 해당 부서의 급여를 인상률에 따라 인상해주는 프로시저를 작성
단 출력문은 급여 인상 전 정보 (부서번호 사원명 급여)를 보여주고
인상 후 정보(부서번호 사원명 급여)를 각각 출력해 보여주세요

CREATE OR REPLACE PROCEDURE SALUP(PNO IN NUMBER,SRATE IN NUMBER)
IS
BEGIN
  DBMS_OUTPUT.PUT_LINE('--급여 조정 전--');
  FOR CR IN (SELECT DEPTNO, ENAME, SAL FROM EMP WHERE DEPTNO=PNO) LOOP
  DBMS_OUTPUT.PUT_LINE(CR.DEPTNO||' '||CR.ENAME||' '||CR.SAL);
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('--급여 조정 후--');
  UPDATE EMP SET SAL = SAL + SAL*SRATE/100
  WHERE DEPTNO = PNO;
  FOR CR IN (SELECT DEPTNO, ENAME, SAL FROM EMP WHERE DEPTNO=PNO) LOOP
  DBMS_OUTPUT.PUT_LINE(CR.DEPTNO||' '||CR.ENAME||' '||CR.SAL);
END LOOP;
END;
/
EXECUTE SALUP(10,20);


+ Recent posts