Skocz do zawartości

Problem z odczytem z czujnika dźwięku oraz zanik działania układu po podłączeniu buzzera


Watchman

Pomocna odpowiedź

Witam

To mój pierwszy post, także przepraszam za nie jasności oraz jeśli umieściłem go w złym miejscu. Stworzyłem sobie prosty układ składający się z wyświetlacza OLED 0.91", czujnika DHT11, czujnika dźwięku i diody LED. Dodatkowo chciałem dodać buzzer, ale o tym za chwilę.

1.) Czujnik wykrywający dźwięk (w zależności jak ustawie czułość) daje odczyt w monitorze na poziomie 522-524. Nie mniej mogę klaskać lub głośniej mówić, a odczyt nie ulega zmianie. Dopiero dmuchnięcie lub głośniejsze dźwięki z telefonu pobudzają czujni, a odczyt maleje. Dioda na czujniku czasami samoczynnie mruga, jakby czujnik coś wyłapywał, jednak odczyt się nie zmienia. Czy jest on źle podłączony, czy może uszkodzony?

2.) Układ, oprócz pomiaru temperatury i wilgotności w pomieszczeniu, miał wykrywać głośniejsze dźwięki i sygnalizować wykrycie diodą LED oraz dźwiękiem buzzera. Jednak sam czujnik dźwięku trochę płata figle (o czym w punkcie 1), dodatkowo po podłączeniu buzzera cały układ zamiera i zawiesza program.

To moje w sumie pierwsze dni z Arduino uno (a właściwie jego klonem). Całkiem prawdopodobne, że mogłem coś źle podłączyć. Podsyłam zdjęcia. Zdaje sobie również sprawę, że opisałem problem dość ogólnikowo, ale nie wiedziałem nad czym rozpisać się szczegółowo. Jak coś, odpowiem na pytania.

Pozdrawiam

 

IMG_20230102_163640065.jpg

IMG_20230102_163650746.jpg

IMG_20230102_163708132.jpg

Link do komentarza
Share on other sites

Czujnik dźwięku dołączony do zestawu to SY-M213. Jest podłączony do zasilania na płytce stykowej, a wyjście analogowe (AO) do pinu A1. Buzzer podłączony do do A5, i do GND (ale na Arduino, nie na płytce stykowej).

int odczytanaWartoscAO = 0;
int wilgotnosc = 0;
int temperatura = 0;
#include "DHT.h"
#include <Arduino.h>
#include <SPI.h>
#include <U8g2lib.h>
#define LEDpin  2
#define SENAOpin  A1
#define DHT11pin 8
#define BUZZERpin A5
DHT dht;
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA);   // pin remapping with ESP8266 HW I2C

void setup() {
  Serial.begin(9600);//Uruchomienie komunikacji przez USART
  pinMode(LEDpin, OUTPUT);
  pinMode(SENAOpin, INPUT);
  pinMode(BUZZERpin, OUTPUT);
  dht.setup(DHT11pin); // czujnik DHT11 wilg. i temp.
  u8g2.begin(); // wyświetlacz OLED
}

void SensorDzwieku() { // Obsługa sensora dźwieku

  odczytanaWartoscAO = analogRead(SENAOpin);//Odczytujemy wartość napięcia
  
  Serial.println(odczytanaWartoscAO);//Wysyłamy ją do terminala
  if (odczytanaWartoscAO < 500) {
    digitalWrite(LEDpin, HIGH);
  }
  else {
    digitalWrite(LEDpin, LOW);
  }
  
  delay(100);
  
}

void SensorDHT() { // obsługa czujnika wilgotności i temperatury

  delay(dht.getMinimumSamplingPeriod());

  //Pobranie informacji o wilgotnosci
  wilgotnosc = dht.getHumidity();
  Serial.print(wilgotnosc);
  Serial.print("%RH \t ");
  
  //Pobranie informacji o temperaturze
  temperatura = dht.getTemperature();
  Serial.print(temperatura);
  Serial.println("*C");

  delay(1000); //Odczekanie wymaganego czasu
}

void WyswietlaczOLED() { // Obsługa wyświelacza OLED
  String temperature = "Temp.: " + String(temperatura) + " C";
  String humidity = "RH:    " + String(wilgotnosc) + " %";

  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_courB12_tr);
    u8g2.setCursor(0, 13);
    u8g2.print(temperature);
    u8g2.setCursor(0,32);
    u8g2.print(humidity);
  } while ( u8g2.nextPage() );
  delay(1000);
}

void Buzzer() { // Obsługa buzzera
  tone(BUZZERpin, 1, 500);
  delay(1000);
  noTone(BUZZERpin);
  Serial.println("Bzyt!");
}

