Demo: Control gate and door with ESP8266 via web interface | PM2021 @ ACS, UPB
Wiki: Access Control System Tutorial
Dragus Alexandru
Linkedin
Grupa: 334CB
releu → intrerupator → interfon
) sau a unor device-uri (tranzistor → remote controller poarta auto/ garaj
) de la distantasmarthome
)NodeMCU ESP8266
pentru server-ul web si pentru controlul releelor sau a semnalelor.
Device-ul din partea de sus, conectat la interfon, va fi referit in continuare prin Device interfon
, si reprezinta un server care asculta pe /door si activeaza un releu.
Device-ul de jos este Device hub
si reprezinta webserver-ul principal, cel care ofera interfata utilizatorului. Totodata, hub-ul transmite si semnale remote controller-ului pentru poarta.
Toate piesele au denumiri comune si se pot gasi printr-o cautare scurta pe internet.
Nr.crt | Piesa | Nr. bucati |
---|---|---|
1 | NodeMCU ESP8266 | 2 |
2 | Tranzistor NPN 2N3904 | 3 |
3 | Rezistente 1k | 3 |
4 | Headere pini mama | 60 |
5 | Conector dublu cu surub | 6 |
6 | Regulator tensiune 5V | 1 |
7 | Regulator tensiune 3.3V | 2 |
8 | Modul releu 5V | 1 |
9 | Headere pini tata | 10 |
10 | Cap jumper | 4 |
11 | Fire | 60 |
12 | Placa prototipare PCB | 2 |
13 | Fludor | 1 |
14 | Conector DC Jack | 1 |
15 | Buton on/ off | 2 |
16 | Incarcator 220V → 7-12V | 2 |
Acestea sunt echipamentele folosite in dezvoltarea prezentului proiect. Sistemul final se poate realiza si pe breadboard, fara a fi nevoie de lipituri.
Nr.crt | Echipament |
---|---|
1 | Pistol de lipit |
2 | Multimetru |
3 | Pistol cu silicon |
4 | Surubelnita |
5 | Cleste fire |
Scurta descriere a sistemelor reale cu care este conectat produsul finit:
Nr.crt | Sistem | Explicatie |
---|---|---|
1 | Interfon care deschide poarta prin contact mecanic | NodeMCU ESP8266 face contactul printr-un releu |
2 | Sistem automat deschidere poarta auto Nice | Actionat de telecomanda |
3 | Sistem automat deschidere garaj Nice | Actionat de telecomanda |
4 | Telecomanda Nice | Actionate butoanele de NodeMCU ESP8266 prin tranzistoare |
Device-ul interfon se poate alimenta direct la 3.3V sau la o tensiune intre 7 si 24V. Acesta are atasat un modul de relee prin care poate controla dispozitive cu tensiuni mari. In cazul de fata, releul face contactul la butonul pentru deschiderea portii, semnalul venind printr-un tranzistor, pentru a putea transmite 5V.
Device-urile se pot produce si pe placi PCB proiectate in software, dupa cum se vede in exemplul de mai jos, realizat in Eagle. Totodata, Eagle ofera suport pentru proiectarea 3D a placutei, cu ajutorul Fusion360.
Imaginile de proiectare PCB/ 3D sunt exemplificative, placa finala avand atasate modulele de releu si regulator 5V in plus.
Device-ul hub este alimentat de la 8V prin incarcatorul unui telefon fix, lipit cu un conector Jack. Acesta are atasata o telecomanda pentru poarta care are butoanele conectate la colectorul si emitorul tranzistorilor, astfel facandu-se contact atunci cand se transmite semnal in baza.
Aplicatia trebuie sa fie cat mai usor de folosit de catre un utilizator obisnuit, astfel ca am ales o interfata web simpla, cu 3 butoane, cate unul pentru fiecare 'usa' de deschis. Programarea se realizeaza Arduino-like pe placutele NodeMCU ESP8266.
Codul are urmatoarea logica:
GET /door
Device Hub
GET /door handler:
server.on("/door", HTTP_GET, [](AsyncWebServerRequest *request) { // Send webpage request->send(200, "text/html", doorWebpage()); Serial.println("Door pressed"); timePressDoor = millis(); doorState = "on"; // Send signal for door (relay) digitalWrite(doorPin, HIGH); });
Codul are urmatoarea logica:
GET /garage
, GET /carGate
, GET /door
GET /door
, se redirecteaza utilizatorul spre adresa Device interfon
pentru a face GET acoloExemplu handler GET request:
server.on("/cargate", HTTP_GET, [](AsyncWebServerRequest *request) { // Send webpage request->send(200, "text/html", buttonWebpage("cargate")); Serial.println("Car gate pressed"); timePressCarGate = millis(); carGateState = "on"; // Send signal for Car gate digitalWrite(carGatePin, HIGH); });
Functie care returneaza o pagina web simpla:
String buttonWebpage(String which) { String webpage = ""; webpage = webpage + ("<!DOCTYPE html><html>"); webpage = webpage + ("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"); webpage = webpage + (""); webpage = webpage + ("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}"); webpage = webpage + ("</style>"); webpage = webpage + ("<meta http-equiv=\"refresh\" content=\"1;url=http://192.168.0.103\" />"); webpage = webpage + ("</head>"); webpage = webpage + ("<body><h1>Access system</h1>"); webpage = webpage + ("<h2>Se deschide "); if (which == "garage") webpage = webpage + "garajul"; else if (which == "cargate") webpage = webpage + "poarta auto"; else webpage = webpage + "poarta mica"; webpage = webpage + ("</h2>"); webpage = webpage + ("<br></br><br></br><br></br>"); webpage = webpage + ("<h3>Proiect realizat in cadrul materiei<br></br>"); webpage = webpage + ("Proiectarea pe Microprocesoare<br></br>"); webpage = webpage + ("</body></html>"); return webpage; }
Snippet cod care reseteaza butonul la starea 'neapasat':
currentTime = millis(); // Release button if delay time passed if (garageState == "on" && currentTime - timePressGarage > timeoutButtons) { garageState = "off"; digitalWrite(garagePin, LOW); Serial.println("Garage unpressed"); }
Demo: Control gate and door with ESP8266 via web interface | PM2021 @ ACS, UPB
Proiectul a fost finalizat cu succes si este implementat intr-o situatie din viata reala. Mai jos este o imagine cu Device-ul interfon
montat intr-un interfon real.
Consider ca proiectul la PM a fost o activitate placuta, care mi-a adus mai multa experienta hands-on in domeniul embedded.