#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RotaryEncoder.h>
// Pinbelegung
#define ENA 9
#define IN1 8
#define IN2 7
#define ENB 10
#define IN3 6
#define IN4 5
#define CLK 2
#define DT 3
#define SW 4
// Initialisierung des LCDs
LiquidCrystal_I2C lcd(0x27, 16, 2);
RotaryEncoder encoder(CLK, DT);
volatile int frequency = 1;
int lastFrequency = 1;
unsigned long lastTime = 0;
void setup() {
// Initialisierung der Pins
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(SW, INPUT_PULLUP);
// Initialisierung des LCDs
lcd.begin(16,2);
lcd.backlight();
// Setzen der PWM-Duty-Cycle auf 100%
analogWrite(ENA, 255);
analogWrite(ENB, 255);
// Interrupts für den Encoder
attachInterrupt(digitalPinToInterrupt(CLK), updateEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(DT), updateEncoder, CHANGE);
// Initiale Anzeige auf dem LCD
lcd.setCursor(0, 0);
lcd.print("Frequenz:");
lcd.setCursor(9, 1); // Anfangsposition für die Frequenz
lcd.print(frequency);
}
void loop() {
// Lesen des Encoder-Tasters
if (digitalRead(SW) == LOW) {
frequency = 1;
delay(500); // Entprellung
}
// Aktualisieren der Frequenzanzeige
if (frequency != lastFrequency) {
lcd.setCursor(9, 1); // Position für die Frequenz
lcd.print(" "); // Vorherige Frequenz löschen (4 Leerzeichen)
lcd.setCursor(9, 1); // Zurück zur Position für die Frequenz
lcd.print(frequency); // Neue Frequenz anzeigen
lastFrequency = frequency;
}
// Erzeugung der Rechtecksignale
unsigned long currentTime = millis();
if (currentTime - lastTime >= (500 / frequency)) {
lastTime = currentTime;
// Wechseln der Zustände an den Motorpins
digitalWrite(IN1, !digitalRead(IN1));
digitalWrite(IN2, !digitalRead(IN2));
digitalWrite(IN3, !digitalRead(IN3));
digitalWrite(IN4, !digitalRead(IN4));
}
}
void updateEncoder() {
encoder.tick();
int newPos = encoder.getPosition();
frequency = constrain(newPos, 1, 1000); // Begrenzen der Frequenz auf 1 - 1000 Hz
}