Hi,
wir bauen in einem Uniprojekt einen MP3 Player mit Arduino. Wir verwenden einen Rotary Encoder, um zwischen den MP3 Dateien hin und her zu springen und einen Potentiometer, um die Lautstärke einzustellen. Die einzelnen Sachen funktionieren soweit auch, wenn nur der Rotary Encoder dran hängt kann man problemlos vor- und zurückspulen. Wenn allerdings beides aktiv ist, dann scheint der Input vom Potentiometer zu überwiegen, wir können dann zwar die Lautstärke ändern aber der Rotary Encoder gibt dann kein Signal mehr durch. Wir wollen später auch noch Drucksensoren einbauen, um auf verschiedene MP3 Ordner zuzugreifen, das heißt das funktionierende Multitasking des Projekts ist enorm wichtig.
Hier ist unser aktueller Code:
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
int val;
int encoder0PinA = 3;
int encoder0PinB = 4;
int encoder0PinBUSY = 2;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int encoder0PinAState = 0;
int encoder0PinALaststate = 0;
int encoder0PinBState = 0;
int encoder0PinBLaststate = 0;
int n = LOW;
const int volumePin = A0;
int volumeState = 0;
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
void setup() {
pinMode (encoder0PinA, INPUT);
pinMode (encoder0PinB, INPUT);
pinMode (encoder0PinBUSY, INPUT);
Serial.begin (9600);
mySoftwareSerial.begin(9600);
//Serial.begin(115200);
Serial.println();
Serial.println(F("DFRobot DFPlayer Mini Demo"));
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
while(true);
{
delay(0);
}
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.volume(15); //Set volume value. From 0 to 30
myDFPlayer.play(1); //Play the first mp3
Serial.println ("playing track 1");
encoder0PinALaststate = digitalRead(encoder0PinA);
delay(1000);
}
void loop() {
encoder0PinAState = digitalRead(encoder0PinA); // Reads the "current" state of the encoder0PinA
// If the previous and the current state of the encoder0PinA are different, that means a Pulse has occured
encoder0PinBState = digitalRead(encoder0PinB);
const int volumePin = A0;
byte volumeState = 254;
int read = analogRead (volumePin);
byte state = map (read, 0, 1023, 20, 5);
if (state < volumeState - 1 || state > volumeState + 1) {
volumeState = state;
myDFPlayer.volume(volumeState);
Serial.print (volumePin);
Serial.print ("volume");
Serial.println (volumeState);
Serial.println(myDFPlayer.readVolume());
}
if (digitalRead(encoder0PinBUSY) == HIGH) {
Serial.println ("Track is over");
myDFPlayer.next();
delay(50);
myDFPlayer.next();
Serial.println ("Skipping to next track");
delay(100);
}
if (encoder0PinAState != encoder0PinALaststate) {
if (digitalRead(encoder0PinB) != encoder0PinAState) { // If the encoder0PinB state is different to the encoder0PinA state, that means the encoder is rotating clockwise
myDFPlayer.next();
delay(50);
myDFPlayer.next();
Serial.println ("next");
} else {
myDFPlayer.previous();
delay(50);
myDFPlayer.previous();
Serial.println ("prev");
}
Serial.println (encoder0Pos);
Serial.println ("/");
Serial.flush();
delay(1000);
}
encoder0PinBState = encoder0PinBLaststate;
encoder0PinALast = n;
}
Ich hoffe jemand hier kann uns damit weiterhelfen