Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2023:dene:jucariebebelusi [2023/05/25 19:16]
ana_maria.nastase [Bibliografie/Resurse]
pm:prj2023:dene:jucariebebelusi [2023/05/30 13:04] (current)
ana_maria.nastase [Concluzii]
Line 16: Line 16:
 {{ :​pm:​prj2023:​dene:​schema.png?​700 }} {{ :​pm:​prj2023:​dene:​schema.png?​700 }}
  
-Arduino va primi de la senzorul de sunet semnalul analogic, pe care il va converti in digital cu ajutorul ADC-ului inclus. Pentru a determina daca bebelusul plange, se va verifica daca media valorilor semnalului ​pe o durata de 5 secunde depaseste ​o anumita valoare. Daca da, atunci microcontroller-ul va face cercul de LED-uri sa lumineze si va incepe sa redea melodii de pe un card SD, cu ajutorul modulului Micro SD (comunicand prin protocolul SPI) si al difuzorului. De asemenea, va trimite o alerta catre un telefon conectat prin bluetooth ​(folosind un modul cu interfata UART), pentru a semnala plansul copilului. Dispozitivul poate fi oprit cu ajutorul unui buton, iar, daca se doreste ca acesta sa intre din nou in stare de functionare,​ de asteptare a plansului, trebuie apasat acelasi buton.+Arduino va primi de la senzorul de sunet semnalul analogic, pe care il va converti in digital cu ajutorul ADC-ului inclus. Pentru a determina daca bebelusul plange, se va verifica daca numarul citirilor senzorului mai mari decat o anumita valoare, ​pe o durata de 5 secundedepaseste ​un numar minim. Daca da, atunci microcontroller-ul va face cercul de LED-uri sa lumineze si va incepe sa redea melodii de pe un card SD, cu ajutorul modulului Micro SD (comunicand prin protocolul SPI) si al difuzorului. De asemenea, va trimite o alerta catre un telefon conectat prin Bluetooth ​(folosind un modul cu interfata UART), pentru a semnala plansul copilului. Dispozitivul poate fi oprit cu ajutorul unui buton, iar, daca se doreste ca acesta sa intre din nou in stare de functionare,​ de asteptare a plansului, trebuie apasat acelasi buton.
 ===== Hardware Design ===== ===== Hardware Design =====
  
Line 30: Line 30:
 </​note>​ </​note>​
 {{ :​pm:​prj2023:​dene:​whatsapp_image_2023-05-21_at_22.43.50.jpg?​700 }} {{ :​pm:​prj2023:​dene:​whatsapp_image_2023-05-21_at_22.43.50.jpg?​700 }}
-{{ :​pm:​prj2023:​dene:​whatsapp_image_2023-05-21_at_21.11.11.jpg?​700 }} 
 ===== Software Design ===== ===== Software Design =====
  
  
-<note tip> +Mediul de dezvoltare utilizat a fost Arduino IDE. 
-Descrierea codului aplicaţiei (firmware)+In ceea ce priveste bibliotecile,​ acestea sunt
-  * mediu de dezvoltare (if any) (e.gAVR Studio, CodeVisionAVR) +  * Adafruit_NeoPixel.h - biblioteca folosita pentru a controla inelul de led-uri Neopixel Ring 
-  * librării şi surse 3rd-party (e.gProcyon AVRlib) +  * SPI.h si SD.h - utilizate pentru comunicarea cu modulul SD 
-  * algoritmi şi structuri ​pe care plănuiţi să le implementaţi +  * TMRpcm.h - biblioteca necesara redarii de muzica de pe un  card SD 
-  * (etapa 3) surse şi funcţii implementate +  * SoftwareSerial.h - pentru comunicarea cu modulul Bluetooth
-</​note>​+
  
-===== Rezultate Obţinute =====+Pentru a primi pe telefon un mesaj de avertizare atunci cand jucaria porneste, am instalat pe telefon o aplicatie numita "​Arduino Bluetooth Controller",​ prin care pot fi vizualizate mesajele trimise prin interfata seriala.
  
-<note tip+Codul sursa: 
-Care au fost rezultatele obţinute în urma realizării proiectului vostru+<file c baby_toy.ino
-</note>+#include <​Adafruit_NeoPixel.h> 
 +#​include ​<SPI.h> 
 +#include <​SD.h>​ 
 +#include <​TMRpcm.h>​ 
 +#include <​SoftwareSerial.h>
  
-===== Concluzii =====+#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
  
-===== Download =====+#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
  
-<note warning>​ +SoftwareSerial mySerial(1, 0); // RXTX pentru bluetooth 
-O arhivă ​(sau mai multe dacă este cazulcu fişierele obţinute în urma realizării proiectului:​ surseschemeetc. Un fişier READMEun ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).+Adafruit_NeoPixel strip(LED_COUNTLED_PINNEO_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;​
  
-Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:​pm:​prj20??:​c?​** sau **:​pm:​prj20??:​c?:​nume_student** ​(dacă este cazul). **Exemplu:​** Dumitru Alin331CC -> **:​pm:​prj2009:​cc:​dumitru_alin**. +void setup() 
-</​note>​+  pinMode(SENSORINPUT); 
 +  ​pinMode(BUTTON,​ INPUT_PULLUP);​ 
 +  pinMode(SS, OUTPUT); 
 +  pinMode(SPEAKER,​ OUTPUT);
  
-===== Jurnal =====+  onOff 0; 
 +  crying ​0;
  
-<note tip+  strip.begin();​ 
-Putețavea șo secțiune ​de jurnal în care să poată urmări asistentul de proiect progresul proiectului+  strip.show();​ 
-</note>+  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 ​= 0; < 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; 
 +  } 
 +
 + 
 +</​file>​ 
 + 
 +===== Rezultate Obţinute ===== 
 + 
 +{{ :​pm:​prj2023:​dene:​baby_toy.jpg?​700 ​ }} 
 + 
 +===== Concluzii ===== 
 + 
 +Dispozitivul functioneaza conform descrierii, desi cu siguranta nu este cu adevarat o jucarie ce ar putea fi folosita intr-o situatie reala, atat prin prisma aspectului, cat si din cauza volumului redus al sunetului redat (problema ce ar fi putut fi corectata utilizand un amplificator sau un difuzor mai performant). In ciuda acestor aspecte, un astfel de dispozitiv este fezabil si util, iar pentru mine realizarea proiectului a reprezentat o experienta foarte buna de proiectare cu Arduino si de familiarizare cu ceea ce presupune lucrul cu senzori, diferite module specializate,​ intreruperi hardware, protocoale de comunicatie specifice si cateva biblioteci.
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
pm/prj2023/dene/jucariebebelusi.1685031401.txt.gz · Last modified: 2023/05/25 19:16 by ana_maria.nastase
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0