Operácie

Ovládanie elektrického zámku z cloudu: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
StudentMIPS (diskusia | príspevky)
 
(9 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 27: Riadok 27:
[[Obrázok:servo.png|400px|thumb|center]]
[[Obrázok:servo.png|400px|thumb|center]]


== Algoritmus a program ==


1.Algoritmus činnosti Arduina


•  Pri spustení sa inicializuje sériová komunikácia UART


• Arduino očakáva príchod znaku 0 alebo 1 zo sériového portu


• Ak Arduino prijme 1, aktivuje digitálny výstup čim zopne relé a otvorí zámok


'''Literatúra:'''
• Ak je prijatá 0, Arduino digitálny výstup deteguje čim zámok zatvorí
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]


• Cyklus je opakovaný neustále


__TOC__
2.Algoritmus činnosti ESP8266


== Analýza  a opis riešenia ==
• Modul sa pripojí k nastavenej Wi-Fi sieti


Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
• Po pripojení na Wi-Fi sa napojí na cloudovu službu BLYNK
Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu.


[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]
• Keď prijme ovládací príkaz z cloudu odošle prostredníctvom sériovej komunikácie UART hodnotu 1 alebo 0 do arduina


Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.
• Po odoslaní očakáva ďalší úkon z internetu


[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]]
<tabs>
<tab name="Hlavný kód"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "uart.h"
 
#define RELE PB5   
#define SERVO PB1 
 
int main(void)
{
    uart_init(); //inicializacia komunikácie
    uart_puts("Servo a rele su pripravene.\n");
 
    // RELE ako výstup
    DDRB |= (1 << RELE);


    // SERVO ako výstup
    DDRB |= (1 << SERVO);


=== Algoritmus a program ===
    // Nastavíme Timer1: Fast PWM, TOP = ICR1 (presné PWM pre servo)
    TCCR1A = (1 << COM1A1) | (1 << WGM11);
    TCCR1B = (1 << WGM12) | (1 << WGM13) | (1 << CS11);
    ICR1 = 40000; // 20 ms perioda (50 Hz)


Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto...
    while (1)
Výpis kódu je nižšie...
    {
        char prikaz = uart_getc();


        if (prikaz == '1') {
            PORTB |= (1 << RELE);    // zapni relé = napájanie pre servo
OCR1A = 5000; //otocenie serva o 180°
            uart_puts("Otvaram zamok\n");
        }
        else if (prikaz == '0') {       
       
OCR1A = 1000; //vratenie serva na 0°
_delay_ms(1000);
            PORTB &= ~(1 << RELE); 
uart_puts("Zatvaram zamok\n");
        }
    }
}


<tabs>
</syntaxhighlight ></tab>
<tab name="AVR C-code"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<tab name="uart.c"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#include <avr/io.h>
#include <stdio.h>
#include <string.h>
#define BAUD 9600
#define F_CPU 16000000UL


int main(void)
void uart_init( void )
{
UBRR0 = 103;
#if USE_2X
UCSR0A |= _BV(U2X0);
#else
    UCSR0A &= ~(_BV(U2X0));
#endif
 
    UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);
    UCSR0B = _BV(RXEN0) | _BV(TXEN0);
}
 
void uart_putc(char c)  
{
{
  unsigned int measuredValue;
  if (c == '\n')
    {
      uart_putc('\r');
    }
  loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
  UDR0 = c;
}


  while (1)
void uart_puts(const char *s)
  {
{
    /*  relax  */ 
  for(int i = 0; i<=strlen(s);i++)
   }
   uart_putc(s[i]);
}


  return(0);
char uart_getc(void) {
    loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
    return UDR0;
}
}


</syntaxhighlight ></tab>
</syntaxhighlight ></tab>
<tab name="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<tab name="uart.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#include <avr/io.h>
void uart_init( void );
   
void uart_putc( char c );
void uart_puts( const char *s );
 
char uart_getc( void );
 
 
</syntaxhighlight ></tab>
<tab name="ESP8266 v IDE"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#define BLYNK_TEMPLATE_ID "TMPL4s3XVVGDQ"
#define BLYNK_TEMPLATE_NAME "Projekt ESP8266"
#define BLYNK_AUTH_TOKEN "3zNgryWRPOpyX2i46Z2Gnd28OdaS-bEC" %%tieto údaje poskytne cloud server
 
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
 
char ssid[] = "meno wifi";
char pass[] = "heslo wifi";
 
void setup()
{
  Serial.begin(9600);
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
}
 
void loop()
{
  Blynk.run();
}


