• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Miernik czasu trwania hałasu
#1
Music 
Witam serdecznie. To mój pierwszy post tutaj więc proszę o wyrozumiałośćSmile

Od miesiąca bawię się arduino, stąd też jestem mało doświadczony. 
W internecie widziałem wiele instrukcji jak zrobić miernik poziomu głośności, jednak nigdzie nie ma jak zrobić miernik czasu hałasu.
Mam mikrofon z wyjściem analogowym i cyfrowym, oraz trzy diody. Gdy jest całkowita cisza miernik dźwięku analogowy mi wyświetla wartość 543. Chciałem, żeby podczas wykrycia hałasu (czyli powyżej wartości 600) zaczął się mierzyć czas. Gdy hałas jest ciągły to po upływie 1 sekundy zapala się pierwsza dioda, po kolejnej sekundzie druga dioda, a po 3 sekundzie trzecia dioda. W momencie przerwania krzyku wszystkie gasną.

Napisałem nieudolnie do tego nawet kilka programów w szkicowniku, ale żaden nie nadaje się do zaprezentowania tutaj.
Czy możecie mi może jakoś pomóc z tym tematem, jakoś mnie naprowadzić?

Dzięki z góry Smile
 
Odpowiedź
#2
(13-12-2016, 01:11)tadziu_91 napisał(a): Napisałem nieudolnie do tego nawet kilka programów w szkicowniku, ale żaden nie nadaje się do zaprezentowania tutaj.
Czy możecie mi może jakoś pomóc z tym tematem, jakoś mnie naprowadzić?
Panie mechaniku nie działe mi auto pomoże mi pan je naprawić? Niestety nie mog e go pokazać bo się go wstydzę.

Użyj funkcji millis(): https://techniczny.wordpress.com/2012/04...w-arduino/
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
A masz niech ci będzie

Kod:
long pm;
float czas;

void setup() {

  Serial.begin(9600);
  
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);

}

void loop() {

long cm = millis();
int x = analogRead(A0);

if ( x < 600 ){
  
  pm = cm;
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  }

if ( x >= 600 ){
  
  czas = ( cm - pm );
  
  if ( czas > 1000 )digitalWrite(6,HIGH);
  if ( czas > 2000 )digitalWrite(7,HIGH);
  if ( czas > 3000 )digitalWrite(8,HIGH);

  Serial.println(czas/1000);
  }
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#4
Dziękuję bardzo Smile
Jak się okazało problem jest bardziej skomplikowany, ponieważ mikrofon analogowy nie wyczuwał ciągłości hałasu. Stwierdziłem, że może wartoby by było próbkować sygnał z mikrofonu co np 100 ms, lub 500 ms. Dowiedziałem się, że można to zrealizować za pomocą przerwań i timera. Sterowanie diod zrobić za pomocą przejść bitowych (do 8 diod) lub word (w przypadku wiekszej ilości diod). Próbowałem ale zakopałem się w tym strasznie :/

Ze względu na to, że jestem początkujący zrobiłem programik dość prosty bazujący na nieszczęsnych delay() i goto.
Czekam na razie na mikrofon analogowy, więc nie miałem okazji tego programu testować, ale po tym co się naczytałem mogę sądzić, że ten program jest dość toporny.

Czy mógłby ktoś proszę pomóc w doprowadzeniu tego programiku do wersji mniej topornej? 
Z góry dziękuję Smile
Kod:
int mikrofon=A0;


int dioda1=1;
int dioda2=2;
int dioda3=3;
int dioda4=4;
int dioda5=5;

void setup()
{
 pinMode(mikrofon,INPUT);
 pinMode (dioda1, OUTPUT);
 pinMode (dioda2, OUTPUT);
 pinMode (dioda3, OUTPUT);
 pinMode (dioda4, OUTPUT);
 pinMode (dioda5, OUTPUT);
 
 
 int on=HIGH;
 int off=LOW;
 
 digitalWrite(dioda1,off);
 digitalWrite(dioda2,off);  
 digitalWrite(dioda3,off);  
 digitalWrite(dioda4,off);  
 digitalWrite(dioda5,off);  
 
}
 
void loop()
{
 int on=HIGH;
 int off=LOW;
 int mic;

 POCZATEK:
 digitalWrite(dioda1,off);
 digitalWrite(dioda2,off);  
 digitalWrite(dioda3,off);  
 digitalWrite(dioda4,off);  
 digitalWrite(dioda5,off);
 
 mic=analogRead(mikrofon);

 if (mic>600) {
   digitalWrite(dioda1, on);
 }
 else {
   goto POCZATEK;
 }
 delay (500);

 if (mic>600) {
   digitalWrite(dioda2, on);
 }
 else {
   goto POCZATEK;
 }

 if (mic>600) {
   digitalWrite(dioda3, on);
 }
 else {
   goto POCZATEK;
 }

 if (mic>600) {
   digitalWrite(dioda4, on);
 }
 else {
   goto POCZATEK;
 }

 if (mic>600) {
   digitalWrite(dioda5, on);
 }
 else {
   goto POCZATEK;
 }

 
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości