#include "Arduino.h" #include "SimpleExpressions.h" void SimpleExpressions::init(int mouthPin, int buzzerPin) { mouth = Adafruit_NeoPixel(7, mouthPin, NEO_GRB + NEO_KHZ800); pinBuzzer = buzzerPin; mouth.begin(); mouth.show(); } /////////////////////////////////////////////////////////////////// //-- MOUTHS & ANIMATIONS ----------------------------------------// /////////////////////////////////////////////////////////////////// unsigned long int SimpleExpressions::getMouthShape(int number){ unsigned long int types []={zero_code,one_code,two_code,three_code,four_code,five_code,six_code,seven_code,eight_code, nine_code,smile_code,happyOpen_code,happyClosed_code,heart_code,bigSurprise_code,smallSurprise_code,tongueOut_code, vamp1_code,vamp2_code,lineMouth_code,confused_code,diagonal_code,sad_code,sadOpen_code,sadClosed_code, okMouth_code, xMouth_code,interrogation_code,thunder_code,culito_code,angry_code}; return types[number]; } unsigned long int SimpleExpressions::getAnimShape(int anim, int index){ unsigned long int littleUuh_code[]={ 0b00000000000000001100001100000000, 0b00000000000000000110000110000000, 0b00000000000000000011000011000000, 0b00000000000000000110000110000000, 0b00000000000000001100001100000000, 0b00000000000000011000011000000000, 0b00000000000000110000110000000000, 0b00000000000000011000011000000000 }; unsigned long int dreamMouth_code[]={ 0b00000000000000000000110000110000, 0b00000000000000010000101000010000, 0b00000000011000100100100100011000, 0b00000000000000010000101000010000 }; unsigned long int adivinawi_code[]={ 0b00100001000000000000000000100001, 0b00010010100001000000100001010010, 0b00001100010010100001010010001100, 0b00000000001100010010001100000000, 0b00000000000000001100000000000000, 0b00000000000000000000000000000000 }; unsigned long int wave_code[]={ 0b00001100010010100001000000000000, 0b00000110001001010000100000000000, 0b00000011000100001000010000100000, 0b00000001000010000100001000110000, 0b00000000000001000010100100011000, 0b00000000000000100001010010001100, 0b00000000100000010000001001000110, 0b00100000010000001000000100000011, 0b00110000001000000100000010000001, 0b00011000100100000010000001000000 }; switch (anim){ case littleUuh: return littleUuh_code[index]; break; case dreamMouth: return dreamMouth_code[index]; break; case adivinawi: return adivinawi_code[index]; break; case wave: return wave_code[index]; break; } } void SimpleExpressions::putAnimationMouth(unsigned long int aniMouth, int index){ ledmatrix.writeFull(getAnimShape(aniMouth,index)); } void SimpleExpressions::putMouth(unsigned long int mouth, bool predefined){ if (predefined){ ledmatrix.writeFull(getMouthShape(mouth)); } else{ ledmatrix.writeFull(mouth); } } void SimpleExpressions::clearMouth(){ ledmatrix.clearMatrix(); } /////////////////////////////////////////////////////////////////// //-- SOUNDS -----------------------------------------------------// /////////////////////////////////////////////////////////////////// void SimpleExpressions::_tone (float noteFrequency, long noteDuration, int silentDuration){ // tone(10,261,500); // delay(500); if(silentDuration==0){silentDuration=1;} tone(SimpleExpressions::pinBuzzer, noteFrequency, noteDuration); delay(noteDuration); //milliseconds to microseconds //noTone(PIN_Buzzer); delay(silentDuration); } void SimpleE::bendTones (float initFrequency, float finalFrequency, float prop, long noteDuration, int silentDuration){ //Examples: // bendTones (880, 2093, 1.02, 18, 1); // bendTones (note_A5, note_C7, 1.02, 18, 0); if(silentDuration==0){silentDuration=1;} if(initFrequency < finalFrequency) { for (int i=initFrequency; ifinalFrequency; i=i/prop) { _tone(i, noteDuration, silentDuration); } } } void SimpleExpressions::sing(int songName){ switch(songName){ case S_connection: _tone(note_E5,50,30); _tone(note_E6,55,25); _tone(note_A6,60,10); break; case S_disconnection: _tone(note_E5,50,30); _tone(note_A6,55,25); _tone(note_E6,50,10); break; case S_buttonPushed: bendTones (note_E6, note_G6, 1.03, 20, 2); delay(30); bendTones (note_E6, note_D7, 1.04, 10, 2); break; case S_mode1: bendTones (note_E6, note_A6, 1.02, 30, 10); //1318.51 to 1760 break; case S_mode2: bendTones (note_G6, note_D7, 1.03, 30, 10); //1567.98 to 2349.32 break; case S_mode3: _tone(note_E6,50,100); //D6 _tone(note_G6,50,80); //E6 _tone(note_D7,300,0); //G6 break; case S_surprise: bendTones(800, 2150, 1.02, 10, 1); bendTones(2149, 800, 1.03, 7, 1); break; case S_OhOoh: bendTones(880, 2000, 1.04, 8, 3); //A5 = 880 delay(200); for (int i=880; i<2000; i=i*1.04) { _tone(note_B5,5,10); } break; case S_OhOoh2: bendTones(1880, 3000, 1.03, 8, 3); delay(200); for (int i=1880; i<3000; i=i*1.03) { _tone(note_C6,10,10); } break; case S_cuddly: bendTones(700, 900, 1.03, 16, 4); bendTones(899, 650, 1.01, 18, 7); break; case S_sleeping: bendTones(100, 500, 1.04, 10, 10); delay(500); bendTones(400, 100, 1.04, 10, 1); break; case S_happy: bendTones(1500, 2500, 1.05, 20, 8); bendTones(2499, 1500, 1.05, 25, 8); break; case S_superHappy: bendTones(2000, 6000, 1.05, 8, 3); delay(50); bendTones(5999, 2000, 1.05, 13, 2); break; case S_happy_short: bendTones(1500, 2000, 1.05, 15, 8); delay(100); bendTones(1900, 2500, 1.05, 10, 8); break; case S_sad: bendTones(880, 669, 1.02, 20, 200); break; case S_confused: bendTones(1000, 1700, 1.03, 8, 2); bendTones(1699, 500, 1.04, 8, 3); bendTones(1000, 1700, 1.05, 9, 10); break; case S_fart1: bendTones(1600, 3000, 1.02, 2, 15); break; case S_fart2: bendTones(2000, 6000, 1.02, 2, 20); break; case S_fart3: bendTones(1600, 4000, 1.02, 2, 20); bendTones(4000, 3000, 1.02, 2, 20); break; } }