From 5fadd482224f4493a301143984b86e32a682b7e8 Mon Sep 17 00:00:00 2001 From: pfolhento Date: Mon, 19 May 2025 01:00:44 +0100 Subject: [PATCH 01/26] Added Button and Buzzer and other additions on LCD. --- code/LCDScreen.cpp | 15 +++++++++++++++ code/code.ino | 42 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/code/LCDScreen.cpp b/code/LCDScreen.cpp index ecdc9bb..7f5430f 100644 --- a/code/LCDScreen.cpp +++ b/code/LCDScreen.cpp @@ -4,6 +4,7 @@ enum LCDScreenState { DISPLAY_DEFAULT_MESSAGE, DISPLAY_TEMPERATURE, + DISPLAY_PARKING_SPOTS_FULL, DISPLAY_PARKING_SPOTS }; @@ -46,4 +47,18 @@ class LCDScreen { lcd.print(this->default_message); } + void display_message_full(){ + this->state = DISPLAY_PARKING_SPOTS_FULL; + lcd.setCursor(0, 0); + this->clear(); + lcd.print("Parking Lot is FULL.\nPlease come back later.\n"); + } + + void display_message(int slots){ + this->state = DISPLAY_PARKING_SPOTS; + lcd.setCursor(0, 0); + this->clear(); + lcd.print("Available slots: "); + lcd.print(slots); lcd.print('\n'); + } }; \ No newline at end of file diff --git a/code/code.ino b/code/code.ino index 76306f8..44b560d 100644 --- a/code/code.ino +++ b/code/code.ino @@ -6,11 +6,14 @@ #include "DistSensor.cpp"; #include "LCDScreen.cpp"; +#define PARK_SLOTS = 8; #define ULTRASONIC_SENSOR_PIN_TRIG 11 #define ULTRASONIC_SENSOR_PIN_ECHO 12 #define SERVO_PIN 10 #define SERVO_PIN 10 #define TEMP_SENSOR_PIN 9 +#define BUTTON_PIN = 8; +#define BUZZER_PIN = 3; OneWire oneWire(TEMP_SENSOR_PIN); DallasTemperature sensors(&oneWire); @@ -20,6 +23,7 @@ Barrier barrier = Barrier(SERVO_PIN, 3); LCDScreen screen = LCDScreen(); unsigned long current_time, sensor_last_time_activated, temperature_last_time_measured; +int OCCUPIED_SLOTS = 0, Button_State = 0, Last_Button_State = 0; void setup() { Serial.begin(9600); @@ -27,31 +31,57 @@ void setup() { barrier.configure_pins(); sensors.begin(); screen.init(); - + pinMode(BUTTON_PIN, INPUT); + pinMode(BUZZER_PIN, OUTPUT); } void loop() { current_time = millis(); + Button_State = digitalRead(BUTTON_PIN); + // Carro entra: if (dist_sensor.is_in_range()){ - sensor_last_time_activated = current_time; + sensor_last_time_activated_IN = current_time; if(barrier.is_closed()){ barrier.open(); } } else if (!dist_sensor.is_in_range() && barrier.is_open()){ - if (current_time - sensor_last_time_activated >= barrier.open_time_seconds * 1000){ + if (current_time - sensor_last_time_activated_IN >= barrier.open_time_seconds * 1000){ + barrier.close(); + OCCUPIED_SLOTS++; + } + } + + // Carro sai: + if (Button_State != Last_Button_State){ + sensor_last_time_activated_OUT = current_time; + if(barrier.is_closed()){ + barrier.open(); + if (Button_State == HIGH) { + OCCUPIED_SLOTS--; + screen.display_message(OCCUPIED_SLOTS); + if (OCCUPIED_SLOTS == PARK_SLOTS) { + screen.display_message_full(); + tone(BUZZER_PIN, 1000); delayMicroseconds(500); + noTone(BUZZER_PIN); + tone(BUZZER_PIN, 1000); delayMicroseconds(500); + noTone(BUZZER_PIN); + } + } + } + } else if (!dist_sensor.is_in_range() && barrier.is_open()){ + if (current_time - sensor_last_time_activated_OUT >= barrier.open_time_seconds * 1000){ barrier.close(); } } + Last_Button_State = Button_State; + // Temperatura: if (current_time - temperature_last_time_measured >= 1000){ temperature_last_time_measured = current_time; sensors.requestTemperatures(); float tempC = sensors.getTempCByIndex(0); screen.display_temperature(tempC); } - - - } From 68285fc89207be8a6f577ac3bdaaade20043242b Mon Sep 17 00:00:00 2001 From: rafa Date: Mon, 19 May 2025 01:21:04 +0100 Subject: [PATCH 02/26] Fix errors related to push putthon --- code/code.ino | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/code.ino b/code/code.ino index e2b5a1d..99a3695 100644 --- a/code/code.ino +++ b/code/code.ino @@ -6,13 +6,13 @@ #include "DistSensor.cpp"; #include "LCDScreen.cpp"; -#define PARK_SLOTS = 8; +#define PARK_SLOTS 8 #define ULTRASONIC_SENSOR_PIN_TRIG 11 #define ULTRASONIC_SENSOR_PIN_ECHO 12 #define SERVO_PIN 10 #define TEMP_SENSOR_PIN 9 -#define BUTTON_PIN = 8; -#define BUZZER_PIN = 3; +#define BUTTON_PIN 8 +#define BUZZER_PIN 3 OneWire oneWire(TEMP_SENSOR_PIN); DallasTemperature temperature_sensors(&oneWire); @@ -21,7 +21,7 @@ DistSensor dist_sensor = DistSensor(ULTRASONIC_SENSOR_PIN_TRIG, ULTRASONIC_SENSO Barrier barrier = Barrier(SERVO_PIN, 4); LCDScreen screen = LCDScreen(); -unsigned long current_time, sensor_last_time_activated, temperature_last_time_measured; +unsigned long current_time, sensor_last_time_activated, temperature_last_time_measured, sensor_last_time_activated_IN, sensor_last_time_activated_OUT; int OCCUPIED_SLOTS = 0, Button_State = 0, Last_Button_State = 0; float temperature_in_c = 0; From fc6834d79eeea17c879f19ff863b46db8b9b0ba2 Mon Sep 17 00:00:00 2001 From: rafa Date: Mon, 19 May 2025 19:19:26 +0100 Subject: [PATCH 03/26] Add step motor --- diagram.json | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/diagram.json b/diagram.json index 4553d45..9812296 100644 --- a/diagram.json +++ b/diagram.json @@ -53,6 +53,14 @@ "left": 18.65, "rotate": 90, "attrs": { "value": "4700" } + }, + { + "type": "wokwi-stepper-motor", + "id": "stepper1", + "top": -387.25, + "left": -376.54, + "rotate": 90, + "attrs": { "size": "14" } } ], "connections": [ @@ -94,16 +102,20 @@ [ "bb1:57b.f", "bb1:57t.e", "black", [ "v0" ] ], [ "uno:9", "bb1:58t.d", "blue", [ "v480", "h519.2", "v-136" ] ], [ "bb1:58b.f", "bb1:58t.e", "violet", [ "v0" ] ], + [ "uno:A4", "bb1:37b.g", "gray", [ "v0" ] ], + [ "uno:A5", "bb1:38b.h", "purple", [ "v0" ] ], + [ "temp1:GND", "bb1:57t.c", "", [ "$bb" ] ], + [ "temp1:DQ", "bb1:58t.c", "", [ "$bb" ] ], + [ "temp1:VCC", "bb1:59t.c", "", [ "$bb" ] ], [ "btn1:1.l", "bb1:4t.c", "", [ "$bb" ] ], [ "btn1:2.l", "bb1:2t.c", "", [ "$bb" ] ], [ "btn1:1.r", "bb1:4b.h", "", [ "$bb" ] ], [ "btn1:2.r", "bb1:2b.h", "", [ "$bb" ] ], [ "r1:1", "bb1:58b.g", "", [ "$bb" ] ], - [ "temp1:GND", "bb1:57t.c", "", [ "$bb" ] ], - [ "temp1:DQ", "bb1:58t.c", "", [ "$bb" ] ], - [ "temp1:VCC", "bb1:59t.c", "", [ "$bb" ] ], - [ "uno:A4", "bb1:37b.g", "gray", [ "v0" ] ], - [ "uno:A5", "bb1:38b.h", "purple", [ "v0" ] ] + [ "stepper1:A-", "uno:2", "green", [ "h0" ] ], + [ "stepper1:A+", "uno:4", "green", [ "h0" ] ], + [ "stepper1:B+", "uno:5", "green", [ "h0" ] ], + [ "stepper1:B-", "uno:6", "green", [ "h0" ] ] ], "dependencies": {} } \ No newline at end of file From 9a81cd695dd01c70372f1f8c300e3f6701a64b01 Mon Sep 17 00:00:00 2001 From: rafa Date: Mon, 19 May 2025 21:24:18 +0100 Subject: [PATCH 04/26] Add Stepper Lib --- libs/Stepper/README.adoc | 26 ++ libs/Stepper/examples/MotorKnob/MotorKnob.ino | 39 ++ .../stepper_oneRevolution.ino | 44 +++ .../stepper_oneStepAtATime.ino | 44 +++ .../stepper_speedControl.ino | 48 +++ libs/Stepper/keywords.txt | 28 ++ libs/Stepper/library.properties | 9 + libs/Stepper/src/Stepper.cpp | 365 ++++++++++++++++++ libs/Stepper/src/Stepper.h | 121 ++++++ 9 files changed, 724 insertions(+) create mode 100644 libs/Stepper/README.adoc create mode 100644 libs/Stepper/examples/MotorKnob/MotorKnob.ino create mode 100644 libs/Stepper/examples/stepper_oneRevolution/stepper_oneRevolution.ino create mode 100644 libs/Stepper/examples/stepper_oneStepAtATime/stepper_oneStepAtATime.ino create mode 100644 libs/Stepper/examples/stepper_speedControl/stepper_speedControl.ino create mode 100644 libs/Stepper/keywords.txt create mode 100644 libs/Stepper/library.properties create mode 100644 libs/Stepper/src/Stepper.cpp create mode 100644 libs/Stepper/src/Stepper.h diff --git a/libs/Stepper/README.adoc b/libs/Stepper/README.adoc new file mode 100644 index 0000000..9d4d052 --- /dev/null +++ b/libs/Stepper/README.adoc @@ -0,0 +1,26 @@ += Stepper Library for Arduino = + +This library allows you to control unipolar or bipolar stepper motors. To use it you will need a stepper motor, and the appropriate hardware to control it. + +For more information about this library please visit us at +http://www.arduino.cc/en/Reference/Stepper + +== License == + +Copyright (c) Arduino LLC. All right reserved. +Copyright (c) Sebastian Gassner. All right reserved. +Copyright (c) Noah Shibley. All right reserved. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA diff --git a/libs/Stepper/examples/MotorKnob/MotorKnob.ino b/libs/Stepper/examples/MotorKnob/MotorKnob.ino new file mode 100644 index 0000000..5cf12ec --- /dev/null +++ b/libs/Stepper/examples/MotorKnob/MotorKnob.ino @@ -0,0 +1,39 @@ +/* + * MotorKnob + * + * A stepper motor follows the turns of a potentiometer + * (or other sensor) on analog input 0. + * + * http://www.arduino.cc/en/Reference/Stepper + * This example code is in the public domain. + */ + +#include + +// change this to the number of steps on your motor +#define STEPS 100 + +// create an instance of the stepper class, specifying +// the number of steps of the motor and the pins it's +// attached to +Stepper stepper(STEPS, 8, 9, 10, 11); + +// the previous reading from the analog input +int previous = 0; + +void setup() { + // set the speed of the motor to 30 RPMs + stepper.setSpeed(30); +} + +void loop() { + // get the sensor value + int val = analogRead(0); + + // move a number of steps equal to the change in the + // sensor reading + stepper.step(val - previous); + + // remember the previous value of the sensor + previous = val; +} \ No newline at end of file diff --git a/libs/Stepper/examples/stepper_oneRevolution/stepper_oneRevolution.ino b/libs/Stepper/examples/stepper_oneRevolution/stepper_oneRevolution.ino new file mode 100644 index 0000000..373eb60 --- /dev/null +++ b/libs/Stepper/examples/stepper_oneRevolution/stepper_oneRevolution.ino @@ -0,0 +1,44 @@ + +/* + Stepper Motor Control - one revolution + + This program drives a unipolar or bipolar stepper motor. + The motor is attached to digital pins 8 - 11 of the Arduino. + + The motor should revolve one revolution in one direction, then + one revolution in the other direction. + + + Created 11 Mar. 2007 + Modified 30 Nov. 2009 + by Tom Igoe + + */ + +#include + +const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution +// for your motor + +// initialize the stepper library on pins 8 through 11: +Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); + +void setup() { + // set the speed at 60 rpm: + myStepper.setSpeed(60); + // initialize the serial port: + Serial.begin(9600); +} + +void loop() { + // step one revolution in one direction: + Serial.println("clockwise"); + myStepper.step(stepsPerRevolution); + delay(500); + + // step one revolution in the other direction: + Serial.println("counterclockwise"); + myStepper.step(-stepsPerRevolution); + delay(500); +} + diff --git a/libs/Stepper/examples/stepper_oneStepAtATime/stepper_oneStepAtATime.ino b/libs/Stepper/examples/stepper_oneStepAtATime/stepper_oneStepAtATime.ino new file mode 100644 index 0000000..e6c141f --- /dev/null +++ b/libs/Stepper/examples/stepper_oneStepAtATime/stepper_oneStepAtATime.ino @@ -0,0 +1,44 @@ + +/* + Stepper Motor Control - one step at a time + + This program drives a unipolar or bipolar stepper motor. + The motor is attached to digital pins 8 - 11 of the Arduino. + + The motor will step one step at a time, very slowly. You can use this to + test that you've got the four wires of your stepper wired to the correct + pins. If wired correctly, all steps should be in the same direction. + + Use this also to count the number of steps per revolution of your motor, + if you don't know it. Then plug that number into the oneRevolution + example to see if you got it right. + + Created 30 Nov. 2009 + by Tom Igoe + + */ + +#include + +const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution +// for your motor + +// initialize the stepper library on pins 8 through 11: +Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); + +int stepCount = 0; // number of steps the motor has taken + +void setup() { + // initialize the serial port: + Serial.begin(9600); +} + +void loop() { + // step one step: + myStepper.step(1); + Serial.print("steps:"); + Serial.println(stepCount); + stepCount++; + delay(500); +} + diff --git a/libs/Stepper/examples/stepper_speedControl/stepper_speedControl.ino b/libs/Stepper/examples/stepper_speedControl/stepper_speedControl.ino new file mode 100644 index 0000000..5eb4f6a --- /dev/null +++ b/libs/Stepper/examples/stepper_speedControl/stepper_speedControl.ino @@ -0,0 +1,48 @@ + +/* + Stepper Motor Control - speed control + + This program drives a unipolar or bipolar stepper motor. + The motor is attached to digital pins 8 - 11 of the Arduino. + A potentiometer is connected to analog input 0. + + The motor will rotate in a clockwise direction. The higher the potentiometer value, + the faster the motor speed. Because setSpeed() sets the delay between steps, + you may notice the motor is less responsive to changes in the sensor value at + low speeds. + + Created 30 Nov. 2009 + Modified 28 Oct 2010 + by Tom Igoe + + */ + +#include + +const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution +// for your motor + + +// initialize the stepper library on pins 8 through 11: +Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); + +int stepCount = 0; // number of steps the motor has taken + +void setup() { + // nothing to do inside the setup +} + +void loop() { + // read the sensor value: + int sensorReading = analogRead(A0); + // map it to a range from 0 to 100: + int motorSpeed = map(sensorReading, 0, 1023, 0, 100); + // set the motor speed: + if (motorSpeed > 0) { + myStepper.setSpeed(motorSpeed); + // step 1/100 of a revolution: + myStepper.step(stepsPerRevolution / 100); + } +} + + diff --git a/libs/Stepper/keywords.txt b/libs/Stepper/keywords.txt new file mode 100644 index 0000000..5e58a66 --- /dev/null +++ b/libs/Stepper/keywords.txt @@ -0,0 +1,28 @@ +####################################### +# Syntax Coloring Map For Test +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +Stepper KEYWORD1 Stepper + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +step KEYWORD2 +setSpeed KEYWORD2 +version KEYWORD2 + +###################################### +# Instances (KEYWORD2) +####################################### +direction KEYWORD2 +speed KEYWORD2 + + +####################################### +# Constants (LITERAL1) +####################################### diff --git a/libs/Stepper/library.properties b/libs/Stepper/library.properties new file mode 100644 index 0000000..875067a --- /dev/null +++ b/libs/Stepper/library.properties @@ -0,0 +1,9 @@ +name=Stepper +version=1.1.3 +author=Arduino +maintainer=Arduino +sentence=Allows Arduino boards to control a variety of stepper motors. +paragraph=This library allows you to control unipolar or bipolar stepper motors. To use it you will need a stepper motor, and the appropriate hardware to control it. +category=Device Control +url=http://www.arduino.cc/en/Reference/Stepper +architectures=* diff --git a/libs/Stepper/src/Stepper.cpp b/libs/Stepper/src/Stepper.cpp new file mode 100644 index 0000000..1f76295 --- /dev/null +++ b/libs/Stepper/src/Stepper.cpp @@ -0,0 +1,365 @@ +/* + * Stepper.cpp - Stepper library for Wiring/Arduino - Version 1.1.0 + * + * Original library (0.1) by Tom Igoe. + * Two-wire modifications (0.2) by Sebastian Gassner + * Combination version (0.3) by Tom Igoe and David Mellis + * Bug fix for four-wire (0.4) by Tom Igoe, bug fix from Noah Shibley + * High-speed stepping mod by Eugene Kozlenko + * Timer rollover fix by Eugene Kozlenko + * Five phase five wire (1.1.0) by Ryan Orendorff + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * + * Drives a unipolar, bipolar, or five phase stepper motor. + * + * When wiring multiple stepper motors to a microcontroller, you quickly run + * out of output pins, with each motor requiring 4 connections. + * + * By making use of the fact that at any time two of the four motor coils are + * the inverse of the other two, the number of control connections can be + * reduced from 4 to 2 for the unipolar and bipolar motors. + * + * A slightly modified circuit around a Darlington transistor array or an + * L293 H-bridge connects to only 2 microcontroler pins, inverts the signals + * received, and delivers the 4 (2 plus 2 inverted ones) output signals + * required for driving a stepper motor. Similarly the Arduino motor shields + * 2 direction pins may be used. + * + * The sequence of control signals for 5 phase, 5 control wires is as follows: + * + * Step C0 C1 C2 C3 C4 + * 1 0 1 1 0 1 + * 2 0 1 0 0 1 + * 3 0 1 0 1 1 + * 4 0 1 0 1 0 + * 5 1 1 0 1 0 + * 6 1 0 0 1 0 + * 7 1 0 1 1 0 + * 8 1 0 1 0 0 + * 9 1 0 1 0 1 + * 10 0 0 1 0 1 + * + * The sequence of control signals for 4 control wires is as follows: + * + * Step C0 C1 C2 C3 + * 1 1 0 1 0 + * 2 0 1 1 0 + * 3 0 1 0 1 + * 4 1 0 0 1 + * + * The sequence of controls signals for 2 control wires is as follows + * (columns C1 and C2 from above): + * + * Step C0 C1 + * 1 0 1 + * 2 1 1 + * 3 1 0 + * 4 0 0 + * + * The circuits can be found at + * + * http://www.arduino.cc/en/Tutorial/Stepper + */ + +#include "Arduino.h" +#include "Stepper.h" + +/* + * two-wire constructor. + * Sets which wires should control the motor. + */ +Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2) +{ + this->step_number = 0; // which step the motor is on + this->direction = 0; // motor direction + this->last_step_time = 0; // time stamp in us of the last step taken + this->number_of_steps = number_of_steps; // total number of steps for this motor + + // Arduino pins for the motor control connection: + this->motor_pin_1 = motor_pin_1; + this->motor_pin_2 = motor_pin_2; + + // setup the pins on the microcontroller: + pinMode(this->motor_pin_1, OUTPUT); + pinMode(this->motor_pin_2, OUTPUT); + + // When there are only 2 pins, set the others to 0: + this->motor_pin_3 = 0; + this->motor_pin_4 = 0; + this->motor_pin_5 = 0; + + // pin_count is used by the stepMotor() method: + this->pin_count = 2; +} + + +/* + * constructor for four-pin version + * Sets which wires should control the motor. + */ +Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, + int motor_pin_3, int motor_pin_4) +{ + this->step_number = 0; // which step the motor is on + this->direction = 0; // motor direction + this->last_step_time = 0; // time stamp in us of the last step taken + this->number_of_steps = number_of_steps; // total number of steps for this motor + + // Arduino pins for the motor control connection: + this->motor_pin_1 = motor_pin_1; + this->motor_pin_2 = motor_pin_2; + this->motor_pin_3 = motor_pin_3; + this->motor_pin_4 = motor_pin_4; + + // setup the pins on the microcontroller: + pinMode(this->motor_pin_1, OUTPUT); + pinMode(this->motor_pin_2, OUTPUT); + pinMode(this->motor_pin_3, OUTPUT); + pinMode(this->motor_pin_4, OUTPUT); + + // When there are 4 pins, set the others to 0: + this->motor_pin_5 = 0; + + // pin_count is used by the stepMotor() method: + this->pin_count = 4; +} + +/* + * constructor for five phase motor with five wires + * Sets which wires should control the motor. + */ +Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, + int motor_pin_3, int motor_pin_4, + int motor_pin_5) +{ + this->step_number = 0; // which step the motor is on + this->direction = 0; // motor direction + this->last_step_time = 0; // time stamp in us of the last step taken + this->number_of_steps = number_of_steps; // total number of steps for this motor + + // Arduino pins for the motor control connection: + this->motor_pin_1 = motor_pin_1; + this->motor_pin_2 = motor_pin_2; + this->motor_pin_3 = motor_pin_3; + this->motor_pin_4 = motor_pin_4; + this->motor_pin_5 = motor_pin_5; + + // setup the pins on the microcontroller: + pinMode(this->motor_pin_1, OUTPUT); + pinMode(this->motor_pin_2, OUTPUT); + pinMode(this->motor_pin_3, OUTPUT); + pinMode(this->motor_pin_4, OUTPUT); + pinMode(this->motor_pin_5, OUTPUT); + + // pin_count is used by the stepMotor() method: + this->pin_count = 5; +} + +/* + * Sets the speed in revs per minute + */ +void Stepper::setSpeed(long whatSpeed) +{ + this->step_delay = 60L * 1000L * 1000L / this->number_of_steps / whatSpeed; +} + +/* + * Moves the motor steps_to_move steps. If the number is negative, + * the motor moves in the reverse direction. + */ +void Stepper::step(int steps_to_move) +{ + int steps_left = abs(steps_to_move); // how many steps to take + + // determine direction based on whether steps_to_mode is + or -: + if (steps_to_move > 0) { this->direction = 1; } + if (steps_to_move < 0) { this->direction = 0; } + + + // decrement the number of steps, moving one step each time: + while (steps_left > 0) + { + unsigned long now = micros(); + // move only if the appropriate delay has passed: + if (now - this->last_step_time >= this->step_delay) + { + // get the timeStamp of when you stepped: + this->last_step_time = now; + // increment or decrement the step number, + // depending on direction: + if (this->direction == 1) + { + this->step_number++; + if (this->step_number == this->number_of_steps) { + this->step_number = 0; + } + } + else + { + if (this->step_number == 0) { + this->step_number = this->number_of_steps; + } + this->step_number--; + } + // decrement the steps left: + steps_left--; + // step the motor to step number 0, 1, ..., {3 or 10} + if (this->pin_count == 5) + stepMotor(this->step_number % 10); + else + stepMotor(this->step_number % 4); + } + } +} + +/* + * Moves the motor forward or backwards. + */ +void Stepper::stepMotor(int thisStep) +{ + if (this->pin_count == 2) { + switch (thisStep) { + case 0: // 01 + digitalWrite(motor_pin_1, LOW); + digitalWrite(motor_pin_2, HIGH); + break; + case 1: // 11 + digitalWrite(motor_pin_1, HIGH); + digitalWrite(motor_pin_2, HIGH); + break; + case 2: // 10 + digitalWrite(motor_pin_1, HIGH); + digitalWrite(motor_pin_2, LOW); + break; + case 3: // 00 + digitalWrite(motor_pin_1, LOW); + digitalWrite(motor_pin_2, LOW); + break; + } + } + if (this->pin_count == 4) { + switch (thisStep) { + case 0: // 1010 + digitalWrite(motor_pin_1, HIGH); + digitalWrite(motor_pin_2, LOW); + digitalWrite(motor_pin_3, HIGH); + digitalWrite(motor_pin_4, LOW); + break; + case 1: // 0110 + digitalWrite(motor_pin_1, LOW); + digitalWrite(motor_pin_2, HIGH); + digitalWrite(motor_pin_3, HIGH); + digitalWrite(motor_pin_4, LOW); + break; + case 2: //0101 + digitalWrite(motor_pin_1, LOW); + digitalWrite(motor_pin_2, HIGH); + digitalWrite(motor_pin_3, LOW); + digitalWrite(motor_pin_4, HIGH); + break; + case 3: //1001 + digitalWrite(motor_pin_1, HIGH); + digitalWrite(motor_pin_2, LOW); + digitalWrite(motor_pin_3, LOW); + digitalWrite(motor_pin_4, HIGH); + break; + } + } + + if (this->pin_count == 5) { + switch (thisStep) { + case 0: // 01101 + digitalWrite(motor_pin_1, LOW); + digitalWrite(motor_pin_2, HIGH); + digitalWrite(motor_pin_3, HIGH); + digitalWrite(motor_pin_4, LOW); + digitalWrite(motor_pin_5, HIGH); + break; + case 1: // 01001 + digitalWrite(motor_pin_1, LOW); + digitalWrite(motor_pin_2, HIGH); + digitalWrite(motor_pin_3, LOW); + digitalWrite(motor_pin_4, LOW); + digitalWrite(motor_pin_5, HIGH); + break; + case 2: // 01011 + digitalWrite(motor_pin_1, LOW); + digitalWrite(motor_pin_2, HIGH); + digitalWrite(motor_pin_3, LOW); + digitalWrite(motor_pin_4, HIGH); + digitalWrite(motor_pin_5, HIGH); + break; + case 3: // 01010 + digitalWrite(motor_pin_1, LOW); + digitalWrite(motor_pin_2, HIGH); + digitalWrite(motor_pin_3, LOW); + digitalWrite(motor_pin_4, HIGH); + digitalWrite(motor_pin_5, LOW); + break; + case 4: // 11010 + digitalWrite(motor_pin_1, HIGH); + digitalWrite(motor_pin_2, HIGH); + digitalWrite(motor_pin_3, LOW); + digitalWrite(motor_pin_4, HIGH); + digitalWrite(motor_pin_5, LOW); + break; + case 5: // 10010 + digitalWrite(motor_pin_1, HIGH); + digitalWrite(motor_pin_2, LOW); + digitalWrite(motor_pin_3, LOW); + digitalWrite(motor_pin_4, HIGH); + digitalWrite(motor_pin_5, LOW); + break; + case 6: // 10110 + digitalWrite(motor_pin_1, HIGH); + digitalWrite(motor_pin_2, LOW); + digitalWrite(motor_pin_3, HIGH); + digitalWrite(motor_pin_4, HIGH); + digitalWrite(motor_pin_5, LOW); + break; + case 7: // 10100 + digitalWrite(motor_pin_1, HIGH); + digitalWrite(motor_pin_2, LOW); + digitalWrite(motor_pin_3, HIGH); + digitalWrite(motor_pin_4, LOW); + digitalWrite(motor_pin_5, LOW); + break; + case 8: // 10101 + digitalWrite(motor_pin_1, HIGH); + digitalWrite(motor_pin_2, LOW); + digitalWrite(motor_pin_3, HIGH); + digitalWrite(motor_pin_4, LOW); + digitalWrite(motor_pin_5, HIGH); + break; + case 9: // 00101 + digitalWrite(motor_pin_1, LOW); + digitalWrite(motor_pin_2, LOW); + digitalWrite(motor_pin_3, HIGH); + digitalWrite(motor_pin_4, LOW); + digitalWrite(motor_pin_5, HIGH); + break; + } + } +} + +/* + version() returns the version of the library: +*/ +int Stepper::version(void) +{ + return 5; +} diff --git a/libs/Stepper/src/Stepper.h b/libs/Stepper/src/Stepper.h new file mode 100644 index 0000000..2e68979 --- /dev/null +++ b/libs/Stepper/src/Stepper.h @@ -0,0 +1,121 @@ +/* + * Stepper.h - Stepper library for Wiring/Arduino - Version 1.1.0 + * + * Original library (0.1) by Tom Igoe. + * Two-wire modifications (0.2) by Sebastian Gassner + * Combination version (0.3) by Tom Igoe and David Mellis + * Bug fix for four-wire (0.4) by Tom Igoe, bug fix from Noah Shibley + * High-speed stepping mod by Eugene Kozlenko + * Timer rollover fix by Eugene Kozlenko + * Five phase five wire (1.1.0) by Ryan Orendorff + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * + * Drives a unipolar, bipolar, or five phase stepper motor. + * + * When wiring multiple stepper motors to a microcontroller, you quickly run + * out of output pins, with each motor requiring 4 connections. + * + * By making use of the fact that at any time two of the four motor coils are + * the inverse of the other two, the number of control connections can be + * reduced from 4 to 2 for the unipolar and bipolar motors. + * + * A slightly modified circuit around a Darlington transistor array or an + * L293 H-bridge connects to only 2 microcontroler pins, inverts the signals + * received, and delivers the 4 (2 plus 2 inverted ones) output signals + * required for driving a stepper motor. Similarly the Arduino motor shields + * 2 direction pins may be used. + * + * The sequence of control signals for 5 phase, 5 control wires is as follows: + * + * Step C0 C1 C2 C3 C4 + * 1 0 1 1 0 1 + * 2 0 1 0 0 1 + * 3 0 1 0 1 1 + * 4 0 1 0 1 0 + * 5 1 1 0 1 0 + * 6 1 0 0 1 0 + * 7 1 0 1 1 0 + * 8 1 0 1 0 0 + * 9 1 0 1 0 1 + * 10 0 0 1 0 1 + * + * The sequence of control signals for 4 control wires is as follows: + * + * Step C0 C1 C2 C3 + * 1 1 0 1 0 + * 2 0 1 1 0 + * 3 0 1 0 1 + * 4 1 0 0 1 + * + * The sequence of controls signals for 2 control wires is as follows + * (columns C1 and C2 from above): + * + * Step C0 C1 + * 1 0 1 + * 2 1 1 + * 3 1 0 + * 4 0 0 + * + * The circuits can be found at + * + * http://www.arduino.cc/en/Tutorial/Stepper + */ + +// ensure this library description is only included once +#ifndef Stepper_h +#define Stepper_h + +// library interface description +class Stepper { + public: + // constructors: + Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2); + Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, + int motor_pin_3, int motor_pin_4); + Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, + int motor_pin_3, int motor_pin_4, + int motor_pin_5); + + // speed setter method: + void setSpeed(long whatSpeed); + + // mover method: + void step(int number_of_steps); + + int version(void); + + private: + void stepMotor(int this_step); + + int direction; // Direction of rotation + unsigned long step_delay; // delay between steps, in ms, based on speed + int number_of_steps; // total number of steps this motor can take + int pin_count; // how many pins are in use. + int step_number; // which step the motor is on + + // motor pin numbers: + int motor_pin_1; + int motor_pin_2; + int motor_pin_3; + int motor_pin_4; + int motor_pin_5; // Only 5 phase motor + + unsigned long last_step_time; // time stamp in us of when the last step was taken +}; + +#endif + From 8765fc7a071598025e4ee441669b4f054a1a321d Mon Sep 17 00:00:00 2001 From: pfolhento Date: Wed, 21 May 2025 01:14:43 +0100 Subject: [PATCH 05/26] Fix Push Button, Modified Car state Entering Exiting. --- code/Barrier.cpp | 2 ++ code/LCDScreen.cpp | 35 ++++++++++++-------- code/code.ino | 80 ++++++++++++++++++++++++---------------------- diagram.json | 37 +++++++++++++-------- 4 files changed, 88 insertions(+), 66 deletions(-) diff --git a/code/Barrier.cpp b/code/Barrier.cpp index bf5ce20..4f6b283 100644 --- a/code/Barrier.cpp +++ b/code/Barrier.cpp @@ -21,6 +21,8 @@ class Barrier { void configure_pins(){ this->servo.attach(pin); + this->servo.write(90); + this->state = CLOSED; } void open(){ diff --git a/code/LCDScreen.cpp b/code/LCDScreen.cpp index 3554a61..e7e8b13 100644 --- a/code/LCDScreen.cpp +++ b/code/LCDScreen.cpp @@ -3,6 +3,7 @@ enum LCDScreenState { DISPLAY_DEFAULT_MESSAGE, + DISPLAY_MESSAGE, DISPLAY_TEMPERATURE, DISPLAY_PARKING_SPOTS_FULL, DISPLAY_PARKING_SPOTS @@ -13,19 +14,20 @@ class LCDScreen { private: LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27,20,4); LCDScreenState state; - String default_message = "Bem vindo!"; + String default_message = "Welcome!"; public: LCDScreen(String default_message = ""){ if (default_message != ""){ this->default_message = default_message; + this->state = DISPLAY_DEFAULT_MESSAGE; } } void init(){ lcd.init(); lcd.backlight(); - this->display_default_message(); + this->display_message(default_message); } void clear(){ @@ -43,27 +45,34 @@ class LCDScreen { lcd.print(" C "); } - void display_default_message(){ - if (this->state != DISPLAY_DEFAULT_MESSAGE){ + void display_message(String message){ + if (this->state != DISPLAY_MESSAGE){ this->clear(); - this->state = DISPLAY_DEFAULT_MESSAGE; + this->state = DISPLAY_MESSAGE; } lcd.setCursor(0, 0); - lcd.print(this->default_message); + lcd.print(message); } void display_message_full(){ - this->state = DISPLAY_PARKING_SPOTS_FULL; + if (this->state != DISPLAY_PARKING_SPOTS_FULL){ + this->clear(); + this->state = DISPLAY_PARKING_SPOTS_FULL; + } lcd.setCursor(0, 0); - this->clear(); - lcd.print("Parking Lot is FULL.\nPlease come back later.\n"); + lcd.print("Park is FULL."); + lcd.setCursor(0, 1); + lcd.print("Come back later."); } - void display_message(int slots){ - this->state = DISPLAY_PARKING_SPOTS; + void display_message_SLOTS(int slots){ + if (this->state != DISPLAY_PARKING_SPOTS){ + this->clear(); + this->state = DISPLAY_PARKING_SPOTS; + } lcd.setCursor(0, 0); - this->clear(); lcd.print("Available slots: "); - lcd.print(slots); lcd.print('\n'); + lcd.setCursor(0, 1); + lcd.print(slots); } }; \ No newline at end of file diff --git a/code/code.ino b/code/code.ino index 99a3695..cea5041 100644 --- a/code/code.ino +++ b/code/code.ino @@ -6,7 +6,7 @@ #include "DistSensor.cpp"; #include "LCDScreen.cpp"; -#define PARK_SLOTS 8 +#define PARK_SLOTS 3 #define ULTRASONIC_SENSOR_PIN_TRIG 11 #define ULTRASONIC_SENSOR_PIN_ECHO 12 #define SERVO_PIN 10 @@ -21,9 +21,12 @@ DistSensor dist_sensor = DistSensor(ULTRASONIC_SENSOR_PIN_TRIG, ULTRASONIC_SENSO Barrier barrier = Barrier(SERVO_PIN, 4); LCDScreen screen = LCDScreen(); -unsigned long current_time, sensor_last_time_activated, temperature_last_time_measured, sensor_last_time_activated_IN, sensor_last_time_activated_OUT; -int OCCUPIED_SLOTS = 0, Button_State = 0, Last_Button_State = 0; +unsigned long current_time, sensor_last_time_activated, temperature_last_time_measured; +unsigned long Debounce_Delay = 1000, Debounce_Time = 0; +bool Debounce; +int SLOTS = PARK_SLOTS, Button_State = LOW, Last_Button_State = LOW; float temperature_in_c = 0; +enum CarState {ENTER, EXIT, STOP} Car_State; void setup() { Serial.begin(9600); @@ -33,56 +36,55 @@ void setup() { screen.init(); pinMode(BUTTON_PIN, INPUT); pinMode(BUZZER_PIN, OUTPUT); + Car_State = STOP; } void loop() { - current_time = millis(); Button_State = digitalRead(BUTTON_PIN); - - // Carro entra: - if (dist_sensor.is_in_range()){ - sensor_last_time_activated_IN = current_time; - if(barrier.is_closed()){ - barrier.open(); - } - } else if (!dist_sensor.is_in_range() && barrier.is_open()){ - if (current_time - sensor_last_time_activated_IN >= barrier.open_time_seconds * 1000){ - barrier.close(); - OCCUPIED_SLOTS++; - } - } + (current_time - Debounce_Time) > Debounce_Delay ? Debounce = true : Debounce = false; - // Carro sai: - if (Button_State != Last_Button_State){ - sensor_last_time_activated_OUT = current_time; - if(barrier.is_closed()){ - barrier.open(); - if (Button_State == HIGH) { - OCCUPIED_SLOTS--; - screen.display_message(OCCUPIED_SLOTS); - if (OCCUPIED_SLOTS == PARK_SLOTS) { - screen.display_message_full(); - tone(BUZZER_PIN, 1000); delayMicroseconds(500); - noTone(BUZZER_PIN); - tone(BUZZER_PIN, 1000); delayMicroseconds(500); - noTone(BUZZER_PIN); - } - } - } - } else if (!dist_sensor.is_in_range() && barrier.is_open()){ - if (current_time - sensor_last_time_activated_OUT >= barrier.open_time_seconds * 1000){ + // Car enters (Motion Sensor, Servo, Buzzer, and LCD): + if (dist_sensor.is_in_range() && barrier.is_closed() && SLOTS != 0 && Car_State == STOP){ + sensor_last_time_activated = current_time; + barrier.open(); + Car_State = ENTER; + } else if (dist_sensor.is_in_range() && SLOTS == 0) { + screen.display_message_full(); + tone(BUZZER_PIN, 100); delayMicroseconds(500); + noTone(BUZZER_PIN); + tone(BUZZER_PIN, 100); delayMicroseconds(500); + noTone(BUZZER_PIN); + } else if (!dist_sensor.is_in_range() && barrier.is_open() && Car_State == ENTER){ + if (current_time - sensor_last_time_activated >= barrier.open_time_seconds * 1000){ barrier.close(); + screen.display_message_SLOTS(--SLOTS); + Car_State = STOP; } } - Last_Button_State = Button_State; - // Temperatura: + // Car leaves (Push Button and LCD): + if (Button_State != Last_Button_State && barrier.is_closed() && Debounce && Car_State == STOP){ + barrier.open(); + if (SLOTS < PARK_SLOTS) SLOTS++; + screen.display_message_SLOTS(SLOTS); + Debounce_Time = millis(); + Car_State = EXIT; + } + else if (Button_State != Last_Button_State && barrier.is_open() && Debounce && Car_State == EXIT){ + barrier.close(); + screen.display_message("Ate a proxima!"); + Debounce_Time = millis(); + Car_State = STOP; + } + + // Temperature (Temperature sensor, and LCD): if (current_time - temperature_last_time_measured >= 1000){ temperature_last_time_measured = current_time; temperature_sensors.requestTemperatures(); temperature_in_c = temperature_sensors.getTempCByIndex(0); } - screen.display_temperature(temperature_in_c); + //screen.display_temperature(temperature_in_c); + Last_Button_State = Button_State; } diff --git a/diagram.json b/diagram.json index 4553d45..1dfc1bf 100644 --- a/diagram.json +++ b/diagram.json @@ -3,7 +3,7 @@ "author": "Anonymous maker", "editor": "wokwi", "parts": [ - { "type": "wokwi-breadboard", "id": "bb1", "top": 72.2, "left": -524, "attrs": {} }, + { "type": "wokwi-breadboard", "id": "bb1", "top": 73.8, "left": -525.2, "attrs": {} }, { "type": "wokwi-arduino-uno", "id": "uno", "top": -201, "left": -691.8, "attrs": {} }, { "type": "wokwi-servo", @@ -13,13 +13,13 @@ "attrs": { "hornColor": "#FFFF00" } }, { "type": "wokwi-hc-sr04", "id": "ultrasonic1", "top": -56.1, "left": -378.5, "attrs": {} }, - { "type": "board-ds18b20", "id": "temp1", "top": 94.87, "left": 32.88, "attrs": {} }, + { "type": "board-ds18b20", "id": "temp1", "top": 96.47, "left": 31.68, "attrs": {} }, { "type": "wokwi-ky-040", "id": "encoder1", "top": 164.9, "left": -711.2, "attrs": {} }, { "type": "wokwi-pushbutton", "id": "btn1", - "top": 153.5, - "left": -514.9, + "top": 153, + "left": -515.4, "rotate": 90, "attrs": { "color": "yellow", "xray": "1", "bounce": "1" } }, @@ -49,10 +49,17 @@ { "type": "wokwi-resistor", "id": "r1", - "top": 225.6, - "left": 18.65, + "top": 227.2, + "left": 17.45, "rotate": 90, "attrs": { "value": "4700" } + }, + { + "type": "wokwi-resistor", + "id": "r2", + "top": 215.45, + "left": -471.8, + "attrs": { "value": "10000" } } ], "connections": [ @@ -63,8 +70,6 @@ [ "uno:GND.2", "bb1:tn.1", "black", [ "v0" ] ], [ "bb1:tn.50", "bb1:bn.50", "black", [ "h28", "v174" ] ], [ "bb1:tp.50", "bb1:bp.50", "red", [ "h37.6", "v174" ] ], - [ "bb1:bn.2", "bb1:4b.j", "black", [ "v0" ] ], - [ "bb1:2t.b", "uno:8", "gold", [ "v-240", "h-19.2", "v-86.4" ] ], [ "bb1:59b.j", "bb1:bp.48", "red", [ "v0" ] ], [ "bb1:57b.j", "bb1:bn.46", "black", [ "v0" ] ], [ "encoder1:VCC", "bb1:bp.1", "red", [ "h57.6", "v58.9" ] ], @@ -94,16 +99,20 @@ [ "bb1:57b.f", "bb1:57t.e", "black", [ "v0" ] ], [ "uno:9", "bb1:58t.d", "blue", [ "v480", "h519.2", "v-136" ] ], [ "bb1:58b.f", "bb1:58t.e", "violet", [ "v0" ] ], - [ "btn1:1.l", "bb1:4t.c", "", [ "$bb" ] ], - [ "btn1:2.l", "bb1:2t.c", "", [ "$bb" ] ], - [ "btn1:1.r", "bb1:4b.h", "", [ "$bb" ] ], - [ "btn1:2.r", "bb1:2b.h", "", [ "$bb" ] ], + [ "uno:A4", "bb1:37b.g", "gray", [ "v0" ] ], + [ "uno:A5", "bb1:38b.h", "purple", [ "v0" ] ], + [ "bb1:10b.j", "bb1:bn.7", "black", [ "v0" ] ], [ "r1:1", "bb1:58b.g", "", [ "$bb" ] ], [ "temp1:GND", "bb1:57t.c", "", [ "$bb" ] ], [ "temp1:DQ", "bb1:58t.c", "", [ "$bb" ] ], [ "temp1:VCC", "bb1:59t.c", "", [ "$bb" ] ], - [ "uno:A4", "bb1:37b.g", "gray", [ "v0" ] ], - [ "uno:A5", "bb1:38b.h", "purple", [ "v0" ] ] + [ "btn1:1.l", "bb1:4t.c", "", [ "$bb" ] ], + [ "btn1:2.l", "bb1:2t.c", "", [ "$bb" ] ], + [ "btn1:1.r", "bb1:4b.h", "", [ "$bb" ] ], + [ "btn1:2.r", "bb1:2b.h", "", [ "$bb" ] ], + [ "uno:8", "bb1:2t.b", "yellow", [ "h0.4", "v326.4" ] ], + [ "bb1:tp.2", "bb1:4t.b", "red", [ "v0" ] ], + [ "r2:2", "bb1:7b.f", "", [ "$bb" ] ] ], "dependencies": {} } \ No newline at end of file From 3cdfff0a1035e3484b123f49dbc5114b053c55dd Mon Sep 17 00:00:00 2001 From: rafa Date: Fri, 23 May 2025 12:45:57 +0100 Subject: [PATCH 06/26] Create a car spot controller --- code/CarSpotController.cpp | 31 +++++++++++++++++++++++++++++++ code/LCDScreen.cpp | 16 ++++++++++++++++ code/code.ino | 8 +++++++- 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 code/CarSpotController.cpp diff --git a/code/CarSpotController.cpp b/code/CarSpotController.cpp new file mode 100644 index 0000000..bb040e2 --- /dev/null +++ b/code/CarSpotController.cpp @@ -0,0 +1,31 @@ +class CarSpotCOntroller { + + private: + int total_spots; + int occupied_spots; + + public: + CarSpotCOntroller(int default_total_spots) { + this->set_total_spots(default_total_spots); + } + + int get_total_spots() { + return this->total_spots; + } + + void set_total_spots(int total_spots) { + this->total_spots = total_spots; + } + + int get_occupied_spots() { + return this->occupied_spots; + } + + void set_occupied_spots(int occupied_spots) { + this->occupied_spots = occupied_spots; + } + + void increment_occupied_spots () { + this->occupied_spots++; + } +}; \ No newline at end of file diff --git a/code/LCDScreen.cpp b/code/LCDScreen.cpp index e9e2f64..c81db86 100644 --- a/code/LCDScreen.cpp +++ b/code/LCDScreen.cpp @@ -51,4 +51,20 @@ class LCDScreen { lcd.print(this->default_message); } + void display_parking_spots(int total_spots, int occupied_spots){ + if (this->state != DISPLAY_PARKING_SPOTS){ + this->clear(); + this->state = DISPLAY_PARKING_SPOTS; + } + int free_spots = total_spots - occupied_spots; + lcd.setCursor(0, 0); + lcd.print("Occupied: "); + lcd.print(occupied_spots); + lcd.print(" / "); + lcd.print(total_spots); + lcd.setCursor(0, 1); + lcd.print("Free: "); + lcd.print(free_spots); + } + }; \ No newline at end of file diff --git a/code/code.ino b/code/code.ino index 0e4d921..616ecac 100644 --- a/code/code.ino +++ b/code/code.ino @@ -5,6 +5,7 @@ #include "Barrier.cpp"; #include "DistSensor.cpp"; #include "LCDScreen.cpp"; +#include "CarSpotController.cpp"; #define ULTRASONIC_SENSOR_PIN_TRIG 11 #define ULTRASONIC_SENSOR_PIN_ECHO 12 @@ -17,6 +18,7 @@ DallasTemperature temperature_sensors(&oneWire); DistSensor dist_sensor = DistSensor(ULTRASONIC_SENSOR_PIN_TRIG, ULTRASONIC_SENSOR_PIN_ECHO, 25.0); Barrier barrier = Barrier(SERVO_PIN, 4); LCDScreen screen = LCDScreen(); +CarSpotCOntroller car_spot_controller = CarSpotCOntroller(24); unsigned long current_time, sensor_last_time_activated, temperature_last_time_measured; @@ -39,6 +41,7 @@ void loop() { sensor_last_time_activated = current_time; if(barrier.is_closed()){ barrier.open(); + car_spot_controller.increment_occupied_spots(); } } else if (!dist_sensor.is_in_range() && barrier.is_open()){ if (current_time - sensor_last_time_activated >= barrier.open_time_seconds * 1000){ @@ -52,5 +55,8 @@ void loop() { temperature_in_c = temperature_sensors.getTempCByIndex(0); } - screen.display_temperature(temperature_in_c); + //screen.display_temperature(temperature_in_c); + + screen.display_parking_spots(car_spot_controller.get_total_spots(), car_spot_controller.get_occupied_spots()); + } From 29dd0d4d431a9e785e1e62c8f0f1087148d2affd Mon Sep 17 00:00:00 2001 From: rafa Date: Fri, 23 May 2025 22:06:59 +0100 Subject: [PATCH 07/26] rotate joystick --- diagram.json | 578 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 512 insertions(+), 66 deletions(-) diff --git a/diagram.json b/diagram.json index 9812296..12f61e4 100644 --- a/diagram.json +++ b/diagram.json @@ -3,25 +3,61 @@ "author": "Anonymous maker", "editor": "wokwi", "parts": [ - { "type": "wokwi-breadboard", "id": "bb1", "top": 72.2, "left": -524, "attrs": {} }, - { "type": "wokwi-arduino-uno", "id": "uno", "top": -201, "left": -691.8, "attrs": {} }, + { + "type": "wokwi-breadboard", + "id": "bb1", + "top": 72.2, + "left": -524, + "attrs": {} + }, + { + "type": "wokwi-arduino-uno", + "id": "uno", + "top": -201, + "left": -691.8, + "attrs": {} + }, { "type": "wokwi-servo", "id": "servo1", "top": -174.8, "left": -355.2, - "attrs": { "hornColor": "#FFFF00" } + "attrs": { + "hornColor": "#FFFF00" + } + }, + { + "type": "wokwi-hc-sr04", + "id": "ultrasonic1", + "top": -56.1, + "left": -378.5, + "attrs": {} + }, + { + "type": "board-ds18b20", + "id": "temp1", + "top": 94.87, + "left": 32.88, + "attrs": {} + }, + { + "type": "wokwi-ky-040", + "id": "encoder1", + "top": 164.9, + "left": -711.2, + "attrs": {} }, - { "type": "wokwi-hc-sr04", "id": "ultrasonic1", "top": -56.1, "left": -378.5, "attrs": {} }, - { "type": "board-ds18b20", "id": "temp1", "top": 94.87, "left": 32.88, "attrs": {} }, - { "type": "wokwi-ky-040", "id": "encoder1", "top": 164.9, "left": -711.2, "attrs": {} }, { "type": "wokwi-pushbutton", "id": "btn1", "top": 153.5, "left": -514.9, "rotate": 90, - "attrs": { "color": "yellow", "xray": "1", "bounce": "1" } + "attrs": { + "color": "yellow", + "xray": "1", + "bounce": "1" + } }, { "type": "wokwi-buzzer", @@ -29,14 +65,15 @@ "top": -242.7, "left": -369.9, "rotate": 90, - "attrs": { "volume": "0.1" } + "attrs": { + "volume": "0.1" + } }, { "type": "wokwi-analog-joystick", "id": "joystick1", - "top": -99.1, - "left": -62.9, - "rotate": 90, + "top": -115.8, + "left": -90.6, "attrs": {} }, { @@ -44,7 +81,9 @@ "id": "lcd1", "top": -272, "left": -128.8, - "attrs": { "pins": "i2c" } + "attrs": { + "pins": "i2c" + } }, { "type": "wokwi-resistor", @@ -52,7 +91,9 @@ "top": 225.6, "left": 18.65, "rotate": 90, - "attrs": { "value": "4700" } + "attrs": { + "value": "4700" + } }, { "type": "wokwi-stepper-motor", @@ -60,62 +101,467 @@ "top": -387.25, "left": -376.54, "rotate": 90, - "attrs": { "size": "14" } + "attrs": { + "size": "14" + } } ], "connections": [ - [ "encoder1:DT", "uno:A2", "orange", [ "v0.1", "h48", "v-172.8", "h82.4" ] ], - [ "encoder1:CLK", "uno:7", "orange", [ "h57.6", "v-278.4", "h34.8" ] ], - [ "encoder1:SW", "uno:A3", "orange", [ "v0.1", "h67.2", "v-172.8", "h72.7" ] ], - [ "uno:5V", "bb1:tp.1", "red", [ "v0" ] ], - [ "uno:GND.2", "bb1:tn.1", "black", [ "v0" ] ], - [ "bb1:tn.50", "bb1:bn.50", "black", [ "h28", "v174" ] ], - [ "bb1:tp.50", "bb1:bp.50", "red", [ "h37.6", "v174" ] ], - [ "bb1:bn.2", "bb1:4b.j", "black", [ "v0" ] ], - [ "bb1:2t.b", "uno:8", "gold", [ "v-240", "h-19.2", "v-86.4" ] ], - [ "bb1:59b.j", "bb1:bp.48", "red", [ "v0" ] ], - [ "bb1:57b.j", "bb1:bn.46", "black", [ "v0" ] ], - [ "encoder1:VCC", "bb1:bp.1", "red", [ "h57.6", "v58.9" ] ], - [ "encoder1:GND", "bb1:bn.1", "black", [ "h48", "v59.7" ] ], - [ "bz1:2", "uno:3", "red", [ "h-28.8", "v-38.8", "h-61.6" ] ], - [ "bb1:bp.14", "bb1:18b.j", "green", [ "v0" ] ], - [ "bb1:bn.16", "bb1:21b.j", "green", [ "v0" ] ], - [ "bz1:1", "bb1:tn.7", "black", [ "h0" ] ], - [ "bb1:tn.19", "ultrasonic1:GND", "black", [ "v0" ] ], - [ "bb1:tp.16", "ultrasonic1:VCC", "red", [ "v-36.5", "h-2" ] ], - [ "ultrasonic1:TRIG", "uno:11", "violet", [ "v19.2", "h-96.4", "v-172.8", "h-154.2" ] ], - [ "ultrasonic1:ECHO", "uno:12", "green", [ "v28.8", "h-116", "v-163.2", "h-154.1" ] ], - [ "bb1:tp.9", "servo1:V+", "red", [ "v-94.1", "h7.6", "v-105.7" ] ], - [ "bb1:tn.10", "servo1:GND", "black", [ "v0" ] ], - [ "servo1:PWM", "uno:10", "orange", [ "h-124.8", "v-19", "h-58.3" ] ], - [ "joystick1:GND", "bb1:tn.36", "black", [ "h0" ] ], - [ "joystick1:VCC", "bb1:tp.35", "red", [ "h0" ] ], - [ "joystick1:VERT", "bb1:42t.a", "green", [ "h0" ] ], - [ "joystick1:HORZ", "bb1:44t.a", "blue", [ "h0" ] ], - [ "bb1:42t.b", "uno:A0", "green", [ "v1.6", "h-327.6", "v-86.4", "h-51.8" ] ], - [ "bb1:44t.c", "uno:A1", "blue", [ "v1.6", "h-337.2", "v-105.6", "h-51.9" ] ], - [ "lcd1:GND", "bb1:tn.28", "black", [ "h0" ] ], - [ "lcd1:VCC", "bb1:tp.29", "red", [ "h0" ] ], - [ "lcd1:SDA", "bb1:37b.f", "gray", [ "h0" ] ], - [ "lcd1:SCL", "bb1:38b.f", "purple", [ "h0" ] ], - [ "bb1:59b.f", "bb1:59t.e", "red", [ "v0" ] ], - [ "bb1:57b.f", "bb1:57t.e", "black", [ "v0" ] ], - [ "uno:9", "bb1:58t.d", "blue", [ "v480", "h519.2", "v-136" ] ], - [ "bb1:58b.f", "bb1:58t.e", "violet", [ "v0" ] ], - [ "uno:A4", "bb1:37b.g", "gray", [ "v0" ] ], - [ "uno:A5", "bb1:38b.h", "purple", [ "v0" ] ], - [ "temp1:GND", "bb1:57t.c", "", [ "$bb" ] ], - [ "temp1:DQ", "bb1:58t.c", "", [ "$bb" ] ], - [ "temp1:VCC", "bb1:59t.c", "", [ "$bb" ] ], - [ "btn1:1.l", "bb1:4t.c", "", [ "$bb" ] ], - [ "btn1:2.l", "bb1:2t.c", "", [ "$bb" ] ], - [ "btn1:1.r", "bb1:4b.h", "", [ "$bb" ] ], - [ "btn1:2.r", "bb1:2b.h", "", [ "$bb" ] ], - [ "r1:1", "bb1:58b.g", "", [ "$bb" ] ], - [ "stepper1:A-", "uno:2", "green", [ "h0" ] ], - [ "stepper1:A+", "uno:4", "green", [ "h0" ] ], - [ "stepper1:B+", "uno:5", "green", [ "h0" ] ], - [ "stepper1:B-", "uno:6", "green", [ "h0" ] ] + [ + "encoder1:DT", + "uno:A2", + "orange", + [ + "v0.1", + "h48", + "v-172.8", + "h82.4" + ] + ], + [ + "encoder1:CLK", + "uno:7", + "orange", + [ + "h57.6", + "v-278.4", + "h34.8" + ] + ], + [ + "encoder1:SW", + "uno:A3", + "orange", + [ + "v0.1", + "h67.2", + "v-172.8", + "h72.7" + ] + ], + [ + "uno:5V", + "bb1:tp.1", + "red", + [ + "v0" + ] + ], + [ + "uno:GND.2", + "bb1:tn.1", + "black", + [ + "v0" + ] + ], + [ + "bb1:tn.50", + "bb1:bn.50", + "black", + [ + "h28", + "v174" + ] + ], + [ + "bb1:tp.50", + "bb1:bp.50", + "red", + [ + "h37.6", + "v174" + ] + ], + [ + "bb1:bn.2", + "bb1:4b.j", + "black", + [ + "v0" + ] + ], + [ + "bb1:2t.b", + "uno:8", + "gold", + [ + "v-240", + "h-19.2", + "v-86.4" + ] + ], + [ + "bb1:59b.j", + "bb1:bp.48", + "red", + [ + "v0" + ] + ], + [ + "bb1:57b.j", + "bb1:bn.46", + "black", + [ + "v0" + ] + ], + [ + "encoder1:VCC", + "bb1:bp.1", + "red", + [ + "h57.6", + "v58.9" + ] + ], + [ + "encoder1:GND", + "bb1:bn.1", + "black", + [ + "h48", + "v59.7" + ] + ], + [ + "bz1:2", + "uno:3", + "red", + [ + "h-28.8", + "v-38.8", + "h-61.6" + ] + ], + [ + "bb1:bp.14", + "bb1:18b.j", + "green", + [ + "v0" + ] + ], + [ + "bb1:bn.16", + "bb1:21b.j", + "green", + [ + "v0" + ] + ], + [ + "bz1:1", + "bb1:tn.7", + "black", + [ + "h0" + ] + ], + [ + "bb1:tn.19", + "ultrasonic1:GND", + "black", + [ + "v0" + ] + ], + [ + "bb1:tp.16", + "ultrasonic1:VCC", + "red", + [ + "v-36.5", + "h-2" + ] + ], + [ + "ultrasonic1:TRIG", + "uno:11", + "violet", + [ + "v19.2", + "h-96.4", + "v-172.8", + "h-154.2" + ] + ], + [ + "ultrasonic1:ECHO", + "uno:12", + "green", + [ + "v28.8", + "h-116", + "v-163.2", + "h-154.1" + ] + ], + [ + "bb1:tp.9", + "servo1:V+", + "red", + [ + "v-94.1", + "h7.6", + "v-105.7" + ] + ], + [ + "bb1:tn.10", + "servo1:GND", + "black", + [ + "v0" + ] + ], + [ + "servo1:PWM", + "uno:10", + "orange", + [ + "h-124.8", + "v-19", + "h-58.3" + ] + ], + [ + "joystick1:GND", + "bb1:tn.36", + "black", + [ + "v57.6", + "h-55.6" + ] + ], + [ + "joystick1:VCC", + "bb1:tp.35", + "red", + [ + "v48", + "h-36.4" + ] + ], + [ + "joystick1:VERT", + "bb1:42t.a", + "green", + [ + "v67.2", + "h-56.4" + ] + ], + [ + "joystick1:HORZ", + "bb1:44t.a", + "blue", + [ + "v67.2", + "h-46.8" + ] + ], + [ + "bb1:42t.b", + "uno:A0", + "green", + [ + "v1.6", + "h-327.6", + "v-86.4", + "h-51.8" + ] + ], + [ + "bb1:44t.c", + "uno:A1", + "blue", + [ + "v1.6", + "h-337.2", + "v-105.6", + "h-51.9" + ] + ], + [ + "lcd1:GND", + "bb1:tn.28", + "black", + [ + "h0" + ] + ], + [ + "lcd1:VCC", + "bb1:tp.29", + "red", + [ + "h0" + ] + ], + [ + "lcd1:SDA", + "bb1:37b.f", + "gray", + [ + "h0" + ] + ], + [ + "lcd1:SCL", + "bb1:38b.f", + "purple", + [ + "h0" + ] + ], + [ + "bb1:59b.f", + "bb1:59t.e", + "red", + [ + "v0" + ] + ], + [ + "bb1:57b.f", + "bb1:57t.e", + "black", + [ + "v0" + ] + ], + [ + "uno:9", + "bb1:58t.d", + "blue", + [ + "v480", + "h519.2", + "v-136" + ] + ], + [ + "bb1:58b.f", + "bb1:58t.e", + "violet", + [ + "v0" + ] + ], + [ + "uno:A4", + "bb1:37b.g", + "gray", + [ + "v0" + ] + ], + [ + "uno:A5", + "bb1:38b.h", + "purple", + [ + "v0" + ] + ], + [ + "stepper1:A-", + "uno:2", + "green", + [ + "h0" + ] + ], + [ + "stepper1:A+", + "uno:4", + "green", + [ + "h0" + ] + ], + [ + "stepper1:B+", + "uno:5", + "green", + [ + "h0" + ] + ], + [ + "stepper1:B-", + "uno:6", + "green", + [ + "h0" + ] + ], + [ + "btn1:1.l", + "bb1:4t.c", + "", + [ + "$bb" + ] + ], + [ + "btn1:2.l", + "bb1:2t.c", + "", + [ + "$bb" + ] + ], + [ + "btn1:1.r", + "bb1:4b.h", + "", + [ + "$bb" + ] + ], + [ + "btn1:2.r", + "bb1:2b.h", + "", + [ + "$bb" + ] + ], + [ + "r1:1", + "bb1:58b.g", + "", + [ + "$bb" + ] + ], + [ + "temp1:GND", + "bb1:57t.c", + "", + [ + "$bb" + ] + ], + [ + "temp1:DQ", + "bb1:58t.c", + "", + [ + "$bb" + ] + ], + [ + "temp1:VCC", + "bb1:59t.c", + "", + [ + "$bb" + ] + ] ], "dependencies": {} } \ No newline at end of file From a4cd6d17963b7a75c9377dfaba70f3936fb0160d Mon Sep 17 00:00:00 2001 From: rafa Date: Fri, 23 May 2025 22:07:30 +0100 Subject: [PATCH 08/26] update lcd logic to work with diferent states controlled by the joystick --- code/LCDScreen.cpp | 54 +++++++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/code/LCDScreen.cpp b/code/LCDScreen.cpp index c81db86..df04b9d 100644 --- a/code/LCDScreen.cpp +++ b/code/LCDScreen.cpp @@ -2,7 +2,7 @@ #include enum LCDScreenState { - DISPLAY_DEFAULT_MESSAGE, + DISPLAY_DEFAULT_MESSAGE = 0, DISPLAY_TEMPERATURE, DISPLAY_PARKING_SPOTS }; @@ -11,10 +11,16 @@ class LCDScreen { private: LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27,20,4); - LCDScreenState state; + LCDScreenState current_state; String default_message = "Bem vindo!"; public: + LCDScreenState ordered_states[3] = { + DISPLAY_DEFAULT_MESSAGE, + DISPLAY_TEMPERATURE, + DISPLAY_PARKING_SPOTS + }; + LCDScreen(String default_message = ""){ if (default_message != ""){ this->default_message = default_message; @@ -32,10 +38,7 @@ class LCDScreen { } void display_temperature(float temp){ - if (this->state != DISPLAY_TEMPERATURE){ - this->clear(); - this->state = DISPLAY_TEMPERATURE; - } + lcd.setCursor(0, 0); lcd.print("Temp: "); lcd.print(temp,1); @@ -43,19 +46,13 @@ class LCDScreen { } void display_default_message(){ - if (this->state != DISPLAY_DEFAULT_MESSAGE){ - this->clear(); - this->state = DISPLAY_DEFAULT_MESSAGE; - } + lcd.setCursor(0, 0); lcd.print(this->default_message); } void display_parking_spots(int total_spots, int occupied_spots){ - if (this->state != DISPLAY_PARKING_SPOTS){ - this->clear(); - this->state = DISPLAY_PARKING_SPOTS; - } + int free_spots = total_spots - occupied_spots; lcd.setCursor(0, 0); lcd.print("Occupied: "); @@ -67,4 +64,31 @@ class LCDScreen { lcd.print(free_spots); } -}; \ No newline at end of file + LCDScreenState get_next_state(){ + return this->ordered_states[this->current_state + 1]; + } + + LCDScreenState get_previous_state(){ + return this->ordered_states[this->current_state - 1]; + } + + void set_state(LCDScreenState state){ + this->clear(); + this->current_state = state; + } + + void display(float temperature_in_c, int total_spots, int occupied_spots){ + switch(this->current_state){ + case DISPLAY_DEFAULT_MESSAGE: + this->display_default_message(); + break; + case DISPLAY_TEMPERATURE: + this->display_temperature(temperature_in_c); + break; + case DISPLAY_PARKING_SPOTS: + this->display_parking_spots(total_spots, occupied_spots); + break; + } + } + +}; From 19cd517153cfed8c8aeab7b012b14a759c0573c1 Mon Sep 17 00:00:00 2001 From: rafa Date: Fri, 23 May 2025 22:07:45 +0100 Subject: [PATCH 09/26] create joystick controller --- code/JoyStickController.cpp | 67 +++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 code/JoyStickController.cpp diff --git a/code/JoyStickController.cpp b/code/JoyStickController.cpp new file mode 100644 index 0000000..44428be --- /dev/null +++ b/code/JoyStickController.cpp @@ -0,0 +1,67 @@ +#import "Arduino.h" + +class JoySitkController { + + private: + int pin_x; + int pin_y; + int x = 1024 / 2; + int y = 1024 / 2; + + public: + JoySitkController(int pin_x, int pin_y) { + this->set_pin_x(pin_x); + this->set_pin_y(pin_y); + } + + void configure_pins() { + pinMode(this->pin_x, INPUT); + pinMode(this->pin_y, INPUT); + } + + int get_x() { + return this->x; + } + + int get_y() { + return this->y; + } + + void set_x(int x) { + this->x = x; + } + + void set_y(int y) { + this->y = y; + } + + int get_pin_x() { + return this->pin_x; + } + + void set_pin_x(int pin_x) { + this->pin_x = pin_x; + } + + int get_pin_y() { + return this->pin_y; + } + + void set_pin_y(int pin_y) { + this->pin_y = pin_y; + } + + void read(){ + this->set_y(analogRead(this->pin_y)); + this->set_x(analogRead(this->pin_x)); + } + + bool is_moving_right(){ + return this->get_x() < 512; + } + + bool is_moving_left(){ + return this->get_x() > 512; + } + +}; \ No newline at end of file From 40beda91da2f46c802ce16201292295941c7a310 Mon Sep 17 00:00:00 2001 From: rafa Date: Fri, 23 May 2025 22:08:03 +0100 Subject: [PATCH 10/26] Controll screen state with joystick --- code/code.ino | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/code/code.ino b/code/code.ino index 616ecac..6595f90 100644 --- a/code/code.ino +++ b/code/code.ino @@ -6,11 +6,14 @@ #include "DistSensor.cpp"; #include "LCDScreen.cpp"; #include "CarSpotController.cpp"; +#include "JoyStickController.cpp"; #define ULTRASONIC_SENSOR_PIN_TRIG 11 #define ULTRASONIC_SENSOR_PIN_ECHO 12 #define SERVO_PIN 10 #define TEMP_SENSOR_PIN 9 +#define JOYSTICK_X_PIN A1 +#define JOYSTICK_Y_PIN A0 OneWire oneWire(TEMP_SENSOR_PIN); DallasTemperature temperature_sensors(&oneWire); @@ -19,8 +22,9 @@ DistSensor dist_sensor = DistSensor(ULTRASONIC_SENSOR_PIN_TRIG, ULTRASONIC_SENSO Barrier barrier = Barrier(SERVO_PIN, 4); LCDScreen screen = LCDScreen(); CarSpotCOntroller car_spot_controller = CarSpotCOntroller(24); +JoySitkController joystick = JoySitkController(JOYSTICK_X_PIN, JOYSTICK_Y_PIN); -unsigned long current_time, sensor_last_time_activated, temperature_last_time_measured; +unsigned long current_time, sensor_last_time_activated, temperature_last_time_measured, joystick_last_time_activated; float temperature_in_c = 0; @@ -29,8 +33,8 @@ void setup() { dist_sensor.configure_pins(); barrier.configure_pins(); temperature_sensors.begin(); + joystick.configure_pins(); screen.init(); - } void loop() { @@ -55,8 +59,20 @@ void loop() { temperature_in_c = temperature_sensors.getTempCByIndex(0); } - //screen.display_temperature(temperature_in_c); + + joystick.read(); - screen.display_parking_spots(car_spot_controller.get_total_spots(), car_spot_controller.get_occupied_spots()); + if (joystick.is_moving_right() && current_time - joystick_last_time_activated >= 250){ + joystick_last_time_activated = current_time; + + screen.set_state((screen.get_next_state())); + } + if (joystick.is_moving_left() && current_time - joystick_last_time_activated >= 250){ + joystick_last_time_activated = current_time; + + screen.set_state(screen.get_previous_state()); + } + + screen.display(temperature_in_c,car_spot_controller.get_total_spots(), car_spot_controller.get_occupied_spots()); } From 4ece705c296ad7ef5fde7cf26b53aaf1135b2cd0 Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 00:42:16 +0100 Subject: [PATCH 11/26] fix: not detecting end of array(make it circular) --- code/LCDScreen.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/LCDScreen.cpp b/code/LCDScreen.cpp index df04b9d..fe197c7 100644 --- a/code/LCDScreen.cpp +++ b/code/LCDScreen.cpp @@ -65,10 +65,16 @@ class LCDScreen { } LCDScreenState get_next_state(){ + if (this->current_state == 2){ + return this->ordered_states[0]; + } return this->ordered_states[this->current_state + 1]; } LCDScreenState get_previous_state(){ + if (this->current_state == 0){ + return this->ordered_states[2]; + } return this->ordered_states[this->current_state - 1]; } From 6554a14a77c238ffc7f950d9861d6d208e7ed8d6 Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 00:42:49 +0100 Subject: [PATCH 12/26] Ring buzzer when parking lot is full --- code/CarSpotController.cpp | 4 ++++ code/code.ino | 20 ++++++++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/code/CarSpotController.cpp b/code/CarSpotController.cpp index bb040e2..300cab5 100644 --- a/code/CarSpotController.cpp +++ b/code/CarSpotController.cpp @@ -28,4 +28,8 @@ class CarSpotCOntroller { void increment_occupied_spots () { this->occupied_spots++; } + + bool is_full() { + return this->occupied_spots == this->total_spots; + } }; \ No newline at end of file diff --git a/code/code.ino b/code/code.ino index 6595f90..c5932a9 100644 --- a/code/code.ino +++ b/code/code.ino @@ -19,9 +19,9 @@ OneWire oneWire(TEMP_SENSOR_PIN); DallasTemperature temperature_sensors(&oneWire); DistSensor dist_sensor = DistSensor(ULTRASONIC_SENSOR_PIN_TRIG, ULTRASONIC_SENSOR_PIN_ECHO, 25.0); -Barrier barrier = Barrier(SERVO_PIN, 4); +Barrier barrier = Barrier(SERVO_PIN, 2); LCDScreen screen = LCDScreen(); -CarSpotCOntroller car_spot_controller = CarSpotCOntroller(24); +CarSpotCOntroller car_spot_controller = CarSpotCOntroller(2); JoySitkController joystick = JoySitkController(JOYSTICK_X_PIN, JOYSTICK_Y_PIN); unsigned long current_time, sensor_last_time_activated, temperature_last_time_measured, joystick_last_time_activated; @@ -44,8 +44,12 @@ void loop() { if (dist_sensor.is_in_range()){ sensor_last_time_activated = current_time; if(barrier.is_closed()){ - barrier.open(); - car_spot_controller.increment_occupied_spots(); + if (!car_spot_controller.is_full()){ + barrier.open(); + car_spot_controller.increment_occupied_spots(); + }else{ + tone(3, 262, 500); + } } } else if (!dist_sensor.is_in_range() && barrier.is_open()){ if (current_time - sensor_last_time_activated >= barrier.open_time_seconds * 1000){ @@ -64,15 +68,19 @@ void loop() { if (joystick.is_moving_right() && current_time - joystick_last_time_activated >= 250){ joystick_last_time_activated = current_time; - screen.set_state((screen.get_next_state())); } if (joystick.is_moving_left() && current_time - joystick_last_time_activated >= 250){ joystick_last_time_activated = current_time; - screen.set_state(screen.get_previous_state()); } + + + + + + screen.display(temperature_in_c,car_spot_controller.get_total_spots(), car_spot_controller.get_occupied_spots()); } From 170acfa84b8556f2f007d196e1b66ee6b7e703e2 Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 02:52:11 +0100 Subject: [PATCH 13/26] minor fixes --- code/CarSpotController.cpp | 4 ++-- code/JoyStickController.cpp | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/code/CarSpotController.cpp b/code/CarSpotController.cpp index 300cab5..44bf859 100644 --- a/code/CarSpotController.cpp +++ b/code/CarSpotController.cpp @@ -1,11 +1,11 @@ -class CarSpotCOntroller { +class CarSpotController { private: int total_spots; int occupied_spots; public: - CarSpotCOntroller(int default_total_spots) { + CarSpotController(int default_total_spots) { this->set_total_spots(default_total_spots); } diff --git a/code/JoyStickController.cpp b/code/JoyStickController.cpp index 44428be..5ece73c 100644 --- a/code/JoyStickController.cpp +++ b/code/JoyStickController.cpp @@ -1,6 +1,6 @@ #import "Arduino.h" -class JoySitkController { +class JoystickController { private: int pin_x; @@ -9,7 +9,7 @@ class JoySitkController { int y = 1024 / 2; public: - JoySitkController(int pin_x, int pin_y) { + JoystickController(int pin_x, int pin_y) { this->set_pin_x(pin_x); this->set_pin_y(pin_y); } @@ -57,10 +57,12 @@ class JoySitkController { } bool is_moving_right(){ + this->read(); return this->get_x() < 512; } bool is_moving_left(){ + this->read(); return this->get_x() > 512; } From 417052335ae1ff3cd5fc8647d35403bdabeef243 Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 02:52:48 +0100 Subject: [PATCH 14/26] update diagram --- diagram.json | 573 ++++++--------------------------------------------- 1 file changed, 63 insertions(+), 510 deletions(-) diff --git a/diagram.json b/diagram.json index 12f61e4..66ef5b0 100644 --- a/diagram.json +++ b/diagram.json @@ -3,61 +3,25 @@ "author": "Anonymous maker", "editor": "wokwi", "parts": [ - { - "type": "wokwi-breadboard", - "id": "bb1", - "top": 72.2, - "left": -524, - "attrs": {} - }, - { - "type": "wokwi-arduino-uno", - "id": "uno", - "top": -201, - "left": -691.8, - "attrs": {} - }, + { "type": "wokwi-breadboard", "id": "bb1", "top": 72.2, "left": -524, "attrs": {} }, + { "type": "wokwi-arduino-uno", "id": "uno", "top": -201, "left": -691.8, "attrs": {} }, { "type": "wokwi-servo", "id": "servo1", "top": -174.8, "left": -355.2, - "attrs": { - "hornColor": "#FFFF00" - } - }, - { - "type": "wokwi-hc-sr04", - "id": "ultrasonic1", - "top": -56.1, - "left": -378.5, - "attrs": {} - }, - { - "type": "board-ds18b20", - "id": "temp1", - "top": 94.87, - "left": 32.88, - "attrs": {} - }, - { - "type": "wokwi-ky-040", - "id": "encoder1", - "top": 164.9, - "left": -711.2, - "attrs": {} + "attrs": { "hornColor": "#FFFF00" } }, + { "type": "wokwi-hc-sr04", "id": "ultrasonic1", "top": -56.1, "left": -378.5, "attrs": {} }, + { "type": "board-ds18b20", "id": "temp1", "top": 94.87, "left": 32.88, "attrs": {} }, + { "type": "wokwi-ky-040", "id": "encoder1", "top": 164.9, "left": -711.2, "attrs": {} }, { "type": "wokwi-pushbutton", "id": "btn1", "top": 153.5, "left": -514.9, "rotate": 90, - "attrs": { - "color": "yellow", - "xray": "1", - "bounce": "1" - } + "attrs": { "color": "yellow", "xray": "1", "bounce": "1" } }, { "type": "wokwi-buzzer", @@ -65,9 +29,7 @@ "top": -242.7, "left": -369.9, "rotate": 90, - "attrs": { - "volume": "0.1" - } + "attrs": { "volume": "0.1" } }, { "type": "wokwi-analog-joystick", @@ -81,9 +43,7 @@ "id": "lcd1", "top": -272, "left": -128.8, - "attrs": { - "pins": "i2c" - } + "attrs": { "pins": "i2c" } }, { "type": "wokwi-resistor", @@ -91,9 +51,7 @@ "top": 225.6, "left": 18.65, "rotate": 90, - "attrs": { - "value": "4700" - } + "attrs": { "value": "4700" } }, { "type": "wokwi-stepper-motor", @@ -101,467 +59,62 @@ "top": -387.25, "left": -376.54, "rotate": 90, - "attrs": { - "size": "14" - } + "attrs": { "size": "14" } } ], "connections": [ - [ - "encoder1:DT", - "uno:A2", - "orange", - [ - "v0.1", - "h48", - "v-172.8", - "h82.4" - ] - ], - [ - "encoder1:CLK", - "uno:7", - "orange", - [ - "h57.6", - "v-278.4", - "h34.8" - ] - ], - [ - "encoder1:SW", - "uno:A3", - "orange", - [ - "v0.1", - "h67.2", - "v-172.8", - "h72.7" - ] - ], - [ - "uno:5V", - "bb1:tp.1", - "red", - [ - "v0" - ] - ], - [ - "uno:GND.2", - "bb1:tn.1", - "black", - [ - "v0" - ] - ], - [ - "bb1:tn.50", - "bb1:bn.50", - "black", - [ - "h28", - "v174" - ] - ], - [ - "bb1:tp.50", - "bb1:bp.50", - "red", - [ - "h37.6", - "v174" - ] - ], - [ - "bb1:bn.2", - "bb1:4b.j", - "black", - [ - "v0" - ] - ], - [ - "bb1:2t.b", - "uno:8", - "gold", - [ - "v-240", - "h-19.2", - "v-86.4" - ] - ], - [ - "bb1:59b.j", - "bb1:bp.48", - "red", - [ - "v0" - ] - ], - [ - "bb1:57b.j", - "bb1:bn.46", - "black", - [ - "v0" - ] - ], - [ - "encoder1:VCC", - "bb1:bp.1", - "red", - [ - "h57.6", - "v58.9" - ] - ], - [ - "encoder1:GND", - "bb1:bn.1", - "black", - [ - "h48", - "v59.7" - ] - ], - [ - "bz1:2", - "uno:3", - "red", - [ - "h-28.8", - "v-38.8", - "h-61.6" - ] - ], - [ - "bb1:bp.14", - "bb1:18b.j", - "green", - [ - "v0" - ] - ], - [ - "bb1:bn.16", - "bb1:21b.j", - "green", - [ - "v0" - ] - ], - [ - "bz1:1", - "bb1:tn.7", - "black", - [ - "h0" - ] - ], - [ - "bb1:tn.19", - "ultrasonic1:GND", - "black", - [ - "v0" - ] - ], - [ - "bb1:tp.16", - "ultrasonic1:VCC", - "red", - [ - "v-36.5", - "h-2" - ] - ], - [ - "ultrasonic1:TRIG", - "uno:11", - "violet", - [ - "v19.2", - "h-96.4", - "v-172.8", - "h-154.2" - ] - ], - [ - "ultrasonic1:ECHO", - "uno:12", - "green", - [ - "v28.8", - "h-116", - "v-163.2", - "h-154.1" - ] - ], - [ - "bb1:tp.9", - "servo1:V+", - "red", - [ - "v-94.1", - "h7.6", - "v-105.7" - ] - ], - [ - "bb1:tn.10", - "servo1:GND", - "black", - [ - "v0" - ] - ], - [ - "servo1:PWM", - "uno:10", - "orange", - [ - "h-124.8", - "v-19", - "h-58.3" - ] - ], - [ - "joystick1:GND", - "bb1:tn.36", - "black", - [ - "v57.6", - "h-55.6" - ] - ], - [ - "joystick1:VCC", - "bb1:tp.35", - "red", - [ - "v48", - "h-36.4" - ] - ], - [ - "joystick1:VERT", - "bb1:42t.a", - "green", - [ - "v67.2", - "h-56.4" - ] - ], - [ - "joystick1:HORZ", - "bb1:44t.a", - "blue", - [ - "v67.2", - "h-46.8" - ] - ], - [ - "bb1:42t.b", - "uno:A0", - "green", - [ - "v1.6", - "h-327.6", - "v-86.4", - "h-51.8" - ] - ], - [ - "bb1:44t.c", - "uno:A1", - "blue", - [ - "v1.6", - "h-337.2", - "v-105.6", - "h-51.9" - ] - ], - [ - "lcd1:GND", - "bb1:tn.28", - "black", - [ - "h0" - ] - ], - [ - "lcd1:VCC", - "bb1:tp.29", - "red", - [ - "h0" - ] - ], - [ - "lcd1:SDA", - "bb1:37b.f", - "gray", - [ - "h0" - ] - ], - [ - "lcd1:SCL", - "bb1:38b.f", - "purple", - [ - "h0" - ] - ], - [ - "bb1:59b.f", - "bb1:59t.e", - "red", - [ - "v0" - ] - ], - [ - "bb1:57b.f", - "bb1:57t.e", - "black", - [ - "v0" - ] - ], - [ - "uno:9", - "bb1:58t.d", - "blue", - [ - "v480", - "h519.2", - "v-136" - ] - ], - [ - "bb1:58b.f", - "bb1:58t.e", - "violet", - [ - "v0" - ] - ], - [ - "uno:A4", - "bb1:37b.g", - "gray", - [ - "v0" - ] - ], - [ - "uno:A5", - "bb1:38b.h", - "purple", - [ - "v0" - ] - ], - [ - "stepper1:A-", - "uno:2", - "green", - [ - "h0" - ] - ], - [ - "stepper1:A+", - "uno:4", - "green", - [ - "h0" - ] - ], - [ - "stepper1:B+", - "uno:5", - "green", - [ - "h0" - ] - ], - [ - "stepper1:B-", - "uno:6", - "green", - [ - "h0" - ] - ], - [ - "btn1:1.l", - "bb1:4t.c", - "", - [ - "$bb" - ] - ], - [ - "btn1:2.l", - "bb1:2t.c", - "", - [ - "$bb" - ] - ], - [ - "btn1:1.r", - "bb1:4b.h", - "", - [ - "$bb" - ] - ], - [ - "btn1:2.r", - "bb1:2b.h", - "", - [ - "$bb" - ] - ], - [ - "r1:1", - "bb1:58b.g", - "", - [ - "$bb" - ] - ], - [ - "temp1:GND", - "bb1:57t.c", - "", - [ - "$bb" - ] - ], - [ - "temp1:DQ", - "bb1:58t.c", - "", - [ - "$bb" - ] - ], - [ - "temp1:VCC", - "bb1:59t.c", - "", - [ - "$bb" - ] - ] + [ "encoder1:DT", "uno:A2", "orange", [ "v0.1", "h48", "v-172.8", "h82.4" ] ], + [ "encoder1:CLK", "uno:7", "orange", [ "h57.6", "v-278.4", "h34.8" ] ], + [ "encoder1:SW", "uno:A3", "orange", [ "v0.1", "h67.2", "v-172.8", "h72.7" ] ], + [ "uno:5V", "bb1:tp.1", "red", [ "v0" ] ], + [ "uno:GND.2", "bb1:tn.1", "black", [ "v0" ] ], + [ "bb1:tn.50", "bb1:bn.50", "black", [ "h28", "v174" ] ], + [ "bb1:tp.50", "bb1:bp.50", "red", [ "h37.6", "v174" ] ], + [ "bb1:bn.2", "bb1:4b.j", "black", [ "v0" ] ], + [ "bb1:2t.b", "uno:8", "gold", [ "v-240", "h-19.2", "v-86.4" ] ], + [ "bb1:59b.j", "bb1:bp.48", "red", [ "v0" ] ], + [ "bb1:57b.j", "bb1:bn.46", "black", [ "v0" ] ], + [ "encoder1:VCC", "bb1:bp.1", "red", [ "h57.6", "v58.9" ] ], + [ "encoder1:GND", "bb1:bn.1", "black", [ "h48", "v59.7" ] ], + [ "bz1:2", "uno:3", "red", [ "h-28.8", "v-38.8", "h-61.6" ] ], + [ "bb1:bp.14", "bb1:18b.j", "green", [ "v0" ] ], + [ "bb1:bn.16", "bb1:21b.j", "green", [ "v0" ] ], + [ "bz1:1", "bb1:tn.7", "black", [ "h0" ] ], + [ "bb1:tn.19", "ultrasonic1:GND", "black", [ "v0" ] ], + [ "bb1:tp.16", "ultrasonic1:VCC", "red", [ "v-36.5", "h-2" ] ], + [ "ultrasonic1:TRIG", "uno:11", "violet", [ "v19.2", "h-96.4", "v-172.8", "h-154.2" ] ], + [ "ultrasonic1:ECHO", "uno:12", "green", [ "v28.8", "h-116", "v-163.2", "h-154.1" ] ], + [ "bb1:tp.9", "servo1:V+", "red", [ "v-94.1", "h7.6", "v-105.7" ] ], + [ "bb1:tn.10", "servo1:GND", "black", [ "v0" ] ], + [ "servo1:PWM", "uno:10", "orange", [ "h-124.8", "v-19", "h-58.3" ] ], + [ "joystick1:GND", "bb1:tn.36", "black", [ "v57.6", "h-55.6" ] ], + [ "joystick1:VCC", "bb1:tp.35", "red", [ "v48", "h-36.4" ] ], + [ "joystick1:VERT", "bb1:42t.a", "green", [ "v67.2", "h-56.4" ] ], + [ "joystick1:HORZ", "bb1:44t.a", "blue", [ "v67.2", "h-46.8" ] ], + [ "bb1:42t.b", "uno:A0", "green", [ "v1.6", "h-327.6", "v-86.4", "h-51.8" ] ], + [ "bb1:44t.c", "uno:A1", "blue", [ "v1.6", "h-337.2", "v-105.6", "h-51.9" ] ], + [ "lcd1:GND", "bb1:tn.28", "black", [ "h0" ] ], + [ "lcd1:VCC", "bb1:tp.29", "red", [ "h0" ] ], + [ "lcd1:SDA", "bb1:37b.f", "gray", [ "h0" ] ], + [ "lcd1:SCL", "bb1:38b.f", "purple", [ "h0" ] ], + [ "bb1:59b.f", "bb1:59t.e", "red", [ "v0" ] ], + [ "bb1:57b.f", "bb1:57t.e", "black", [ "v0" ] ], + [ "uno:9", "bb1:58t.d", "blue", [ "v480", "h519.2", "v-136" ] ], + [ "bb1:58b.f", "bb1:58t.e", "violet", [ "v0" ] ], + [ "uno:A4", "bb1:37b.g", "gray", [ "v0" ] ], + [ "uno:A5", "bb1:38b.h", "purple", [ "v0" ] ], + [ "stepper1:A-", "uno:2", "green", [ "h0" ] ], + [ "stepper1:A+", "uno:4", "green", [ "h0" ] ], + [ "stepper1:B+", "uno:5", "green", [ "h0" ] ], + [ "stepper1:B-", "uno:6", "green", [ "h0" ] ], + [ "btn1:1.l", "bb1:4t.c", "", [ "$bb" ] ], + [ "btn1:2.l", "bb1:2t.c", "", [ "$bb" ] ], + [ "btn1:1.r", "bb1:4b.h", "", [ "$bb" ] ], + [ "btn1:2.r", "bb1:2b.h", "", [ "$bb" ] ], + [ "r1:1", "bb1:58b.g", "", [ "$bb" ] ], + [ "temp1:GND", "bb1:57t.c", "", [ "$bb" ] ], + [ "temp1:DQ", "bb1:58t.c", "", [ "$bb" ] ], + [ "temp1:VCC", "bb1:59t.c", "", [ "$bb" ] ] ], "dependencies": {} } \ No newline at end of file From ae0603fbab819cf0f6e4ca43b49eb9405460fd82 Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 02:53:19 +0100 Subject: [PATCH 15/26] add timers --- code/code.ino | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/code/code.ino b/code/code.ino index c5932a9..c64a1c5 100644 --- a/code/code.ino +++ b/code/code.ino @@ -21,10 +21,10 @@ DallasTemperature temperature_sensors(&oneWire); DistSensor dist_sensor = DistSensor(ULTRASONIC_SENSOR_PIN_TRIG, ULTRASONIC_SENSOR_PIN_ECHO, 25.0); Barrier barrier = Barrier(SERVO_PIN, 2); LCDScreen screen = LCDScreen(); -CarSpotCOntroller car_spot_controller = CarSpotCOntroller(2); -JoySitkController joystick = JoySitkController(JOYSTICK_X_PIN, JOYSTICK_Y_PIN); +CarSpotController car_spot_controller = CarSpotController(2); +JoystickController joystick = JoystickController(JOYSTICK_X_PIN, JOYSTICK_Y_PIN); -unsigned long current_time, sensor_last_time_activated, temperature_last_time_measured, joystick_last_time_activated; +unsigned long current_time, sensor_last_time_readed, sensor_last_time_activated, temperature_last_time_measured, joystick_last_time_activated, joystick_last_time_readed, screen_last_time_updated; float temperature_in_c = 0; @@ -37,50 +37,50 @@ void setup() { screen.init(); } + void loop() { current_time = millis(); - if (dist_sensor.is_in_range()){ - sensor_last_time_activated = current_time; - if(barrier.is_closed()){ - if (!car_spot_controller.is_full()){ - barrier.open(); - car_spot_controller.increment_occupied_spots(); - }else{ - tone(3, 262, 500); + if (current_time - sensor_last_time_readed >= 1000){ + if (dist_sensor.is_in_range()){ + sensor_last_time_activated = current_time; + if(barrier.is_closed()){ + if (!car_spot_controller.is_full()){ + barrier.open(); + car_spot_controller.increment_occupied_spots(); + }else{ + tone(3, 262, 500); + } + } + } else if (!dist_sensor.is_in_range() && barrier.is_open()){ + if (current_time - sensor_last_time_activated >= barrier.open_time_seconds * 1000){ + barrier.close(); } - } - } else if (!dist_sensor.is_in_range() && barrier.is_open()){ - if (current_time - sensor_last_time_activated >= barrier.open_time_seconds * 1000){ - barrier.close(); } } if (current_time - temperature_last_time_measured >= 1000){ temperature_last_time_measured = current_time; + temperature_sensors.setWaitForConversion(false); temperature_sensors.requestTemperatures(); temperature_in_c = temperature_sensors.getTempCByIndex(0); } - joystick.read(); - - if (joystick.is_moving_right() && current_time - joystick_last_time_activated >= 250){ + if (joystick.is_moving_right() && current_time - joystick_last_time_activated >= 450){ joystick_last_time_activated = current_time; screen.set_state((screen.get_next_state())); } - if (joystick.is_moving_left() && current_time - joystick_last_time_activated >= 250){ + if (joystick.is_moving_left() && current_time - joystick_last_time_activated >= 450){ joystick_last_time_activated = current_time; screen.set_state(screen.get_previous_state()); } - - - - - - screen.display(temperature_in_c,car_spot_controller.get_total_spots(), car_spot_controller.get_occupied_spots()); + if (current_time - screen_last_time_updated >= 500){ + screen_last_time_updated = current_time; + screen.display(temperature_in_c,car_spot_controller.get_total_spots(), car_spot_controller.get_occupied_spots()); + } } From 02aa26be94b49b63b758c12f8ef33bfa96619df8 Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 13:33:22 +0100 Subject: [PATCH 16/26] Change circuit diagram --- diagram.json | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/diagram.json b/diagram.json index 08ee8d5..065d6f3 100644 --- a/diagram.json +++ b/diagram.json @@ -3,7 +3,7 @@ "author": "Anonymous maker", "editor": "wokwi", "parts": [ - { "type": "wokwi-breadboard", "id": "bb1", "top": 73.8, "left": -525.2, "attrs": {} }, + { "type": "wokwi-breadboard", "id": "bb1", "top": 72.2, "left": -524, "attrs": {} }, { "type": "wokwi-arduino-uno", "id": "uno", "top": -201, "left": -691.8, "attrs": {} }, { "type": "wokwi-servo", @@ -13,13 +13,13 @@ "attrs": { "hornColor": "#FFFF00" } }, { "type": "wokwi-hc-sr04", "id": "ultrasonic1", "top": -56.1, "left": -378.5, "attrs": {} }, - { "type": "board-ds18b20", "id": "temp1", "top": 96.47, "left": 31.68, "attrs": {} }, + { "type": "board-ds18b20", "id": "temp1", "top": 94.87, "left": 32.88, "attrs": {} }, { "type": "wokwi-ky-040", "id": "encoder1", "top": 164.9, "left": -711.2, "attrs": {} }, { "type": "wokwi-pushbutton", "id": "btn1", - "top": 153, - "left": -515.4, + "top": 153.5, + "left": -514.9, "rotate": 90, "attrs": { "color": "yellow", "xray": "1", "bounce": "1" } }, @@ -48,8 +48,8 @@ { "type": "wokwi-resistor", "id": "r1", - "top": 227.2, - "left": 17.45, + "top": 225.6, + "left": 18.65, "rotate": 90, "attrs": { "value": "4700" } }, @@ -70,6 +70,8 @@ [ "uno:GND.2", "bb1:tn.1", "black", [ "v0" ] ], [ "bb1:tn.50", "bb1:bn.50", "black", [ "h28", "v174" ] ], [ "bb1:tp.50", "bb1:bp.50", "red", [ "h37.6", "v174" ] ], + [ "bb1:bn.2", "bb1:4b.j", "black", [ "v0" ] ], + [ "bb1:2t.b", "uno:8", "gold", [ "v-240", "h-19.2", "v-86.4" ] ], [ "bb1:59b.j", "bb1:bp.48", "red", [ "v0" ] ], [ "bb1:57b.j", "bb1:bn.46", "black", [ "v0" ] ], [ "encoder1:VCC", "bb1:bp.1", "red", [ "h57.6", "v58.9" ] ], @@ -105,14 +107,14 @@ [ "stepper1:A+", "uno:4", "green", [ "h0" ] ], [ "stepper1:B+", "uno:5", "green", [ "h0" ] ], [ "stepper1:B-", "uno:6", "green", [ "h0" ] ], - [ "btn1:1.l", "bb1:4t.c", "", [ "$bb" ] ], - [ "btn1:2.l", "bb1:2t.c", "", [ "$bb" ] ], - [ "btn1:1.r", "bb1:4b.h", "", [ "$bb" ] ], - [ "btn1:2.r", "bb1:2b.h", "", [ "$bb" ] ], [ "r1:1", "bb1:58b.g", "", [ "$bb" ] ], [ "temp1:GND", "bb1:57t.c", "", [ "$bb" ] ], [ "temp1:DQ", "bb1:58t.c", "", [ "$bb" ] ], - [ "temp1:VCC", "bb1:59t.c", "", [ "$bb" ] ] + [ "temp1:VCC", "bb1:59t.c", "", [ "$bb" ] ], + [ "btn1:1.l", "bb1:4t.c", "", [ "$bb" ] ], + [ "btn1:2.l", "bb1:2t.c", "", [ "$bb" ] ], + [ "btn1:1.r", "bb1:4b.h", "", [ "$bb" ] ], + [ "btn1:2.r", "bb1:2b.h", "", [ "$bb" ] ] ], "dependencies": {} } \ No newline at end of file From 82ea463b0ce4d4417f15f6a81d365908cfd569cc Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 13:34:23 +0100 Subject: [PATCH 17/26] modify the code for better readability --- code/LCDScreen.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/LCDScreen.cpp b/code/LCDScreen.cpp index 7bd3c39..fe197c7 100644 --- a/code/LCDScreen.cpp +++ b/code/LCDScreen.cpp @@ -24,14 +24,13 @@ class LCDScreen { LCDScreen(String default_message = ""){ if (default_message != ""){ this->default_message = default_message; - this->state = DISPLAY_DEFAULT_MESSAGE; } } void init(){ lcd.init(); lcd.backlight(); - this->display_message(default_message); + this->display_default_message(); } void clear(){ @@ -49,7 +48,7 @@ class LCDScreen { void display_default_message(){ lcd.setCursor(0, 0); - lcd.print(message); + lcd.print(this->default_message); } void display_parking_spots(int total_spots, int occupied_spots){ From a8bebfc0fc8c807e27b2ca5254d515cb3f0a8ef2 Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 13:34:56 +0100 Subject: [PATCH 18/26] add methods to decrement occupied spots and check if the parking lot is empty --- code/CarSpotController.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/CarSpotController.cpp b/code/CarSpotController.cpp index 44bf859..8a31e19 100644 --- a/code/CarSpotController.cpp +++ b/code/CarSpotController.cpp @@ -29,7 +29,15 @@ class CarSpotController { this->occupied_spots++; } + void decrement_occupied_spots () { + this->occupied_spots--; + } + bool is_full() { return this->occupied_spots == this->total_spots; } + + bool is_empty() { + return this->occupied_spots == 0; + } }; \ No newline at end of file From 6b4835d1daf6ecfd0579a18fe01d9b77f3125483 Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 13:35:06 +0100 Subject: [PATCH 19/26] add button controller --- code/ButtonController.cpp | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 code/ButtonController.cpp diff --git a/code/ButtonController.cpp b/code/ButtonController.cpp new file mode 100644 index 0000000..87ee7da --- /dev/null +++ b/code/ButtonController.cpp @@ -0,0 +1,40 @@ +#include + +class ButtonController { + + private: + int pin; + int new_value; + int old_value = HIGH; + + public: + ButtonController(int pin){ + this->set_pin(pin); + }; + + void configure_pins(){ + pinMode(this->pin, INPUT_PULLUP); + } + + void set_pin(int pin){ + this->pin = pin; + } + + void read(){ + this->new_value = digitalRead(this->pin); + } + + bool value_changed(){ + return (this->new_value != this->old_value); + } + + bool is_pressed(){ + if(this->value_changed()){ + bool is_pressed = (this->new_value == LOW); + this->old_value = this->new_value; + return is_pressed; + } + return this->new_value == LOW; + } + +}; \ No newline at end of file From 62d95a77999c9767e8d6c0aeeaac7acf616ffb53 Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 13:35:47 +0100 Subject: [PATCH 20/26] add button logic to open the barrier and decrement occupied spots --- code/code.ino | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/code/code.ino b/code/code.ino index 451aa6e..43b9502 100644 --- a/code/code.ino +++ b/code/code.ino @@ -7,6 +7,7 @@ #include "LCDScreen.cpp"; #include "CarSpotController.cpp"; #include "JoyStickController.cpp"; +#include "ButtonController.cpp"; #define PARK_SLOTS 3 #define ULTRASONIC_SENSOR_PIN_TRIG 11 @@ -16,6 +17,7 @@ #define JOYSTICK_X_PIN A1 #define JOYSTICK_Y_PIN A0 #define BUZZER_PIN 3 +#define BUTTON_PIN 8 OneWire oneWire(TEMP_SENSOR_PIN); DallasTemperature temperature_sensors(&oneWire); @@ -25,8 +27,10 @@ Barrier barrier = Barrier(SERVO_PIN, 2); LCDScreen screen = LCDScreen(); CarSpotController car_spot_controller = CarSpotController(2); JoystickController joystick = JoystickController(JOYSTICK_X_PIN, JOYSTICK_Y_PIN); +ButtonController button = ButtonController(BUTTON_PIN); -unsigned long current_time, sensor_last_time_readed, sensor_last_time_activated, temperature_last_time_measured, joystick_last_time_activated, joystick_last_time_readed, screen_last_time_updated; + +unsigned long current_time, sensor_last_time_readed, barrier_last_time_opened, temperature_last_time_measured, joystick_last_time_activated, joystick_last_time_readed, screen_last_time_updated; float temperature_in_c = 0; @@ -36,16 +40,28 @@ void setup() { barrier.configure_pins(); temperature_sensors.begin(); joystick.configure_pins(); + button.configure_pins(); screen.init(); } void loop() { + current_time = millis(); + button.read(); + + if (button.is_pressed()){ + barrier_last_time_opened = current_time; + if (!car_spot_controller.is_empty() && barrier.is_closed()){ + barrier.open(); + car_spot_controller.decrement_occupied_spots(); + } + } + if (current_time - sensor_last_time_readed >= 1000){ if (dist_sensor.is_in_range()){ - sensor_last_time_activated = current_time; + barrier_last_time_opened = current_time; if(barrier.is_closed()){ if (!car_spot_controller.is_full()){ barrier.open(); @@ -55,7 +71,7 @@ void loop() { } } } else if (!dist_sensor.is_in_range() && barrier.is_open()){ - if (current_time - sensor_last_time_activated >= barrier.open_time_seconds * 1000){ + if (current_time - barrier_last_time_opened >= barrier.open_time_seconds * 1000 && !button.is_pressed()){ barrier.close(); } } From a5760caad3430cf7d35f376d23f53965885ce6dc Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 13:51:17 +0100 Subject: [PATCH 21/26] Add Stepper motor logic --- code/code.ino | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/code/code.ino b/code/code.ino index 43b9502..93c35dd 100644 --- a/code/code.ino +++ b/code/code.ino @@ -1,6 +1,7 @@ #include #include #include +#include #include "Barrier.cpp"; #include "DistSensor.cpp"; @@ -9,7 +10,6 @@ #include "JoyStickController.cpp"; #include "ButtonController.cpp"; -#define PARK_SLOTS 3 #define ULTRASONIC_SENSOR_PIN_TRIG 11 #define ULTRASONIC_SENSOR_PIN_ECHO 12 #define SERVO_PIN 10 @@ -19,16 +19,19 @@ #define BUZZER_PIN 3 #define BUTTON_PIN 8 +#define PARK_SLOTS 3 +#define STEP_MOTOR_STEPS 200 + OneWire oneWire(TEMP_SENSOR_PIN); DallasTemperature temperature_sensors(&oneWire); DistSensor dist_sensor = DistSensor(ULTRASONIC_SENSOR_PIN_TRIG, ULTRASONIC_SENSOR_PIN_ECHO, 25.0); Barrier barrier = Barrier(SERVO_PIN, 2); LCDScreen screen = LCDScreen(); -CarSpotController car_spot_controller = CarSpotController(2); +CarSpotController car_spot_controller = CarSpotController(PARK_SLOTS); JoystickController joystick = JoystickController(JOYSTICK_X_PIN, JOYSTICK_Y_PIN); ButtonController button = ButtonController(BUTTON_PIN); - +Stepper stepper(STEP_MOTOR_STEPS, 6, 5, 4, 2); unsigned long current_time, sensor_last_time_readed, barrier_last_time_opened, temperature_last_time_measured, joystick_last_time_activated, joystick_last_time_readed, screen_last_time_updated; @@ -41,6 +44,7 @@ void setup() { temperature_sensors.begin(); joystick.configure_pins(); button.configure_pins(); + stepper.setSpeed(60); screen.init(); } @@ -55,6 +59,7 @@ void loop() { barrier_last_time_opened = current_time; if (!car_spot_controller.is_empty() && barrier.is_closed()){ barrier.open(); + stepper.step(STEP_MOTOR_STEPS); car_spot_controller.decrement_occupied_spots(); } } @@ -66,6 +71,7 @@ void loop() { if (!car_spot_controller.is_full()){ barrier.open(); car_spot_controller.increment_occupied_spots(); + stepper.step(STEP_MOTOR_STEPS); }else{ tone(BUZZER_PIN, 262, 500); } @@ -73,6 +79,7 @@ void loop() { } else if (!dist_sensor.is_in_range() && barrier.is_open()){ if (current_time - barrier_last_time_opened >= barrier.open_time_seconds * 1000 && !button.is_pressed()){ barrier.close(); + stepper.step(-STEP_MOTOR_STEPS); } } } From 1fecdaee619d73fc1495072a05ae202310b755d1 Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 13:57:42 +0100 Subject: [PATCH 22/26] Config sttep motor pins with #define constants --- code/code.ino | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/code.ino b/code/code.ino index 93c35dd..ec0e817 100644 --- a/code/code.ino +++ b/code/code.ino @@ -18,6 +18,10 @@ #define JOYSTICK_Y_PIN A0 #define BUZZER_PIN 3 #define BUTTON_PIN 8 +#define STEPPER_B_MINUS_PIN 6 +#define STEPPER_B_PLUS_PIN 5 +#define STEPPER_A_PLUS_PIN 4 +#define STEPPER_A_MINUS_PIN 2 #define PARK_SLOTS 3 #define STEP_MOTOR_STEPS 200 @@ -31,7 +35,7 @@ LCDScreen screen = LCDScreen(); CarSpotController car_spot_controller = CarSpotController(PARK_SLOTS); JoystickController joystick = JoystickController(JOYSTICK_X_PIN, JOYSTICK_Y_PIN); ButtonController button = ButtonController(BUTTON_PIN); -Stepper stepper(STEP_MOTOR_STEPS, 6, 5, 4, 2); +Stepper stepper(STEP_MOTOR_STEPS, STEPPER_B_MINUS_PIN, STEPPER_B_PLUS_PIN, STEPPER_A_PLUS_PIN, STEPPER_A_MINUS_PIN); unsigned long current_time, sensor_last_time_readed, barrier_last_time_opened, temperature_last_time_measured, joystick_last_time_activated, joystick_last_time_readed, screen_last_time_updated; From bb933c847b6550c44166658bfc36ca2248ad2803 Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 14:59:09 +0100 Subject: [PATCH 23/26] Remove delay from dist sensor --- code/DistSensor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/DistSensor.cpp b/code/DistSensor.cpp index abe839b..1fdaa39 100644 --- a/code/DistSensor.cpp +++ b/code/DistSensor.cpp @@ -9,7 +9,7 @@ class DistSensor { void make_measurement(){ digitalWrite(this->trig_pin, HIGH); - delayMicroseconds(10); + //delayMicroseconds(10); digitalWrite(this->trig_pin, LOW); } From 32696420021d5da818ffad681a97eb427c847920 Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 18:48:22 +0100 Subject: [PATCH 24/26] Add encoder controller --- code/EncoderController.cpp | 90 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 code/EncoderController.cpp diff --git a/code/EncoderController.cpp b/code/EncoderController.cpp new file mode 100644 index 0000000..4ce0598 --- /dev/null +++ b/code/EncoderController.cpp @@ -0,0 +1,90 @@ +#include + +enum EncoderDirection { + COUNTERCLOCKWISE = 2, + STOPPED = 0, + CLOCKWISE = 1, +}; + +enum ButtonState { + PRESSED = 0, + RELEASED = 1, +}; + +class EncoderController { + + private: + int pin_clk; + int pin_dt; + int last_clk = HIGH; + int new_clk; + int dt_value; + EncoderDirection current_direction; + int pin_btn; + int button; + bool last_button_state = HIGH; // começa como solto + bool button_click_registered = false; + + public: + EncoderController(int pin_dt, int pin_clk, int pin_btn) { + this->pin_dt = pin_dt; + this->pin_clk = pin_clk; + this->pin_btn = pin_btn; + } + + void configure_pins() { + pinMode(this->pin_dt, INPUT_PULLUP); + pinMode(this->pin_clk, INPUT_PULLUP); + pinMode(this->pin_btn, INPUT_PULLUP); + } + + bool clk_pin_changed(){ + this->new_clk = digitalRead(this->pin_clk); + return this->new_clk != this->last_clk; + } + + void read(){ + if (this->clk_pin_changed()) { + this->last_clk = this->new_clk; + this->dt_value = digitalRead(this->pin_dt); + if (this->new_clk == LOW && this->dt_value == HIGH) { + + this->current_direction = CLOCKWISE; + } + if (this->new_clk == LOW && this->dt_value == LOW) { + + this->current_direction = COUNTERCLOCKWISE; + } + } + + int current_state = digitalRead(this->pin_btn); + if (this->last_button_state == HIGH && current_state == LOW) { + this->button_click_registered = true; + } + this->last_button_state = current_state; + } + + bool rotated_clockwise(){ + if(this->current_direction == CLOCKWISE){ + this->current_direction = STOPPED; + return true; + } + return false; + } + + bool rotated_counterclockwise(){ + if(this->current_direction == COUNTERCLOCKWISE){ + this->current_direction = STOPPED; + return true; + } + return false; + } + + bool button_pressed(){ + if (this->button_click_registered) { + this->button_click_registered = false; + return true; + } + return false; + } +}; \ No newline at end of file From 1518fbf51a8babe90a909d9c42f53c267ee8642f Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 18:48:38 +0100 Subject: [PATCH 25/26] add methods to incement and decrement total spots --- code/CarSpotController.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/CarSpotController.cpp b/code/CarSpotController.cpp index 8a31e19..85e919d 100644 --- a/code/CarSpotController.cpp +++ b/code/CarSpotController.cpp @@ -29,6 +29,14 @@ class CarSpotController { this->occupied_spots++; } + void increment_total_spots () { + this->total_spots++; + } + + void decrement_total_spots () { + this->total_spots--; + } + void decrement_occupied_spots () { this->occupied_spots--; } From 5b2e505571aeaf1aea38264adaf271c1be2a3945 Mon Sep 17 00:00:00 2001 From: rafa Date: Sat, 24 May 2025 18:48:58 +0100 Subject: [PATCH 26/26] add conf mode, with encoder to regulate parking spots --- code/LCDScreen.cpp | 22 +++++++++++++-- code/code.ino | 68 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 80 insertions(+), 10 deletions(-) diff --git a/code/LCDScreen.cpp b/code/LCDScreen.cpp index fe197c7..6eb2ce3 100644 --- a/code/LCDScreen.cpp +++ b/code/LCDScreen.cpp @@ -4,14 +4,15 @@ enum LCDScreenState { DISPLAY_DEFAULT_MESSAGE = 0, DISPLAY_TEMPERATURE, - DISPLAY_PARKING_SPOTS + DISPLAY_PARKING_SPOTS, + CONFIGURATION_SCREEN }; class LCDScreen { private: LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27,20,4); - LCDScreenState current_state; + LCDScreenState current_state = 0; String default_message = "Bem vindo!"; public: @@ -64,6 +65,23 @@ class LCDScreen { lcd.print(free_spots); } + void display_configuration_screen(int total_spots){ + if (this->current_state != CONFIGURATION_SCREEN){ + this->current_state = CONFIGURATION_SCREEN; + this->clear(); + lcd.setCursor(0, 0); + lcd.print("Conf. Mode"); + } + lcd.setCursor(0, 1); + lcd.print("Total Spots = "); + if (total_spots < 10){ + lcd.print("0"); + lcd.print(total_spots); + }else { + lcd.print(total_spots); + } + } + LCDScreenState get_next_state(){ if (this->current_state == 2){ return this->ordered_states[0]; diff --git a/code/code.ino b/code/code.ino index ec0e817..a22e73e 100644 --- a/code/code.ino +++ b/code/code.ino @@ -9,6 +9,7 @@ #include "CarSpotController.cpp"; #include "JoyStickController.cpp"; #include "ButtonController.cpp"; +#include "EncoderController.cpp"; #define ULTRASONIC_SENSOR_PIN_TRIG 11 #define ULTRASONIC_SENSOR_PIN_ECHO 12 @@ -22,10 +23,18 @@ #define STEPPER_B_PLUS_PIN 5 #define STEPPER_A_PLUS_PIN 4 #define STEPPER_A_MINUS_PIN 2 +#define ENCODER_CLK_PIN 7 +#define ENCODER_DT_PIN A2 +#define ENCODER_SW_PIN A3 #define PARK_SLOTS 3 #define STEP_MOTOR_STEPS 200 +enum ProgramState { + CONFIG_MODE, + APP_MODE +}; + OneWire oneWire(TEMP_SENSOR_PIN); DallasTemperature temperature_sensors(&oneWire); @@ -36,29 +45,69 @@ CarSpotController car_spot_controller = CarSpotController(PARK_SLOTS); JoystickController joystick = JoystickController(JOYSTICK_X_PIN, JOYSTICK_Y_PIN); ButtonController button = ButtonController(BUTTON_PIN); Stepper stepper(STEP_MOTOR_STEPS, STEPPER_B_MINUS_PIN, STEPPER_B_PLUS_PIN, STEPPER_A_PLUS_PIN, STEPPER_A_MINUS_PIN); +EncoderController encoder = EncoderController(ENCODER_DT_PIN, ENCODER_CLK_PIN,ENCODER_SW_PIN); -unsigned long current_time, sensor_last_time_readed, barrier_last_time_opened, temperature_last_time_measured, joystick_last_time_activated, joystick_last_time_readed, screen_last_time_updated; +unsigned long current_time, sensor_last_time_readed, barrier_last_time_opened, temperature_last_time_measured, joystick_last_time_activated, joystick_last_time_readed, screen_last_time_updated, encoder_last_time_readed; float temperature_in_c = 0; +ProgramState program_state = CONFIG_MODE; + void setup() { - Serial.begin(9600); + Serial.begin(115200); dist_sensor.configure_pins(); barrier.configure_pins(); temperature_sensors.begin(); joystick.configure_pins(); button.configure_pins(); stepper.setSpeed(60); + encoder.configure_pins(); screen.init(); } - void loop() { current_time = millis(); + + switch (program_state){ + case CONFIG_MODE: + run_config_mode(); + break; + case APP_MODE: + run_program(); + break; + } +} +void run_config_mode (){ + static bool is_first_time = true; + if (is_first_time){ + screen.display_configuration_screen(car_spot_controller.get_total_spots()); + is_first_time = false; + } + encoder.read(); + if (encoder.rotated_clockwise()){ + if (car_spot_controller.get_total_spots() < 15){ + car_spot_controller.increment_total_spots(); + screen.display_configuration_screen(car_spot_controller.get_total_spots()); + } + } + if (encoder.rotated_counterclockwise()){ + if (car_spot_controller.get_total_spots() > 1 && car_spot_controller.get_occupied_spots() < car_spot_controller.get_total_spots()){ + car_spot_controller.decrement_total_spots(); + screen.display_configuration_screen(car_spot_controller.get_total_spots()); + } + } + if (encoder.button_pressed()){ + program_state = APP_MODE; + screen.set_state(0); + return; + } +} + +void run_program(){ + button.read(); - if (button.is_pressed()){ barrier_last_time_opened = current_time; if (!car_spot_controller.is_empty() && barrier.is_closed()){ @@ -88,7 +137,6 @@ void loop() { } } - if (current_time - temperature_last_time_measured >= 1000){ temperature_last_time_measured = current_time; temperature_sensors.setWaitForConversion(false); @@ -96,7 +144,6 @@ void loop() { temperature_in_c = temperature_sensors.getTempCByIndex(0); } - if (joystick.is_moving_right() && current_time - joystick_last_time_activated >= 450){ joystick_last_time_activated = current_time; screen.set_state((screen.get_next_state())); @@ -106,10 +153,15 @@ void loop() { screen.set_state(screen.get_previous_state()); } - if (current_time - screen_last_time_updated >= 500){ screen_last_time_updated = current_time; screen.display(temperature_in_c,car_spot_controller.get_total_spots(), car_spot_controller.get_occupied_spots()); } -} + encoder.read(); + if (encoder.button_pressed()){ + program_state = CONFIG_MODE; + screen.display_configuration_screen(car_spot_controller.get_total_spots()); + return; + } +} \ No newline at end of file