Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
A. Bukovec 0036492166 M. Kodba 0036491816
D. Šarić 0036493319 I. Vrhoci 0036490546
Kućna upotreba
Google Home, ESP8266, MQTT
Potrebno osnovno predznanje
programiranja i elektrotehnike
SEMINARSKI RAD - SPVP
13. lipnja 2019
VoCom – upravljanje govornim naredbama
2
Sažetak
Razvijeni sustav VoCom omogućuje svim stanarima upravljanje raznim sustavima u kućanstvu pomoću govornih naredba. Na taj način olakšava
svakodnevicu ukućanima, posebice kod osoba sa smanjenom mogućnošću kretanja. Sustav VoCom može upravljati televizorima, klima uređajima,
intenzitetom svjetla, ulaznim vratima te kuhalom za vodu. Sustav se lako nadograđuje i oblikuje zahtjevima korisnika.
Sadržaj
1. UVOD ............................................................................................................ 3
2. POSTAVLJANJE GOOGLE HOME MINI UREĐAJA I POTREBNIH APLIKACIJA .............. 4
2.1. Postavljanje Google Home Mini uređaja ....................................................... 4
2.2. Adafruit IO servis ..................................................................................... 5
2.3. IFTTT aplikacije ........................................................................................ 6
3. SHEME PODSUSTAVA ...................................................................................... 8
3.1. Upravljanje intenzitetom svjetla (Ivan Vrhoci) ............................................. 8
3.2. Sklop za slanje IC naredbi (Mario Kodba, Dino Šarić) .................................... 9
3.3. Detekcija prisutnosti i upravljanje „vratima“ (Antonio Bukovec) ....................10
3.4. Upravljanje kućanskim aparatima (Antonio Bukovec) ...................................11
4. PROGRAMSKI KODOVI....................................................................................12
4.1. Upravljanje intenzitetom svjetla (Ivan Vrhoci) ............................................12
4.2. Slanje IC naredbi (Mario Kodba, Dino Šarić) ...............................................15
4.3. Detekcija prisutnosti i upravljanje „vratima“ (Antonio Bukovec) ....................21
5. ZAKLJUČAK ...................................................................................................24
6. LITERATURA..................................................................................................25
7. POJMOVNIK ..................................................................................................26
Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi za praćenje i vođenje procesa“ na Zavodu za elektroničke sustave i obradbu informacija, Fakulteta elektrotehnike i računarstva, Sveučilišta u Zagrebu. Sadržaj ovog rada može se slobodno koristiti, umnožavati i distribuirati djelomično ili u cijelosti, uz uvjet da je uvijek naveden izvor dokumenta i autor, te da se time ne ostvaruje materijalna korist, a rezultirajuće djelo daje na korištenje pod istim ili sličnim ovakvim uvjetima.
VoCom – upravljanje govornim naredbama
3
1. Uvod
U kućanstvu je sve više elektroničnih uređaja. Elektronički uređaji u našim domovima imaju mnogo različitih način upravljanja. Na primjer,
kuhalo za vodu upravljamo tipkom, dok klimom upravljamo daljinskim upravljačem. Izneseni problemi su stvorili potrebu za jednim sustavom za
sve uređaje. VoCom je baš takav sustav.
VoCom omogućuje svim ukućanima upravljanje raznim sustavima u kućanstvu pomoću govornih naredba. Sustav VoCom može upravljati
televizorima, klima uređajima, intenzitetom svjetla, kuhalom za vodu i
zaključavanjem/otključavanjem vrata. Sustav se lako nadograđuje i oblikuje zahtjevima korisnika.
Ovaj sustav je temeljen na Google Home Mini uređaju. Google Home je
kućni asistent koji pretvara glas u naredbu koju šaljemo kroz sustav. Ta naredba se prosljeđuje na Adafruit IO online servis preko IFTTT platforme.
NodeMCU pločice, koje su osnova realiziranih podsustava, pretplaćene su na Adafruit IO feed-ove koji primaju naredbe. Primjerice, kada se izgovori
naredba, doći će do promjene stanja određenog feed-a na Adafruit IO, NodeMCU će registrirati ovu promjenu i izvršiti potrebnu naredbu. Osim
spajanja na Adafruit IO, Google Home dodaje našem sustavu mogućnost upravljanja glazbe, slanje SMS poruka i pozivanje glasom.
VoCom – upravljanje govornim naredbama
4
2. Postavljanje Google Home Mini uređaja i
potrebnih aplikacija
Korištene aplikacije/platforme: Google Home aplikacija
Adafruit IO servis IFTTT aplikacija
Google Assistant eWeLink
U ovom poglavlju opisujemo korištene resurse te način njihove
implementacije.
2.1. Postavljanje Google Home Mini uređaja
Nakon nabavke Google Home Mini uređaja, potrebno je nabaviti ili
kompatibilan strujni adapter za europsko tržište ili koristiti bilo koji punjač za smartphone jakosti struje 1.8 A ili više. Nakon priključenja Google
Home Mini uređaja na napajanje, potrebno je na smartphone uređaju preuzeti Google Home aplikaciju, kreirati gmail račun ako ga već ne
posjedujete, prijaviti se s tim računom unutar aplikacije te pritisnuti “Add” tipku te nakon toga “Set up device”. Uz praćenje daljnjih koraka na
aplikaciji, kroz nekoliko minuta Google Home Mini uređaj trebao bi biti povezan na vašu wifi mrežu i spreman za korištenje.
Ovako konfiguriran Google Home Mini sposoban je izvršavati mnoštvo
glasovnih naredbi kao što su: dodavanje podsjetnika, postavljanje alarma, dodavanje događaja u kalendar, davanje navigacijskih uputa i procjene
potrebnog vremena za dolazak, pronalaženje vremenskih prognoza, pronalaženje “korak po korak” recepata, rezimiranje sportskih događaja,
pričanje viceva, pronalaženje odgovora na postavljena pitanja itd.
Osim navedenih naredbi, u sklopu ovog projekta realizirani su podsustavi
koji će omogućiti realizaciju dodatnih naredbi. Realizirani su podsustavi za:
● upravljanje intenzitetom svjetla ● slanje IC (infracrvenih) naredbi
● detekciju prisutnosti i upravljanje „vratima“1 ● upravljanje kućanskim aparatima
1 upravljanje vrata će se samo simulirati paljenjem LED diode
VoCom – upravljanje govornim naredbama
5
2.2. Adafruit IO servis
Nadalje, potrebno je kreirati Adafruit korisnički račun kako bi se koristile
mogućnosti Adafruit IO servisa. Nakon prijave na https://io.adafruit.com/ potrebno je kreirati Dashboard (slika 1.) u kojem će se zatim kreirati razni
feed-ovi koji će biti korišteni u projektu. Pritiskom na oznaku ‘+’ u gornjem desnom uglu, otvara se izbornik u kojem je moguće odabrati tip
bloka koji će se koristiti. Mi smo odabrali slider za podsustav promjene intenziteta svjetla, text blok za IC podsustav i toggle za podsustav
detekcije prisutnosti i upravljanje vratima. Nakon toga, potrebno je
stvoriti feed za pojedini blok. Korišteni feedovi prikazani su na slici 2. (Light, IR_send i Door). Za upravljanje ovim feedovima, potrebno je znati
korisničko ime računa i aktivacijski ključ koji je vidljiv na slici 3.
Slika 1. Kreirani dashboard
Slika 2. Pregled korištenih feed-ova Slika 3. Aktivacijski ključ
VoCom – upravljanje govornim naredbama
6
2.3. IFTTT aplikacije
Kako bi povezali Adafruit IO i naš Google Home uređaj, koristi ćemo IFTTT
platformu. Potrebno je preuzeti IFTTT aplikaciju na smartphone uređaj i kreirati korisnički račun. Zatim je potrebno kreirati potrebne aplikacije za
svaki od podsustava ili za svaku željenu naredbu. Kao što je prikazano na slici 4., u izborniku kreiranja nove aplikacije moguće je odrediti “this” i
“that” dio. “This” dio predstavlja okidač za izvedbu “that” dijela.
Slika 4. Izrada nove IFTTT aplikacije
Kao okidač za naše aplikacije potrebno je odabrati Google Assistant. Moguće je odabrati nekoliko različitih okidača (jednostavna fraza, fraza
koja sadrži broj (#), fraza koja sadrži određeni tekst ($) i fraza koja sadrži oboje). Navedeni okidači prikazani su na slici 5. Za upravljanje
intenzitetom svjetla odabrana je fraza koja sadrži broj kako bi se prenijela
informacija o intenzitetu. Za slanje IR naredbi i upravljanje vratima koristit će se jednostavne fraze. Na slici 6. prikazan je primjer okidača za
upravljanje intenzitetom svjetla.
Slika 5. Google assistant izbornik
VoCom – upravljanje govornim naredbama
7
Slika 6. Primjer okidača za upravljanje intenzitetom svjetla
Za “that” dio potrebno je odabrati Adafruit i povezati svoj Adafruit račun (koristeći korisničko ime i aktivacijski ključ) sa IFTTT platformom. Nakon
toga potrebno je još odabrati feed na koji će okidač djelovati (Light) i što će se upisati u taj feed (broj koji smo izgovorili). Navedeno je prikazano
na slici 7.
Slika 7. Adafruit dio aplikacije
VoCom – upravljanje govornim naredbama
8
Za podsustav IR upravljanja koristit će se fraze tipa “Turn on the TV”,
“Increase the TV volume”... i svakoj od fraza pridružen je određen broj koji se šalje na Adafruit IO IR_send feed.
Za podsustav detekcije prisutnosti i upravljanja „vratima“, korištene su fraze tipa “Unlock/Lock the door” i šalje se broj 0/1 na Adafruit IO Door
feed. Za podsustav upravljanja kućanskim uređajima (uz korištenje sonoff wifi
sklopki) kao okidač se također koristiti Google Assistant, a “that” dio je “eWeLink Smart Home” za čije je korištenje potrebno preuzeti eWeLink
aplikaciju, napraviti korisnički račun te sinkronizirati sonoff wifi sklopku s vašim računom. Zatim je potrebno odabrati “Turn 1 channel switch on or
off”, odabrati željenu sklopku te njeno stanje (on/off). Za okidanje se
koriste fraze tipa “Turn on the switch”/”Turn off the switch”. Korištenjem drugih servisa na IFTTT platformi (poput Android Device,
Android SMS, VoIP calls...) moguće je primjerice kreirati aplikacije za puštanje glazbe s vašeg smartphone uređaja, slanje SMS poruka te
glasovnih poruka u obliku poziva.
3. Sheme podsustava
Korišten hardver: Google Home
NodeMCUv3 (ESP8266) Sonoff wifi sklopka
Modul za kontrolu intenziteta svjetlosti
IC dioda IC prijemnik
3.1. Upravljanje intenzitetom svjetla (Ivan Vrhoci)
Upravljanje intenzitetom svjetla izvedeno je pomoću NodeMCUv3 tiskane pločice koja se bazira na ESP8266 wifi mikročipu te AC light dimmer-a tvrtke RobotDyn. Primjer sheme prikazan je na slici 8. Kao output pin (PWM) koristi će se pin D7, a kao zero-cross pin odabran je pin D6. Za napajanje NodeMCU može se koristiti 5V adapter ili powerbank.
VoCom – upravljanje govornim naredbama
9
Slika 8. Shema podsustava za upravljanje intenzitetom svjetla
3.2. Sklop za slanje IC naredbi (Mario Kodba, Dino Šarić)
Upravljanje TV-om i klimom, tj. slanje IC signala izvedeno je pomoću NodeMCUv3 tiskane pločice uz pomoć IC prijemnika i IC diode. Primjer cjelokupne sheme prikazan je na slici 9. Prije slanja signala putem IC diode potrebno je odrediti koji signal poslati. Dekodiranje potrebnog signala se obavlja putem IC prijemnika i originalnog upravljača TV/klima uređaja. Ova radnja se izvršava samo jednom te se nakon toga dobiveni podaci ubacuju u kod za slanje naredbi. Za napajanje NodeMCU može se koristiti 5V adapter ili powerbank.
VoCom – upravljanje govornim naredbama
10
Slika 9. Shema podsustava za primanje i slanje IC signala
3.3. Detekcija prisutnosti i upravljanje „vratima“
(Antonio Bukovec)
Detekcija prisutnosti i upravljanje „vratima“ izvedena je pomoću NodeMCUv3 tiskane pločice. Za napajanje NodeMCU može se koristiti 5V adapter ili powerbank. Simulacija prisutnosti na vratima izvršava se pritiskom na tipku, a otključavanje vrata simulirano je paljenjem (otključano), odnosno gašenjem (zaključano) LED diode. Umjesto diode predlaže se uporaba modula za otključavanje/zaključavanje vrata. Nakon pritiska na tipku, pali se crvena LED dioda te Google Home izgovara poruku „Someone is at the door!“. Izdavanjem naredbe „Unlock the door“, mijenja se Door feed na Adafruit IO servisu te NodeMCU pali zelenu LED diodu. Na slici 10. prikazana je shema podsustava.
VoCom – upravljanje govornim naredbama
11
Slika 10. Shema simulacije podsustava za detekciju prisutnosti i upravljanja
vratima
3.4. Upravljanje kućanskim aparatima (Antonio Bukovec)
Upravljanje kućanskim aparatima izvedeno je preko sonoff wifi sklopke.
Sonoff sklopka za rad treba AC napajanje 90V-250 V, 50/60 Hz. Shema podsustava prikazana je na slici 11.
Slika 11. Shema podsustava za upravljanje kućanskim aparatima
VoCom – upravljanje govornim naredbama
12
4. Programski kodovi
4.1. Upravljanje intenzitetom svjetla (Ivan Vrhoci)
Korištene su Adafruit MQTT Library i RBDDimmer biblioteke. Potrebno je
ispuniti WLAN_SSID, WLAN_PASS, AIO_USERNAME i AIO_KEY.
#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include <RBDdimmer.h>
/************************* WiFi Access Point *******************************/
#define WLAN_SSID "GalaxyA8"
#define WLAN_PASS "12345678"
/************************* ESP8266 pin config ******************************/
#define LED_BUILTIN 2 //D4, internal led
#define outputPin 12 //D6 PWM
#define zerocross 13 // D7 ZC
/************************* Adafruit.io Setup *******************************/
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883 // use 8883 for SSL
#define AIO_USERNAME "VoCom"
#define AIO_KEY "7ec7f6fc12f546e9962a6d48f6576f4d"
/************ Global State (you don't need to change this!) ****************/
// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;
// Setup the MQTT client class by passing in the WiFi client and MQTT server
and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME,
AIO_KEY);
/****************************** Feeds **************************************/
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
// Setup feeds for subscribing to changes.
Adafruit_MQTT_Subscribe light_intensity = Adafruit_MQTT_Subscribe(&mqtt,
AIO_USERNAME "/feeds/light");
/****************************** Dimmer Initialisation***********************/
dimmerLamp dimmer(outputPin, zerocross); //initialase port for dimmer for
ESP8266, ESP32, Arduino due boards
int outVal = 0;
VoCom – upravljanje govornim naredbama
13
/*************************** Sketch Code ***********************************/
void setup() {
Serial.begin(115200);
delay(10);
Serial.println(F("Adafruit MQTT demo")); //cemu taj F?
// Connect to WiFi access point.
Serial.println(); Serial.println();
Serial.print("Connecting to ");
Serial.println(WLAN_SSID);
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Setup MQTT subscription
mqtt.subscribe(&light_intensity);
// Dimmer initialisation
dimmer.begin(NORMAL_MODE, ON); //dimmer initialisation: name.begin(MODE,
STATE)
Serial.println("Dimmer Program is starting...");
Serial.println("Set value");
}
VoCom – upravljanje govornim naredbama
14
void loop() {
MQTT_connect();
Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(5000))) {
if (subscription == &light_intensity){
Serial.print(F("Got: "));
uint16_t intensity=atoi((char *)light_intensity.lastread);
Serial.println(intensity);
int preVal = outVal;
if (intensity < 101 && intensity > -1) outVal = intensity;
delay(200);
dimmer.setPower(outVal); // setPower(0-100%);
if (preVal != outVal)
{
Serial.print("lampValue -> ");
Serial.print(dimmer.getPower());
Serial.println("%");
}
delay(50);
}
}
// ping the server to keep the mqtt connection alive
if(! mqtt.ping(3)) {
mqtt.disconnect();
}
}
// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
int8_t ret;
// Stop if already connected.
if (mqtt.connected()) {
return;
}
Serial.print("Connecting to MQTT... ");
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for
connected
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(5000); // wait 5 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
while (1);
}
}
Serial.println("MQTT Connected!");
}
VoCom – upravljanje govornim naredbama
15
4.2. Slanje IC naredbi (Mario Kodba, Dino Šarić)
Korištene su Adafruit MQTT, IRremoteESP8266 i IRsend biblioteke.
Potrebno je ispuniti WLAN_SSID, WLAN_PASS, AIO_USERNAME, AIO_KEY kao i izmjeniti IR komande dobivene očitanjem signala s daljinskog
upravljača.
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <ir_Fujitsu.h>
/************************* WiFi Access Point *******************************/
#define WLAN_SSID "Mario"
#define WLAN_PASS "_bu56prp"
/************************* ESP8266 pin config ******************************/
#define LED_BUILTIN 2 //D4, internal led
IRsend irsend(4); // An IR LED is controlled by GPIO pin 4 (D2)
/************************* Adafruit.io Setup ******************************/
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883 // use 8883 for SSL //default 1883
#define AIO_USERNAME "VoCom"
#define AIO_KEY "7ec7f6fc12f546e9962a6d48f6576f4d"
/********************* Remote control IR commands **************************/
// D160 ROOM - AC @ 38kHz
uint16_t rawData_ON_AC[243] = {3300,1550, 450,400, 400,400, 450,1150,
450,350, 450,1200, 450,350, 450,350, 450,350, 450,1150, 450,1200, 450,350,
450,350, 450,350, 450,1200, 450,1150, 450,350, 450,350, 450,400, 400,400,
450,350, 450,350, 450,350, 450,350, 450,400, 450,350, 450,350, 450,350,
450,350, 450,1200, 450,350, 450,350, 450,350, 450,400, 400,400, 450,350,
450,350, 450,1150, 450,400, 400,400, 450,350, 450,350, 450,350, 450,1200,
450,1150, 450,1150, 450,1200, 450,1150, 450,1150, 450,400, 400,400, 450,350,
450,1150, 450,350, 450,400, 450,350, 450,350, 450,350, 450,350, 450,400,
400,400, 450,1150, 450,1150, 450,400, 400,400, 450,1150, 450,350, 450,350,
450,400, 450,350, 450,350, 450,1150, 450,350, 450,1150, 500,350, 450,350,
450,350, 450,400, 400,400, 450,350, 450,350, 450,1150, 450,400, 450,350,
450,350, 450,350, 450,350, 450,350, 450,400, 450,350, 450,350, 450,350,
450,350, 450,400, 450,350, 450,350, 450,350, 450,350, 450,350, 450,400,
400,400, 450,350, 450,350, 450,350, 450,400, 400,400, 450,350, 450,350,
450,350, 450,350, 450,400, 450,350, 450,350, 450,1150, 450,350, 450,1200,
450,1150, 450,350, 450,350, 450,400, 450,1150, 450}; // UNKNOWN 7288D277
uint16_t rawData_OFF_AC[99] = // Uklonjeno zbog čitljivosti
uint16_t rawData_30C[243] = // Uklonjeno zbog čitljivosti uint16_t
rawData_18C[243] = // Uklonjeno zbog čitljivosti
uint16_t rawData_19C[243] = // Uklonjeno zbog čitljivosti uint16_t
rawData_20C[243] = // Uklonjeno zbog čitljivosti
uint16_t rawData_21C[243] = // Uklonjeno zbog čitljivosti
uint16_t rawData_22C[243] = // Uklonjeno zbog čitljivosti
uint16_t rawData_23C[243] = // Uklonjeno zbog čitljivosti
uint16_t rawData_24C[243] = // Uklonjeno zbog čitljivosti
uint16_t rawData_25C[243] = // Uklonjeno zbog čitljivosti
uint16_t rawData_26C[243] = // Uklonjeno zbog čitljivosti
uint16_t rawData_27C[243] = // Uklonjeno zbog čitljivosti
uint16_t rawData_28C[243] = // Uklonjeno zbog čitljivosti
uint16_t rawData_29C[243] = // Uklonjeno zbog čitljivosti
VoCom – upravljanje govornim naredbama
16
uint16_t rawData_DOWN_TEMP_1[243] = // Uklonjeno zbog čitljivosti
uint16_t rawData_UP_TEMP_MAX[243] = // Uklonjeno zbog čitljivosti
uint16_t rawData_DOWN_TEMP_MIN[243] = // Uklonjeno zbog čitljivosti
uint16_t rawData_UP_TEMP_2[243] = // Uklonjeno zbog čitljivosti
uint16_t rawData_DOWN_TEMP_2[243] = // Uklonjeno zbog čitljivosti
// HOME - TV @38kHz
uint16_t rawData_ON_BOX[21] = {900,850, 900,850, 1850,1650, 950,800,
950,850, 1800,800, 950,850, 900,1700, 900,850, 1850,800, 950};
uint16_t rawData_OFF_BOX[21] = {950,850, 1800,850, 900,1700, 900,850,
900,850, 1850,800, 950,800, 950,1700, 900,850, 1800,850, 900};
uint16_t rawData_UP_CHANNEL[21] = {900,850, 900,850, 1850,1650, 950,800,
950,800, 1850,1700, 900,850, 900,850, 900,850, 1850,1650, 950};
uint16_t rawData_DOWN_CHANNEL[21] = {900,850, 1850,800, 950,1650, 950,800,
950,850, 1800,1700, 900,850, 900,850, 950,800, 950,800, 1850};
uint16_t rawData_ON_TV[99] = // Uklonjeno zbog čitljivosti
uint16_t rawData_ON_TV_AV[99] // Uklonjeno zbog čitljivosti uint16_t
rawData_OFF_TV[99] = // Uklonjeno zbog čitljivosti uint16_t
rawData_NUM_2[21] = {900,850, 950,800, 1850,1650, 950,800, 950,850, 1800,850,
900,850, 900,850, 900,850, 900,1700, 1850}; // RC5 B82
uint16_t rawData_NUM_5[21] = {950,800, 1850,800, 950,1700, 900,850, 900,850,
1850,800, 900,850, 900,850, 950,1650, 1850,1650, 950}; // RC5 385
uint16_t rawData_OK[23] = {950,800, 950,850, 1800,1700, 900,850, 900,850,
1850,1650, 1850,1650, 950,850, 1800,800, 950}; // RC5 BAC
uint16_t rawData_TV_CHANNEL_BACK[23] = {950,850, 900,850, 1800,1700,
900,850, 950,800, 1850,800, 950,800, 950,1650, 950,850, 900,850, 900,850,
950}; // RC5 B8F
//#define REMOTE_CMD_AC_ON 551489775
//#define REMOTE_CMD_AC_UP 551489775
//#define REMOTE_CMD_AC_DOWN 551489775
//#define REMOTE_CMD_TV_ON 551489775
//#define REMOTE_CMD_TV_CHUP 551489775
//#define REMOTE_CMD_TV_CHDOWN 55148977
/************ Global State (you don't need to change this!) ****************/
// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;
// Setup the MQTT client class by passing in the WiFi client and MQTT server
and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME,
AIO_KEY);
/****************************** Feeds **************************************/
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
// Setup feeds for subscribing to changes.
Adafruit_MQTT_Subscribe ir_recv = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME
"/feeds/IR_send");
VoCom – upravljanje govornim naredbama
17
/*************************** Sketch Code ***********************************/
void MQTT_connect();
void setup() {
irsend.begin();
Serial.begin(115200);
delay(10);
Serial.println(F("Adafruit MQTT demo"));
// Connect to WiFi access point.
Serial.println(); Serial.println();
Serial.print("Connecting to ");
Serial.println(WLAN_SSID);
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Setup MQTT subscription
mqtt.subscribe(&ir_recv);
}
VoCom – upravljanje govornim naredbama
18
void loop()
{
// Ensure the connection to the MQTT server is alive (this will make the
first
// connection and automatically reconnect when disconnected). See the
MQTT_connect
// function definition further below.
MQTT_connect();
// this is our 'wait for incoming subscription packets' busy subloop
// try to spend your time here
Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(5000))) {
if (subscription == &ir_recv){
Serial.print(F("Got: "));
uint32_t remote_cmd = atoi((char *)ir_recv.lastread);
Serial.print("Current remote_cmd value is: ");
Serial.println(remote_cmd);
switch (remote_cmd)
{
case 1: // turn on AC
irsend.sendRaw(rawData_ON_AC, 243, 38); // {rawData,
no_of_elements_in_array, freq} Send a raw data capture at 38kHz.
delay(1200);
irsend.sendRaw(rawData_ON_AC, 243, 38);
break;
case 2: // turn off AC
irsend.sendRaw(rawData_OFF_AC, 99, 38);
delay(300);
irsend.sendRaw(rawData_OFF_AC, 99, 38);
break;
case 18: // set temp to 18C
irsend.sendRaw(rawData_18C, 243, 38);
delay(1000);
irsend.sendRaw(rawData_18C, 243, 38);
break;
case 19:
irsend.sendRaw(rawData_19C, 243, 38);
delay(1000);
irsend.sendRaw(rawData_19C, 243, 38);
break;
case 20:
irsend.sendRaw(rawData_20C, 243, 38);
delay(1000);
irsend.sendRaw(rawData_20C, 243, 38);
break;
case 21:
irsend.sendRaw(rawData_21C, 243, 38);
delay(1000);
irsend.sendRaw(rawData_21C, 243, 38);
break;
case 22:
irsend.sendRaw(rawData_22C, 243, 38);
delay(1000);
irsend.sendRaw(rawData_22C, 243, 38);
break;
VoCom – upravljanje govornim naredbama
19
case 23:
irsend.sendRaw(rawData_23C, 243, 38);
delay(1000);
irsend.sendRaw(rawData_23C, 243, 38);
break;
case 24:
irsend.sendRaw(rawData_24C, 243, 38);
delay(1000);
irsend.sendRaw(rawData_24C, 243, 38);
break;
case 25:
irsend.sendRaw(rawData_25C, 243, 38);
delay(1000);
irsend.sendRaw(rawData_25C, 243, 38);
break;
case 26:
irsend.sendRaw(rawData_26C, 243, 38);
delay(1000);
irsend.sendRaw(rawData_26C, 243, 38);
break;
case 27:
irsend.sendRaw(rawData_27C, 243, 38);
delay(1000);
irsend.sendRaw(rawData_27C, 243, 38);
break;
case 28:
irsend.sendRaw(rawData_28C, 243, 38);
delay(1000);
irsend.sendRaw(rawData_28C, 243, 38);
break;
case 29:
irsend.sendRaw(rawData_29C, 243, 38);
delay(1000);
irsend.sendRaw(rawData_29C, 243, 38);
break;
case 30:
irsend.sendRaw(rawData_30C, 243, 38);
delay(1000);
irsend.sendRaw(rawData_30C, 243, 38);
break;
case 100:
irsend.sendRaw(rawData_ON_TV, 99, 38);
delay(100);
irsend.sendRaw(rawData_ON_TV, 99, 38);
delay(100);
irsend.sendRaw(rawData_ON_TV, 99, 38);
delay(100);
irsend.sendRaw(rawData_ON_TV, 99, 38);
delay(100);
irsend.sendRaw(rawData_ON_TV, 99, 38);
delay(100);
irsend.sendRaw(rawData_ON_TV, 99, 38);
delay(100);
irsend.sendRaw(rawData_ON_TV, 99, 38);
delay(100);
irsend.sendRaw(rawData_ON_TV, 99, 38);
delay(7000);
irsend.sendRaw(rawData_ON_TV_AV, 99, 38);
break;
case 101:
irsend.sendRaw(rawData_OFF_TV, 99, 38);
irsend.sendRaw(rawData_OFF_TV, 99, 38);
break;
VoCom – upravljanje govornim naredbama
20
case 102:
irsend.sendRaw(rawData_NUM_2, 21, 38);
break;
case 105:
irsend.sendRaw(rawData_NUM_5, 21, 38);
break;
case 111:
irsend.sendRaw(rawData_UP_CHANNEL, 21, 38);
break;
case 112:
irsend.sendRaw(rawData_DOWN_CHANNEL, 21, 38);
break;
case 113:
irsend.sendRaw(rawData_TV_CHANNEL_BACK, 23, 38);
break;
default:
break;
}
}
}
// ping the server to keep the mqtt connection alive
// NOT required if you are publishing once every KEEPALIVE seconds
if(! mqtt.ping(3)) {
mqtt.disconnect();
}
}
// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
int8_t ret;
// Stop if already connected.
if (mqtt.connected()) {
return;
}
Serial.print("Connecting to MQTT... ");
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for
connected
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(5000); // wait 5 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
while (1);
}
}
Serial.println("MQTT Connected!");
}
VoCom – upravljanje govornim naredbama
21
4.3. Detekcija prisutnosti i upravljanje „vratima“
(Antonio Bukovec)
Korištene su Adafruit MQTT Library, esp8266 google-home-notifier i
Bounce2 biblioteke. Potrebno je ispuniti WLAN_SSID, WLAN_PASS AIO_USERNAME, AIO_KEY i displayName (predstavlja ime Google Home
uređaja kojeg smo definirali u Google Home aplikaciji).
#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include <esp8266-google-home-notifier.h>
#define WIFI_SSID "LBello"
#define WIFI_PASS "sifra123"
#define MQTT_SERV "io.adafruit.com"
#define MQTT_PORT 1883
#define MQTT_NAME "VoCom"
#define MQTT_PASS "7ec7f6fc12f546e9962a6d48f6576f4d"
#define RED_LED 5
#define GREEN_LED 15
#define BUTTON 4
GoogleHomeNotifier ghn;
int switchState = 0;
int oldSwitchState = 0;
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, MQTT_SERV, MQTT_PORT, MQTT_NAME,
MQTT_PASS);
Adafruit_MQTT_Subscribe onoff = Adafruit_MQTT_Subscribe(&mqtt, MQTT_NAME
"/f/Door");
Adafruit_MQTT_Publish ONvalue = Adafruit_MQTT_Publish(&mqtt, MQTT_NAME
"/feeds/Door");
VoCom – upravljanje govornim naredbama
22
void setup() {
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BUTTON, INPUT);
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(">");
delay(50);
}
mqtt.subscribe(&onoff);
const char displayName[] = "Dnevna soba";
Serial.println("connecting to Google Home...");
if (ghn.device(displayName, "en") != true) {
Serial.println(ghn.getLastError());
return;
}
Serial.print("found Google Home(");
Serial.print(ghn.getIPAddress());
Serial.print(":");
Serial.print(ghn.getPort());
Serial.println(")");
if (ghn.notify("Hello, World!") != true) {
Serial.println(ghn.getLastError());
return;
}
Serial.println("Done.");
}
VoCom – upravljanje govornim naredbama
23
void loop() {
MQTT_connect();
digitalWrite(RED_LED, LOW);
switchState = digitalRead(BUTTON);
if (switchState != oldSwitchState){
if (ghn.notify("Someone is at the door!") != true) {
Serial.println(ghn.getLastError());
}
switchState = 0;
digitalWrite(RED_LED, HIGH);
Adafruit_MQTT_Subscribe * subscription;
while ((subscription = mqtt.readSubscription(30000))) {
if (subscription == &onoff){
Serial.println((char*) onoff.lastread);
if (!strcmp((char*) onoff.lastread, "UNLOCK")) {
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
delay(2000);
digitalWrite(GREEN_LED, LOW);
ONvalue.publish("LOCKED");
break;
}
}
else if(subscription == NULL){
break;
}
}
}
}
void MQTT_connect()
{
// // Stop if already connected
if (mqtt.connected() && mqtt.ping())
{
// mqtt.disconnect();
return;
}
int8_t ret;
mqtt.disconnect();
Serial.print("Connecting to MQTT... ");
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) // connect will return 0 for connected
{
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(5000); // wait 5 seconds
retries--;
if (retries == 0)
{
ESP.reset();
}
}
Serial.println("MQTT Connected!");
}
VoCom – upravljanje govornim naredbama
24
5. Zaključak
Razvijeni sustav VoCom omogućuje svim stanarima upravljanje raznim sustavima u kućanstvu pomoću govornih naredba. Tako olakšava
svakodnevicu ukućanima, posebice kod osoba sa smanjenom mogućnošću kretanja. Sustav VoCom može upravljati televizorima, klima uređajima,
intenzitetom svjetla, ulaznim vratima te kuhalom za vodu. Sustav se lako nadograđuje i oblikuje zahtjevima korisnika.
VoCom – upravljanje govornim naredbama
25
6. Literatura
[1] Adafruit IO, https://io.adafruit.com/api/docs/#adafruit-io
[2] IFTTT, https://platform.ifttt.com/docs
[3] RobotDyn, AC light dimmer, https://robotdyn.com/ac-light-dimmer-module-1-
channel-3-3v-5v-logic-ac-50-60hz-220v-110v.html#custom-4
[4] NodeMCU Documentation, https://nodemcu.readthedocs.io/en/master/
[5] esp8266-google-home-notifier, https://github.com/horihiro/esp8266-google-home-
notifier
[6] IRremoteESP8266, https://github.com/markszabo/IRremoteESP8266
[7] Sonoff, https://sonoff.itead.cc/en/
[8] ESP8266 As A WiFi Controlled Universal Remote,
https://www.youtube.com/watch?v=YV8Mx1qvH4A&list=WL&index=12&t=57s
[9] Controlling Appliances through Google Assistant,
https://www.youtube.com/watch?v=Jc6Jet1Yqsk&list=WL&index=9&t=366s
VoCom – upravljanje govornim naredbama
26
7. Pojmovnik
Pojam Kratko objašnjenje Više informacija potražite na
Adafruit IO Cloud servis https://io.adafruit.com/
Google home Kućni asistent https://en.wikipedia.org/wiki/Google_Home
MQTT Komunikacijski protokol
https://en.wikipedia.org/wiki/MQTT
IFTTT Besplatan način da
aplikacije i uređaji komuniciraju
https://ifttt.com/
ES8266 Mikrokontroler https://en.wikipedia.org/wiki/ESP8266