Prévia do material em texto
SISTEMA DE ENSINO 100% OLINE ENGENHARIA ELÉTRICA NOME DO ALUNO SISTEMAS DIGITAIS E MICROPROCESSADORES AULA PRÁTICA NOME DO ALUNO SISTEMAS DIGITAIS E MICROPROCESSADORES AULA PRÁTICA Atividade Prática Individual da disciplina de Sistemas Digitais e Microprocessadores realizada no Curso de Engenharia Elétrica, valendo como requisito parcial para a obtenção de nota para compor a média semestral. Tutor à Distância: nome do tutor CIDADE 2025 SUMÁRIO 1 INTRODUÇÃO................................................................................................. 4 2 DESENVOLVIMENTO...................................................................................... 6 2.1 ATIVIDADE PRÁTICA 1 ............................................................................... 6 2.2 ATIVIDADE PRÁTICA 2 ............................................................................. 13 2.3 ATIVIDADE PRÁTICA 3 ............................................................................. 17 2.4 ATIVIDADE PRÁTICA 4 ............................................................................. 25 2.5 ATIVIDADE PRÁTICA 5 ............................................................................. 31 3 CONCLUSÃO ................................................................................................ 41 4 REFERÊNCIAS BIBLIOGRÁFICAS................................................................. 42 4 1 INTRODUÇÃO A realização de uma atividade prática dentro do contexto de uma disciplina acadêmica tem como objetivo principal sedimentar o conhecimento que foi aprendido durante as aulas. É uma maneira do aluno colocar em prática o que foi visto na teoria, vivenciando os conceitos, fundamentos e demais aspectos pertinentes à aplicação da disciplina em sua área de atuação. Durante o estudo desta disciplina de Sistemas Digitais e Microprocessadores, foi possível verificar muito conteúdo interessante, que no desenvolvimento dessas atividades, experimentamos uma abordagem prática e mão na massa, o que ajudou a consolidar vários conceitos teóricos aprendidos em sala de aula. Este portfólio não só mostra o desenvolvimento das habilidades técnicas, mas também o caminho de como resolver problemas complexos dentro do universo dos sistemas digitais e microprocessadores. As atividades desenvolvidas englobam desde a implementação de circuitos básicos até a programação avançada de microcontroladores Arduino. Na Aula Prática 1, foi projetado e implementado um circuito com a finalidade de registrar a produção de uma fábrica utilizando 8 teclas, cada uma representando uma quantidade específica de itens produzidos. Por meio do simulador Logisim, foi explorado conceitos como entradas e saídas, codificadores de prioridade e decodificadores, com o intuito de simular o funcionamento do circuito digital e verificar sua utilização na realização desta atividade e de atividades correlatas. A Aula Prática 2 ampliou o escopo ao focar no design, simulação e construção de circuitos lógicos mais sofisticados. Nesse contexto, empregou-se a ferramenta Logisim para desenvolver um contador binário de 4 bits e um contador BCD de década, fortalecendo as competências na manipulação de circuitos digitais. Já a Aula Prática 3 proporcionou a imersão no universo dos microcontroladores, com ênfase no Arduino. Durante esta etapa, foi possível compreender o funcionamento básico do microcontrolador e foram programados algoritmos simples, dando início à exploração de sistemas de controle. Na Aula Prática 4, o aprendizado foi aprofundado ao abordar a programação de algoritmos voltados para a criação de um relógio em tempo real e de uma estação meteorológica equipada com sensores de temperatura e umidade, consolidando ainda mais os conhecimentos adquiridos. 5 Por fim, a Aula Prática 5 investigou aplicações específicas de microcontroladores Arduino, como a implementação de um sensor ultrassônico combinado com LED RGB e um sensor ultrassônico com timer. As atividades descritas neste portfólio nos trazem uma abordagem prática e interativa que conecta teoria e prática, demonstrando não apenas o avanço das habilidades técnicas, mas também a capacidade de solucionar desafios complexos no campo dos sistemas digitais e microprocessadores. 6 2 DESENVOLVIMENTO 2.1 ATIVIDADE PRÁTICA 1 A atividade prática 1 traz a proposta de implementação de um circuito que registre a produção de uma fábrica através de 8 teclas, sendo pressionada a quantidade produzida (de 1 a 8) a cada produção, demonstrando na saída o número de itens produzidos na sequência decimal. Para a realização desta atividade, foi utilizado o software simulador Logisim. A seguir, os passos seguidos durante a atividade: Inicialmente, abriu-se o software simulador Logisim, que foi a plataforma escolhida para a simulação dos circuitos digitais a serem construídos na atividade e foi feita uma verificação de seu ambiente de trabalho para conhecimento das ferramentas e familiarização com os botões. Em seguida, para representar as 8 teclas correspondentes à produção, foram inseridas teclas alinhadas e rotuladas adequadamente para indicar qual número cada tecla representava, conforme Figura 1. Figura 1. Inserção de Teclas e Rótulos Fonte: O autor 7 Na continuação foi adicionado um Codificador de Prioridade ao circuito, um componente que, ao receber várias entradas, exibe na saída o valor da entrada mais alta e feita a conexão das teclas ao codificador, conforme Figura 2. Figura 2. Inserção do Codificador de Prioridade e conexão das teclas a ele Fonte: O autor Uma entrada de Enable foi incorporada ao codificador de prioridade para habilitar seu funcionamento, conforme Figura 3. Figura 3. Inserção da entrada Enable Fonte: O autor 8 Para exibir o valor binário correspondente à entrada habilitada de 0 a 7, foi inserida uma saída, conforme Figura 4. Figura 4. Inserção da Saída Fonte: O autor Em seguida, foi realizada a simulação do codificador de prioridade preenchendo uma tabela com entradas e saídas. Na simulação, observou-se que a saída representava o valor binário mais alto da entrada habilitada. Vide Tabela 1. Tabela 1. Resultados da simulação do codificador de prioridade Enable Tecla Acionada Saída 0 Tecla de 1 a 8 acionada xxx 1 Nenhuma tecla acionada xxx 1 1 000 1 2 001 1 3 010 1 4 011 1 5 100 1 6 101 1 7 110 1 8 111 Fonte: O autor 9 Após a simulação do codificador de prioridade, foi inserido um decodificador no circuito. Foi configurado o número de bits corretamente na entrada e em seguida feita as conexões necessárias, conforme Figura 5. Figura 5. Inserção do decodificador Fonte: O autor Em seguida, foram incorporadas as saídas do decodificador ao circuito, conforme Figura 6. Figura 6. Saídas incorporadas ao decodificador Fonte: O autor 10 Após o circuito pronto, testes foram realizados para verificar todas as possibilidades do circuito, registrando quais saídas eram acionadas em diferentes combinações de teclas, conforme Tabela abaixo: Tabela 2. Simulação do decodificador. Enable Tecla Acionada Saída do Decodificador 0 Tecla de 1 a 8 acionada xxxxxxxx 1 Nenhuma tecla acionada xxxxxxxx 1 1 1 1 2 2 1 3 3 1 4 4 1 5 5 1 6 6 1 7 7 1 8 8 Fonte: O autor Assim, após os testes, verificamos que o codificador de prioridade tem a função de identificar a tecla de maior prioridade que está sendo acionada (ligada) e gerar uma saída bináriacorrespondente. O decodificador, por sua vez, recebe essa saída binária e a converte de volta para a representação decimal, indicando qual tecla foi acionada. A lógica de funcionamento pode ser resumida basicamente desta forma. Alguns exemplos do comportamento do circuito: Combinação 1: Tecla Acionada = 3 Enable = 1 (Habilitado) Saída do Codificador = 010 (correspondente a 2 em binário, pois a sequência no decodificador inicia-se no 0 e finaliza do 7, correspondendo as teclas de 1 a 8) Saída do Decodificador = 3 Resultado: Quando a tecla 3 for acionada e o codificador de prioridade detectar que ela é a de maior prioridade, converte em binário e envia para o decodificador que recebe o sinal em binário e converte para decimal, acionando assim a saída 3. Vide Figura 7. 11 Figura 7. Resultado da combinação 1 Fonte: O autor Combinação 2: Tecla Acionada = 1 Enable = 1 (Habilitado) Saída do Codificador = 000 (correspondente a 0 em binário) Saída do Decodificador = 1 (decimal) Resultado: Quando a tecla 1 for acionada e ela for a de maior prioridade, a saída 1 do decodificador será a correta. Vide Figura 8. Figura 8. Resultado da combinação 2 Fonte: O autor 12 Combinação 3: Tecla Acionada = 7 Enable = 1 (Habilitado) Saída do Codificador = 110 (correspondente a 6 em binário) Saída do Decodificador = 7 Resultado: Quando a tecla 7 for acionada e ela for a de maior prioridade, a saída 7 do decodificador será a correta. Vide Figura 9. Figura 9. Resultado da combinação 3 Fonte: O autor 13 2.2 ATIVIDADE PRÁTICA 2 A segunda atividade prática trouxe a proposta de projetar e simular circuitos lógicos mais complexos, com destaque para a implementação de um meio somador binário, um contador assíncrono de 4 bits e um Contador de Década BCD. Para a realização desta atividade, foi utilizado novamente o software Logisim. A seguir, os passos realizados durante a atividade: Inicialmente, foi construído um circuito com a porta NAND e verificar sua equivalência com a porta OR Negativa. Para tanto, foi necessário adicionar as portas lógicas NAND e OR, bem como duas portas inversoras. Foram inseridas também as entradas A e B, as portas foram devidamente posicionadas e as foram realizadas as conexões, conforme Figura 10. Em seguida, vários testes foram efetuados alternando- se os valores das entradas A e B e verificada com se comportara a saída. Figura 10. Circuito com portas inseridas e conexões efetuadas Fonte: O autor Importante ressaltar que uma maneira de verificar a equivalência entre dois circuitos lógicos é verificar se suas tabelas verdades são iguais. Vide Tabelas 3 e 4. Tabela 3. Tabela verdade da porta NAND A B S 0 0 1 0 1 1 1 0 1 1 1 0 Fonte: O autor 14 Tabela 4. Tabela verdade da porta OR negativa A B S 0 0 1 0 1 1 1 0 1 1 1 0 Fonte: O autor Assim, foi possível verificar que os dois circuitos acima são equivalentes. 2.2.1 Projeto do Circuito Meio Somador Utilizando as portas lógicas disponíveis no Logisim, foi projetado o circuito lógico para um meio somador binário, conforme Figura 11. Na simulação no Logisim, as entradas foram alternadas e as saídas foram analisadas para garantir a precisão do circuito, conforme Tabela 5. Figura 11. Meio somador Fonte: O autor Tabela 5. Tabela verdade para o meio somador Entradas Saídas A B S C 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 Fonte: O autor 15 2.2.2 Projeto Contador Assíncrono de 4 bits Os contadores são circuitos lógicos projetados encadeando flip-flops, eles podem ser classificados como assíncronos ou síncronos, de acordo com a forma que recebem os pulsos do clock. Nos contadores assíncronos, o primeiro flip-flop recebe um sinal de clock externo e cada flip-flop subsequente recebe o clock através da saída do anterior. Nos contadores síncronos, o mesmo sinal de clock é fornecido para todos os flip-flops de forma que eles recebem o clock simultaneamente. Com base no conhecimento adquirido sobre contadores assíncronos, foi projetado um contador de 4 bits. Os flip-flops foram encadeados, e as conexões foram estabelecidas conforme as características desse tipo de contador. Vide Figura 12. Figura 12. Contador assíncrono de 4 bits Fonte: O autor 2.2.3 Projeto Contador de Década BCD O contador de década também funciona de modo assíncrono. Esse tipo de circuito efetua a contagem em números binários de 0 a 9, ou seja, de 0000 a 1001. Assim, para um contador contar somente até 9, quando chegar no 1010, que é o número 10 em decimal, joga-se um nível 0 na entrada CLEAR do flip-flop. Desse modo, para realizar esse procedimento, liga-se as saídas Q3 e Q1 em uma porta NAND de duas entradas, conforme mostrada na Figura 13. 16 Figura 13. Contador de década Fonte: O autor 17 2.3 ATIVIDADE PRÁTICA 3 Esta atividade se divide em 2 atividades propostas. 2.3.1 Atividade Proposta 1 Na primeira atividade proposta da Atividade 3, foram desenvolvidos 4 programas para Arduino Uno, utilizando a plataforma Arduino IDE, com o objetivo de realizar operações específicas. A seguir, breves descrições sobre o escopo, os códigos desenvolvidos e como se deu a estruturação e validação: Programa 1: Programa para Arduino Uno semelhante a um eco • Escopo do Programa: Foi criado um programa que implementa a funcionalidade de eco, ou seja, repete qualquer caractere recebido pela porta serial. O código incluiu a leitura de caracteres da porta serial e a retransmissão desses caracteres de volta para a porta. Segue o código abaixo desenvolvido para implementação da solução: void setup() { Serial.begin(9600); // Inicializa a comunicação serial com taxa de 9600 bps } void loop() { if (Serial.available() > 0) { // Verifica se há dados disponíveis na porta serial char receivedChar = Serial.read(); // Lê o caractere recebido Serial.print("Você digitou: "); // Envia uma mensagem indicando o caractere recebido Serial.println(receivedChar); // Envia o caractere recebido de volta pela porta serial } } 18 • Validação: O programa foi enviado para o Arduino Uno através da Arduino IDE. Após o upload do programa, o Arduino foi conectado ao computador, e a comunicação serial foi estabelecida. Testes foram realizados enviando caracteres pela porta serial, e o Arduino respondeu repetindo os caracteres recebidos. Programa testado com sucesso! Programa 2: Programa de Piscar LEDs em Sequência para Arduino Uno • Escopo do Programa: Foi desenvolvido um programa que simula um registrador de deslocamento com 5 LEDs. Cada LED acende sequencialmente por 200 ms, de forma cíclica. O código incluiu a configuração dos pinos dos LEDs, a lógica de acendimento sequencial e o uso de delay para controlar o tempo de cada LED aceso. Segue o código abaixo desenvolvido para implementação da solução: const int numLEDs = 5; // Número de LEDs const int pinLEDs[] = {8, 9, 10, 11, 12}; // Pinos dos LEDs const int tempoAceso = 200; // Tempo em milissegundos que cada LED ficará aceso void setup() { for (int i = 0; ilimitar a corrente. O programa foi enviado para o Arduino, e os LEDs foram observados piscando de forma sequencial conforme a lógica implementada. Assim, o teste foi realizado com sucesso! Programa 3: Controle de luminosidade de um LED com potenciômetro • Escopo do Programa: Foi desenvolvido um programa que controla a luminosidade de um LED conectado ao pino 10 do Arduino por meio de um potenciômetro. O código incluiu a leitura da posição do potenciômetro no pino A0 e o ajuste da luminosidade do LED proporcionalmente à posição do potenciômetro. Segue o código abaixo desenvolvido para implementação da solução: const int pinoPotenciometro = A0; // Pino analógico onde o potenciômetro está conectado const int pinoLED = 10; // Pino digital onde o LED está conectado void setup() { pinMode(pinoLED, OUTPUT); // Configura o pino do LED como saída } void loop() { int valorPotenciometro = analogRead(pinoPotenciometro); // Lê o valor do potenciômetro (0 a 1023) int luminosidade = map(valorPotenciometro, 0, 1023, 0, 255); // Mapeia o valor para a faixa de brilho do LED analogWrite(pinoLED, luminosidade); // Define a luminosidade do LED } 20 • Validação: Um LED foi conectado ao pino 10 do Arduino, e um potenciômetro foi conectado ao pino A0, com suas extremidades ligadas em 5V e GND. Um resistor de 220 Ω foi utilizado em série com o LED. Em seguida, o programa foi enviado para o Arduino, e o teste foi realizado ajustando o potenciômetro para observar as variações na luminosidade do LED. Teste realizado com sucesso! Parte 4: Controle de luminosidade de um LED por comunicação serial • Escopo do Programa: Foi desenvolvido um programa que controla a luminosidade de um LED no pino 10 do Arduino por meio da comunicação serial. O programa espera receber comandos em ASCII, representando valores de brilho entre 000 e 255. A luminosidade do LED é ajustada de acordo com os valores recebidos. Segue o código abaixo desenvolvido para implementação da solução: const int pinoLED = 10; // Pino digital onde o LED está conectado char comandoSerial[4]; // Array para armazenar o comando recebido via serial void setup() { Serial.begin(9600); // Inicializa a comunicação serial pinMode(pinoLED, OUTPUT); // Configura o pino do LED como saída } void loop() { if (Serial.available() >= 3) { // Verifica se há pelo menos 3 bytes disponíveis na serial Serial.readBytes(comandoSerial, 3); // Lê os 3 bytes do comando comandoSerial[3] = '\0'; // Adiciona o caractere nulo ao final para formar uma string int luminosidade = atoi(comandoSerial); // Converte a string para um valor inteiro // Limita a luminosidade entre 0 e 255 luminosidade = constrain(luminosidade, 0, 255); analogWrite(pinoLED, luminosidade); // Define a luminosidade do LED } } 21 • Validação: Um LED foi conectado ao pino 10 do Arduino, e a comunicação serial foi estabelecida. O programa foi enviado para o Arduino e testes foram realizados enviando comandos válidos (três caracteres entre 000 e 255) pela porta serial para ajustar a luminosidade do LED. O resistor de 220 Ω foi utilizado em série com o LED para limitar a corrente. Assim, teste realizado com sucesso! 2.3.2 Atividade Proposta 2 Na segunda atividade proposta da Atividade 3, foi realizado o desenvolvimento de um projeto no Tinkercad para criar um monitor de umidade do solo com o Arduino. Essa atividade foi bastante conveniente para a aplicação dos conhecimentos adquiridos na utilização do Arduíno e suas saídas digitais e analógicas, o que abre um mundo de possibilidades. A seguir, breves descrições sobre o escopo, os códigos desenvolvidos e como se deu a estruturação e validação: Projeto completo de Monitor de Umidade do Solo com Arduino • Componentes para o Projeto: Para a construção deste projeto, foram necessários os seguintes componentes: - 1 Arduino; - 1 Protoboard; - 5 LEDs (1 Vermelho, 1 Amarelo, 1 Laranja, 1 Azul e 1 Verde); - 5 resistores de 220 Ohms; e, - Módulo sensor de umidade do solo. 22 • Conexões a serem realizadas: As seguintes conexões foram feitas no Tinkercad: - Foi conectada as saídas 9, 10, 11, 12 e 13 do Arduino aos ânodos dos LEDs; - Foi criada a conexão do cátodo dos LEDs para os resistores de 220 Ohms; - Foi conectado o outro terminal dos resistores ao GND (negativo) do Arduino; - Foram criadas as conexões de forma organizada e limpa; - Foi conectado o pino VCC do sensor de umidade do solo à porta A0; - Foi conectado o pino GND do sensor de umidade do solo ao GND do Arduino; e por fim, - Foi conectado o pino SIG do sensor de umidade à porta A1. • Algoritmo em Linguagem C: Ao iniciar o desenvolvimento do código, foram definidas as seguintes variáveis: - Variável umidade para armazenar o valor do sinal de umidade, inicializada com valor 0; - Variáveis led_vermelho, led_amarelo, led_laranja, led_azul e led_verde para controlar os LEDs conectados aos pinos 13, 12, 11, 10 e 9, respectivamente, com a finalidade de acender cada LED à medida que o valor da variável umidade for alterado; e, - Variáveis pin_vcc com a porta A0 e pin_sensor com a porta A1, para controle do sensor de umidade. Para configuração do Setup, no bloco void setup(), foram realizadas as seguintes definições: - Definição das variáveis led_x como saída; - Definição da variável pin_vcc como saída; - Definição da variável pin_sensor como entrada; e, - Inicialização da comunicação serial com Serial.begin(9600). 23 • Loop de Execução: No bloco void loop(), as seguintes ações foram programadas: - Aplicação de tensão no pino VCC do sensor de umidade; - Leitura da variável umidade usando analogRead(pin_sensor); - Impressão do valor da variável umidade no monitor serial; - Desligamento de todos os LEDs; - Verificação para acender cada LED com base nas regras fornecidas: se menor que 200 acenderá o LED vermelho; se menor que 400 acenderá o LED amarelo; se menor que 600 acenderá o LED laranja; se menor que 800 acenderá o LED azul; e se for diferente destes valores, acenderá o LED verde. Segue o código abaixo desenvolvido para implementação da solução: const int led_vermelho = 13; const int led_amarelo = 12; const int led_laranja = 11; const int led_azul = 10; const int led_verde = 9; const int pin_vcc = A0; const int pin_sensor = A1; int umidade = 0; void setup() { pinMode(led_vermelho, OUTPUT); pinMode(led_amarelo, OUTPUT); pinMode(led_laranja, OUTPUT); pinMode(led_azul, OUTPUT); pinMode(led_verde, OUTPUT); pinMode(pin_vcc, OUTPUT); pinMode(pin_sensor, INPUT); Serial.begin(9600); } 24 • Execução e Validação: Após seguir todas as etapas, a simulação foi executada para verificar a operação do projeto. O circuito foi projetado para acender os LEDs na sequência vermelho, amarelo, laranja, azul e verde, dependendo dos valores controlados pela barra de simulação do sensor de umidade. O circuito foi configurado como um loop infinito, mantendo a luz acesa conforme os valores recebidos na variável "umidade". Dessa forma, o teste foi realizado com sucesso! void loop() { digitalWrite(pin_vcc, HIGH); umidade = analogRead(pin_sensor); Serial.println(umidade); digitalWrite(led_vermelho, LOW); digitalWrite(led_amarelo, LOW); digitalWrite(led_laranja, LOW); digitalWrite(led_azul, LOW); digitalWrite(led_verde, LOW); if (umidade #include #include #define DHTPIN 2 // Pino de dados do sensor DHT11 #define DHTTYPE DHT11 // Tipo do sensor DHT RTC_DS1302 rtc; DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); if (!rtc.begin()) { Serial.println("Não foi possível encontrar o módulo RTC!"); while (1); } 26 if (!rtc.isrunning()) { Serial.println("Configurando a hora!"); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } dht.begin(); } void loop() { DateTime now = rtc.now(); float temperature = dht.readTemperature(); float humidity = dht.readHumidity(); Serial.print("Data e Hora: "); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(" "); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.println(now.second(), DEC); Serial.print("Temperatura: "); Serial.print(temperature); Serial.print(" °C, Umidade: "); Serial.print(humidity); Serial.println(" %"); delay(60000); // Aguarda 1 minuto antes da próxima leitura } 27 Programa 2: Programa para Simulação de Estação Meteorológica com Armazenamento na EEPROM Desenvolveu-se um programa que simula uma estação meteorológica, realizando medidas de umidade e temperatura a cada 1 minuto. Utilizou-se o módulo DS1302 para obter a data e hora com precisão. Os dados de data, hora, temperatura e umidade foram armazenados na EEPROM do Arduino. Evitou-se o uso da função delay para garantir a precisão da amostragem. Implementou-se uma lógica para evitar o estouro da EEPROM, considerando suas limitações (1024 posições de 1 byte cada). Ao receber o caractere "L" pela porta serial, o microcontrolador retornou todos os dados armazenados, possibilitando a leitura e, se desejado, a exclusão ou substituição dos dados. Segue o código abaixo desenvolvido para implementação da solução #include #include #include #include #define DHTPIN 2 // Pino de dados do sensor DHT11 #define DHTTYPE DHT11 // Tipo do sensor DHT RTC_DS1302 rtc; DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); if (!rtc.begin()) { Serial.println("Não foi possível encontrar o módulo RTC!"); while (1); } 28 if (!rtc.isrunning()) { Serial.println("Configurando a hora!"); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } dht.begin(); } void loop() { DateTime now = rtc.now(); float temperature = dht.readTemperature(); float humidity = dht.readHumidity(); Serial.print("Data e Hora: "); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(" "); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.println(now.second(), DEC); Serial.print("Temperatura: "); Serial.print(temperature); Serial.print(" °C, Umidade: "); Serial.print(humidity); Serial.println(" %"); 29 // Armazena dados na EEPROM int address = 0; EEPROM.write(address++, now.day()); EEPROM.write(address++, now.month()); EEPROM.write(address++, now.year() % 100); EEPROM.write(address++, now.hour()); EEPROM.write(address++, now.minute()); EEPROM.put(address, temperature); address += sizeof(float); EEPROM.put(address, humidity); address += sizeof(float); delay(60000); // Aguarda 1 minuto antes da próxima leitura } void readAndPrintStoredData() { int address = 0; while (addresspara a cor vermelha do LED RGB const int greenPin = 10; // Pino PWM para a cor verde do LED RGB const int bluePin = 11; // Pino PWM para a cor azul do LED RGB const int maxDistance = 50; // Distância máxima para a cor verde (em cm) const int minDistance = 5; // Distância mínima para a cor vermelha (em cm) const int yellowDistance = 25; // Distância para a transição de verde para amarelo (em cm) 32 void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { long duration; int distance; // Gera um pulso no pino de trigger digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Lê a duração do pulso no pino de echo duration = pulseIn(echoPin, HIGH); // Converte a duração para distância distance = duration * 0.034 / 2; // Imprime a distância no monitor serial Serial.print("Distancia: "); Serial.println(distance); // Atualiza a cor do LED com base na distância medida updateLEDColor(distance); 33 delay(500); // Aguarda 500 milissegundos antes da próxima leitura } void updateLEDColor(int distance) { if (distance > maxDistance) { setColor(0, 255, 0); // Cor verde } else if (distance yellowDistance) { // Interpolação linear para obter a intensidade da cor amarela int greenIntensity = map(distance, yellowDistance, maxDistance, 255, 0); setColor(255, greenIntensity, 0); // Cor amarela } else if (distance = minDistance) { // Interpolação linear para obter a intensidade da cor vermelha int redIntensity = map(distance, minDistance, yellowDistance, 0, 255); setColor(redIntensity, 255, 0); // Cor vermelha } else { setColor(255, 0, 0); // Cor vermelha (distância abaixo do mínimo) } } void setColor(int red, int green, int blue) { analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); } 34 Programa 2: Programa para Leitura de Distância e Piscar de LED Proporcional à Distância Criou-se um programa que realiza a leitura da distância medida pelo sensor ultrassônico e a envia via porta serial a cada 1 segundo. A leitura da distância foi feita em centímetros. O LED conectado ao pino 13 do Arduino foi programado para piscar com uma velocidade proporcional à distância medida. Utilizou-se uma interrupção do timer para gerenciar as duas bases de tempo no programa: uma para amostragem e envio da distância via serial e outra para o LED. Definiu-se que, quando a distância medida for de 50 cm ou mais, o LED deverá mudar seu estado a cada 1 segundo. Com a redução da distância, esse período deve mudar proporcionalmente. O programa foi enviado para o Arduino e testado para verificar a correta leitura da distância e o piscar do LED de acordo com a distância medida. Segue o código abaixo desenvolvido para implementação da solução: const int trigPin = 2; // Pino de controle do trigger do sensor ultrassônico const int echoPin = 3; // Pino de controle do echo do sensor ultrassônico const int ledPin = 13; // Pino para o LED no Arduino volatile unsigned long pulseWidth; volatile unsigned long startTime; volatile boolean echoReceived = false; void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(ledPin, OUTPUT); // Configuração da interrupção do timer cli(); // Desabilita interrupções durante a configuração 35 TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; OCR1A = 15624; // Valor para 1 segundo com prescaler de 256 TCCR1B |= (1de controle do echo do sensor ultrassônico const int redPin = 9; // Pino do LED RGB para a cor vermelha const int greenPin = 10; // Pino do LED RGB para a cor verde const int bluePin = 11; // Pino do LED RGB para a cor azul void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { long duration; // Gera um pulso no pino de trigger digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Aguarda o início do pulso de echo while (digitalRead(echoPin) == LOW); // Inicia o tempo no início do pulso de echo long startTime = micros(); // Aguarda o fim do pulso de echo while (digitalRead(echoPin) == HIGH); 39 // Calcula a duração do pulso de echo long travelTime = micros() - startTime; // Calcula a distância com base no tempo de viagem do ultrassom // Considerando velocidade do som de 343 metros por segundo (34300 cm/s) duration = travelTime / 2; Serial.println(duration); // Atualiza a cor do LED RGB com base na distância medida updateLEDColor(duration); // Aguarda um curto intervalo antes da próxima leitura delay(100); } void updateLEDColor(long distance) { // Define os valores limites de distância para cada cor int greenDistance = 50; int yellowDistance = 25; int redDistance = 5; // Atualiza as cores do LED RGB com base na distância if (distance > greenDistance) { analogWrite(redPin, 0); analogWrite(greenPin, 255); analogWrite(bluePin, 0); } else if (distance > yellowDistance) { analogWrite(redPin, 255); analogWrite(greenPin, 255); analogWrite(bluePin, 0); } else if (distance > redDistance) { analogWrite(redPin, 255); analogWrite(greenPin, 165); analogWrite(bluePin, 0); 40 • Simulação no Tinkercad: Após a construção do código, foi realizada a simulação no Tinkercad, ajustando a distância medida pelo sensor ultrassônico clicando sobre ele. Foi colocado um resistor de 220 Ohms em série com cada cor do LED para limitar a corrente que passava por ele. Foram feitas algumas pesquisas sobre como fazer o sensor de distância ultrassônico funcionar corretamente no Tinkercad, ajustando as configurações necessárias para garantir a simulação adequada. Assim, o resultado final foi um circuito simulado que indicava visualmente a distância medida pelo sensor ultrassônico por meio das cores do LED RGB, seguindo as especificações estabelecidas no programa Arduino. Esse experimento proporcionou a prática da integração de sensores e atuadores, bem como a simulação de circuitos complexos no ambiente virtual do Tinkercad. } else { analogWrite(redPin, 255); analogWrite(greenPin, 0); analogWrite(bluePin, 0); } } 41 3 CONCLUSÃO Este portfólio apresenta uma sequência de atividades planejadas e estruturadas, composta por práticas que possibilitaram a integração com a teoria da disciplina de Sistemas Digitais e Microprocessadores. Essa abordagem prática e fundamentada, foi de grande valor para que se possa consolidar as habilidades técnicas e ampliar a compreensão dos conceitos essenciais que fazem parte dessa área, assim como também proporcionou o conhecimento e o uso de ferramentas de simulação, como o simulador Logisim e a plataforma Arduino, onde realizamos desde projetos mais simplórios, até o desenvolvimento de firmware para microcontroladores. Na Atividade 1, foram apresentados os princípios de funcionamento do codificador de prioridade utilizando o simulador Logisim, possibilitando uma compreensão aprofundada de suas entradas e saídas e de sua relevância em aplicações práticas. A Atividade 2 avançou no domínio do Logisim, promovendo a construção e simulação de circuitos lógicos, bem como a construção de contadores assíncronos, fortalecendo as habilidades de projeto e análise de circuitos digitais. As Atividades 3, 4 e 5 focaram na programação e no desenvolvimento de sistemas de controle variados utilizando a plataforma Arduino. Projetos como o relógio em tempo real, a estação meteorológica e o monitor de umidade do solo demonstraram o potencial criativo e técnico inerente ao uso de microcontroladores. Essas atividades consolidaram conhecimentos teóricos e práticos, evidenciando as capacidades de programação e integração de funcionalidades em sistemas embarcados. Em resumo, este portfólio evidencia um percurso progressivo e bem estruturado no campo dos Sistemas Digitais e Microprocessadores. Cada atividade contribuiu significativamente para o fortalecimento de uma base sólida de conhecimentos teóricos e práticos, essencial para enfrentar os desafios do universo da eletrônica digital e dos sistemas embarcados. A experiência adquirida ao longo dessas atividades nos proporcionou um avanço técnico e profissional, que certamente se traduzirá na capacidade de planejar e implementar soluções inovadoras em contextos futuros. 42 4 REFERÊNCIAS BIBLIOGRÁFICAS ERCEGOVAC, M.; LANG, T.; MORENO, J. H. Introdução aos Sistemas Digitais. Bookman, SP, 2000. HEXSEL, Roberto A. Sistemas Digitais e Microprocessadores. Universidade Federal do Paraná: Departamento de Informática. 2006. [S.I.]. Disponível em: . Acesso em 17/04/2025. NERI, Hermes Gustavo Fernandes. Utilização da Plataforma Arduino para Controle de Experimentos Remotos de Física. Universidade Federal de Uberlândia: Instituito de Física. 2014. [S.I.]. Disponível em: . Acesso em 18/04/2025. PERIM, Victor; LOPES, Giancarlo M.G; MARTIN, Andrea A. Sistemas Digitais e Microprocessadores. Londrina: Editora e Distribuidora Educacional S.A, 2020. SILVER, Luan. Guia da Robótica: Sensor ultrassônico Arduino para acender LED – Saiba como fazer. 2020. [S.I.]. Disponível em: . Acesso em: 19/04/2025. SOUZA, Fábio. Domine a linguagem C: Tudo o que você precisa sabem em um único lugar. Portal Embarcados: 2023. [S.I.]. Disponível em: . Acesso em 18/04/2025. TOCCI, R. J.; WIDMER, N. S. Sistemas Digitais – Princípios e Aplicações. 7.ed. RJ: LTD, 2000. VIANA, Carol Correia. Blog da Robótica: Como medir distância com o sensor ultrassônico HC-SR04 e Arduino. 2022. [S.I.]. Disponível em: . Acesso em 20/04/2025. https://www.blogdarobotica.com/2022/06/30/como-medir-distancia-com-o-sensor-ultrassonico-hc-sr04-e-arduino/ https://www.blogdarobotica.com/2022/06/30/como-medir-distancia-com-o-sensor-ultrassonico-hc-sr04-e-arduino/ https://embarcados.com.br/linguagem-c-guia-completo/ https://www.blogdarobotica.com/2022/06/30/como-medir-distancia-com-o-sensor-ultrassonico-hc-sr04-e-arduino/ https://www.blogdarobotica.com/2022/06/30/como-medir-distancia-com-o-sensor-ultrassonico-hc-sr04-e-arduino/