BASIC4MCU | 질문게시판 | 소스코드 질문드립니다.
페이지 정보
작성자 mangham 작성일2020-06-29 20:05 조회2,235회 댓글0건본문
제가 조이스틱을 사용해 모터를 움직이는 것을 추가하였습니다. 코드 컴파일하여 실행 까지는 문제 없는데 조이스틱을 움직이면 led의 밝기가 줄어 들어 버려서요 코드의 순서가 잘못 된 것 같은데 위치를 어떻게 수정하면 되는지 헷갈려서 질문 드립니다. (찾기 쉽게 주석을 추가했습니다.)
#include <Stepper.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int stepsPerRevolution = 64; // 모터별 스탭 수 설정 (28YBJ-48의 경우 64)
Stepper stepper(stepsPerRevolution, 8, 10, 9, 11); //
const int min_distance = 2;
const int max_distance = 17;
const int step_distance = 3;
int length_accessequence;
const String accessequence = "234";
String sequence_entered = "";
int pos_sequence_entered = 0;
int previous_group = -1;
unsigned long last_time = 0;
const long time_interval = 1000;
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
Servo myservo;
void setup()
{
stepper.setSpeed(220); // 속도 설정
pinMode(GREEN_LED,OUTPUT);
pinMode(WHITE_LED,OUTPUT);
pinMode(RED_LED,OUTPUT);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Waiting ...");
for (int i=0;i<length_accessequence;i++) {
lcd.setCursor(i, 1);
lcd.print("*");
}
digitalWrite(RED_LED, HIGH);
length_accessequence = accessequence.length();
myservo.attach(SERVO_PIN);
myservo.write(0);
}
char int_to_char (int number) {
return char(48+number);
}
int group_distance (int distance) {
int group = 1;
for (int i=min_distance;i<=max_distance;i=i+step_distance) {
if (distance <= i) return group;
else group++;
}
return group;
}
int calculateDistance () {
long duration;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH); // Reads the echoPin, returns the sound wave travel time in microseconds
return duration*0.034/2;
}
void loop()
{
int sensorReading = analogRead(A0); // 조이스틱 X축 A0에 연결
if (sensorReading < 300) {
stepper.step(1); // 좌 회전
}
if (sensorReading > 800) {
stepper.step(-1); // 우 회전
int distance = calculateDistance();
if ((distance < min_distance) or (distance > max_distance)) return;
int group = group_distance(distance);
if (distance <= max_distance) {
if (not (previous_group == group)) {
previous_group = group;
last_time = millis();
lcd.setCursor(0, 0);
lcd.print("Distance = ");
lcd.print(group);
} else {
if ((millis() - last_time) >= time_interval) {
last_time = millis();
digitalWrite(WHITE_LED, HIGH);
delay(100);
digitalWrite(WHITE_LED, LOW);
lcd.setCursor(pos_sequence_entered, 1);
lcd.print(group);
sequence_entered = sequence_entered + int_to_char(group);
pos_sequence_entered++;
if (sequence_entered == accessequence) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("ACCESS GRANTED");
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
myservo.write(90);
delay(2000);
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
myservo.write(0);
}
if (pos_sequence_entered >= length_accessequence) {
delay(500);
sequence_entered = "";
pos_sequence_entered = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Distance = ");
lcd.print(group);
for (int i=0;i<length_accessequence;i++) {
lcd.setCursor(i, 1);
lcd.print("*");
}
}
}
}
}
delay(200);
}
}
댓글 0
조회수 2,235등록된 댓글이 없습니다.