void adc_init(void);                                   // A/D converter initialization
// Ovládanie cez Blynk Virtual Pin V1
BLYNK_WRITE(V1)
{
  int pinValue = param.asInt(); // 1 = ON, 0 = OFF


unsigned int adc_read(char a_pin);
  if (pinValue == 1) {
    Serial.write('1');  // Otvor zámok
  } else {
    Serial.write('0'); // Zavri zámok
  }
}
</syntaxhighlight ></tab>
</syntaxhighlight ></tab>
</tabs>
</tabs>


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: [[Médiá:zadanieDominikAndraščík.zip|kody.zip]]
 
== Zapojenie a overenie funkčnosti ==


Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
Zapojenie:  


=== Overenie ===
• ESP8266 je napájane cez USB


Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.
• Arduino je napájane cez USB
Na konci uvádzame fotku hotového zariadenia.


[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]
• TX z ESP8266 je pripojený na RX Arduina


'''Video:'''
• TX z Arduina je pripojený na RX ESP8266 cez napäťový delič
<center><youtube>D0UnqGm_miA</youtube></center>
 
• Relé je ovládane výstupným signálom z digitálneho pinu Arduina PB5
 
Schéma zapojenia:
[[Obrázok:schemaesparduino.png|400px|thumb|center]]
 
Overenie:
 
Po zapojení sme systém overili nasledovne:
 
• Cloud nám ohlásil či je zariadenie Online alebo Offline


• Arduino nám v sériovom monitore oznámilo úspešnú inicializáciu komunikácie


• Arduino správne rozpoznalo prijatý signál a vypísalo Zámok otvorený alebo Zámok zatvorený v sériovom monitoru.


• Tieto funkcie sme otestovali niekoľkokrát po sebe


Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.  
Týmto sme si potvrdili, že zariadenia spolu komunikujú správne, relé reaguje na príkazy od Arduina a teda ovládanie zámku na diaľku funguje spoľahlivo podľa očakávaní .


[[Category:AVR]] [[Category:MIPS]]
'''Video:'''
<center><youtube>004WkhIj4Wk</youtube></center>

Aktuálna revízia z 22:26, 16. máj 2025

Záverečný projekt predmetu MIPS / LS2025 - Dominik Andraščík


Zadanie

Cieľom zadania bolo vytvoriť program a overiť jeho funkčnosť na fyzickom modeli. Systém využíva cloudovú platformu BLYNK ovládanú prostredníctvom modulu ESP8266, prostredníctvom ktorej je možné diaľkovo ovládať elektronický zámok. Arduino v tomto systéme slúži ako prijímač údajov z ESP8266 a následne zabezpečuje samotné riadenie otvárania alebo zatvárania zámku.

Vývojová doska Arduino UNO.

Analýza a opis riešenia

Na základe zadania bolo potrebné splniť tieto požiadavky: • Vytvoriť komunikáciu medzi ESP8266 a Arduinom • Umožniť diaľkové ovládanie systému pomocou internetového pripojenia • Zrealizovať ovládanie elektrického zámku cez relé • Zabezpečiť ochranu komponentov

Navrhované riešenie využíva jednostrannú komunikáciu medzi ESP8266 a Arduinom. Kde ESP8266 sa pripája na internet prostredníctvom Wi-Fi a komunikuje s cloudovou platformou. Arduino je pripojene na ESP8266 cez sériovú komunikáciu UART, pričom prijíma jednoduché signály (1 alebo 0), ktoré určujú či sa ma zámok otvoriť alebo zatvoriť. Zámok je riadený pomocou digitálneho výstupu z Arduina. Keďže Arduino pracuje na 5V logike a ESP8266 na 3,3V logike museli sme zabezpečiť ochranu vstupného pinu ESP8266. Túto ochranu sme zabezpečili pomocou napäťového deliča z rezistorov 1 kΩ a 2 kΩ, ktorý znižuje napätie TX pinu Arduina na bezpečnú úroveň pre RX pin ESP8266 teda 3,3V.

Na projekt som potreboval: 1x WiFi modul ESP8266

1x Relé

1x Arduino UNO

1x Krokový servomotorček

Algoritmus a program

1.Algoritmus činnosti Arduina

• Pri spustení sa inicializuje sériová komunikácia UART

• Arduino očakáva príchod znaku 0 alebo 1 zo sériového portu

• Ak Arduino prijme 1, aktivuje digitálny výstup čim zopne relé a otvorí zámok

• Ak je prijatá 0, Arduino digitálny výstup deteguje čim zámok zatvorí

