#include #include #include #include #include #define SENSOR A1 // senzorul de sunet #define LED_PIN 6 // input-ul inelului de led-uri #define BUTTON 2 // butonul on/off #define SS 10 #define SD_ChipSelectPin 4 #define SPEAKER 9 #define LED_COUNT 24 #define LED_DELAY 10 // intervalul dupa care isi schimba culoarea fiecare led #define CRYING_WAIT_TIME 5000 // 5 secunde #define CRYING_THRESHOLD 10 // nr de citiri > 200 in 5 secunde necesare pt a porni jucaria #define CRYING_INTENSITY 200 // intensitatea minima a sunetului #define DEBOUNCE_TIME 500 SoftwareSerial mySerial(1, 0); // RX, TX pentru bluetooth Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); // inelul de led-uri TMRpcm tmrpcm; // obiect folosit pt redarea muzicii unsigned long ledInterval; long firstPixelHue; unsigned long soundCount; // nr de citiri > 200 in 5 secunde unsigned long cryingTime; volatile bool onOff; bool crying; volatile unsigned long lastInterrupt; void setup() { pinMode(SENSOR, INPUT); pinMode(BUTTON, INPUT_PULLUP); pinMode(SS, OUTPUT); pinMode(SPEAKER, OUTPUT); onOff = 0; crying = 0; strip.begin(); strip.show(); strip.setBrightness(10); ledInterval = millis(); firstPixelHue = 0; Serial.begin(9600); mySerial.begin(9600); soundCount = 0; cryingTime = millis(); lastInterrupt = 0; attachInterrupt(digitalPinToInterrupt(BUTTON), isr, RISING); // intrerupere la apasarea butonului if (!SD.begin(SD_ChipSelectPin)) { Serial.println("SD fail"); return; } else { Serial.println("SD ok"); } tmrpcm.speakerPin = SPEAKER; tmrpcm.quality(1); tmrpcm.setVolume(6); } void loop() { if (onOff == 1) { // LED-urile if (millis() - ledInterval >= LED_DELAY) { ledInterval = millis(); for(int i = 0; i < LED_COUNT; i++) { if (crying == 1) { // Daca bebelusul plange, se aprind led-urile int pixelHue = firstPixelHue + (i * 65536L / LED_COUNT); strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue))); } else { // primul led este verde pentru a semnala functionarea dispozitivului if (i == 0) { strip.setPixelColor(0, 0, 255, 0); } else { // celelalte led-uri sunt stinse strip.setPixelColor(i, 0, 0, 0); } } } strip.show(); firstPixelHue += 256; if (firstPixelHue >= 5*65536) { firstPixelHue = 0; } } // senzorul de sunet if (crying == 0) { int soundLevel = analogRead(SENSOR); if (soundLevel >= CRYING_INTENSITY) { soundCount++; } // Se verifica daca au trecut cele 5 secunde if (millis() - cryingTime >= CRYING_WAIT_TIME) { if (soundCount >= CRYING_THRESHOLD) { // nr citirilor senzorului // Jucaria porneste crying = 1; // se initializeaza variabilele necesare led-urilor ledInterval = millis(); firstPixelHue = 0; // porneste muzica tmrpcm.play("song.wav", 15); // se trimite notificare Serial.println("Your baby is crying!"); } cryingTime = millis(); soundCount = 0; } } } else { crying = 0; ledInterval = millis(); firstPixelHue = 0; soundCount = 0; cryingTime = millis(); // se opreste muzica tmrpcm.stopPlayback(); // led-urile sunt stinse for(int i = 0; i < LED_COUNT; i++) strip.setPixelColor(i, 0, 0, 0); strip.show(); } } void isr() { // debounce pt buton if (millis() - lastInterrupt >= DEBOUNCE_TIME) { lastInterrupt = millis(); onOff = !onOff; } }