/*
*Wokwi example: https://wokwi.com/projects/342784604105605716
* Ще покажем как можем да създадем собствено IoT устройство, използвайки тип изкуствен интелект с ограничена памет,
* съвместим директно с гласовия асистент Alexa на Amazon с вграден изкуствен интелект.
* За този пример ще ви е необходимо хардуерно устройство Alexa Echo или съвместимо с него.
* Това е основен пример за това как да създадете собствено интелигентно IoT устройство, съвместимо с гласовия асистент Amazon Alexa.
* с изкуствен интелект. Това може да стане с помощта на библиотеката Espalexa за Arduino IDE и нейните методи за деклариране на устройства.
*/
#ifdef ARDUINO_ARCH_ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include <Espalexa.h> // Необходима библиотека. Трябва да я добавите в Arduino IDE или Wokwi. Не е заредена по подразбиране.
// прототипи
boolean connectWifi();
// функции за обратна връзка
void firstLED_Channel (uint8_t LED1_State);
void secondLED_Channel(uint8_t LED2_State);
void thirdLED_Channel (uint8_t LED3_State);
// Трябва да промените името и паролата с тези на вашата мрежа.
// Важно е тази мрежа да е същата, която се използва от Alexa Echo или от съвместимото устройство, което използвате.
#define ssid "Wokwi-GUEST"
#define password ""
boolean wifiConnected = false; // Маркер за WiFi връзкaта
Espalexa espalexa;
EspalexaDevice* device3; //това е необходимо за втория начин за създаване на устройство на Алекса по-долу - "Device 3"
int light1=25; // Дефинирайте GPIO, използвани в тестовата хардуерна схема. Свързани са 4 светодиода.
int light2=26;
int light3=27;
int light4=32;
void setup() {
// Стартирайте серийния монитор
Serial. begin(115200);
// Иницииране на wifi връзка
wifiConnected = connectWifi();
// Дефиниции на режима на пина
pinMode(light1, OUTPUT);
pinMode(light2, OUTPUT);
pinMode(light3, OUTPUT);
pinMode(light4, OUTPUT);
if(wifiConnected){
// Тук дефинирайте устройствата си.
espalexa.addDevice("Device 1", firstLED_Channel); //най-проста дефиниция, състояние по подразбиране изключено
espalexa.addDevice("Device 2", secondLED_Channel, 255); //третият параметър е началното състояние от 0 до 255. (тук състоянието е включен)
// Втори начин за дефиниране на ново устройство
device3 = new EspalexaDevice("Device 3", thirdLED_Channel); //можете също така сами да създадете обектите на устройството, както тук
espalexa.addDevice(device3); //и след това ги добавете
device3->setValue(128); //това ви позволява например да актуализирате стойността на състоянието им от 0 до 255 по всяко време!
espalexa. begin();
} else
{
while (1) {
Serial. println("Не може да се свърже с WiFi. Моля, проверете данните и нулирайте ESP.");
delay(2500);
}
}
}
void loop()
{
espalexa. loop(); // Стартирайте процедурата Alexa loop
delay(100);
}
//нашите функции за обратно извикване
void firstLED_Channel(uint8_t LED1_State) {
// Тук можете да направите необходимите обработки
// Пример за "light1"
Serial. print("Device 1 changed to ");
if (LED1_State) {
Serial. print("ON, LED1_State ");
Serial. println(LED1_State);
digitalWrite(light1, HIGH);
}
else {
Serial. println("OFF");
digitalWrite(light1, LOW);
}
}
void secondLED_Channel(uint8_t LED2_State) {
// Тук можете да направите необходимото
// Пример за "light2"
Serial. print("Device 2 changed to ");
if (LED2_State) {
Serial. print("ON, LED2_State ");
Serial. println(LED2_State);
digitalWrite(light2, HIGH);
}
else {
Serial. println("OFF");
digitalWrite(light2, LOW);
}
}
void thirdLED_Channel(uint8_t LED3_State) {
// Тук можете да направите необходимото
// Пример за "light3"
Serial. print("Device 3 changed to ");
if (LED3_State) {
Serial. print("ON, LED3_State ");
Serial. println(LED3_State);
digitalWrite(light3, HIGH);
}
else {
Serial. println("OFF");
digitalWrite(light3, LOW);
}
}
// свързване с WiFi връща true, ако е успешно, или false, ако не е
boolean connectWifi() {
boolean state = true;
int i = 0;
WiFi.mode(WIFI_STA);
WiFi. begin(ssid, password);
Serial. println("");
Serial. println("Свързване с WiFi");
// Изчакайте за връзка
Serial. print("Свързване...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial. print(".");
if (i > 20){
state = false; break;
}
i++;
}
Serial. println("");
if (state){
Serial. print("Свързано с ");
Serial. println(ssid);
Serial. print("IP адрес: ");
Serial. println(WiFi.localIP());
Serial. println("Този код няма да работи правилно в симулатора на Wokwi. Трябва да имате");
Serial. println("модул за тестване на хардуер и реално устройство Alexa Dot в собствената ви мрежа");
Serial. println("*********************************************");
Serial. println("Можете да потърсите устройствата Device 1, Device 2 и Device 3 в приложението Alexa.");
Serial. println("Ако не ги виждате, можете да попитате Alexa Echo - Alexa find new devices in my network.");
digitalWrite(light4, HIGH); // ако връзката е ОК, светодиодът LED4 ще светне
}
else {
Serial. println("Връзката е неуспешна.");
digitalWrite(light4, LOW); // ако връзката е неуспешна, светодиодът LED4 няма да светне
}
return state;
}