-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPresent_Box.ino
More file actions
167 lines (139 loc) · 4.79 KB
/
Copy pathPresent_Box.ino
File metadata and controls
167 lines (139 loc) · 4.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <Arduino.h>
// ------------------------------------------------------------------------------
// Replace Standard Servo Library with this to enable audio recording with TMRpcm Library
#include <Servo.h>
//#include <MobaTools.h>
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
//#define Servo Servo8
// ------------------------------------------------------------------------------
#include <Wire.h>
#define Console Serial
#define CONSOLE_BAUDRATE 115200 // baudrate used for console
#define DFPLAYER_BAUDRATE 9600 // baudrate used for communication with DFPlayerMini
//Die Aufrufe sind kompatibel zur Standard-Servo Library.
//zusätzliche Aufrufe:
//Servo2.setSpeed( wert ); Vorgabe der Geschwindigkeit. Je größer die Zahl, umso
// größer ist die Geschwindigkeit. Bei 0 (defaultwert)
// verhält das Servo sich wie bei der Standard Bibliothek
//byte = Servo2.moving(); gibt den noch verbleibenden Fahrweg in % vom gesamten
// Verfahrweg an. Bei 0 hat das Servo die Zielposition
// erreicht und steht.
#define SERVO_PIN_LIFT 3 // pin number on UNO for left Servo. Must be one of the six PWM Pins!
#define SERVO_OPEN 90
#define SERVO_CLOSE 0
Servo servoLift;
#define BUTTON_PIN 2
// DFPlayer RX pin is connected to UNO Pin 12 and TX pin to UNO Pin 13
SoftwareSerial mp3Serial(10,11); // RX, TX
DFRobotDFPlayerMini mp3;
bool lidOpen = true;
int buttonState = 0;
bool buttonPressed = false;
uint8_t currentSong = 0;
uint8_t currentVolume = 0;
const uint8_t MAX_VOLUME = 26;
long songStarted =0;
long lidClosingStarted = 0;
long lidOpeningStarted = 0;
uint8_t lastServoAngle =0;
void setup() {
Serial.begin(CONSOLE_BAUDRATE); // Open serial monitor at 9600 baud to see state changes an distances measured.
mp3Serial.begin(DFPLAYER_BAUDRATE);
if (!mp3.begin(mp3Serial)) { //If connection to DFPlayer Module not available, stop here
Console.println(F("Connection to DFPlayer not possible. Check and Reset."));
while (true); // loop forever
}
mp3.setTimeOut(500); //Set serial communictaion time out 500ms
mp3.volume(6); //Set volume value (0~30).
mp3.outputDevice(DFPLAYER_DEVICE_SD);
pinMode(BUTTON_PIN, INPUT_PULLUP);
servoLift.attach(SERVO_PIN_LIFT);
servoLift.write(SERVO_OPEN);
lidOpen = true;
Serial.println(F("setup() done"));
}
void loop() {
buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW) {
if (!buttonPressed) {
Serial.println(F("Button was pressed. Waiting for Release."));
}
buttonPressed = true;
delay(50);
} else if (buttonPressed) {
buttonPressed = false;
delay(200);
Serial.println(F("Button released. Starting procedures."));
// now start action after button was released
//
if (lidOpen) {
Serial.println(F("Lid was open. Closing and stopping Music."));
servoLift.detach();
delay(50);
mp3.stop();
songStarted = 0;
delay(300);
servoLift.attach(SERVO_PIN_LIFT);
lidOpen=false;
lidOpeningStarted = 0;
lidClosingStarted = millis();
} else {
//Serial.println(F("Starting Music and opening Lid."));
servoLift.detach();
delay(10);
startMusic();
songStarted = millis();
delay(4000);
servoLift.attach(SERVO_PIN_LIFT);
lidOpen=true;
lidOpeningStarted = millis();
lidClosingStarted = 0;
}
}
if (lidOpen && lidOpeningStarted>0) {
int angle = servoLift.read();
Serial.print("Opening Servo. Current angle ");
Serial.println(angle);
if (angle >= SERVO_OPEN) {
lidOpeningStarted = 0;
return;
}
long diff = (millis() - lidOpeningStarted) / 150;
Serial.print("current diff ");
Serial.println(diff);
if (diff > 0 && diff > angle) {
servoLift.write(diff);
}
}
if (!lidOpen && lidClosingStarted>0) {
int angle = servoLift.read();
Serial.print("Closing Servo. Current angle ");
Serial.println(angle);
if (angle <= SERVO_CLOSE) {
lidClosingStarted = 0;
return;
}
long diff = (millis() - lidClosingStarted) / 150;
Serial.print("current diff ");
Serial.println(diff);
int nextAngle = SERVO_OPEN - diff;
if (diff > 0 && nextAngle < angle) {
servoLift.write(nextAngle);
}
}
}
// #####################################################################################
// #####################################################################################
void startMusic() {
if (mp3.readCurrentFileNumber() >= 0) {
mp3.stop();
}
currentSong++;
if (currentSong > 3) {
currentSong = 1;
}
currentVolume = 25;
mp3.volume(currentVolume); //Set volume value (0~30).
mp3.playMp3Folder(currentSong); // TODO: Some music
}