26
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

A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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

Page 2: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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.

Page 3: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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.

Page 4: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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

Page 5: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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č

Page 6: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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

Page 7: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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

Page 8: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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.

Page 9: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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.

Page 10: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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.

Page 11: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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

Page 12: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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;

Page 13: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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");

}

Page 14: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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!");

}

Page 15: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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

Page 16: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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");

Page 17: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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);

}

Page 18: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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;

Page 19: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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;

Page 20: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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!");

}

Page 21: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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");

Page 22: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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.");

}

Page 23: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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!");

}

Page 24: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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.

Page 25: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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

Page 26: A. Bukovec 0036492166 SEMINARSKI RAD - SPVP M. Kodba ...nevena.lss.hr/recordings/fer/predmeti/spvp/2019/projekti/ivrhoci/... · Ovaj seminarski rad je izrađen u okviru predmeta „Sustavi

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