/*
Arduino | coding-help
Flying Ghost
2manytoyz — 5/7/2025 10:17 PM
Hi everyone. New to the server and Arduino coding.
I'm a big Halloween nut.
Trying to make a flying ghost prop.
I have the prop activated by a PIR sensor, run a motor for 30 seconds,
stop, reverse direction, and then (I want it to) stop when a hall
effect sensor is triggered, I have most of the code working,
I just can't figure out how to make the hall effect sensor stop the motor.
*/
#include "BTS7960.h"
// user constants
const int RAMP_DELAY = 5;
const unsigned long RUN_TIME = 10000; // 10 seconds for test
// pin constants
const int HALL_PIN = 3;
const int PIR_PIN = 4;
const int EN_PIN = 8;
const int R_PWM_PIN = 9;
const int L_PWM_PIN = 10;
volatile bool travelDir = true;
volatile bool isRunning = false;
volatile int speed = 0;
unsigned long prevTime = 0;
int increment = 1;
//bool isAtSpeed = false;
BTS7960 motorController(EN_PIN, L_PWM_PIN, R_PWM_PIN);
bool checkPIR() {
if (digitalRead(PIR_PIN) == HIGH) {
motorController.Enable();
return true;
}
return false;
}
bool checkHall() {
if (digitalRead(HALL_PIN) == LOW) {
motorController.Stop();
motorController.Disable();
return true;
}
return false;
}
int rampSpeed(int increment) {
speed = speed + increment;
delay(RAMP_DELAY);
return speed;
}
void runMotor(int dir, int speed) {
if (dir == true) {
motorController.TurnRight(speed);
} else {
motorController.TurnLeft(speed);
}
}
void stopISR() {
isRunning = false;
//speed = 0;
travelDir = !travelDir;
motorController.Stop();
motorController.Disable();
}
void setup() {
Serial.begin(115200);
pinMode(HALL_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(HALL_PIN), stopISR, CHANGE);
}
void loop() {
bool isPIR = checkPIR();
bool isHall = checkHall();
if (isHall) {
isRunning = false;
} else if (isPIR) {
isRunning = true;
}
if (isRunning) {
while (speed < 255) {
Serial.print("Ramp up ");
Serial.print(travelDir ? "forward: " : "reverse: ");
Serial.println(speed);
speed = rampSpeed(1); //ramp up
runMotor(travelDir, speed); // fwd
}
Serial.print("Running ");
Serial.print(travelDir ? "forward" : "reverse");
delay(RUN_TIME); //wait 30 secs
while (speed > 0) {
Serial.print("Ramp down ");
Serial.print(travelDir ? "forward: " : "reverse: ");
Serial.println(speed);
speed = rampSpeed(-1); //ramp down
runMotor(travelDir, speed); // fwd
}
//Serial.println("Reverse");
travelDir = !travelDir;
delay(1000); //wait 30 secs
/*
if (travelDir) {
Serial.println("Ramp up reverse");
speed = rampSpeed(1); //ramp up
runMotor(1, speed); // rev
if (speed == 255) {
Serial.println("Running reverse");
//delay(5000); //wait 30 secs
//Serial.println("Ramp down forward");
//speed = rampSpeed(-1); //ramp down
runMotor(1, speed); // rev
}
//speed = rampSpeed(1); //ramp up
//runMotor(1, speed); // rev
}
*/
}
}
/*
if isrunning
ramp up
wait 30 secs
ramp down
reverse
ramp up
wait 30
ramp down
repeat
typedef enum { STATE_STOP,
STATE_RAMP_UP_FWD,
STATE_RUN_FWD,
STATE_RAMP_DN_FWD,
STATE_RAMP_UP_REV,
STATE_RUN_REV,
STATE_RAMP_DN_REV
} states;
// current state-machine state
states state = STATE_STOP;
*/
/*
switch (state) {
case STATE_STOP:
break;
case STATE_RAMP_UP_FWD:
runMotor(0, speed);
break;
case STATE_RUN_FWD:
break;
case STATE_RAMP_DN_FWD:
break;
case STATE_RAMP_UP_REV:
break;
case STATE_RUN_REV:
break;
case STATE_RAMP_DN_REV:
break;
default:
break;
}
//runMotor(0, 255);
}
if (isRunning) {
if (!isAtSpeed) {
speed = rampSpeed(1);
if (speed == 255) {
//increment = -1;
isAtSpeed = true;
prevTime = millis(); // grab current time
}
runMotor(dir, speed);
}
if (millis() - prevTime >= RUN_TIME && isAtSpeed) {
prevTime = millis();
slowToStop();
speed = rampSpeed(-1);
dir = !dir;
}
}
}
*/
L_PWM
R_PWM
EN
"Hall Sensor"
"Motor"