add the main board arudino project

This commit is contained in:
2025-01-21 13:35:00 -05:00
parent 2648f64187
commit a60a3210b1

187
main_board.ino Normal file
View File

@@ -0,0 +1,187 @@
// constants won't change. They're used here to set pin numbers:
const int motorpwml = 9; // PWM left of BTS7960 ... switched from pin 2 on the l298n version to get a PWM pin
const int motorpwmr = 3; // PWM right of BTS7960
const int bottomsensortrig = 4; // attach pin to Echo of HC-SR04
const int bottomsensorecho = 5; //attach pin to Trig of HC-SR04
const int topsensory = A0;
const int upbutton = 6;
const int downbutton = 7;
const int stopbutton = 2; // switched from 9 on the l298n version to get a PWM pin
const int flashlight = 8; // the 7 colour flash
const int flashlight_button = 12; // the pullup to manually set off the flashlight
// variables
int uppressed = 0;
int downpressed = 0;
int stoppressed = 0;
int topsensorval;
bool attop;
bool atbottom;
bool sentalarmon, sentalarmoff, sentbottomalert, senttopalert;
long distance; // variable for the distance measurement
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
// initialize the motor control pins as an output:
pinMode(motorpwml, OUTPUT);
pinMode(motorpwmr, OUTPUT);
// make sure the motor is off on startup
turnmotor("STOP");
// initialize the pushbutton pin as an input:
pinMode(upbutton, INPUT);
pinMode(downbutton, INPUT);
pinMode(stopbutton, INPUT);
// setup the joystick sensor, only for Y axis
pinMode(topsensory, INPUT);
// setup the ultrasonic sensor for the bottom sensor
pinMode(bottomsensortrig, OUTPUT); // Sets the trigPin as an OUTPUT
pinMode(bottomsensorecho, INPUT); // Sets the echoPin as an INPUT
// setup the "flash" light
pinMode(flashlight_button, INPUT_PULLUP);
pinMode(flashlight, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
int checklight = digitalRead(flashlight_button);
if (checklight == HIGH) // not pressed
{
// we only want to turn off the light and the LED once per "cycle" of alerting
if (!sentalarmoff)
{
digitalWrite(flashlight,LOW);
Serial.write('7'); // 7 = help button not pressed anymore, so stop showing the bell LEDs
sentalarmoff = true;
}
sentalarmon = false;
}
else // flashlight-help button pressed
{
if (!sentalarmon)
{
Serial.write('6'); // 6 = help button pressed, so show the bell LED
sentalarmon = true;
}
sentalarmoff = false;
digitalWrite(flashlight,HIGH);
}
// check if we have reached the top and stop the motor
topsensorval = analogRead(topsensory);
if (topsensorval > 511) // seems 511 is the best option after lots of testing and not sure why this time it's the other direction, but meh.
{
if (!senttopalert)
{
Serial.write('4'); // 4 = elevator is at the top LED
senttopalert = true;
}
attop = true;
atbottom = false; // in the event someone puts something in front of the bottom sensor while the elevator is parked at the top causing a soft-lock
turnmotor("STOP");
}
// check if we have reached the bottom and stop the motor
distance = checkBottomDistance();
if (distance <= 27)
{
// check again to avoid mis-readings?
distance = checkBottomDistance();
if (distance <= 27)
{
if (!sentbottomalert)
{
Serial.write('5'); // 5 = elevator is at the bottom LED
sentbottomalert = true;
}
atbottom = true;
attop = false; // in the event someone lifts the top lock while the elevator is parked at the bottom causing a soft-lock
turnmotor("STOP");
}
}
// read if the buttons have been pressed
uppressed = digitalRead(upbutton);
downpressed = digitalRead(downbutton);
stoppressed = digitalRead(stopbutton);
if (uppressed == HIGH && !attop) // only allow up direction if we're not at the top
{
Serial.write('2'); // 2 = going up arrow LED
turnmotor("UP");
if (atbottom)
{
delay(2500); // wait 2.5 seconds before starting the loop and sensor again, otherwise it will never move.
}
atbottom = false; // set being at the bottom to false if we are moving up from the bottom
sentbottomalert = false;
senttopalert = false;
}
else if (downpressed == HIGH && !atbottom) // only allow down direction if we're not at the bottom
{
Serial.write('1'); // 1 = going down arrow LED
turnmotor("DOWN");
if (attop)
{
delay(2500); // wait 2.5 seconds before starting the loop and sensor again, otherwise it will never move.
}
attop = false; // set being at the top to false if we are moving down from the top
sentbottomalert = false;
senttopalert = false;
}
else if (stoppressed == HIGH && !attop && !atbottom) // only allow stop if not at the top and bottom
{
Serial.write('3');
turnmotor("STOP");
sentbottomalert = false;
senttopalert = false;
}
//delay(50);
}
void turnmotor(String direction)
{
if (direction == "UP")
{
turnmotor("STOP");
delay(500);
analogWrite(motorpwml, 254);
analogWrite(motorpwmr, 0);
}
else if (direction == "DOWN")
{
turnmotor("STOP");
delay(500);
analogWrite(motorpwml, 0);
analogWrite(motorpwmr, 254);
}
else if (direction == "STOP")
{
analogWrite(motorpwml, 0);
analogWrite(motorpwmr, 0);
}
}
long checkBottomDistance()
{
// Clears the trigPin condition
digitalWrite(bottomsensortrig, LOW);
delayMicroseconds(2);
// Sets the trigPin HIGH (ACTIVE) for 10 microseconds
digitalWrite(bottomsensortrig, HIGH);
delayMicroseconds(10);
digitalWrite(bottomsensortrig, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
long sampleduration = pulseIn(bottomsensorecho, HIGH);
// Calculating the distance in cm
long sampledistance = sampleduration * 0.034 / 2; // Speed of sound wave divided by 2 (go and back)
return sampledistance;
}