Hlukomer: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
Riadok 182: | Riadok 182: | ||
=== Overenie === | === 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:''' | '''Video:''' | ||
<center><youtube>1nKjUhUQs04</youtube></center> | <center><youtube>1nKjUhUQs04</youtube></center> | ||
[[Category:AVR]] [[Category:MIPS]] | [[Category:AVR]] [[Category:MIPS]] |
Verzia z 01:13, 6. jún 2023
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.
Literatúra:
- Dokumentácia k doske Acrob
- Vyskúšajte si zmerať reakciu on-line
- A/D prevodnik (hlukomer)
- LCD display
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
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: