Hallo,
ich habe einen Lichteffekte-Sketch für den Arduino im Internet gefunden.
Dieser funktioniert auch ohne Probleme. Die Lichteffekte wollte ich nun
mit Sound kombinieren. Der DFPLayer funktioniert auch ohne Probleme.
Kombiniere ich aber beides im Sketch fängt das Problem an.
Beim Anlegen der Spannung wird der erste Teil des Skechtes abgespielt
(Disruptor-Effekt). Sowohl Lichteffekte als auch der entsprechende
Sound.
Danach funktioniert alles ganz normal. Es wird nur dann Sound abgespielt
(in Kombination mit den LED´s) wenn ich den Knopf drücke bzw. halte.
Habe Widerstände in TX RX. Spannungen sind in Ordnung, keine Lötfehler
auf den Boards zu sehen.
Nehme ich aus dem Loop die Soundfunktion wieder raus (aber im Setup Serial
drin), bleibt das Problem gleich, nur eben ohne Sound.
Daher meine Vermutung, dass entweder die Soundfunktion im Loop an der
falschen Stelle ist oder bereits im Setup oder bei den Variablen etwas
nicht stimmt (Problem mit Serial?)?!
Es ist ein Arduino-Nano-Clone mit CH340 Chip und DFPlayer mini.
Wie gesagt, beide Sketche (Licht und Sound) funktionieren für sich
einzeln ohne Probleme.
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
// ===================== Variables =============================================================//
// ------- Declaring Pins ----------------------------------------------//
static byte disruptorPin = 9;
static byte enginePin = 6;
static byte pushButtonPin = 12;
static byte torpPin[] = { 2, 3 };
// ------- User Inputs ------------------------------------------------//
static unsigned long torpUpTime = 1750;
static unsigned long torpFlashTime = 200;
static unsigned long torpDownTime = 150;
static long double torpIdleBrightness = 10;
static long double torpMaxBrightness = 255;
static unsigned long engineFadePeriod = 3000;
static unsigned long disruptorFiringTime = 2600;
// ------- For the Button Pushing -------------------------------------//
unsigned long debounce = 30;
unsigned long holdTime = 1500;
// ------- Bookeeping ------------------------------------------------//
unsigned long currentMillis;
boolean buttonValue = false;
boolean buttonLast = false;
boolean ignoreUp = false;
unsigned long buttonUpTime;
unsigned long buttonDownTime;
unsigned int torpedoPushes = 0;
unsigned int disruptorPushes = 0;
unsigned long torpedoTime;
unsigned long disruptorTime;
unsigned long torpedoMillis;
unsigned long disruptorMillis;
unsigned long disruptorFlashTime;
boolean disruptorState = 0;
// ==================== End Variables ========================================================= //
// ===================== Setup ================================================================ //
void setup(){
pinMode(disruptorPin,OUTPUT);
pinMode(enginePin,OUTPUT);
pinMode(pushButtonPin,INPUT_PULLUP); // Enables internal pull-up resistor
pinMode(torpPin[0],OUTPUT);
pinMode(torpPin[1],OUTPUT);
mySoftwareSerial.begin(9600);
Serial.begin(115200);
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
while(true);
}
myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms
myDFPlayer.volume(10); //Set volume value (0~30).
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
}
// ===================== End Setup ============================================================ //
// ===================== Main Loop ============================================================ //
void loop() {
currentMillis = millis(); // get current time
// ---------- Push Buttoon Code --------------------------------------------------------//
buttonValue = digitalRead(pushButtonPin);
// Record Time of Push
if (buttonValue == LOW && buttonLast == HIGH && (millis() - buttonUpTime) > debounce){
buttonDownTime = millis();
}
// Record Time of Release
if (buttonValue == HIGH && buttonLast == LOW && (millis() - buttonDownTime) > debounce){
buttonUpTime = millis();
if (ignoreUp == false){
disruptorTime = millis(); // If released early, fire disruptors!
disruptorPushes++;
myDFPlayer.playMp3Folder(2);
}
else{
ignoreUp = false;
}
}
// If push time is longer than threshold, fire Torpedos!
if (buttonValue == LOW && (millis() - buttonDownTime) > long(holdTime)){
buttonDownTime = millis();
torpedoTime = millis();
torpedoPushes++;
ignoreUp = true;
myDFPlayer.playMp3Folder(1);
}
// Record the button state for comparison in the next cycle
buttonLast = buttonValue;
// -------------------------------------------------------------------------------------//
// ---------- Torpedo Firing ----------------------------------------------------------//
// Ramp Up Red LED, Flash White LED, then a Ramp Down of Red LED
// Ramp Up
if ((currentMillis-torpedoTime) < torpUpTime && torpedoPushes > 0){
analogWrite(torpPin[1],torpIdleBrightness+(torpMaxBrightness-torpIdleBrightness)/torpUpTime*(currentMillis-torpedoTime));
digitalWrite(torpPin[0], LOW);
}
// Flash
else if (((currentMillis-torpedoTime) > torpUpTime) && ((currentMillis-torpedoTime) < (torpUpTime+torpFlashTime)) && torpedoPushes > 0){
analogWrite(torpPin[1], 0);
digitalWrite(torpPin[0], HIGH);
}
// Ramp Down
else if (((currentMillis-torpedoTime) > (torpUpTime+torpFlashTime)) && ((currentMillis-torpedoTime) < (torpUpTime+torpFlashTime+torpDownTime)) && torpedoPushes > 0){
analogWrite(torpPin[1],torpMaxBrightness+(torpIdleBrightness-torpMaxBrightness)/torpDownTime*((currentMillis-torpedoTime)-(torpUpTime+torpFlashTime)));
digitalWrite(torpPin[0], LOW);
}
// Idle
else{
analogWrite(torpPin[1], torpIdleBrightness);
digitalWrite(torpPin[0], LOW);
}
// ---------- Engine Fading ----------------------------------------------------------- //
// Slow Up and Down Fade with Shorter Pusations
int fadeValue = int(127.0+127.0/2.0*(1+(0.75*sin(2*PI*currentMillis/engineFadePeriod)+0.25*cos(14*PI*currentMillis/engineFadePeriod))));
analogWrite(enginePin,fadeValue);
// ---------- Disruptor Firing -------------------------------------------------------- //
// Get Random On or Off Time Using getRandom() Function Below
disruptorFlashTime = fmod(getRandom(), 4000UL) + 60UL;
if (((currentMillis - disruptorTime) < disruptorFiringTime) && (disruptorPushes > 0)){
if(currentMillis - disruptorMillis > disruptorFlashTime) {
disruptorMillis = currentMillis;
digitalWrite(disruptorPin, disruptorState = !disruptorState);
}
}
else{
analogWrite(disruptorPin,5);
}
// ------------------------------------------------------------------------------------ //
}
// ===================== End Main Loop ======================================================== //
// ===================== Pseduo-Random Generator ============================================== //
// Found This Online. I Take No Credit for It.
unsigned long m_w = 1;
unsigned long m_z = 2;
unsigned long getRandom()
{
m_z = 36969L * (m_z & 65535L) + (m_z >> 16);
m_w = 18000L * (m_w & 65535L) + (m_w >> 16);
return (m_z << 16) + m_w; /* 32-bit result */
}
// ===================== End Pseduo-Random Generator ========================================== //