Differences

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

Link to this comparison view

pm:prj2023:vstoica:carmenpedolu [2023/05/27 21:11]
carmen.pedolu
pm:prj2023:vstoica:carmenpedolu [2023/05/29 20:18] (current)
carmen.pedolu
Line 42: Line 42:
  
 Descrierea functiilor: Descrierea functiilor:
-  * void myCallback()- functia e apelata atunci cand are loc o intrerupere, in aceasta functie se citesc notele muzicale de pe cardul SD si durata fiecarei note, valorile fiind retinute intr-un array de valori integer, iar apoi se seteaza state-ul 9, pentru a stii ca are loc o intrerupere. +  * void myCallback()- functia e apelata atunci cand are loc o intrerupere
-  * void setup() - setez pinii pentru pentru butoane, atasez intreruperea pentru butonul de play, initializez cardul SD, setez timer-ul+ 
 +In aceasta functie se citesc notele muzicale de pe cardul SD si durata fiecarei note, valorile fiind retinute intr-un array de valori integer, iar apoi se seteaza state-ul 9, pentru a stii ca are loc o intrerupere. 
 +<code C> 
 +void myCallback() { 
 +  if (SD.exists("​MELODY.TXT"​) == 0) { 
 +    Serial.println("​MELODY.TXT"​);​ 
 +  } 
 +  if (SD.exists("​DURATI~1.TXT"​) == 0) { 
 +    Serial.println("​DURATI~1.TXT"​);​ 
 +  } 
 +   
 +  File melody_file = SD.open("​MELODY.TXT",​ FILE_READ);​ 
 +  nr_elem = 0; 
 +  while (melody_file.available()){ 
 +    String nr = melody_file.readStringUntil(','​);​ 
 +    melody[nr_elem] = nr.toInt();​ 
 +    nr_elem++;​ 
 +  } 
 +  melody_file.close();​ 
 + 
 +  File duration_file = SD.open("​DURATI~1.TXT",​ FILE_READ);​ 
 +  for (int i = 0; i < nr_elem; i++) { 
 +    String nr = duration_file.readStringUntil(','​);​ 
 +    noteDurations[i] = nr.toInt();​ 
 +  } 
 +  duration_file.close();​ 
 +  state = 9; 
 +</​code>​ 
 +  * void setup() - setez pinii pentru pentru butoane, initializez ecranul LCD si afisez "Hello world!"​, atasez intreruperea pentru butonul de play, initializez cardul SD, setez timer-ul 
 +<code C> 
 +void setup() { 
 +  Serial.begin(9600);​ 
 +  nr_elem = 0; 
 +  lcd.init();​ 
 +  lcd.backlight();​ 
 +  lcd.setCursor(0,​0);​ 
 +  lcd.print("​Hello,​ world!"​);​ 
 +  pinMode(pushButton1,​ INPUT_PULLUP);​ 
 +  pinMode(pushButton2,​ INPUT_PULLUP);​ 
 +  pinMode(pushButton3,​ INPUT_PULLUP);​ 
 +  pinMode(pushButton4,​ INPUT_PULLUP);​ 
 +  pinMode(pushButton5,​ INPUT_PULLUP);​ 
 +  pinMode(pushButton6,​ INPUT_PULLUP);​ 
 +  pinMode(pushButton7,​ INPUT_PULLUP);​ 
 +  pinMode(pushButton8,​ INPUT_PULLUP);​ 
 +  pinMode(pushButton9,​ INPUT_PULLUP);​ 
 +  attachInterrupt(digitalPinToInterrupt(pushButton9),​ myCallback, FALLING); 
 + 
 +  if (!SD.begin(10)) { 
 +    Serial.println("​initialization failed!"​);​ 
 +  } 
 + 
 +  cli(); 
 +  OCR2A = 254; 
 +  TCNT2 = 0; 
 +  TCCR2A |= 0; 
 +  TCCR2B |= 0; 
 +  TCCR2A |= (1<<​WGM20) | (1<<​WGM21);​ 
 +  TCCR2B |= (1<<​WGM22);​ 
 +  TIMSK2 |= (1<<​TOIE2);​ 
 + 
 +  TCCR2B |= (1<<​CS22);​ 
 +  sei(); 
 +
 +</​code>​
   * ISR(TIMER2_OVF_vect) - functia e apelata de timer pentru a decrementa countdown-ul   * ISR(TIMER2_OVF_vect) - functia e apelata de timer pentru a decrementa countdown-ul
-  * void loop() - verific starea fiecarui buton, daca pentru un buton functia digitalRead intoarce valoarea ​0, cat timp aceasta valoare este 0, atunci se va afisa pe monitorul LCD nota specifica butonului si se va reda sunetul specific butonului si state-ul va fi numarul specific butonului. state-ul este o varibila pentru ​a sti ce se intampla in cazul celor 10 stari, starile fiind 0 (in care se afiseaza pe ecran "Hello world!"​ si nu se intampla nimic), de la  1 la 8, daca se apasa un buton al unei clape si se afieaza nota specifica clapei si se reda sunetului asociat clapei, si 9 daca se apasa butonul de play de pe cardul SD. Cand este o intreruperela finalul functiei ​se seteaza ​state ca fiind 9, pentru ca in loop(), daca este state == 9, sa se afiseze ​"play music!",​ si sa se redea melodia salvata. In timpul redarii melodiei se va afisa pe ecranul LCD un countdown de la 1000ms, daca acest timp trece se va afisa "timer expirat!"​+<code C> 
 +ISR(TIMER2_OVF_vect
 +  if (countdown > 0) { 
 +    countdown--
 +  } 
 +
 +</​code>​ 
 +  * void loop() 
 +Pentru ​a sti ce se intampla in cazul celor 10 stari, starile fiind 0 (in care se afiseaza pe ecran "Hello world!"​ si nu se intampla nimic), de la  1 la 8, daca se apasa un buton al unei clape si se afieaza nota specifica clapei si se reda sunetului asociat clapei, si 9 daca se apasa butonul de play de pe cardul SD am folosit o variabila globala volatile int state. 
 + 
 +Verific starea fiecarui buton specific unei clape, daca pentru un buton functia digitalRead intoarce valoarea 0, cat timp aceasta valoare ​este 0atunci ​se va afisa pe monitorul LCD nota specifica butonului si se va reda sunetul specific butonului si state-ul va fi numarul specific butonului. 
 +<code C> 
 +  int buttonState1 = digitalRead(pushButton1)
 +  while (buttonState1 == 0) { 
 +    if (state != 1) { 
 +      lcd.clear();​ 
 +      lcd.setCursor(0,0); 
 +      lcd.print("​nota DO1!"​);​ 
 +      ​state = 1; 
 +    } 
 +    tone(buzzer,​ 440); 
 +    buttonState1 ​digitalRead(pushButton1);​ 
 +  } 
 +</​code>​ 
 +La fel se intampla si pentru celelalte 7 butoane, fiind printat alt mesaj si redat alt sunet si setat alt state. 
 + 
 +Apoi daca state-ul este 9, se afiseaza ​"play music!",​ si sa se redea melodia salvata. In timpul redarii melodiei se va afisa pe ecranul LCD un countdown de la 1000ms, daca acest timp trece se va afisa "timer expirat!"​
 +<code C> 
 +if (state == 9) { 
 +    lcd.clear();​ 
 +    lcd.setCursor(0,​0);​ 
 +    lcd.print("​play music!"​);​ 
 +    countdown = 2000; 
 +    for (int i = 0; i < nr_elem; i++) { 
 +      int noteDuration = 1000 / noteDurations[i];​ 
 +      tone(buzzer,​ melody[i], noteDuration);​ 
 +      int pauseBetweenNotes = noteDuration * 1.30; 
 +      delay(pauseBetweenNotes);​ 
 +      if (countdown == 0) { 
 +        lcd.clear();​ 
 +        lcd.setCursor(0,​0);​ 
 +        lcd.print("​play music!"​);​ 
 +        lcd.setCursor(0,​ 1); 
 +        lcd.print("​Timer expirat!"​);​ 
 +      } else { 
 +        lcd.setCursor(0,​ 1); 
 +        lcd.print("​Time left: "); 
 +        lcd.print(countdown/​2);​ 
 +        lcd.print("​ms"​);​ 
 +      } 
 +      noTone(buzzer);​ 
 +    } 
 +  } 
 +</​code>​ 
 + 
 +Iar la final daca state-ul este diferit de 0 sunetul este oprit si se afiseaza doar textul "Hello world!"​ pe ecranul LCD. 
 +<code C> 
 +  if (state != 0) { 
 +    lcd.clear();​ 
 +    lcd.setCursor(0,​0);​ 
 +    lcd.print("​Hello World!"​);​ 
 +    noTone(buzzer);​ 
 +    state = 0; 
 +  } 
 +</​code>​ 
  
  
Line 53: Line 182:
 {{:​pm:​prj2023:​vstoica:​pedolu_carmenpoza1.jpg?​300 |}}{{:​pm:​prj2023:​vstoica:​pedolu_carmenpoza2.jpg?​300 |}} {{:​pm:​prj2023:​vstoica:​pedolu_carmenpoza3.jpg?​300 |}} {{:​pm:​prj2023:​vstoica:​pedolu_carmenpoza1.jpg?​300 |}}{{:​pm:​prj2023:​vstoica:​pedolu_carmenpoza2.jpg?​300 |}} {{:​pm:​prj2023:​vstoica:​pedolu_carmenpoza3.jpg?​300 |}}
 ===== Concluzii ===== ===== Concluzii =====
-Proiectul mi s-a parut interesant, fascinant si util sa lucrez la proiect. Libertatea de a face ceea ce imi doresc m-a atras la inceput. Apoi mi-a placut sa invat sa lipesc componente. Mi s-a parut interesant sa caut in datasheet diverse informatii despre intreruperi,​ timere si pinii la care trebuie conectati piesele. Consider ca am invatat multe despre ​lucrul ​cu arduino si conectarea hardware-ului cu software-ul.+Proiectul mi s-a parut interesant, fascinant si util. Libertatea de a face ceea ce imi doresc m-a atras la inceput. Apoi mi-a placut sa invat sa lipesc componente. Mi s-a parut interesant sa caut in datasheet diverse informatii despre intreruperi,​ timere si pinii la care trebuie conectati piesele. Consider ca am invatat multe despre ​lucratul ​cu arduino si conectarea hardware-ului cu software-ul.
  
 ===== Download ===== ===== Download =====
pm/prj2023/vstoica/carmenpedolu.1685211099.txt.gz · Last modified: 2023/05/27 21:11 by carmen.pedolu
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