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.

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: