#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Encoder.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
const int potPin1 = 0; // Pino ADC para o primeiro potenciômetro
const int potPin2 = 1; // Pino ADC para o segundo potenciômetro
const int pwmChannel1 = 2; // Canal PWM para a primeira onda quadrada
const int pwmChannel2 = 3; // Canal PWM para a segunda onda quadrada
const int pwmPin1 = 2; // Pino de saída para a primeira onda quadrada
const int pwmPin2 = 3; // Pino de saída para a segunda onda quadrada
const int encoderPinA = 4; // Pino A do encoder
const int encoderPinB = 5; // Pino B do encoder
const int encoderButtonPin = 6; // Pino do botão do encoder
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
Encoder myEnc(encoderPinA, encoderPinB);
enum MenuState {
VELOC,
RPM
};
MenuState menuState = VELOC;
bool pwmOn1 = false;
bool pwmOn2 = false;
void setup() {
Serial.begin(115200);
Wire.begin(8, 9);
lcd.init();
lcd.backlight();
lcd.setCursor(1,0);
lcd.print("Tocantins BIKE");
lcd.setCursor(0,1);
lcd.print("63-3224-2111 Zap");
delay(2500);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Testador de");
lcd.setCursor(2,1);
lcd.print(" Paineis");
delay(2500);
// Configura os canais PWM e anexa os canais PWM aos pinos de saída
ledcAttachChannel(pwmPin1, 5, 14, pwmChannel1);
ledcAttachChannel(pwmPin2, 5, 14, pwmChannel2);
ledcAttach(pwmPin1, 3, 14);
ledcAttach(pwmPin2, 3, 14);
// Configura o duty cycle inicial
// ledcWrite(pwmPin1, 8191); // 50% duty cycle
// ledcWrite(pwmPin2, 8191); // 50% duty cycle
pinMode(encoderButtonPin, INPUT_PULLUP);
}
void loop() {
int potValue1 = analogRead(potPin1);
int potValue2 = analogRead(potPin2);
int freq1 = map(potValue1, 0, 4095, 0, 2400);
int freq2 = map(potValue2, 0, 4095, 0, 2400);
// Lê a posição do encoder
static long lastEncoderPos = -999;
long newEncoderPos = myEnc.read() / 4; // Ajusta a sensibilidade do encoder
if (newEncoderPos != lastEncoderPos) {
lastEncoderPos = newEncoderPos;
if (newEncoderPos % 2 == 0) {
menuState = VELOC;
} else {
menuState = RPM;
}
}
// Lê o estado do botão do encoder
if (digitalRead(encoderButtonPin) == LOW) {
delay(50); // Debouncing
while (digitalRead(encoderButtonPin) == LOW); // Aguarda o botão ser solto
if (menuState == VELOC) {
pwmOn1 = !pwmOn1;
if (pwmOn1) {
ledcWriteTone(pwmChannel1, freq1);
} else {
ledcWriteTone(pwmChannel1, 0);
}
} else if (menuState == RPM) {
pwmOn2 = !pwmOn2;
if (pwmOn2) {
ledcWriteTone(pwmChannel2, freq2);
} else {
ledcWriteTone(pwmChannel2, 0);
}
}
}
// Atualiza as frequências dos canais PWM continuamente
if (pwmOn1) {
ledcWriteTone(pwmChannel1, freq1);
}
if (pwmOn2) {
ledcWriteTone(pwmChannel2, freq2);
}
delay(100); // Pequeno atraso para evitar leitura excessiva
lcd.setCursor(0, 0);
if (menuState == VELOC) {
lcd.print("Vel: ");
lcd.print(pwmOn1 ? "On " : "Off ");
lcd.print(map(analogRead(potPin1), 0, 4095, 0, 2400));
lcd.print("Hz ");
} else if (menuState == RPM) {
lcd.print("RPM: ");
lcd.print(pwmOn2 ? "On " : "Off ");
lcd.print(map(analogRead(potPin2), 0, 4095, 0, 2400));
lcd.print("Hz ");
}
lcd.setCursor(0, 1);
lcd.print("Gire para: ");
lcd.print(menuState == VELOC ? "RPM " : "Vel ");
}
Loading
esp32-c3-devkitm-1
esp32-c3-devkitm-1