Operácie

Hlukomer

Zo stránky SensorWiki

Záverečný projekt predmetu MIPS / LS2023 - Sabadash


Zadanie

Hlukomer: - naprogramujte zariadenie na meranie úrovne hluku so zobrazením na LCD displej. Zobrazenie v dB a pomocou stupnice.

Hlukomer.


Literatúra:


Analýza a opis riešenia

Zapojenie nasho Hlukomeru bolo urobene strucne podla cviceni, kde nas senzor zvuku je A/D prevodnikom (cvicenie 9) a LCD displej z cvicenia 4

Prikladam schemy zapojenia z cviceni

Schéma pripojenia LCD displeja k procesoru.
Zapojovaci diagram pre A/D prevodnik.


Algoritmus a program

Algoritmus programu je taky ze:

Sme inicializujeme A/D prevodnik, inicializujeme LCD displej a overujeme spravnost ho zapojenia, ked je vsetko v pohode tak displej sa zapne a sa zacnu ukazovat tam data ktore sme tam posleme (ked ze sme tam nieco posleme).

Dalej, zadefinujeme "lcd_puts" (funkcia na vypis veci na displej), zoberieme nase vstupne data z funkcie "adc_read()", a vyskusame ich v Serial Plot-e. Tu sme overime ci je nas senzor zvuku funkcny/zapojeny, lebo priebeh data ktore on nam posiela vidime na diagrame.

Teraz, zadefinujeme riadok, "vypocitame" hodnotu ktoru chceme vidiet na displeji, a vypiseme to pomocou funkcie "sprintf()".

A, pre lepsi vyhlad nasho hlukomeru pridame mu stupnicu hluku, ktoru vytvorime z ciernych stvorcekov a "pustych miest" (space key)

Kedy nam to vsetko vypise, dostaneme vypis na LCD ktory bude vyzerat priblizne takto:

Db --> 25

■■

Alebo napriklad takto

Db --> 100

■■■■■■■■

Potom, sme vratime kurzor na zaciatok, a urobime meranie a vypis znova


#include <avr/io.h>
#include "adc.h"
#include "uart.h"
#include "lcd_ch.h"
#include <stdio.h>
#include <avr/interrupt.h>
#include <util/delay.h>


#define LCD_CTRL_PORT DDRD
#define LCD_DATA_PORT DDRB
#define LCD_CLR               0      /* DB0: clear display                  */
#define LCD_HOME              1      /* DB1: return to home position        */

#define LCD_RS_pin 2
#define LCD_RW_pin 3
#define LCD_EN_pin 4

#define LCD_D4_pin 1
#define LCD_D5_pin 2
#define LCD_D6_pin 3
#define LCD_D7_pin 4


FILE uart_stream = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);

int main(void)
{
	
 int pocitadlo =0;
	
 
 /* inicializacia a/d prevodnika*/
  unsigned int measuredValue;
  adc_init();                                          // Init A/D converter
  uart_init(); 
  stdout =  &uart_stream;
  
  /* inicializacia portov - vstupy / vystupy */
	
	DDRD |= (1<<LCD_EN_pin);	// Pin D4 (Enable)  PORTD  output  
	DDRD |= (1<<LCD_RW_pin);	// Pin D3 (RW)      PORTD  output  
	DDRD |= (1<<LCD_RS_pin);	// Pin D2 (RS)      PORTD  output  
  
	LCD_DATA_PORT |= (1<<LCD_D4_pin)|(1<<LCD_D5_pin)|(1<<LCD_D6_pin)|(1<<LCD_D7_pin);	// Piny 1,2,3,4, PORTB ako output (Data pre display)
	
	/* displej je spravne pripojeny, mozeme zacat inicializaciu podla datasheetu */
	
	lcd_init();  // definiciu pozri v -> lcd_ch.h resp. lcd_ch.c

	/* po ukonceni inicializacie je displej zapnuty a ak posleme nejake data, tak 
	   sa zacnu zobrazovat od prvej pozicie (riadok 0, stlpec 0)               */
  
  
  void lcd_puts(const char *s)
	{
	register unsigned char c;
	while((c = *s++))	lcd_data(c); // retazec konci "nulou"
    }

  while (1)
  {
     

	  lcd_puts("Db  -->  ");                        // vystup co sa vypise na displeji
    measuredValue = adc_read(4);
    printf("%u\n",measuredValue);			// pre serial plot  
 _delay_ms(100);
 
      lcd_command(0x0C);
	  
	  char riadok[]= {"                "};	
        int value = measuredValue - 350;   // premenna, ktorej hodnotu by sme chceli zobrazit na LCD (350 podla toho ze
	  sprintf(riadok,"%d",value);          // je to akoby nulova velicina nasho 'kvalitneho' hlukomera, ked ze sa vypisuju zle hodnoty na displej
                                           // tak musime menit prave tuto hodnotu, aby nulovy hluk zodpovedal 'nule' na displeji)
    
	  int i = (value/12);
	  int o = 16-i;                  // tu sme pocitame nase "stvorceky" pre stupnicu
	  
	  if (pocitadlo == 5)            // pocitadlo na vypisovanie dB jeden krat za 5 cyklusov programu,  aby bolo to prehliadne
	  {
	   lcd_puts(riadok);             // dB
	   lcd_data(0x10);               
	   
	  pocitadlo =0;
	   } 
	   pocitadlo++;	  
	   
	   lcd_command(0xC0);
	   
	   for(i;i>0;i--)                 // stupnica
	   {
		  lcd_data(0xFF);
	    }		  
		for(o;o>0;o--)
	   {
		  lcd_data(0x10);
	    }		 
	  lcd_command(0x70);
	  
      lcd_command(1<<LCD_HOME);  /* Set cursor to home position */


  }

  return(0);
}
#include <avr/io.h>

void adc_init(void);                                   // A/D converter initialization

unsigned int adc_read(char a_pin);

Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:

Zdrojový kód: zdrojaky.zip


Overenie

Vytvorime hluk a uvidime "reakciu" hlukomeru, kde mame vypisane "hodnoty hluku" v cislach a pomocou stupnice. Tak isto vidime na konci videa to ze hodnoty idu do minusu a ne mame stupnicu, co znamena ze hlukomer nam ustalil na hodnote mensej ako 350, ktoru sme pouzili v kode, a musime sme ju zmensit, aby minimalnym/ustalenym vypisom bola nula, a potom znov zacat meranie.

Video: