Operácie

Inteligentný šatník

Zo stránky SensorWiki

Záverečný projekt predmetu MIPS / LS2024
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.

Vývojová doska ARDUINO-UNO-R3.

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.

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.

Schéma zapojenia.

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.

Aplikácia.

Video:

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