void loop() {
  SensorDzwieku();
  SensorDHT();
  WyswietlaczOLED();
  // Buzzer();
  
}

Zdaje sobie sprawę z niedoskonałości kodu, ale próbuje na razie ogarnąć podstawy i to by działało.

IMG_20230102_211055184.jpg

IMG_20230102_211105172.jpg

IMG_20230102_211121662.jpg

IMG_20230102_211142799.jpg

Link do komentarza
Share on other sites

Spróbuj najpierw dla testu napisać krótki program, w którym tylko odczytujesz wartość z tego czujnika dźwięku i wypisz sobie odczytane dane do monitora portu szeregowego lub narysuj wykres z tych danych. Zobacz czy faktycznie podczas klaśnięcia nie widać żadnego piku. Taki sygnał będzie bardzo krótki, jeśli wykonanie całego programu trwa stosunkowo długo to jest szansa, że mikrokontroler nie nadąża wyłapać tego piku.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Tak zrobiłem, początkowo bez delay'a żadnego, ale ciężko było coś wyłapać. Więc dodałem diodę i warunek, który przy wykryciu zaświeci diodą oraz opóźni pogram o 500ms. Wygląda na to, że działa poprawnie.

int odczytanaWartoscAO = 0;
#define SENAOpin  A0
#define LEDpin  2

void setup() {
  Serial.begin(9600);//
  pinMode(SENAOpin, INPUT);
  pinMode(LEDpin, OUTPUT);
}

void loop() {
  odczytanaWartoscAO = analogRead(SENAOpin);
  Serial.println(odczytanaWartoscAO);
  if (odczytanaWartoscAO > 520) {
    digitalWrite(LEDpin, HIGH);
    delay(500);
  }
  else {
    digitalWrite(LEDpin, LOW);
  }
}

PS. podłączyłem wszystko na nowo, zlikwidowałem opóźnienia (poza warunkiem, gdzie buzzer ma się wzbudzać). Czujnik dźwięku, o ile działało poprawnie sam z diodą, o tyle w całym układzie czujnik jakby nie jest tak czuły jak wtedy gdy był podpięty sam z diodą. Wklejam również ponownie kod do całości.

int odczytanaWartoscAO = 0;
int wilgotnosc = 0;
int temperatura = 0;
#include "DHT.h"
#include <Arduino.h>
#include <SPI.h>
#include <U8g2lib.h>
#define LEDpin  2
#define SENAOpin  A0
#define DHT11pin 8
#define BUZZERpin 4
DHT dht;
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA);   // pin remapping with ESP8266 HW I2C

void setup() {
  Serial.begin(9600);//Uruchomienie komunikacji przez USART
  pinMode(LEDpin, OUTPUT);
  pinMode(SENAOpin, INPUT);
  pinMode(BUZZERpin, OUTPUT);
  dht.setup(DHT11pin); // czujnik DHT11 wilg. i temp.
  u8g2.begin(); // wyświetlacz OLED
}

void SensorDzwieku() { // Obsługa sensora dźwieku

  odczytanaWartoscAO = analogRead(SENAOpin);
  
  Serial.println(odczytanaWartoscAO);
  if (odczytanaWartoscAO > 520) {
    digitalWrite(LEDpin, HIGH);
    tone(BUZZERpin, 100, 500);
    delay(600);
    noTone(BUZZERpin);
    Serial.println("Bzyt!");
  }
  else {
    digitalWrite(LEDpin, LOW);
  }  
}

void SensorDHT() { // obsługa czujnika wilgotności i temperatury

  delay(dht.getMinimumSamplingPeriod());

  //Pobranie informacji o wilgotnosci
  wilgotnosc = dht.getHumidity();
  Serial.print(wilgotnosc);
  Serial.print("%RH \t ");
  
  //Pobranie informacji o temperaturze
  temperatura = dht.getTemperature();
  Serial.print(temperatura);
  Serial.println("*C");
}

void WyswietlaczOLED() { // Obsługa wyświelacza OLED
  String temperature = "Temp.: " + String(temperatura) + " C";
  String humidity = "RH:    " + String(wilgotnosc) + " %";

  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_courB12_tr);
    u8g2.setCursor(0, 13);
    u8g2.print(temperature);
    u8g2.setCursor(0,32);
    u8g2.print(humidity);
  } while ( u8g2.nextPage() );
  
}

void loop() {
  SensorDzwieku();
  SensorDHT();
  WyswietlaczOLED();
  //delay(1000);
}

 

Edytowano przez Watchman
Link do komentarza
Share on other sites

3 godziny temu, Watchman napisał:

