스택쌓기/대회 || 대외활동

[ICT] 아두이노 제품 제작기 (1) 블록코딩으로 코딩하기

개발새발주발 2023. 6. 7. 10:55
728x90

웹 만들고 아두이노를 기다리고 있었는데 

대회 2일전까지 아두이노에 계속된 에러 발생 !! 

하지만 .. 웹 <<<< 아두이노 구현이라 하드웨어 바보인 나도 붙어서 얼른 아두이노 구현 도전 .. 

 

세빈언니 조언듣고 주최측에서 올려주신 강의자료 참고하고 공부하고 이전 코드를 엎어버렸다 !

왜냐면 .. 오류가 넘 많아 ..~ 

처음 작성한 알고리즘 

변수 : 
 inout - 초음파 센서 측정값이(물체와 센서 사이의 거리) n 이하이면 +1씩 증가, 즉 물체가 센서를 통과할 때마다 변수 값 증가 
           - 이 값이 짝수이면 IN(문을 열고 들어간 상태), 홀수이면 OUT(문 밖에 나가있는 상태)

times - 현재 타이머 값 

알고리즘 : 
1. 물체가 초음파 센서를 통과하면(방으로 들어간다고 가정) IN, 이 물체가 다시 초음파 센서를 통과하면 (방에서 나간다고 가정)OUT한다. 이를 위해 inout변수를 설정하여 초음파센서가 물체를 감지할때마다 inout변수에 +1씩해준다 이 점을 토대로 inout변수가 짝수일때는 OUT상태로, 홀수일 때는 IN상태로 LCD에 보여준다.

2. 타이머를 설정하고 IN과 OUT간의 시간차가 10초 이상이면 LED의 노란불, 20초 이상이면 LED의 빨간불을 켠다. 10초 미만인 경우에는 초록색 불을 켜준다.

안되는 코드 .. <.. .h>확장파일은 팀원들이 따로 작성한 라이브러리 !! 

#include <arduino-timer.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include <Wire.h>

// 자동 유형으로 timer 인스턴스를 만듭니다.
auto timer = timer_create_default(); // 기본 설정으로 타이머 만들기

// 또는 아래와 같이 Timer 생성자로 만들 수 있습니다.
Timer<> default_timer; // 위와 같음


int Red=8;
int Yellow=7;
int Green=4;

int echoPin=12;
int trigPin=13;

int enterDistance=500;
int inOut=0;
int inAverage=2000;
int outAverage=4000;

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

void loop()
{
  pinMode(echoPin,INPUT);
  pinMode(trigPin,OUTPUT);

  long duration, distance;
  digitalWrite(trigPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin,LOW);
  duration=pulseIn(echoPin,HIGH);
  distance=((float)(340*duration)/1000)/2;

  digitalWrite(Red,LOW);
  digitalWrite(Yellow,LOW);
  digitalWrite(Green,HIGH);
  delay(100000);
  timer.tick();

  if (enterDistance>distance)
  {
    inOut+=1;
    timer.cancel();

  }

  if (inOut%2==1)
  {
    timer.cancel();
    timer.tick();
    lcd.init();
    lcd.setCursor(0,0);
    lcd.print("IN");

    if (millis()>inAverage*2)
    {
      digitalWrite(Red,LOW);
      digitalWrite(Yellow,HIGH);
      digitalWrite(Green,LOW);
      delay(10000);
    }

    if (millis()>inAverage*4)
    {
      digitalWrite(Red,HIGH);
      digitalWrite(Yellow,LOW);
      digitalWrite(Green,LOW);
      delay(10000);
    }
  }
  else
  {
    timer.cancel();
    timer.tick();
    lcd.init();
    lcd.setCursor(0,0);
    lcd.print("OUT");

    if (millis()>outAverage*2)
    {
      digitalWrite(Red,LOW);
      digitalWrite(Yellow,HIGH);
      digitalWrite(Green,LOW);
      delay(10000);
    }

    if (millis()>outAverage*4)
    {
      digitalWrite(Red,HIGH);
      digitalWrite(Yellow,LOW);
      digitalWrite(Green,LOW);
      delay(10000);
    }
  }
}

그런데 .. !! 하도 안되서 강의를 찾아보고 디버깅해보니 여러가지 문제가 있었다. 

 

⚠️ 무한루프 한 세트가 너무 빠르게 돌아감 

⚠️ 초음파 센서가 측정하는 주기가 너무 짧음 = inout변수의 값이 무한히 커짐, 짝 홀 의미가 없음 

 

엎어버리고 난 뒤의 알고리즘 

변수 : 
state - 현재 상태값 (1초가 지날때마다 1씩 증가 - 타이머기능 구현) 
inout- 물체가 센서를 통과할 때마다 변수 값 증가 
           이 값이 짝수이면 IN(문을 열고 들어간 상태), 홀수이면 OUT(문 밖에 나가있는 상태)

알고리즘 : 
1. 문 사이 물체 통과 시 -  state값 0으로 세팅, inout값 +1씩, 
2. 문 사이 물체가 통과하지 않고 아무 반응이 없을 시 -  state 값 -1씩 (1초마다 )

3. state값에 따른 상태 표시
state가 -10 초과일 때 (정상 범주에 있을 때), 초록불 - Noaml- 로 이동 
state가 -10이하일 때(오랜시간동안 아무런 반응이 없을 때), 노란불-Caution- 로 이동
state가 -20이하일 때(한계치 넘은 경우), 빨간불 - Warning -로 이동

4. IN - OUT 표시 
inout값이 짝수일 때 : IN상태, 
inout값이 홀수일 때, OUT상태 

 

안드로이드 환경에서 메이킷올을 사용하여 작성한 블록 코딩 ! 

하드웨어 + 소프트웨어 구현 완료해서 넘 힘들었지만 성공했을때의 도파민 뿜뿜이란 .. 🤍

(사실 아주 대단한 건 아니지만 .. 하나씩 성공할 때 나 많이 컸다 싶어서 넘 좋다 헤헤)  

IMG_8619.mov
19.53MB

 

글씨는 죄송 .. 넘 급했어서 ..

아두이노 만지는 것도 알고리즘이 짱 중요하구나 .. 기본 지식, 디버깅이 너무너무너무 X10 중요하구나 새삼 깨닫는 시간이었다 ..

 

이렇게 쉽게 될 것을 ~~ 

 

그럼 다음에 발표완료 후 최종으로 찾아올게요 0.<