답변 : 안녕하세요 아두이노 질문 추가입니다
페이지 정보
작성자 master 작성일18-06-12 14:56 조회6,868회 댓글1건본문
// MCU BASIC: https://www.basic4mcu.com
// DateTime : 2018-06-12 오후 2:59:06
// by Ok-Hyun Park
/*
Arduino Maker With 탐탐 아두이노
아두이노 자동창문+블라인드 제어 만들기
17.11.30 기준으로 3년전에 제작한 아이템 입니다.
도움을 많이주신 아두이노 스토리 카페에서 활동중인 배고파님 감사합니다.
상업적용도로 배포를 금합니다.
*/
#include <MsTimer2.h>
//#define PWM 180
#define SW1 2 // 4.7k=10k 대체,capacitor x
#define SW2 3
#define SW3 4
#define SW4 5
// SW
#define MOTER_B 6 // ic2 // 블라인드용
#define MOTER_A 7 // 7
#define MOTER_EN 8 // 1
#define MOTER_D 9 // 10 // 창문용
#define MOTER_C 10 //14
#define MOTER_EN1 11 // 9
//MOTER
#define CDS A0 // 아래쪽이 블라인드
#define Rain A1 // 윗쪽이 창문
//
int buttonState1=0,buttonState2=0,buttonState3=0,buttonState4=0;
int cds_val,Rain_val;
int state; //for BT
static int Timer=0,Timer1=0;
static int Timer_for_Sensor=0;
static int MOTER_DIR=0,MOTER_DIR1=0;
static int DIR_flag=0,DIR_flag1=0;
static bool flag=1,flag1=1;
static bool BT_flag=0;
static bool MOTER_flag=0,MOTER_flag1=0;
static bool cds_chattering_flag=1,cds_flag=1,before_cds=0;
static bool Rain_chattering_flag=1,Rain_flag=1,before_Rain=0;
//
void MOTER_STOP(){ digitalWrite(MOTER_EN,LOW); cds_chattering_flag=1; } // blind
void MOTER_STOP1(){ digitalWrite(MOTER_EN1,LOW); Rain_chattering_flag=1; } //window
//
void MOTER_LEFT(){ // blind
digitalWrite(MOTER_EN,HIGH); digitalWrite(MOTER_A,HIGH); digitalWrite(MOTER_B,LOW); cds_chattering_flag=0;
//Serial.print("left"); Serial.print("\n");
}
//
void MOTER_LEFT1(){ //window
digitalWrite(MOTER_EN1,HIGH); digitalWrite(MOTER_C,HIGH); digitalWrite(MOTER_D,LOW); Rain_chattering_flag=0;
//Serial.print("left"); Serial.print("\n");
}
//
void MOTER_RIGHT(){ //blind
digitalWrite(MOTER_EN,HIGH); digitalWrite(MOTER_A,LOW); digitalWrite(MOTER_B,HIGH); cds_chattering_flag=0;
//Serial.print("right"); Serial.print("\n");
}
//
void MOTER_RIGHT1(){ //window
digitalWrite(MOTER_EN1,HIGH); digitalWrite(MOTER_C,LOW); digitalWrite(MOTER_D,HIGH); Rain_chattering_flag=0;
//Serial.print(MOTER_D); //Serial.print("right"); Serial.print("\n");
}
//
void MOTER_run(){ // blind
switch(MOTER_DIR){
case 0: MOTER_STOP(); DIR_flag=0; break;
case 1: if(DIR_flag!=1)flag=1; if(flag){ Timer=Timer1=0; flag=0; } MOTER_LEFT(); DIR_flag=1; break;
case 2: if(DIR_flag!=2)flag=1; if(flag){ Timer=Timer1=0; flag=0; } MOTER_RIGHT(); DIR_flag=2; break;
}
}
//
void MOTER_run1(){ // window!!!
switch(MOTER_DIR1){
case 0: MOTER_STOP1(); DIR_flag1=0; break;
case 1: if(DIR_flag1!=1)flag1=1; if(flag1){ Timer=Timer1=0; flag1=0; } MOTER_LEFT1(); DIR_flag1=1; break;
case 2: if(DIR_flag1!=2)flag1=1; if(flag1){ Timer=Timer1=0; flag1=0; } MOTER_RIGHT1(); DIR_flag1=2; break;
}
}
//
void BTS(){ // BLUETOOTH // flag->BT_flag change
if(Serial.available()>0){ state=Serial.read(); BT_flag=0; }
//
if(state=='0'){ MOTER_DIR=MOTER_DIR1=0; // motor turn off
if(BT_flag==0){ Serial.println("BlindMotor or Window: off"); BT_flag=1; }
state=0;
}
else if(state=='1'){ MOTER_DIR=1; if(BT_flag==0){ BT_flag=1; state=0; } } // motor turn right
else if(state=='2'){ MOTER_DIR=2; if(BT_flag==0)BT_flag=1; state=0; }
else if(state=='3'){ MOTER_DIR1=1; if(BT_flag==0)BT_flag=1; state=0; }
else if(state=='4'){ MOTER_DIR1=2; if(BT_flag==0)BT_flag=1; state=0; }
}
//
void cds_run(){
if(cds_chattering_flag){
cds_val=analogRead(CDS); Serial.println(cds_val); cds_val=cds_val/750; // 750 is 0 or 1 value
//
if (before_cds!=cds_val){ before_cds=cds_val; MOTER_flag=1; }
else if(before_cds==cds_val){ MOTER_flag=0; }
//
if(MOTER_flag){
if(cds_val)MOTER_DIR=1; else MOTER_DIR=2;
}
}
}
//
void Rain_run(){ // Rain window
if(Rain_chattering_flag){
Rain_val=analogRead(Rain); Rain_val=Rain_val/600; // 600 is 0 or 1 value OPEN
//
if (before_Rain!=Rain_val){ before_Rain=Rain_val; MOTER_flag1=1; }
else if(before_Rain==Rain_val){ MOTER_flag1=0; }
//
if(MOTER_flag1){
if(Rain_val)MOTER_DIR1=1; else MOTER_DIR1=2;
}
}
}
//
void ISR_Timer(){
if(++Timer>25){ Timer=0; MOTER_DIR=0; flag=1; } //window
if(++Timer1>10){ Timer1=0; MOTER_DIR1=0; flag1=1; } //blind
}
//
void pinMode_init(){
pinMode(SW1,INPUT); pinMode(SW2,INPUT); pinMode(SW3,INPUT); pinMode(SW4,INPUT);
pinMode(MOTER_EN,OUTPUT); pinMode(MOTER_A,OUTPUT); pinMode(MOTER_B,OUTPUT);
pinMode(MOTER_EN1,OUTPUT); pinMode(MOTER_C,OUTPUT); pinMode(MOTER_D,OUTPUT);
pinMode(CDS,INPUT);
pinMode(Rain,INPUT);
}
//
void setup(){
pinMode_init();
Serial.begin(9600);
MsTimer2::set(100,ISR_Timer); // 100ms,ISR_Timer
MsTimer2::start(); // Timer start
}
//
void key_scan(){
buttonState1=digitalRead(SW1); if(!buttonState1)MOTER_DIR=1;
buttonState2=digitalRead(SW2); if(!buttonState2)MOTER_DIR=2;
}
//
void key_scan1(){
buttonState3=digitalRead(SW3); if(!buttonState3)MOTER_DIR1=1;
buttonState4=digitalRead(SW4); if(!buttonState4)MOTER_DIR1=2;
}
//
void loop(){
key_scan();
key_scan1();
BTS();
MOTER_run();
MOTER_run1();
cds_run();
Rain_run();
}
정리된 소스로 공부해보세요
댓글 : 1
조회수 : 6,868
Wnwjdqoddl님의 댓글
Wnwjdqoddl 작성일감사합니다!! 정말 감사합니다