• Cyklus je opakovaný neustále

2.Algoritmus činnosti ESP8266

• Modul sa pripojí k nastavenej Wi-Fi sieti

• Po pripojení na Wi-Fi sa napojí na cloudovu službu BLYNK

• Keď prijme ovládací príkaz z cloudu odošle prostredníctvom sériovej komunikácie UART hodnotu 1 alebo 0 do arduina

• Po odoslaní očakáva ďalší úkon z internetu

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "uart.h"

#define RELE PB5     
#define SERVO PB1  

int main(void)
{
    uart_init(); //inicializacia komunikácie
    uart_puts("Servo a rele su pripravene.\n");

    // RELE ako výstup
    DDRB |= (1 << RELE);

    // SERVO ako výstup
    DDRB |= (1 << SERVO);

    // Nastavíme Timer1: Fast PWM, TOP = ICR1 (presné PWM pre servo)
    TCCR1A = (1 << COM1A1) | (1 << WGM11);
    TCCR1B = (1 << WGM12) | (1 << WGM13) | (1 << CS11);
    ICR1 = 40000; // 20 ms perioda (50 Hz)

    while (1)
    {
        char prikaz = uart_getc();

        if (prikaz == '1') {
            PORTB |= (1 << RELE);    // zapni relé = napájanie pre servo
			OCR1A = 5000; //otocenie serva o 180°
			
            uart_puts("Otvaram zamok\n");

        } 
        else if (prikaz == '0') {        
         
		OCR1A = 1000; //vratenie serva na 0°
		_delay_ms(1000);
            PORTB &= ~(1 << RELE);  
			uart_puts("Zatvaram zamok\n");
        }
    }
}
#include <avr/io.h>
#include <stdio.h>
#include <string.h>
#define BAUD 9600
#define F_CPU 16000000UL

void uart_init( void )
{
	UBRR0 = 103;
#if USE_2X
	UCSR0A |= _BV(U2X0);
#else
    UCSR0A &= ~(_BV(U2X0));
#endif

    UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); 
    UCSR0B = _BV(RXEN0) | _BV(TXEN0);
}

void uart_putc(char c) 
{
   if (c == '\n') 
    {
       uart_putc('\r');
    }
   loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
   UDR0 = c;
}

void uart_puts(const char *s)
{
  for(int i = 0; i<=strlen(s);i++)
  uart_putc(s[i]);
}

char uart_getc(void) {
    loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
    return UDR0;
}
void uart_init( void );
     
void uart_putc( char c );
void uart_puts( const char *s );

char uart_getc( void );
#define BLYNK_TEMPLATE_ID "TMPL4s3XVVGDQ"
#define BLYNK_TEMPLATE_NAME "Projekt ESP8266"
#define BLYNK_AUTH_TOKEN "3zNgryWRPOpyX2i46Z2Gnd28OdaS-bEC" %%tieto údaje poskytne cloud server

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

char ssid[] = "meno wifi";
char pass[] = "heslo wifi";

void setup()
{
  Serial.begin(9600);
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
}

void loop()
{
  Blynk.run();
}

// Ovládanie cez Blynk Virtual Pin V1
BLYNK_WRITE(V1)
{
  int pinValue = param.asInt(); // 1 = ON, 0 = OFF

  if (pinValue == 1) {
    Serial.write('1');  // Otvor zámok
  } else {
    Serial.write('0');  // Zavri zámok
  }
}

Zdrojový kód: kody.zip

Zapojenie a overenie funkčnosti

Zapojenie:

• ESP8266 je napájane cez USB

• Arduino je napájane cez USB

• TX z ESP8266 je pripojený na RX Arduina

• TX z Arduina je pripojený na RX ESP8266 cez napäťový delič

• Relé je ovládane výstupným signálom z digitálneho pinu Arduina PB5

Schéma zapojenia:

Overenie:

Po zapojení sme systém overili nasledovne:

• Cloud nám ohlásil či je zariadenie Online alebo Offline

• Arduino nám v sériovom monitore oznámilo úspešnú inicializáciu komunikácie

• Arduino správne rozpoznalo prijatý signál a vypísalo Zámok otvorený alebo Zámok zatvorený v sériovom monitoru.

• Tieto funkcie sme otestovali niekoľkokrát po sebe

Týmto sme si potvrdili, že zariadenia spolu komunikujú správne, relé reaguje na príkazy od Arduina a teda ovládanie zámku na diaľku funguje spoľahlivo podľa očakávaní .

Video: