Okosotthon házilag (alapok)

Ha hanggal vezérelhető okosotthont szeretnétek csinálni, akkor megspórolok egy kis keresgélést nektek. – írta: Joccc07, 6 éve

Valamikor régen vettem egy Raspberry PI2-t, és beszippantott a mikrokontrollerek világa. Sok érdemleges projektet nem csináltam vele, mert az elejétől kezdve médiaboxnak és házi szervernek volt tervezve és időm se volt annyi, amennyit szerettem volna. De tavaly karácsonyra a feleségemtől kaptam egy Feather Huzzah mikrokontrollert és egyéb nyalánkságokat hozzá, hogy elkezdhessem a „Smart Home” rendszeremet. Elárulom, hogy ebből még azóta sincs semmi.

De a szándék a fontos, szokták mondani, és egy alapprojektet készítettem, amit most szeretnék veletek is megosztani. Ahogy az elején is írtam, a terv egy okostelefonnal vezérelhető okosotthon volt. De egy kicsit továbbgondoltam. Minek nyomkodjam a telefonomat, ha beszélhetek is hozzá. El is kezdtem keresni az interneten, hátha valaki csinált már ilyet. Természetesen így, ebben a formában, ahogy én elgondoltam, nem. Nem voltam túl boldog mert, így sokkal tovább tartott, mint gondoltam. De most, hogy ezt nektek leírom és esetleg pont azon gondolkodtok, hogy „Kéne csinálni egy hanggal vezérelhető okosotthont!,” megspórolok nektek egy csomó időt. És, hogy mi kell hozzá?

Hozzávalók:

Feather Huzzah mikrokontroller
Neopixel (természetesen ez mással is helyettesíthető)
Jumper kábelek
• Egy számítógép tetszőleges operációs rendszerrel
Arduino IDE
Adafruit.io regisztráció
IFTT regisztráció

Nem is olyan sok minden, igaz?

Hogyan kezdjünk hozzá?

Regisztrálj mind a két oldalon.

Ha ezzel megvagy, töltsd le az Arduino IDE szoftvert.

Ha ez is kész, akkor látogasd meg ezt a weboldalt, ahol részletesen leírják a Feather Huzzah Arduino IDE-hez való hozzáadásának menetét.
Ha ezzel megvagy, akkor az io.adafruit.com oldalon keresd meg a Feeds menüpontot. Kattints az Action fülre.

Majd azon belül a create new Feed-re. A felugró ablakban adj hozzá a „Name” mezőhöz egy tetszőleges nevet (Lehetőség szerint angol legyen). Én a home nevet adtam neki. De ha nem szeretnéd később javítani, akkor írd te is ezt, az egyszerűség kedvéért. Ha kész, akkor a listában megjelenik egy home nevű dashboard fül. Ezzel meg is volnánk.

Most menj az IFTT oldalára.

A bejelentkezés után kattints a My Applets fülre, majd az Applets fülön a New Applet ikonra. A +this-re kattintva feljön egy „Choose a service”. Oda írd be, hogy Google Assistant. Válaszd ki majd a következő lépésben kattints a „Say a phrase with a text ingredient”-re. A „What do you want to say?” kérdéshez írd be a home $ szöveget (vagy amit választottál, de a dollárjel ne maradjon le) majd alá is ugyanezt és az alá is. Ezután a „What do you want to say Assistant to say in response” részhez bármit írhatsz (Én az „ok turn”-t írtam). Ez a rész annyit tesz, hogy ezt mondja vissza az asszisztens, ha értette a parancsot. A language pontnál maradjon az angol, de igazából ez lényegtelen. Ezek után „Create trigger” és a +that-re kattintva jön egy másik ablak „Choose action service” címmel. Ide írd be és válaszd ki az Adafruit pontot, utána a „Send data to adafruit IO”-t.
Most, ha mindent jól csináltál akkor automatikusan a home-nak kell benne lennie a „Feed name” dobozban. A „data to save” dobozba csak válaszd ki, hogy „Textfield” majd kattints a „create action”-re és kész is vagy. A következő lépésben leellenőrizheted, hogy mindent jól csináltál. Ha igen, akkor finish. Ezzel kész is volnánk.

