// Trabalho 4
// Introdução à Programação para Microcontroladores
// Licenciatura em Tecnologias para a Educação STEAM
// 05-05-2026
// Potenciómetro ligado ao pino analógico 0.
// O pino central do potenciómetro está ligado ao pino analógico.
// Os pinos laterais do potenciómetro estão ligados a +5V e ao GND.
// LED ligado do pino digital 9 ao GND através de uma resistência de 220 ohm.
// Associar numero dos pinos às designações no exercicio - Constante.
const byte analogInPin = A0; // Potenciómetro;
const byte analogOutPin = 9; // Luminária LED;
// Variáveis globais
// Valor lido do potenciómetro: Escala ADC;
int DimmerValue = 0;
// Valor a colocar na saída: Escala PWM;
int LightValue = 0;
// Limite de saída, definido pela classe energetica escolhida;
int limit = 255; /// Por defeito permite até ao máximo - Classe D;
// Variável auxiliar global - Ultimo tempo guardado;
unsigned long tempoAnterior = 0;
// put your setup code here, to run once:
void setup() {
//Definir a funcionalidade dos pinos usados.
pinMode(analogInPin, INPUT);
pinMode(analogOutPin, OUTPUT);
// Ativa a porta serie e define a baudrate.
Serial.begin(115200);
// Definir a tensão de referencia para a conversão
analogReference(DEFAULT);
}
// put your main code here, to run repeatedly:
void loop() {
// Funcionamento 1 - Controlo básico de iluminação;
// Leitura do valor do potênciómetro (0 a 1023), e guarda-o na vaiável atribuida;
DimmerValue = analogRead(analogInPin);
// Conversão de escalas entre op valor lido e o valor a escrever (0-255)
// Alternativa seria: map(sensorValue, 0, 1023, 0, 255);
LightValue = ((long)DimmerValue * 255) / 1023; // Para não dar overflow. Exemplo: 1000 × 255 = 255000, que é muito maior que 32767 = Max. do Int.
// Caso o valor lido pretendido seja maior que o limite em vigor;
if(LightValue > limit){
// implementa a limitação;
LightValue = limit;
}
// Gerar o sinal PWM proporcional para controlo da intensidade da luminária LED;
analogWrite(analogOutPin, LightValue);
// Funcionamento 2 - Monitorização;
// O intervalor entre monitorizações deve ser de 1000 ms;
if ((millis() - tempoAnterior) > 1000) {
// Mostra no monitor série o valor lido e o sinal PWM aplicado (debug / feedback);
Serial.print("Valor lido: ");
Serial.print(DimmerValue);
Serial.print("; Valor enviado: ");
Serial.print(LightValue);
Serial.println(";");
// Volta a guardar o tempo atual, para que só envie daqui a 1 segundo;
tempoAnterior = millis();
}
// Funcionamento 3 - Limitação por eficiência energética;
// Verifica se existem dados disponíveis na comunicação série;
// (ou seja, se o utilizador escreveu alguma coisa no Serial Monitor);
if (Serial.available() > 0) {
// Lê o primeiro caracter inserido e guarda-o;
char classe = Serial.read();
// Para limpar o buffer serial - Descarta o byte final (\n) - Senão entrava duas vezes;
Serial.read();
// Automaticamente atribui a limitação por classe energetica associada/lida;
switch (classe){
case 'A': // Muito eficiente;
limit = 63;
break;
case 'B': // Eficiente;
limit = 127;
break;
case 'C': // Moderada;
limit = 191;
break;
case 'D': // Baixa eficiencia;
limit = 255;
break;
default: // Valor por defeito, perante erros/outras opções de inserção;
limit = 255;
break;
}
// Informar que o limite foi atualizado;
Serial.println("Classe energética atualizada!");
}
}