Trabalho 2: Arduino e Hardware: Alexandre Oliveira - A48130 Nuno Fernandes - A43994 Younes Chennafi - A43985
Trabalho 2: Arduino e Hardware: Alexandre Oliveira - A48130 Nuno Fernandes - A43994 Younes Chennafi - A43985
Trabalho 2: Arduino e Hardware: Alexandre Oliveira - A48130 Nuno Fernandes - A43994 Younes Chennafi - A43985
2022-2023
A Escola Superior de Tecnologia e de Gestão não se responsabiliza pelas opiniões
expressas neste relatório.
Declaro que o trabalho descrito neste relatório é da nossa autoria e é
da nossa vontade que o mesmo seja submetido a avaliação.
1 Introdução 1
1.1 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2 Descrição do projeto 3
2.1 Dados do Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Tabela de conexões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3 Código Implementado 7
3.1 Código Implementado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4 Simulação 15
4.1 Simulação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
A Apêndice A1
A.1 Código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A1
A.2 Código Implementado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A1
vii
Lista de Figuras
viii
Capítulo 1
Introdução
Durante a cadeira de Sistemas Embebidos temos vindo a estudar uma série de comandos
da linguagem arduino, e para vincar esse estudo, realizámos o trabalho que se segue.
1.1 Objetivos
O objetivo deste trabalho passa pelo desenvolvimento de um sistema de parque de esta-
cionamento de automóvies, que conta o número de automóvies que entraram no mesmo,
o estado da passagem(aberta, fechada ou em manutenção) bem como a temperatura re-
gistada.
1
2
Capítulo 2
Descrição do projeto
• Servo Motor - Usar como cancela quando o sensor de moviemento detectar algum
carro. Usar em junção com o joystick e movimentar em caso o sensor de moviemento
não funcionar (manualmente).
• Joystick - Usar para controlar o Servo Motor em caso o o sensor de movimento não
funcionar
3
• LCD - Usar em junção com o sensor de temperatura e fazer com que apareça a
temperatura no display Quando a cancela levantar mostrar aberto e quando baixa
mostrar fechado
• Push button - faz Com que a luz fique verde para disponível ou vermelho para
indisponível ao acesso
4
Figura 2.2: Tabela de conexões
5
6
Capítulo 3
Código Implementado
// Pins do hardware
int buttonPin = 8;
int temperaturePin = 9;
int buzzerPin = 3;
int triggerPin = 11;
int echoPin = 12;
int servoPin = 10;
int ledGreenPin = A5;
int ledRedPin = A4;
int stepMotorAPin = 2;
int stepMotorBPin = 4;
int stepMotorCPin = 5;
7
int stepMotorDPin = 6;
int joystickXPin = A1;
int joystickYPin = A0;
int vehicleCount = 0;
// Definição do LCD
DFRobot_RGBLCD1602 lcd(16, 2);
// Variáveis globais
int motionCount = 0;
bool maintenanceMode = false;
void setup() {
// Inicialização do LCD
lcd.init();
lcd.setCursor(0, 0);
lcd.setRGB(255, 255, 0);
lcd.setCursor(0, 1);
lcd.print("Inicializar ...");
8
pinMode(buzzerPin, OUTPUT);
pinMode(triggerPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(stepMotorAPin, OUTPUT);
pinMode(stepMotorBPin, OUTPUT);
pinMode(stepMotorCPin, OUTPUT);
pinMode(stepMotorDPin, OUTPUT);
// Limpa o LCD
lcd.clear();
}
void loop() {
// Verifica se o botão foi pressionado
if (digitalRead(buttonPin) == HIGH) {
maintenanceMode = !maintenanceMode;
updateLED();
lcd.setCursor(0, 1);
lcd.print("Manutencao ...");
delay(500);
lcd.setCursor(0, 1);
delay(500);
9
}
else{
maintenanceMode = !maintenanceMode;
updateLED();
lcd.setCursor(0, 1);
lcd.print("Disponivel ");
delay(500);
lcd.setCursor(0, 1);
delay(500);
}
lcd.setCursor(0, 0);
lcd.print("Veiculos: ");
10
lcd.print(vehicleCount);
lcd.print(" ");
// Controla o Servo Motor usando o Joystick
controlServoMotor();
}
bool detectMotion() {
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
unsigned long duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.034 / 2;
// Faz a contagem de quantos veiculos passaram pela cancela
if (distance < 20) {
vehicleCount++;
return true;
} else {
return false;
}
}
void blinkLED() {
for (int i = 0; i < 3; i++) {
digitalWrite(ledGreenPin, HIGH);
digitalWrite(ledRedPin, LOW);
delay(500);
digitalWrite(ledGreenPin, LOW);
digitalWrite(ledRedPin, HIGH);
delay(500);
11
}
updateLED();
}
void updateLED() {
if (maintenanceMode) {
digitalWrite(ledGreenPin, LOW);
digitalWrite(ledRedPin, HIGH);
} else {
digitalWrite(ledGreenPin, HIGH);
digitalWrite(ledRedPin, LOW);
}
}
void playBuzzer() {
tone(buzzerPin, 1000, 500);
delay(500);
noTone(buzzerPin);
}
void openGate() {
servoMotor.write(180); // Altere o valor conforme necessário para a posição de abertura
}
void closeGate() {
servoMotor.write(0); // Altere o valor conforme necessário para a posição de fechamento
}
void updateTemperature() {
float temperature = getTemperature();
lcd.setCursor(0, 1);
12
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C ");
delay(1000);
}
float getTemperature() {
// Solicita a leitura da temperatura
sensors.requestTemperatures();
// Lê a temperatura em Celsius
float temperature = sensors.getTempCByIndex(0);
return temperature;
}
void controlServoMotor() {
int joystickXValue = analogRead(joystickXPin);
int joystickYValue = analogRead(joystickYPin);
if (servoAngle == 0) {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Cancela: Fechada ");
} else if (servoAngle == 180) {
lcd.clear();
lcd.setCursor(0, 0);
13
lcd.print("Cancela: Aberta ");
}
delay(100);
}
14
Capítulo 4
Simulação
4.1 Simulação
Segue-se em baixo a simulação do código
15
Apêndice A
Apêndice
A.1 Código
#include <Wire.h>
#include <DFRobot_RGBLCD1602.h>
#include <Servo.h>
#include <DallasTemperature.h>
#include <OneWire.h>
// Pins do hardware
int buttonPin = 8;
int temperaturePin = 9;
int buzzerPin = 3;
int triggerPin = 11;
int echoPin = 12;
int servoPin = 10;
int ledGreenPin = A5;
int ledRedPin = A4;
A1
int stepMotorAPin = 2;
int stepMotorBPin = 4;
int stepMotorCPin = 5;
int stepMotorDPin = 6;
int joystickXPin = A1;
int joystickYPin = A0;
int vehicleCount = 0;
// Definição do LCD
DFRobot_RGBLCD1602 lcd(16, 2);
// Variáveis globais
int motionCount = 0;
bool maintenanceMode = false;
void setup() {
// Inicialização do LCD
lcd.init();
lcd.setCursor(0, 0);
lcd.setRGB(255, 255, 0);
lcd.setCursor(0, 1);
lcd.print("Inicializar ...");
A2
// Inicialização dos componentes
pinMode(buttonPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(triggerPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(stepMotorAPin, OUTPUT);
pinMode(stepMotorBPin, OUTPUT);
pinMode(stepMotorCPin, OUTPUT);
pinMode(stepMotorDPin, OUTPUT);
// Limpa o LCD
lcd.clear();
}
void loop() {
// Verifica se o botão foi pressionado
if (digitalRead(buttonPin) == HIGH) {
maintenanceMode = !maintenanceMode;
updateLED();
lcd.setCursor(0, 1);
lcd.print("Manutencao ...");
A3
delay(500);
lcd.setCursor(0, 1);
delay(500);
}
else{
maintenanceMode = !maintenanceMode;
updateLED();
lcd.setCursor(0, 1);
lcd.print("Disponivel ");
delay(500);
lcd.setCursor(0, 1);
delay(500);
}
A4
lcd.setCursor(0, 0);
lcd.print("Veiculos: ");
lcd.print(vehicleCount);
lcd.print(" ");
// Controla o Servo Motor usando o Joystick
controlServoMotor();
}
bool detectMotion() {
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
unsigned long duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.034 / 2;
// Faz a contagem de quantos veiculos passaram pela cancela
if (distance < 20) {
vehicleCount++;
return true;
} else {
return false;
}
}
void blinkLED() {
for (int i = 0; i < 3; i++) {
digitalWrite(ledGreenPin, HIGH);
digitalWrite(ledRedPin, LOW);
delay(500);
A5
digitalWrite(ledGreenPin, LOW);
digitalWrite(ledRedPin, HIGH);
delay(500);
}
updateLED();
}
void updateLED() {
if (maintenanceMode) {
digitalWrite(ledGreenPin, LOW);
digitalWrite(ledRedPin, HIGH);
} else {
digitalWrite(ledGreenPin, HIGH);
digitalWrite(ledRedPin, LOW);
}
}
void playBuzzer() {
tone(buzzerPin, 1000, 500);
delay(500);
noTone(buzzerPin);
}
void openGate() {
servoMotor.write(180); // Altere o valor conforme necessário para a posição de abertura
}
void closeGate() {
servoMotor.write(0); // Altere o valor conforme necessário para a posição de fechamento
}
A6
void updateTemperature() {
float temperature = getTemperature();
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C ");
delay(1000);
}
float getTemperature() {
// Solicita a leitura da temperatura
sensors.requestTemperatures();
// Lê a temperatura em Celsius
float temperature = sensors.getTempCByIndex(0);
return temperature;
}
void controlServoMotor() {
int joystickXValue = analogRead(joystickXPin);
int joystickYValue = analogRead(joystickYPin);
if (servoAngle == 0) {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Cancela: Fechada ");
A7
} else if (servoAngle == 180) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Cancela: Aberta ");
}
delay(100);
}
A8