#include <Wire.h>
#include <LiquidCrystal_I2C_Hangul.h>
#include <TimerOne.h>
#include <digitalWriteFast.h>
#define pinoSinal 10
#define pinoLed 13
#define pinoPotFreq A6
#define pinoPotDuty A7
#define pinoBotao1 4
#define pinoBotao2 5
#define pinoBotao3 6
#define pinoBotao4 7
LiquidCrystal_I2C_Hangul lcd(0x27, 16, 2);
bool ligado = false;
unsigned long ultimaLeituraBotao = 0;
unsigned long intervaloLeituraBotao = 50;
int faixaSelecionada = 0; // 0: Nenhuma faixa selecionada
void setup() {
Timer1.initialize(1000);
pinMode(pinoSinal, OUTPUT);
pinMode(pinoBotao1, INPUT_PULLUP);
pinMode(pinoBotao2, INPUT_PULLUP);
pinMode(pinoBotao3, INPUT_PULLUP);
pinMode(pinoBotao4, INPUT_PULLUP);
pinMode(pinoLed, OUTPUT);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(3, 0);
lcd.print("Gerador PWM");
lcd.setCursor(0, 1);
lcd.print("Selecionar faixa");
}
void loop() {
unsigned long currentMillis = millis();
if (millis() - ultimaLeituraBotao >= intervaloLeituraBotao) {
lerBotoes();
ultimaLeituraBotao = millis();
}
if (ligado && faixaSelecionada > 0) {
int dutyVal = leituraPot(pinoPotDuty);
int periodoVal = leituraPot(pinoPotFreq);
// Faixas de frequência
if (faixaSelecionada == 1) {
periodoVal = map(periodoVal, 0, 1023, 10, 1000); // Ajuste a faixa desejada
} else if (faixaSelecionada == 2) {
periodoVal = map(periodoVal, 0, 1023, 400, 800); // Ajuste a faixa desejada
} else if (faixaSelecionada == 3) {
periodoVal = map(periodoVal, 0, 1023, 800, 1200); // Ajuste a faixa desejada
} else if (faixaSelecionada == 4) {
periodoVal = map(periodoVal, 0, 1023, 1200, 1600); // Ajuste a faixa desejada
}
float frequencyKHz = 1000.0 / periodoVal;
lcd.setCursor(6, 0);
if (frequencyKHz < 10.00) lcd.print(" ");
lcd.print(frequencyKHz, 2);
float dutyCyclePercentage = (dutyVal / 10);
dutyCyclePercentage = constrain(dutyCyclePercentage, 0, 100);
lcd.setCursor(11, 1);
if (dutyCyclePercentage < 10) lcd.print(" ");
if (dutyCyclePercentage < 100) lcd.print(" ");
lcd.print(dutyCyclePercentage, 0);
Timer1.pwm(pinoSinal, dutyVal, periodoVal);
} else {
Timer1.disablePwm(pinoSinal);
digitalWriteFast(pinoSinal, LOW);
}
}
void lerBotoes() {
if (digitalRead(pinoBotao1) == LOW) {
faixaSelecionada = 1;
ligado = true;
digitalWriteFast(pinoLed, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Freq: 0.00 KHz");
lcd.setCursor(0, 1);
lcd.print("Duty Cycle: 0 %");
} else if (digitalRead(pinoBotao2) == LOW) {
faixaSelecionada = 2;
ligado = true;
digitalWriteFast(pinoLed, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Freq: 0.00 KHz");
lcd.setCursor(0, 1);
lcd.print("Duty Cycle: 0 %");
} else if (digitalRead(pinoBotao3) == LOW) {
faixaSelecionada = 3;
ligado = true;
digitalWriteFast(pinoLed, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Freq: 0.00 KHz");
lcd.setCursor(0, 1);
lcd.print("Duty Cycle: 0 %");
} else if (digitalRead(pinoBotao4) == LOW) {
faixaSelecionada = 4;
ligado = true;
digitalWriteFast(pinoLed, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Freq: 0.00 KHz");
lcd.setCursor(0, 1);
lcd.print("Duty Cycle: 0 %");
}
}
int leituraPot(int pinoPot) {
int leitura = 0;
int numLeituras = 10;
for (int i = 0; i < numLeituras; i++) {
leitura = leitura + analogRead(pinoPot);
}
leitura = leitura / numLeituras;
leitura = constrain(leitura, 0, 1023);
return leitura;
}