PS. podłączyłem wszystko na nowo, zlikwidowałem opóźnienia (poza warunkiem, gdzie buzzer ma się wzbudzać). Czujnik dźwięku, o ile działało poprawnie sam z diodą, o tyle w całym układzie czujnik jakby nie jest tak czuły jak wtedy gdy był podpięty sam z diodą. Wklejam również ponownie kod do całości.

To może zamiast składać całość, dokładaj kolejne elementy po kolei. Jak odłączysz i wyrzucisz to: 

SensorDHT();
WyswietlaczOLED();

to zadziała, czy nie?

Jak nie działa, a z LED działa, to opisz jak masz podłączony buzer. Sterujesz go przez tranzystor czy bezpośrednio z pinu Arduino.

Jak już sam buzer zadziała, to następnym krokiem będzie pozbycie się tego delay:

tone(BUZZERpin, 100, 500);
delay(600);
noTone(BUZZERpin);

I dopiero wtedy możemy dyskutować, o podłączaniu kolejnego elementu...

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)
Dnia 3.01.2023 o 23:22, pmochocki napisał:

To może zamiast składać całość, dokładaj kolejne elementy po kolei. Jak odłączysz i wyrzucisz to: 

SensorDHT();
WyswietlaczOLED();

to zadziała, czy nie?

Tak, Działa poprawnie.

Dnia 3.01.2023 o 23:22, pmochocki napisał:

Jak nie działa, a z LED działa, to opisz jak masz podłączony buzer. Sterujesz go przez tranzystor czy bezpośrednio z pinu Arduino.

Jak już sam buzer zadziała, to następnym krokiem będzie pozbycie się tego delay:

tone(BUZZERpin, 100, 500);
delay(600);
noTone(BUZZERpin);

I dopiero wtedy możemy dyskutować, o podłączaniu kolejnego elementu...

Buzzer zasilam bezpośrednio z pinu Arduino, bez tranzystorów lub kondensatorów. Po wyrzuceniu tego delaya buzzer nie dostaje dość energii by brzęczeć przez te 500ms. Pyknie i cichnie. Nie mniej nawet z delayem i wyświetlaczem działa tak jakbym chciał,  tylko po dołączeniu sensora DHT11 powstaje opóźnienie i domyślam się, że odpowiedzialna za to jest ta linijka kodu:

delay(dht.getMinimumSamplingPeriod());

 

Edytowano przez Watchman
Link do komentarza
Share on other sites

3 godziny temu, Watchman napisał:

Tak, Działa poprawnie.

No i super. Teraz będziemy dodawać, rzeczy po kolei, ale najpierw zaadresujemy delay i tone.

Funkcje tone trzeba zmienić na tone(pin, czestotliwosc), bez czasu trwania, a delay'a nie może być. Oczywiście trzeba wstawić coś w zamian.

Zapraszam do lektury:

https://forbot.pl/blog/kurs-arduino-ii-wielozadaniowosc-opoznienia-z-millis-id18418

I wszędzie tam gdzie masz aktywne czekanie: buzer, wyświetlacz czujnik wilgotności, nie możesz blokować mikrokontrolera.

Ponadto masz jeszcze jeden problem. Jak w czasie wykonywani tego:

  do {
    u8g2.setFont(u8g2_font_courB12_tr);
    u8g2.setCursor(0, 13);
    u8g2.print(temperature);
    u8g2.setCursor(0,32);
    u8g2.print(humidity);
  } while ( u8g2.nextPage() );

będzie jakiś głośny dźwięk to tego też nie "zauważysz".

Więc chyba musisz zmienić odczyt ADC na ciągły i obsłużyć to przerwaniem.

https://arduino.stackexchange.com/questions/45927/arduino-continuously-reading-adc-value-using-interrupt

W funkcji obsłigi przerwania odczytujesz wartość ADC. Większa niż zadany poziom ustawiasz zmianną volatile. W głównej pętli programu odczytujesz tą zmienną i zerujesz uruchamiasz buzzer jak trzeba (oczywiście bez żadnych delay)

 

Edytowano przez pmochocki
Link do komentarza
Share on other sites

Właśnie miałem pisać, że zaznajomiłem się z funkcją millis() i działa jak bym chciał, a tu widzę Twój nowy wpis 🙂

Więc tak, z millis() działa dobrze. Co do tego drugiego problemu o którym napisałeś to będę musiał się znaleźć czas i dokładniej to przeanalizować, zrozumieć i wprowadzić do mojego programu. Nie mniej na chwile obecną myślę, że mój problem z całym układem został rozwiązany.

Dziękuję za pomoc 🙂

  • Lubię! 2
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.