Operácie

Hlukomer

Z 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 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)

	  sprintf(riadok,"%d",value);    
	  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

Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.

Video:

Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.