Różnice
Różnice między wybraną wersją a wersją aktualną.
Poprzednia rewizja po obu stronach Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
projekty:szuszacz [2017/11/29 12:58] yazjack [Wykonanie] |
— (aktualna) | ||
---|---|---|---|
Linia 1: | Linia 1: | ||
- | ==== Opis projektu ==== | ||
- | Mój synek dość niespokojnie śpi, najczęściej wybudza się co jakiś czas i trzeba brać go na ręce, ponownie usypiać itd. To wszystkow czasie, kiedy kręgosłup odmawiał mi posłuszeństwa. Jedyną opcją było "szuszanie", kiedy słyszał ten dźwięk, uspokajał się i ponownie zasypiał. Są nawet badania, wskazujące na korzystne działanie białego szumu na sen u dzieci. Nie ważne, działało. Z tym mankamentem, że trzeba było obserwować małego, kiedy zaczynał się poruszać we śnie, to był moment na "szuszanie". | ||
- | |||
- | Pomysł był dość prosty, zrobić czujkę, która "obserwuje" malucha za mnie i "szusza" w odpowiednim momencie. | ||
- | |||
- | ==== Wykonanie ==== | ||
- | |||
- | Elementy: | ||
- | |||
- | - Arduino Nano | ||
- | - DFPlayer | ||
- | - zasilacz do płytek prototypowych | ||
- | - czujnik PIR | ||
- | - mikrofon | ||
- | |||
- | Zaczęło się i skończyło na prototypie na płytce. Bo działało i wystarczyło. Za układ starujący posłużyło Arduino Nano, za odtwarzanie dźwięku DFPlayer z głośnikiem, za wykrywanie ruchu i dźwięku czujnik PIR i mikrofon. Arduino przyjmowało sygnał z PIR i odtwarzało losowo cykl pięciu z dziesięciu czterosekundowych nagrań. Takie rozwiązanie pozwalało na odtworzenie dość naturalnego, niepowtarzalnego "szuszania". Mikrofon miał wykrywać płacz i zwiększać głośność, ewentualnie dawać znać do odbiornika przez wifi, ale nie oddalam się nigdy na tyle, żeby było to konieczne. | ||
- | |||
- | <code cpp> | ||
- | |||
- | #include "Arduino.h" | ||
- | #include "SoftwareSerial.h" | ||
- | #include "DFRobotDFPlayerMini.h" | ||
- | |||
- | SoftwareSerial mySoftwareSerial(10, 11); // RX, TX | ||
- | DFRobotDFPlayerMini myDFPlayer; | ||
- | void printDetail(uint8_t type, int value); | ||
- | |||
- | void setup() | ||
- | { | ||
- | mySoftwareSerial.begin(9600); | ||
- | Serial.begin(115200); | ||
- | |||
- | Serial.println(); | ||
- | Serial.println(F("DFRobot DFPlayer Mini Demo")); | ||
- | Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); | ||
- | |||
- | if (!myDFPlayer.begin(mySoftwareSerial)) { //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.")); | ||
- | |||
- | myDFPlayer.volume(10); //Set volume value. From 0 to 30 | ||
- | myDFPlayer.play(1); //Play the first mp3 | ||
- | } | ||
- | |||
- | void loop() | ||
- | { | ||
- | static unsigned long timer = millis(); | ||
- | |||
- | if (millis() - timer > 3000) { | ||
- | timer = millis(); | ||
- | myDFPlayer.next(); //Play next mp3 every 3 second. | ||
- | } | ||
- | |||
- | if (myDFPlayer.available()) { | ||
- | printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states. | ||
- | } | ||
- | } | ||
- | |||
- | 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; | ||
- | } | ||
- | } | ||
- | </code> | ||
- | ==== Finał projektu ==== | ||
- | |||
- | Na zdjęciu pierwszy test bojowy. Działało idealnie, drzemki trwały bez przerw. 10/10, używam do tej pory. | ||
- | |||
- | {{https://trello-attachments.s3.amazonaws.com/5a156db2be9d8433cfe1eaaa/5a1e9c9965016cd49e972e71/7784e26863b65249e9157f23b065e324/IMG_20170615_152405.jpg?400}} |