Você está na página 1de 31

Trabalho 2: Arduino e Hardware

Alexandre Oliveira - a48130


Nuno Fernandes - a43994
Younes Chennafi - a43985

Trabalho realizado sob a orientação de


José Lima

Curso de Engenharia Informática


Relatório da UC de Sistemas Embebidos
2022-2023
Trabalho 2: Arduino e Hardware

Relatório da UC de Sistemas Embebidos


Curso de Engenharia Informática
Escola Superior de Tecnologia e Gestão

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.

Alexandre Oliveira - a48130

Nuno Fernandes - a43994


Younes Chennafi - a43985
Conteúdo

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

2.1 Tabela de conexões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4


2.2 Tabela de conexões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

4.1 Simulação do código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

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

2.1 Dados do Projeto

Segue-se em baixo a descrição do trabalho realizado

• Buzzer - Usar quando o sensor de movimento detectar a cancela levantar.

• 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).

• Led - Piscar quando o sensor se movimento detectar algum movimento, quando o


garagem estiver em manuntenção E também quando a cancela levantar fica verde,
baixar fica vermelho Verde quando garagem disponivel e vermelho quando e ma-
nuntenção

• Joystick - Usar para controlar o Servo Motor em caso o o sensor de movimento não
funcionar

• HC-SR04 (Sensor de movimento) - Usar para determinar movimentos

• DS18B20 (Sensor de temperatura) - Usar para determinar a temperatura ambiente

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

• Mostrar no LCD a cancela abrir, fechar e quantas pessoas ou viaturas passaram no


estacionamento

2.2 Tabela de conexões


Segue-se em baixo a tabela das conexões do enunciado

Figura 2.1: Tabela de conexões

4
Figura 2.2: Tabela de conexões

5
6
Capítulo 3

Código Implementado

3.1 Código Implementado


#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;
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);

// Configuração do sensor de temperatura


OneWire oneWire(temperaturePin);
DallasTemperature sensors(&oneWire);

// Definição do Servo Motor


Servo servoMotor;

// 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 ...");

// Inicialização dos componentes


pinMode(buttonPin, INPUT);

8
pinMode(buzzerPin, OUTPUT);
pinMode(triggerPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(stepMotorAPin, OUTPUT);
pinMode(stepMotorBPin, OUTPUT);
pinMode(stepMotorCPin, OUTPUT);
pinMode(stepMotorDPin, OUTPUT);

// Inicialização do Servo Motor


servoMotor.attach(servoPin);

// Inicialização do sensor de temperatura


sensors.begin();

// Aguarda 1 segundos para inicialização dos componentes


delay(1000);

// 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);
}

// Verifica a detecção de movimento


if (detectMotion()) {
motionCount++;
blinkLED();
playBuzzer();
openGate();
lcd.setCursor(0, 1);
lcd.print("Cancela: Aberta ");
delay(1000);
closeGate();
lcd.setCursor(0, 1);
lcd.print("Cancela: Fechada ");
delay(1000);
}

// Atualiza o LCD com a temperatura ambiente


updateTemperature();

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);

int servoAngle = map(joystickXValue, 0, 1023, 0, 180);


servoMotor.write(servoAngle);

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

Figura 4.1: Simulação do código

15
Apêndice A

Apêndice

A.1 Código

A.2 Código Implementado

#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);

// Configuração do sensor de temperatura


OneWire oneWire(temperaturePin);
DallasTemperature sensors(&oneWire);

// Definição do Servo Motor


Servo servoMotor;

// 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);

// Inicialização do Servo Motor


servoMotor.attach(servoPin);

// Inicialização do sensor de temperatura


sensors.begin();

// Aguarda 1 segundos para inicialização dos componentes


delay(1000);

// 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);
}

// Verifica a detecção de movimento


if (detectMotion()) {
motionCount++;
blinkLED();
playBuzzer();
openGate();
lcd.setCursor(0, 1);
lcd.print("Cancela: Aberta ");
delay(1000);
closeGate();
lcd.setCursor(0, 1);
lcd.print("Cancela: Fechada ");
delay(1000);
}

// Atualiza o LCD com a temperatura ambiente


updateTemperature();

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);

int servoAngle = map(joystickXValue, 0, 1023, 0, 180);


servoMotor.write(servoAngle);

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

Você também pode gostar