高三下多元選修科技應用專題
平交道截斷式程式碼unknown
c_cpp
7 months ago
2.6 kB
8
Indexable
#include <Servo.h>
#include <Pitches.h>
#define NOTE_G5 784
#define NOTE_F5 698
const int yellowLED = 4;
const int redLED = 8;
const int greenLED = 12;
const int buzzer = 2;
const int button = A1;
Servo servo_9;
const int SERVO_PIN = 11;
const int SERVO_MIN_ANGLE = 0;
const int SERVO_MAX_ANGLE = 180;
int servoAngle = SERVO_MIN_ANGLE;
const int RPM = 60;
const int SERVO_DELAY = 100;
char state = 'w';
long motorStartTime, warningStartTime, buzzerStartTime, lastMotorMoveTime;
const int motorHoldTime = 5000;
const int warningDelay = 250;
const int buzzerDelay = 500;
bool redLightOn = false;
bool buzzerToneG5 = true;
void setup() {
Serial.begin(9600);
pinMode(buzzer, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(button, INPUT);
servo_9.attach(SERVO_PIN);
servo_9.write(servoAngle);
motorStartTime = millis();
warningStartTime = millis();
buzzerStartTime = millis();
lastMotorMoveTime = millis();
delay(2000);
}
void loop() {
Serial.println(state);
if (state == 'w') {
noTone(buzzer);
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, LOW);
digitalWrite(yellowLED, LOW);
if (digitalRead(button) == LOW) {
state = 'd';
}
}
if (state == 'd' || state == 'p' || state == 'u') {
if (millis() - warningStartTime >= warningDelay) {
redLightOn = !redLightOn;
digitalWrite(redLED, redLightOn ? HIGH : LOW);
digitalWrite(yellowLED, redLightOn ? LOW : HIGH);
digitalWrite(greenLED, LOW);
warningStartTime = millis();
}
if (millis() - buzzerStartTime >= buzzerDelay) {
if (buzzerToneG5) {
tone(buzzer, NOTE_G5, 100);
} else {
tone(buzzer, NOTE_F5, 100);
}
buzzerToneG5 = !buzzerToneG5;
delay(250);
noTone(buzzer);
buzzerStartTime = millis();
}
}
if (millis() - lastMotorMoveTime >= SERVO_DELAY) {
lastMotorMoveTime = millis();
if (state == 'd') {
if (servoAngle < SERVO_MAX_ANGLE) {
servoAngle += 6;
servo_9.write(servoAngle);
} else {
state = 'p';
motorStartTime = millis();
}
} else if (state == 'p') {
if (millis() - motorStartTime >= motorHoldTime) {
state = 'u';
}
} else if (state == 'u') {
if (servoAngle > SERVO_MIN_ANGLE) {
servoAngle -= 6;
servo_9.write(servoAngle);
} else {
state = 'w';
}
}
}
}
Editor is loading...
Leave a Comment