Inteligentný šatník: Rozdiel medzi revíziami
Zo stránky SensorWiki
Riadok 50: | Riadok 50: | ||
<tabs> | <tabs> | ||
<tab name="main.c"><source lang="c++" style="background: LightYellow;"> | <tab name="main.c"><source lang="c++" style="background: LightYellow;"> | ||
#define RED_PIN PD5 | |||
#define GREEN_PIN PD6 | |||
#define BLUE_PIN PD7 | |||
#define MAGNET_PIN PB5 | |||
#define LCD_CMD_DISPLAY_OFF_CURSOR_OFF 0x0C | |||
#include <avr/io.h> | #include <avr/io.h> | ||
#include <avr/interrupt.h> // Pre fungovanie random generátora | |||
#include <stdlib.h> // Pre funkcie rand() a srand() | |||
#include <stdio.h> | |||
#include "uart.h" | |||
#include "lcd.h" | |||
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); | |||
static volatile int randomNumber = 0; | |||
void initRandomGenerator() { // Inicializácia generátora náhodných čísel. | |||
srand(TCNT0); | |||
} | |||
int generateRandomNumber(int min, int max) { // Zadefinovanie funkcie generátora náhodých čísel. | |||
int randomNum = rand() % (max - min + 1); | |||
randomNum += min; | |||
return randomNum; | |||
} | |||
ISR(TIMER1_OVF_vect) { | |||
TCNT1 = 65536 - 45000; // Nastavenie timera na 1 sekundu. | |||
randomNumber = generateRandomNumber(1, 6); // Nastavenie generátora náhodných čísel, aby generovalo len v intervale od 1 po 6. | |||
} | |||
void stavy() { | |||
if (randomNumber == 1) { | |||
lcd_command(0x80); // Nastavenie pozície kurzora na 1. riadok, 1. políčko. | |||
lcd_puts("Teplota: 30\x01\x02\nJasno, Bez vetra"); | |||
setRGBled(255, 0, 0); | |||
} | |||
if (randomNumber == 2) { | |||
lcd_command(0x80); | |||
lcd_puts("Teplota: 25\x01\x02\nSlne\x04no, Veterno"); | |||
setRGBled(255, 165, 0); | |||
} | |||
if (randomNumber == 3) { | |||
lcd_command(0x80); | |||
lcd_puts("Teplota: 16\x01\x02\nJasno, Slne\x04no "); | |||
setRGBled(255, 255, 0); | |||
} | |||
if (randomNumber == 4) { | |||
lcd_command(0x80); | |||
lcd_puts("Teplota: 8\x01\x02 \nPoloobla\x04no,D\x03\x05\x06"); | |||
setRGBled(102, 204, 255); | |||
} | |||
if (randomNumber == 5) { | |||
lcd_command(0x80); | |||
lcd_puts("Teplota: 2\x01\x02 \nZamra\x04\x07n\x08, D\x03\x05\x06 "); | |||
setRGBled(153, 0, 204); | |||
} | |||
if (randomNumber == 6) { | |||
lcd_command(0x80); | |||
lcd_puts("Teplota: -5\x01\x02\nZamra\x04\x07n\x08, Sneh "); | |||
setRGBled(0, 0, 255); | |||
} | |||
} | |||
int main(void) | int main(void) { | ||
uart_init(); // Inicializácia UARTu | |||
initRGBled(); // Inicilizácia RGB LED diódy | |||
stdout = &mystdout; // printf() funkcia je zapnutá | |||
printf("Spustenie DEBUGU aktívne!\n"); | |||
DDRB &= ~(1 << MAGNET_PIN); // Nastavenie MAGNET pinu na INPUT | |||
PORTB |= (1 << MAGNET_PIN); | |||
TCCR1B |= (1 << CS12) | (1 << CS10); // Prescaler nastavený na 1024 | |||
TIMSK1 |= (1 << TOIE1); | |||
TCCR0B |= (1 << CS00); | |||
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) | |||
lcd_init(); // Inicializácia LCD Displeja | |||
def_spec_znaky(); // Inicializácia špeciálnych znakov na displeji | |||
lcd_command(LCD_CMD_DISPLAY_OFF_CURSOR_OFF); // Vypnutie kurzora na displeji | |||
sei(); | |||
while(1) { | |||
if (PINB & (1 << MAGNET_PIN)) { | |||
// Ak je magnet pripojený, do UARTu sa vypíše DEBUG, RGB LED dióda sa vypne a vynuluje sa LCD Displej | |||
printf("Magnet je pripojený!\r"); | |||
setRGBled(0, 0, 0); | |||
lcd_command(0x01); | |||
} else { | |||
// Ak je magnet odpojený, do UARTu sa vypíše DEBUG a spustí sa funkcia stavy(). | |||
printf("Magnet je odpojený!\r"); | |||
stavy(); | |||
} | |||
} | } | ||
return(0); | return(0); | ||
} | } |
Verzia z 22:06, 27. apríl 2024
Vypracoval: | Tomáš Reismüller |
Projekt: | Inteligentný šatník |
Študijný odbor: | Automobilová mechatronika |
Ročník: | 2. Bc. |
Zadanie
Cieľom tohto projektu bolo vytvoriť prototyp inteligentného šatníka, ktorý nám po otvorení dvierok vypíše na LCD displeji vonkajšiu teplotu aj s aktuálnou predpoveďou počasia a následne rozsvieti RGB LED diódu na farbu danú podľa teploty, napríklad: Červená = 30 °C,Modrá = -2 °C, a pod.
Literatúra:
Analýza a opis riešenia
Model inteligentného šatníku je zostrojený z troch rôznych súčiastok a to: LCD displej s radičom HD44780,Senzor otvorenia dverí MC-38A,RGB LED dióda. Tieto súčiastky sú zapojené pomocou Breadboardu do Arduina UNO R3.
Princíp fungovania je pomerne jednoduchý, keďže sa jedná len o prototyp, tak všetky funkcie sú len iba ako príklad, samotné riešenie v realite by bolo oveľa komplexnejšie. Funguje to tak, že z vnútornej strane dverí je nalepený senzor otvorenia dverí, ktorý sníma, či sú otvorené alebo zatvorené dvere. Snímanie je založené na magnete, ak je spojený, dvere sú zatvorené, ak je rozpojený, dvere sú otvorené. Následne ak otvoríme dvierka, tak sa rozpojí senzor a tým zapne LCD displej, na ktorom sa vypíše aktuálna teplota, predpoveď počasia a RGB LED dióda sa rozsvieti na farbu danú podľa teploty.
-
Senzor otvorenia dverí MC-38A.
-
RGB LED dióda.
-
LCD Displej HD44780.
Zapojenie a schéma
LCD displej sme zapojili podľa návodu z cvičenia č.11. Použili sme piny PD2,PD3,PD4 a PB1,PB2,PB3,PB4. Senzor otvorenia dverí sme zapojili do pinu PB5 a ako posledné RGB LED diódu sme zapojili do pinov PD5,PD6 a PD7. Pomohli sme si aj s Breadboardom, aby sme si uľahčili pripájanie ZEME a NAPÁJANIA 5V.
Program
Program sa skladá z hlavnej časti main.c, kde sa riadi celý systém ovládanie RGB diódy, LCD displeja a samotné fungovanie senzoru otvárania dverí. A 2 knižníc - lcd.c (Na fungovanie LCD dipleja) a uart.c (Na fungovanie sériovej komunikácie a ostatných funkcií použitých v main.c).
Ako prvé sme si zadefinovali knižnice, aby sme mohli ďalej pracovať s kódom v hlavnej časti programu. Ďalej sme už pokračovali len v hlavnej časti programu a to nasledovne: Zadefinovali sme si porty na pripojenie do Arduina. Vytvorili sme funkciu generátora náhodných čísel a následne aj časovač, ktorý umožní generátoru pomimo programu každú 1 sekundu vygenerovať 1 náhodné číslo v intervale od 1 po 6. Ako ďalšie sme si vytvorili funkciu stavy(), kde sa nachádzajú funkcie na vypisovanie na displej a riadenie RGB LED diódy. Táto funkcia sa neskôr využije v programe. Potom sme si v hlavnej funkcii main() spustili inicializáciu UART komunikácie, LCD dipleja, RGB LED diódy, časovača a senzoru otvorenia dverí. A ako posledné sme do while() funkcie, ktorá prebieha neustále dokola pridali samotné riadenie celého systému inteligentného šatníka ovládané senzorom otvorenia dverí, kde sme využili aj funkciu stavy().
#define RED_PIN PD5
#define GREEN_PIN PD6
#define BLUE_PIN PD7
#define MAGNET_PIN PB5
#define LCD_CMD_DISPLAY_OFF_CURSOR_OFF 0x0C
#include <avr/io.h>
#include <avr/interrupt.h> // Pre fungovanie random generátora
#include <stdlib.h> // Pre funkcie rand() a srand()
#include <stdio.h>
#include "uart.h"
#include "lcd.h"
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
static volatile int randomNumber = 0;
void initRandomGenerator() { // Inicializácia generátora náhodných čísel.
srand(TCNT0);
}
int generateRandomNumber(int min, int max) { // Zadefinovanie funkcie generátora náhodých čísel.
int randomNum = rand() % (max - min + 1);
randomNum += min;
return randomNum;
}
ISR(TIMER1_OVF_vect) {
TCNT1 = 65536 - 45000; // Nastavenie timera na 1 sekundu.
randomNumber = generateRandomNumber(1, 6); // Nastavenie generátora náhodných čísel, aby generovalo len v intervale od 1 po 6.
}
void stavy() {
if (randomNumber == 1) {
lcd_command(0x80); // Nastavenie pozície kurzora na 1. riadok, 1. políčko.
lcd_puts("Teplota: 30\x01\x02\nJasno, Bez vetra");
setRGBled(255, 0, 0);
}
if (randomNumber == 2) {
lcd_command(0x80);
lcd_puts("Teplota: 25\x01\x02\nSlne\x04no, Veterno");
setRGBled(255, 165, 0);
}
if (randomNumber == 3) {
lcd_command(0x80);
lcd_puts("Teplota: 16\x01\x02\nJasno, Slne\x04no ");
setRGBled(255, 255, 0);
}
if (randomNumber == 4) {
lcd_command(0x80);
lcd_puts("Teplota: 8\x01\x02 \nPoloobla\x04no,D\x03\x05\x06");
setRGBled(102, 204, 255);
}
if (randomNumber == 5) {
lcd_command(0x80);
lcd_puts("Teplota: 2\x01\x02 \nZamra\x04\x07n\x08, D\x03\x05\x06 ");
setRGBled(153, 0, 204);
}
if (randomNumber == 6) {
lcd_command(0x80);
lcd_puts("Teplota: -5\x01\x02\nZamra\x04\x07n\x08, Sneh ");
setRGBled(0, 0, 255);
}
}
int main(void) {
uart_init(); // Inicializácia UARTu
initRGBled(); // Inicilizácia RGB LED diódy
stdout = &mystdout; // printf() funkcia je zapnutá
printf("Spustenie DEBUGU aktívne!\n");
DDRB &= ~(1 << MAGNET_PIN); // Nastavenie MAGNET pinu na INPUT
PORTB |= (1 << MAGNET_PIN);
TCCR1B |= (1 << CS12) | (1 << CS10); // Prescaler nastavený na 1024
TIMSK1 |= (1 << TOIE1);
TCCR0B |= (1 << CS00);
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)
lcd_init(); // Inicializácia LCD Displeja
def_spec_znaky(); // Inicializácia špeciálnych znakov na displeji
lcd_command(LCD_CMD_DISPLAY_OFF_CURSOR_OFF); // Vypnutie kurzora na displeji
sei();
while(1) {
if (PINB & (1 << MAGNET_PIN)) {
// Ak je magnet pripojený, do UARTu sa vypíše DEBUG, RGB LED dióda sa vypne a vynuluje sa LCD Displej
printf("Magnet je pripojený!\r");
setRGBled(0, 0, 0);
lcd_command(0x01);
} else {
// Ak je magnet odpojený, do UARTu sa vypíše DEBUG a spustí sa funkcia stavy().
printf("Magnet je odpojený!\r");
stavy();
}
}
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.