Created
July 10, 2019 20:06
-
-
Save samirsogay/5750d0146acbe56b1a05ed531ce065c7 to your computer and use it in GitHub Desktop.
This is the code for my Project Toddler Tutor using Arduino UNO and DF Mini Audio Player which teaches kids Alphabets, Numbers, etc. The video for the project is at https://youtu.be/ju8HZb7C1EA
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "Arduino.h" | |
#include "SoftwareSerial.h" | |
#include "DFRobotDFPlayerMini.h" | |
#include <Adafruit_NeoPixel.h> | |
#define BUTTON_1 2 // white | |
#define BUTTON_2 4 // yellow | |
#define BUTTON_3 6 // red small | |
#define BUTTON_4 8 // blue small | |
#define BUTTON_5 10 // red big | |
#define BUTTON_6 12 // blue big | |
#define BUTTON_7 A0 // green | |
#define LED_1 3 // white | |
#define LED_2 5 // yellow | |
#define LED_3 7 // red small | |
#define LED_4 9 // blue small | |
#define LED_5 11 // red big | |
#define LED_6 13 // blue big | |
#define BUTTONS_COUNT 7 | |
#define LED_BUTTONS_COUNT 6 | |
#define BUTTON_RELEASED 0 | |
#define BUTTON_PRESSED 1 | |
#define BUTTON_HANDLED 2 | |
byte buttonPins[] = {BUTTON_1, BUTTON_2, BUTTON_3, BUTTON_4, BUTTON_5, BUTTON_6, BUTTON_7}; | |
byte buttonState[] = {0, 0, 0, 0, 0, 0, 0}; | |
byte ledbuttonPins[] = {LED_1, LED_2, LED_3, LED_4, LED_5, LED_6}; | |
byte ledbuttonState[] = {0, 0, 0, 0, 0, 0, 0}; | |
#define NEOPIXEL_PIN 9 | |
#define RED 0 | |
#define GREEN 1 | |
#define BLUE 2 | |
float currentRGB[] = {0, 0, 0}; | |
float changeRGB[] = {0, 0, 0}; | |
byte newRGB[] = {0, 0, 0}; | |
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(4, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ400); | |
SoftwareSerial playerSerial(A1, A2); // RX, TX | |
DFRobotDFPlayerMini player; | |
#define FOLDER_ALPHA 0 | |
#define FOLDER_NUM 1 | |
#define FOLDER_WEEK 2 | |
#define FOLDER_COLOR 3 | |
#define FOLDER_QURAN 4 | |
#define FOLDER_RHYME 5 | |
int currentfolder; | |
byte currentSong[] = {0, 0, 0,0, 0, 0,0}; // 1 to size of folder | |
byte folderSizes[] = {0, 0, 0,0, 0, 0,0}; | |
byte volume = 25; | |
byte lightIntensity = 0; | |
void setup() { | |
randomSeed(analogRead(A7)); | |
playerSerial.begin(9600); | |
Serial.begin(115200); | |
pixels.begin(); | |
pixelsUnifiedColor(0); | |
for (int i = 0; i < BUTTONS_COUNT; i++) { | |
pinMode(buttonPins[i], INPUT_PULLUP); | |
buttonState[i] = BUTTON_RELEASED; | |
} | |
for (int i = 0; i < LED_BUTTONS_COUNT; i++) { | |
pinMode(ledbuttonPins[i], OUTPUT); | |
} | |
Serial.println(); | |
Serial.println(F("DFRobot DFPlayer Mini Demo")); | |
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); | |
if (!player.begin(playerSerial)) { //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); | |
} | |
Serial.println(F("DFPlayer Mini online.")); | |
//player.EQ(DFPLAYER_EQ_ROCK); | |
player.outputDevice(DFPLAYER_DEVICE_SD); | |
player.volume(volume); | |
//player.play(1); | |
folderSizes[FOLDER_QURAN] = player.readFileCountsInFolder(FOLDER_QURAN + 1); | |
folderSizes[FOLDER_ALPHA] = player.readFileCountsInFolder(FOLDER_ALPHA + 1); | |
folderSizes[FOLDER_NUM] = player.readFileCountsInFolder(FOLDER_NUM + 1); | |
folderSizes[FOLDER_WEEK] = player.readFileCountsInFolder(FOLDER_WEEK + 1); | |
folderSizes[FOLDER_RHYME] = player.readFileCountsInFolder(FOLDER_RHYME + 1); | |
folderSizes[FOLDER_COLOR] = player.readFileCountsInFolder(FOLDER_COLOR + 1); | |
Serial.println(F("Radio ready.")); | |
} | |
void loop() { | |
if (player.available()) { | |
printDetail(player.readType(), player.read()); //Print the detail message from DFPlayer to handle different errors and states. | |
} | |
readButtons(); | |
crossFade(); | |
delay(15); | |
} | |
void readButtons() { | |
for (int i = 0; i < BUTTONS_COUNT; i++) { | |
if (digitalRead(buttonPins[i]) == HIGH) { | |
buttonState[i] = BUTTON_RELEASED; | |
} | |
else if (buttonState[i] == BUTTON_RELEASED) { | |
buttonState[i] = BUTTON_PRESSED; | |
} | |
} | |
if (buttonState[0] == BUTTON_PRESSED) { // white | |
buttonState[0] = BUTTON_HANDLED; | |
player.playFolder(7, 1); | |
currentfolder = FOLDER_ALPHA; | |
currentSong[0] = 0; | |
Serial.println ("White pressed"); | |
digitalWrite(LED_1,HIGH); | |
digitalWrite(LED_2,LOW); | |
digitalWrite(LED_3,LOW); | |
digitalWrite(LED_4,LOW); | |
digitalWrite(LED_5,LOW); | |
digitalWrite(LED_6,LOW); | |
} | |
else if (buttonState[1] == BUTTON_PRESSED) { // yellow | |
buttonState[1] = BUTTON_HANDLED; | |
player.playFolder(7, 2); | |
currentfolder = FOLDER_NUM; | |
currentSong[1] = 0; | |
Serial.println ("Yellow pressed"); | |
digitalWrite(LED_1,LOW); | |
digitalWrite(LED_2,HIGH); | |
digitalWrite(LED_3,LOW); | |
digitalWrite(LED_4,LOW); | |
digitalWrite(LED_5,LOW); | |
digitalWrite(LED_6,LOW); | |
} | |
else if (buttonState[2] == BUTTON_PRESSED) { // red small | |
buttonState[2] = BUTTON_HANDLED; | |
player.playFolder(7, 3); | |
currentfolder = FOLDER_WEEK; | |
currentSong[2] = 0; | |
Serial.println ("red small pressed"); | |
digitalWrite(LED_1,LOW); | |
digitalWrite(LED_2,LOW); | |
digitalWrite(LED_3,HIGH); | |
digitalWrite(LED_4,LOW); | |
digitalWrite(LED_5,LOW); | |
digitalWrite(LED_6,LOW); | |
} | |
else if (buttonState[3] == BUTTON_PRESSED) { // blue small | |
buttonState[3] = BUTTON_HANDLED; | |
player.playFolder(7, 4); | |
currentfolder = FOLDER_COLOR; | |
Serial.println ("Blue small pressed"); | |
digitalWrite(LED_1,LOW); | |
digitalWrite(LED_2,LOW); | |
digitalWrite(LED_3,LOW); | |
digitalWrite(LED_4,HIGH); | |
digitalWrite(LED_5,LOW); | |
digitalWrite(LED_6,LOW); | |
} | |
else if (buttonState[4] == BUTTON_PRESSED) { // red big | |
buttonState[4] = BUTTON_HANDLED; | |
player.playFolder(7, 5); | |
currentfolder = FOLDER_QURAN; | |
Serial.println ("Red big pressed"); | |
digitalWrite(LED_1,LOW); | |
digitalWrite(LED_2,LOW); | |
digitalWrite(LED_3,LOW); | |
digitalWrite(LED_4,LOW); | |
digitalWrite(LED_5,HIGH); | |
digitalWrite(LED_6,LOW); | |
} | |
else if (buttonState[5] == BUTTON_PRESSED) { // blue big | |
buttonState[5] = BUTTON_HANDLED; | |
player.playFolder(7, 6); | |
currentfolder = FOLDER_RHYME; | |
Serial.println ("Blue big pressed"); | |
digitalWrite(LED_1,LOW); | |
digitalWrite(LED_2,LOW); | |
digitalWrite(LED_3,LOW); | |
digitalWrite(LED_4,LOW); | |
digitalWrite(LED_5,LOW); | |
digitalWrite(LED_6,HIGH); | |
} | |
else if (buttonState[6] == BUTTON_PRESSED) { // green | |
buttonState[6] = BUTTON_HANDLED; | |
playNextInFolder(currentfolder); | |
Serial.println ("green pressed"); | |
} | |
} | |
void playNextInFolder(byte folder) { | |
currentSong[folder]++; | |
if (currentSong[folder] > folderSizes[folder]) { | |
currentSong[folder] = 1; | |
} | |
player.playFolder(folder + 1, currentSong[folder]); | |
Serial.print("Playing next song"); | |
} | |
void printDetail(uint8_t type, int value){ | |
switch (type) { | |
case TimeOut: | |
Serial.println(F("Time Out!")); | |
break; | |
case WrongStack: | |
Serial.println(F("Stack Wrong!")); | |
break; | |
case DFPlayerCardInserted: | |
Serial.println(F("Card Inserted!")); | |
break; | |
case DFPlayerCardRemoved: | |
Serial.println(F("Card Removed!")); | |
break; | |
case DFPlayerCardOnline: | |
Serial.println(F("Card Online!")); | |
break; | |
case DFPlayerPlayFinished: | |
Serial.print(F("Number:")); | |
Serial.print(value); | |
Serial.println(F(" Play Finished!")); | |
break; | |
case DFPlayerError: | |
Serial.print(F("DFPlayerError:")); | |
switch (value) { | |
case Busy: | |
Serial.println(F("Card not found")); | |
break; | |
case Sleeping: | |
Serial.println(F("Sleeping")); | |
break; | |
case SerialWrongStack: | |
Serial.println(F("Get Wrong Stack")); | |
break; | |
case CheckSumNotMatch: | |
Serial.println(F("Check Sum Not Match")); | |
break; | |
case FileIndexOut: | |
Serial.println(F("File Index Out of Bound")); | |
break; | |
case FileMismatch: | |
Serial.println(F("Cannot Find File")); | |
break; | |
case Advertise: | |
Serial.println(F("In Advertise")); | |
break; | |
default: | |
break; | |
} | |
break; | |
default: | |
break; | |
} | |
} | |
void prepareCrossFade(byte red, byte green, byte blue, unsigned int duration) { | |
float rchange = red - currentRGB[RED]; | |
float gchange = green - currentRGB[GREEN]; | |
float bchange = blue - currentRGB[BLUE]; | |
changeRGB[RED] = rchange / (float) duration; | |
changeRGB[GREEN] = gchange / (float) duration; | |
changeRGB[BLUE] = bchange / (float) duration; | |
newRGB[RED] = red; | |
newRGB[GREEN] = green; | |
newRGB[BLUE] = blue; | |
Serial.print(newRGB[RED]); | |
Serial.print(" "); | |
Serial.print(newRGB[GREEN]); | |
Serial.print(" "); | |
Serial.print(newRGB[BLUE]); | |
Serial.print(" ("); | |
Serial.print(changeRGB[RED]); | |
Serial.print(" "); | |
Serial.print(changeRGB[GREEN]); | |
Serial.print(" "); | |
Serial.print(changeRGB[BLUE]); | |
Serial.println(")"); | |
} | |
boolean crossFade() { | |
if (currentRGB[RED] == newRGB[RED] && currentRGB[GREEN] == newRGB[GREEN] && currentRGB[BLUE] == newRGB[BLUE]) { | |
return true; | |
} | |
for (byte i = 0; i < 3; i++) { | |
if (changeRGB[i] > 0 && currentRGB[i] < newRGB[i]) { | |
currentRGB[i] = currentRGB[i] + changeRGB[i]; | |
} | |
else if (changeRGB[i] < 0 && currentRGB[i] > newRGB[i]) { | |
currentRGB[i] = currentRGB[i] + changeRGB[i]; | |
} | |
else { | |
currentRGB[i] = newRGB[i]; | |
} | |
} | |
pixelsUnifiedColor(pixels.Color(currentRGB[RED], currentRGB[GREEN], currentRGB[BLUE])); | |
return false; | |
} | |
void pixelsUnifiedColor(uint32_t color) { | |
for (unsigned int i = 0; i < pixels.numPixels(); i++) { | |
pixels.setPixelColor(i, color); | |
} | |
pixels.show(); | |
} | |
void rainbow(int j) { | |
uint16_t i; | |
byte num = pixels.numPixels() - 1; | |
pixels.setPixelColor(pixels.numPixels() - 1, 100, 100, 100); | |
for (i = 0; i < num; i++) { | |
pixels.setPixelColor(i, colorWheel(((i * 256 / num) + j) & 255)); | |
} | |
pixels.show(); | |
} | |
uint32_t colorWheel(byte wheelPos) { | |
// Input a value 0 to 255 to get a color value. | |
// The colours are a transition r - g - b - back to r. | |
wheelPos = 255 - wheelPos; | |
if (wheelPos < 85) { | |
return pixels.Color(255 - wheelPos * 3, 0, wheelPos * 3); | |
} | |
if (wheelPos < 170) { | |
wheelPos -= 85; | |
return pixels.Color(0, wheelPos * 3, 255 - wheelPos * 3); | |
} | |
wheelPos -= 170; | |
return pixels.Color(wheelPos * 3, 255 - wheelPos * 3, 0); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment