2024.04.06(am): 로봇공방 실습자료

기억력 향상 게임

준비물

NO부품명수량
1아두이노 UNO R31
2LCD모듈1
3LED4
5저항(100옴)4
6푸쉬버튼스위치(노브)4
7부저1
8점퍼케이블25
99V 전원(케이블)1
10브레드보드1

회로도

코드

LCD 라이브러리를 라이브러리 매니저에서 추가해줍니다.

#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C lcd(0x27,16,2);

int buttons[4] = {2, 3, 4,  5};
int leds[4]    = {8, 9, 10, 11};

boolean button[4] = {0, 0, 0, 0};

#define buzzer 6

#define levelsInGame 50

//create an array for this game
int bt_simonSaid[100]; //initialise the array
int led_simonSaid[100]; //initialise the array

boolean lost;
int game_play, level, stage;

void setup(){ // the setup function runs once when you press reset or power the board
Serial.begin(9600);

// initialize digital pins as outputs for LEDS in the buttons.
for(int i=0; i<=3; i++) {
pinMode(buttons[i], INPUT_PULLUP);// set the button pins as inputs
pinMode(leds[i], OUTPUT); // set the led pins as outputs
}

pinMode(buzzer, OUTPUT); 
 
lcd.init();// initialize the lcd
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("   Welcome To   ");
lcd.setCursor(0,1);
lcd.print("> Memory  Game <");
delay(2000); // Waiting for a while
lcd.clear(); 

randomSeed(analogRead(0));  //make our random numbers more random
}


void loop() {// the loop function runs over and over again forever
  
switch(stage){
case 0:
      lcd.setCursor(0, 0); lcd.print("Press Red Button");
      lcd.setCursor(0, 1); lcd.print(" for Start Game ");
      button[0] = digitalRead(buttons[0]);
      while(button[0] == HIGH) {
        button[0] = digitalRead(buttons[0]);
      }
      level=1, stage=1, game_play=1;
break;
      
case 1:
      lcd.clear();
      //print level on screen
      lcd.setCursor(4,0);
      lcd.print("Level: ");
      lcd.print((level/10)%10);
      lcd.print(level%10);
 
      lcd.setCursor(0,1);
      lcd.print(" -- Memorize -- ");
      delay(1500);
      led_simonSaid[level] = random(8, 12); // populate the array with random 'colours'
      for(int i=1; i<=level; i++) {
        digitalWrite(led_simonSaid[i], HIGH);//turn on the button light
        playBuzzer(led_simonSaid[i]-7);
        digitalWrite(led_simonSaid[i], LOW);
        delay(400);
      }
      delay(500);
      stage=2;
break;
      
case 2:
      stage=3;
      lcd.setCursor(0, 1); 
      lcd.print("   -- Play --   "); 
break;

case 3:
     for(int i=0; i<=3; i++){
        button[i] = digitalRead(buttons[i]);
        if(button[i] == LOW){
          bt_simonSaid[game_play] = leds[i];
          digitalWrite(leds[i], HIGH);
          playBuzzer(i+1); //make the sound of the button pressed - right or wrong
          while(button[i] == LOW){
            button[i] = digitalRead(buttons[i]);
          }
          delay(50);
          digitalWrite(leds[i], LOW);
          game_play++;
          if(game_play-1==level){game_play=1;
            stage=4;
            break;
          }
        }
      }
      delay(10);
break;

case 4:
     lcd.setCursor(0, 1); 
     lcd.print("  Verification  ");
     delay(1000);
     for(int i=1; i<=level; i++){
        if(led_simonSaid[i]!=bt_simonSaid[i]){
          lost=1;
          break;
        }
      }      
      if(lost==1)stage=5;
            else stage=6;
break;

case 5:
      lcd.setCursor(0, 1); 
      lcd.print(" !! You Lost !! ");
      tone(buzzer, 350); //play game over low tone on buzzer
      for(int i=0; i<=3; i++) {
      digitalWrite(leds[i], HIGH);  
      }
      delay(1000);
      lcd.setCursor(0, 1); 
      lcd.print("!! GAME  OVER !!");
      noTone(buzzer);
      delay(1000);
      for(int i=0; i<=3; i++) {
      digitalWrite(leds[i], LOW);  
      }
      level=1, stage=0, lost=0;
 break;

case 6:
      lcd.setCursor(0, 1); 
      lcd.print(" ** You  Win ** ");
      delay(1000);   
    if(level==levelsInGame){
      lcd.setCursor(0, 0); 
      lcd.print("Congratulation"); 
      lcd.setCursor(0, 1); 
      lcd.print(" Level Complete");
      delay(1000); 
      lcd.clear();           
      level=1;          
      }else{
      if(level<levelsInGame)level++;       
      }
      
      stage=1;
break;

default:
break;
}

}

void playBuzzer(int x) {
tone(buzzer, 650+(x*100));
delay(300);
noTone(buzzer);
}

거짓말 탐지기

GSR(Galvanic Skin Response)는 피부의 전도성 변화를 측정하여 스트레스 또는 감정 변화를 감지하는 데 사용되는 생리학적인 센서입니다. 이 센서는 피부의 땀 분비에 의한 전도성 변화를 감지하여 심리적 및 감정적 반응을 측정합니다.

GSR 센서는 전기 전도도를 측정하는 두 개의 전극으로 구성됩니다. 이 두 전극은 피부와 접촉하여 피부의 전기 전도도를 측정합니다. 피부의 전기 전도도는 피부 상태와 땀 분비량에 따라 변화합니다. 스트레스, 감정적인 긴장, 불안, 혹은 사실을 숨기려는 시도 등으로 인해 신체가 긴장되면, 자동적으로 땀 분비가 증가하게 됩니다. 이에 따라 피부의 전기 전도도가 증가하게 되고, 이러한 변화를 GSR 센서가 감지합니다.

따라서 GSR 센서는 주로 거짓말 탐지 및 감정 인식 분야에서 사용됩니다. 사람이 거짓말을 할 때나 감정적으로 긴장할 때, 피부의 전기 전도도가 증가하므로 이러한 변화를 감지하여 거짓말을 탐지하거나 감정을 분석하는 데 사용될 수 있습니다.

아래는 공식 홈페이지

https://wiki.seeedstudio.com/Grove-GSR_Sensor/

검은색 : GND, 빨간색 : VCC, 노란색 : A0, 흰색 : 연결X

예제 코드

const int GSR=A0;
int sensorValue=0;
int gsr_average=0;

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

void loop(){
  long sum=0;
  for(int i=0;i<10;i++)           //Average the 10 measurements to remove the glitch
      {
      sensorValue=analogRead(GSR);
      sum += sensorValue;
      delay(5);
      }
   gsr_average = sum/10;
   Serial.println(gsr_average);
}

아래와 같이 시리얼 모니터에 그래프가 그려지는것을 확인할 수 있습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *