Operácie

Ovládanie elektrického zámku z cloudu

Zo stránky SensorWiki

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: