Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.15 KB | None | 0 0
  1. #include <SPI.h>
  2. #include <SdFat.h>
  3. #include <Adafruit_VS1053.h>
  4. #include <SFEMP3Shield.h>
  5. SFEMP3Shield MP3player;
  6. SdFat sd;
  7.  
  8. #define RESET 8 // VS1053 reset pin (output)
  9. #define CS 6 // VS1053 chip select pin (output)
  10. #define DCS 7 // VS1053 Data/command select pin (output)
  11. #define CARDCS 9 // Card chip select pin
  12. #define DREQ 2 // VS1053 Data request, ideally an Interrupt pin
  13. Adafruit_VS1053_FilePlayer musicPlayer = Adafruit_VS1053_FilePlayer(RESET, CS, DCS, DREQ, CARDCS);
  14. SdFile recording; // the file we will save our recording to
  15. #define RECBUFFSIZE 128 // 64 or 128 bytes.
  16. uint8_t recording_buffer[RECBUFFSIZE];
  17.  
  18.  
  19. int ledpin = A5;
  20. int ledState = LOW;
  21. unsigned long previousMillis = 0;
  22. const long interval = 500;
  23.  
  24. int hook = A3;
  25.  
  26. #include <Keypad.h>
  27. const byte ROWS = 4; //four rows
  28. const byte COLS = 3; //three columns
  29. char keys[ROWS][COLS] = {
  30. {'1','2','3'},
  31. {'4','5','6'},
  32. {'7','8','9'},
  33. {'*','0','#'}};
  34. byte rowPins[ROWS] = {A2, A1, A0, A4};
  35. byte colPins[COLS] = {5, 4, 3};
  36. Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS );
  37.  
  38. #define Number_Length 11
  39. char Data[Number_Length];
  40. byte data_count = 0, master_count = 0;
  41. char customKey;
  42.  
  43. boolean stoptone = false;
  44. boolean done = false;
  45. String number;
  46. boolean mail = false;
  47. boolean recording_on = false;
  48.  
  49. void setup(){
  50. Serial.begin(9600);
  51. // if(!SD.begin(9, SPI_HALF_SPEED)) SD.initErrorHalt();
  52. // if (!SD.chdir("/")) SD.errorHalt("sd.chdir");
  53. // if (!musicPlayer.begin()) {Serial.println("VS1053 not found");
  54. // while (1); // don't do anything more}
  55. if (!SD.begin(CARDCS)) {
  56. Serial.println("SD failed, or not present");
  57. while (1); // don't do anything more
  58. }
  59. Serial.println("SD OK!");
  60. pinMode(hook, INPUT);
  61. pinMode(ledpin, OUTPUT);
  62. MP3player.begin();
  63. MP3player.setVolume(0,30);}
  64.  
  65. uint8_t isRecording = false;
  66.  
  67. void loop(){
  68. MP3player.available();
  69. int hook_state = digitalRead(hook);
  70. unsigned long currentMillis = millis();
  71.  
  72. if (hook_state == HIGH){
  73. MP3player.stopTrack();
  74. clearData();
  75. if (currentMillis - previousMillis >= interval && mail == true){
  76. previousMillis = currentMillis;
  77. if (ledState == LOW) {ledState = HIGH;}
  78. else {ledState = LOW;}
  79. digitalWrite(ledpin, ledState);}
  80. }
  81.  
  82. else{digitalWrite(ledpin, LOW);
  83. if(stoptone == false) {
  84. MP3player.playMP3("tone.mp3");
  85. }
  86. char key = keypad.getKey();
  87.  
  88. if (key){
  89. Serial.println(key);
  90. stoptone = true;
  91. MP3player.stopTrack();
  92. String keychime = "/"+String(key)+".mp3";
  93.  
  94. if(keychime == "/#.mp3"){keychime = "/a.mp3";
  95. if(data_count == 0){recording_on = true;}
  96. else{number = number+key;
  97. data_count++;}}
  98.  
  99. else if(keychime == "/*.mp3"){keychime = "/b.mp3";
  100. number = number+key;
  101. data_count++;}
  102.  
  103. else{number = number+key;
  104. data_count++;}
  105.  
  106. MP3player.playMP3(keychime.c_str());
  107. }
  108.  
  109. if(data_count == Number_Length-1 && done == false){
  110. done = true;
  111. MP3player.stopTrack();
  112. number = "/"+number.substring(0, 3)+"/"+number.substring(3, 10)+".ogg";
  113. Serial.println(number);
  114. if(recording_on == true){Record();}
  115. else if(SD.exists(number.c_str())) {
  116. MP3player.playMP3(number.c_str());
  117. }
  118. else {
  119. MP3player.playMP3("busy.mp3");}
  120. clearData();
  121. }}}
  122.  
  123. void clearData(){
  124. while(data_count !=0){
  125. Data[data_count--] = 0;}
  126. number = "";
  127. stoptone = false;
  128. done = false;
  129. recording_on = false;
  130. return;}
  131.  
  132. void Record(){
  133. int hook_state = digitalRead(hook);
  134. if (hook_state == HIGH){
  135. Serial.println("End recording");
  136. musicPlayer.stopRecordOgg();
  137. isRecording = false;
  138. saveRecordedData(isRecording);
  139. clearData();
  140. recording.close();
  141. delay(1000);
  142. return;}
  143. else if (! musicPlayer.prepareRecordOgg("v44k1q05.img")) {
  144. Serial.println("Couldn't load plugin!");
  145. while (1);}
  146. MP3player.playMP3("/record.mp3");
  147. Serial.println("Begin recording");
  148. isRecording = true;
  149. Serial.print("Recording to "); Serial.println(number);
  150. recording = sd.open(number, FILE_WRITE);
  151. if (! recording) {
  152. Serial.println("Couldn't open file to record!");
  153. while (1);
  154. }
  155. musicPlayer.startRecordOgg(true);
  156. if (isRecording)
  157. saveRecordedData(isRecording);
  158. }
  159.  
  160. uint16_t saveRecordedData(boolean isrecord) {
  161. uint16_t written = 0;
  162.  
  163. // read how many words are waiting for us
  164. uint16_t wordswaiting = musicPlayer.recordedWordsWaiting();
  165.  
  166. // try to process 256 words (512 bytes) at a time, for best speed
  167. while (wordswaiting > 256) {
  168. //Serial.print("Waiting: "); Serial.println(wordswaiting);
  169. // for example 128 bytes x 4 loops = 512 bytes
  170. for (int x=0; x < 512/RECBUFFSIZE; x++) {
  171. // fill the buffer!
  172. for (uint16_t addr=0; addr < RECBUFFSIZE; addr+=2) {
  173. uint16_t t = musicPlayer.recordedReadWord();
  174. //Serial.println(t, HEX);
  175. recording_buffer[addr] = t >> 8;
  176. recording_buffer[addr+1] = t;
  177. }
  178. if (! recording.write(recording_buffer, RECBUFFSIZE)) {
  179. Serial.print("Couldn't write "); Serial.println(RECBUFFSIZE);
  180. while (1);
  181. }
  182. }
  183. // flush 512 bytes at a time
  184. recording.flush();
  185. written += 256;
  186. wordswaiting -= 256;
  187. }
  188.  
  189. wordswaiting = musicPlayer.recordedWordsWaiting();
  190. if (!isrecord) {
  191. Serial.print(wordswaiting); Serial.println(" remaining");
  192. // wrapping up the recording!
  193. uint16_t addr = 0;
  194. for (int x=0; x < wordswaiting-1; x++) {
  195. // fill the buffer!
  196. uint16_t t = musicPlayer.recordedReadWord();
  197. recording_buffer[addr] = t >> 8;
  198. recording_buffer[addr+1] = t;
  199. if (addr > RECBUFFSIZE) {
  200. if (! recording.write(recording_buffer, RECBUFFSIZE)) {
  201. Serial.println("Couldn't write!");
  202. while (1);
  203. }
  204. recording.flush();
  205. addr = 0;
  206. }
  207. }
  208. if (addr != 0) {
  209. if (!recording.write(recording_buffer, addr)) {
  210. Serial.println("Couldn't write!"); while (1);
  211. }
  212. written += addr;
  213. }
  214. musicPlayer.sciRead(VS1053_SCI_AICTRL3);
  215. if (! (musicPlayer.sciRead(VS1053_SCI_AICTRL3) & _BV(2))) {
  216. recording.write(musicPlayer.recordedReadWord() & 0xFF);
  217. written++;
  218. }
  219. recording.flush();
  220. }
  221.  
  222. return written;
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement