6
https://www.youtube.com/watch?v=2gMp...ature=youtu.be
Ένα μικρό βίντεο που δείχνει πως ακούγεται .wav αρχείο αναγνωσμένο απο microSD κάρτα και παιγμένο κατ' ευθείαν σε μικρό μεγάφωνο απο PWM pin ενός Arduino!
Με τα μέσα που είχα, έφτιαξα στα γρήγορα ένα setup για να δείξω πόσο καλό είναι το κολπάκι με τα αρχεία .wav και πόσο εύκολο είναι επίσης να τα συμπεριλάβει
κάποιος στα projects του κάνοντάς τα πιο ελκυστικά.
Πάλι, ένας Arduino MEGA1280, η ίδια shield SIM900 που έχει ενσωματωμένο card reader, ένα 4x4 matrix πληκτρολόγιο, ένα μικρό buzzer για τα μπίπ και ένα επίσης
μικρό μεγαφωνάκι στα 8Ω, απ' ευθείας πάνω σε ένα PWM pin του Arduino (κανονικά μέσω μιας μικρής αντίστασης για περιορισμό ρεύματος, αλλά το pin αντέχει και
χωρίς αυτήν). Η ένταση του παραγόμενου ήχου δεν είναι μεγάλη, αλλά μπορεί με σεταρισμένο το volume στο χαμηλότερο (π.χ. audio.setVolume(1); όπου audio είναι η καλούμενη
κλάση) και ένα μικρό ενισχυτή, π.χ. TDA7052 ή LM386 να έχει μια ικανοποιητική απόδοση.
Κώδικας:#include <SPI.h> #include <SdFat.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <Keypad.h> #include <TimedAction.h> #include <ctype.h> #include <avr/interrupt.h> #include <WString.h> #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <TMRpcm.h> //=========================================== #define LCD_I2C_ADDRESS 0x27 #define cols 20 #define lines 4 #define BUZZER_PIN 6 //=========================================== #if SD_SPI_CONFIGURATION >= 3 const uint8_t SOFT_MISO_PIN = 12; const uint8_t SOFT_MOSI_PIN = 11; const uint8_t SOFT_SCK_PIN = 13; const uint8_t SD_CHIP_SELECT_PIN = 10; //=========================================== const byte ROWS = 4; //four rows const byte COLS = 4; //three columns char numberKeys[ROWS][COLS] = { { '1','2','3','A' }, { '4','5','6','B' }, { '7','8','9','C' }, { '*','0','#','D' } }; boolean alpha = false; // Start with the numeric keypad. char key; byte rowPins[ROWS] = {29, 27, 25, 23}; //connect to the row pinouts of the keypad byte colPins[COLS] = {37, 35, 33, 31}; //connect to the column pinouts of the keypad static char virtKey = NO_KEY; // Stores the last virtual key press. (Alpha keys only) static char physKey = NO_KEY; // Stores the last physical key press. (Alpha keys only) static char buildStr[12]; static byte buildCount; static byte pressCount; static byte kpadState; //=========================================== LiquidCrystal_I2C lcd(LCD_I2C_ADDRESS, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address SdFatSoftSpi<SOFT_MISO_PIN, SOFT_MOSI_PIN, SOFT_SCK_PIN> sd; SdFile file; Keypad numpad( makeKeymap(numberKeys), rowPins, colPins, sizeof(rowPins), sizeof(colPins)); TMRpcm audio; //=========================================== void setup() { Wire.begin(); lcd.begin(cols, lines); numpad.begin( makeKeymap(numberKeys) ); numpad.addEventListener(keypadEvent_num); // Add an event listener. numpad.setHoldTime(100); // Default is 1000mS audio.speakerPin = 5; // audio.setVolume(3); Serial.begin(9600); pinMode(BUZZER_PIN, OUTPUT); digitalWrite(BUZZER_PIN, LOW); beepBuzzer(6250,30); if (!sd.begin(SD_CHIP_SELECT_PIN)) { Serial.println("SD FAIL!"); return; }else { Serial.println("SD OK!"); } lcd.setCursor(0,0); lcd.print(" WAV FILES PLAYER "); lcd.setCursor(0,1); lcd.print(" NO DAC, PWM OUTPUT "); lcd.setCursor(0,2); lcd.print(" 32KHz MONO, 8bit "); delay(4000); lcd.clear(); lcd.setCursor(0,0); lcd.print("KEY PRESSED: "); } //=========================================== void loop() { #else #error SD_SPI_CONFIGURATION must be set to 3 in SdFat/SdFatConfig.h #endif key = numpad.getKey( ); } //=========================================== void beepBuzzer(unsigned long hz, unsigned long ms) { unsigned long us = (750000 / hz); unsigned long rep = (ms * 500L) / us; for (int i = 0; i < rep; i++) { digitalWrite(BUZZER_PIN, HIGH); delayMicroseconds(us); digitalWrite(BUZZER_PIN, LOW); delayMicroseconds(us); } } //=========================================== void keypadEvent_num(KeypadEvent key) { kpadState = numpad.getState(); swOnState(key); } //=========================================== void swOnState(char key) { switch(kpadState) { case PRESSED: beepBuzzer(6250,15); switch(key) { case '1': audio.play("1.wav"); break; case '2': audio.play("2.wav"); break; case '3': audio.play("3.wav"); break; case '4': audio.play("4.wav"); break; case '5': audio.play("5.wav"); break; case '6': audio.play("6.wav"); break; case '7': audio.play("7.wav"); break; case '8': audio.play("8.wav"); break; case '9': audio.play("9.wav"); break; case '0': audio.play("0.wav"); break; case '*': audio.play("star.wav"); break; case '#': audio.play("diesi.wav"); break; case 'A': audio.play("A_eng.wav"); break; case 'B': audio.play("B_eng.wav"); break; case 'C': audio.play("C_eng.wav"); break; case 'D': audio.play("D_eng.wav"); break; } Serial.print(key); lcd.setCursor(0,0); lcd.print("KEY PRESSED: "); lcd.print(key); lcd.print(" "); break; case HOLD: break; case RELEASED: delay(500); lcd.setCursor(13,0); lcd.print(" "); break; } }// end switch on state function //===========================================