Kötés és programozás

Elérkeztünk a legnehezebb részhez. Most jön a hozzávalók összekeverése.

A kép alapján megcsináltad a bekötéseket, akkor jöhet az Arduino IDE és forráskód feltöltése az eszközre.

/***************************************************
Adafruit MQTT Library ESP8266 Example

Must use ESP8266 Arduino from:
https://github.com/esp8266/Arduino

Works great with Adafruit's Huzzah ESP board & Feather
----> https://www.adafruit.com/product/2471
----> https://www.adafruit.com/products/2821

Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!

Written by Tony DiCola for Adafruit Industries.
MIT license, all text above must be included in any redistribution
****************************************************/

/********************************************************************
Modified by Csizmazia József

********************************************************************/

#include <ESP8266WiFi.h>
#include <Adafruit_NeoPixel.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

//Change the pins according to the choice of your board

#define PIN 2 //Define the pins connected to the Play Button


/************************* WiFi Access Point *********************************/

#define WLAN_SSID "xxxxxxx" // Saját Wifi név
#define WLAN_PASS "xxxxxxxx" //Saját wifi jelszó

/************************* Adafruit.io Setup *********************************/

#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883 // use 8883 for SSL
#define AIO_USERNAME "xxxxx" //Adafruit.io felhasználóneved helye
#define AIO_KEY "xxxxxxxxxxx" //io kulcsod helye *

Adafruit_NeoPixel strip = Adafruit_NeoPixel(32, PIN, NEO_GRB + NEO_KHZ800);
volatile boolean neopixel_state = false;

uint32_t Wheel(byte WheelPos);
/************ Global State (you don't need to change this!) ******************/

// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;
// or... use WiFiFlientSecure for SSL
//WiFiClientSecure 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 a feed called 'Speaker' for subscribing to changes.
Adafruit_MQTT_Subscribe home = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/home");


/*************************** Sketch Code ************************************/

// Bug workaround for Arduino 1.6.6, it seems to need a function declaration
// for some reason (only affects ESP8266, likely an arduino-builder bug).
void MQTT_connect();

void setup() {
Serial.begin(115200);
delay(10);
pinMode(PIN, OUTPUT);
strip.begin();
strip.setBrightness(20);
strip.show();



Serial.println(F("Adafruit MQTT"));

// 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 for onoff feed.
mqtt.subscribe(&home);

}


uint32_t j = 0;
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 == &home) {
Serial.print(F("Got from Home Feed: "));

Serial.println((char *)home.lastread);

if (strcmp((char *)home.lastread, "pixel on") == 0) {
for(int16_t i=0; i< strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
j++;
delay(20);}
else{
if (strcmp((char *)home.lastread, "pixel off") == 0) {
for(int16_t i=0; i< strip.numPixels(); i++) {
strip.setPixelColor(i, 0);
}
strip.show();}
}
}
}}
// ping the server to keep the mqtt connection alive
// NOT required if you are publishing once every KEEPALIVE seconds
/*
if(! mqtt.ping()) {
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!");
}
uint32_t Wheel(byte WheelPos) {
if(WheelPos < 85) {
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
} else if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}

* io kulcs helyét az io.adafruit.com-on a "view AIO key"-ben találod.

A feltöltés előtt érdemes még egyszer leellenőrizni, hogy nincs-e hiba a kódban. Az Arduino IDE-n belül a pipa gombra kattintva elvégzi az ellenőrzést. Ha nem jelenik meg hiba, akkor mehet is a feltöltés.

A forráskódot úgy alakítottam ki, hogy könnyen kiegészíthető legyen a későbbiekben.

El is készültél.

Ha mindent jól csináltál, és hát miért ne, akkor add ki a következő varázsszavakat a Google Asszisztensnek:

"OK Google"
"Home pixel on" Ha minden rendben, akkor most felvillanak a ledek.
"Home pixel off"

Mindez videóban:

Első cikkem, úgyhogy légyszi, csak finoman.

Előzmények