Hlukomer: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
Riadok 130: | Riadok 130: | ||
char riadok[]= {" "}; | 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 | |||
// 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) | // tak musime menit prave tuto hodnotu, aby nulovy hluk zodpovedal 'nule' na displeji) | ||
int i = (value/12); | int i = (value/12); | ||
int o = 16-i; // tu sme pocitame nase "stvorceky" pre stupnicu | int o = 16-i; // tu sme pocitame nase "stvorceky" pre stupnicu |
Verzia z 01:05, 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
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.