ILife v8 - уборка по внешнему расписанию

Jun 28, 2020 18:52

На распродаже Aliexpress приобрёл сабжевый аппарат.
Понравился он мне очень.
И проходимый, скачет по коврам как горный козёл.
И незастревучий. Только когда я на полу верёвку оставил, он её и намотал.
И убирается по-умному, змейкой, от стены к стене.
И все комнаты сам обходит, и сам возвращается на базу.

Но есть и мелкие недостатки - нет настройки уборки по дням недели.
А ежедневная уборка мне без надобности. Это бессмысленное расходование ресурса пылесоса.
Включать же вручную в выходные в своём присутствии тоже неохота, приятнее было бы, чтобы он убирался когда меня нет дома, например, во вторник и пятницу. Или только в пятницу, пока не решил.

Захотелось сделать всё красиво, без вмешательства в аппаратную часть пылесоса.
Поэтому пришлось немного изучить новую для меня область - управление ИК-лучами.
Использовал примеры из IRremote и IRLib2.
Снял дамп и прочие параметры кнопки включения родного пульта.
Частота сигнала 50кГц. Сигнал определяется как UNKNOWN 52A3E788
Пришлось посылать в сыром формате:
uint16_t rawData[89] = {4450, 4400, 550, 500, 600, 1650, 500, 550, 550, 1650, 550, 550, 550, 1700, 500, 550, 550, 600, 4450, 4400, 550, 550, 550, 1650, 550, 500, 550, 1650, 550, 550, 550, 1650, 550, 550, 550, 600, 4450, 4400, 550, 550, 550, 1650, 550, 500, 600, 1650, 500, 550, 550, 1700, 500, 550, 550, 600, 4450, 4400, 500, 600, 550, 1650, 550, 500, 600, 1600, 600, 500, 550, 1700, 500, 550, 550, 600, 4450, 4400, 550, 550, 550, 1650, 550, 550, 500, 1700, 500, 550, 550, 1650, 550, 550, 550}; //

Далее дело техники. Взял уже готовую ESP8266 от неактуального проекта, присобачил к нему ИК-светодиод, поставил на магните над базой пылесоса. Всё готово!
Ах да, скетч конечно ещё. Но там ничего сложного - дни недели, время старта. Лог событий.

[скетч]

#include
#include
#include
#include
#include
#include
WidgetRTC rtc;
WidgetTerminal terminal(V8);

uint16_t rawData[89] = {4450, 4400, 550, 500, 600, 1650, 500, 550, 550, 1650, 550, 550, 550, 1700, 500, 550, 550, 600, 4450, 4400, 550, 550, 550, 1650, 550, 500, 550, 1650, 550, 550, 550, 1650, 550, 550, 550, 600, 4450, 4400, 550, 550, 550, 1650, 550, 500, 600, 1650, 500, 550, 550, 1700, 500, 550, 550, 600, 4450, 4400, 500, 600, 550, 1650, 550, 500, 600, 1600, 600, 500, 550, 1700, 500, 550, 550, 600, 4450, 4400, 550, 550, 550, 1650, 550, 550, 500, 1700, 500, 550, 550, 1650, 550, 550, 550}; // UNKNOWN 52A3E788
bool days[7] = {false, false, false, false, false, false, false};
const uint16_t kIrLed = 14; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
IRsend irsend(kIrLed);
char auth[] = "my_auth";
char ssid[] = "my_ssid";
char pass[] = "my_pass";
bool send_test = false;
bool sent = false;
unsigned long lastsend;
unsigned long lastsync;
unsigned long lastlogc;
int dd1, dd2, dm1, dm2, rep;

void term_log(String text) {
char time_buf[12]; // size big enough
sprintf(time_buf, "%02u%02u%02u %02u%02u ", year() % 100, month(), day(), hour(), minute());
String str = time_buf;
terminal.print(str); terminal.println(text); terminal.flush();
}

BLYNK_CONNECTED() {
Blynk.syncVirtual(V0);
Blynk.syncVirtual(V1);
Blynk.syncVirtual(V2);
Blynk.syncVirtual(V3);
Blynk.syncVirtual(V4);
Blynk.syncVirtual(V5);
Blynk.syncVirtual(V6);
Blynk.syncVirtual(V10);//час
Blynk.syncVirtual(V11);//минуты
Blynk.syncVirtual(V12);//час
Blynk.syncVirtual(V13);//минуты
rtc.begin();
}

BLYNK_WRITE(V0) {
days[1] = param.asInt();
}
BLYNK_WRITE(V1) {
days[2] = param.asInt();
}
BLYNK_WRITE(V2) {
days[3] = param.asInt();
}
BLYNK_WRITE(V3) {
days[4] = param.asInt();
}
BLYNK_WRITE(V4) {
days[5] = param.asInt();
}
BLYNK_WRITE(V5) {
days[6] = param.asInt();
}
BLYNK_WRITE(V6) {
days[0] = param.asInt();
}
BLYNK_WRITE(V7) {
rep = param.asInt();
}
BLYNK_WRITE(V9) {
send_test = param.asInt();
}
BLYNK_WRITE(V10) {
dd1 = param.asInt();
}
BLYNK_WRITE(V11) {
dm1 = param.asInt();
}
BLYNK_WRITE(V12) {
dd2 = param.asInt();
}
BLYNK_WRITE(V13) {
dm2 = param.asInt();
}

void setup() {
Blynk.begin(auth, ssid, pass, "my_server", my_port);
delay(2000); while (year() == 1970) {
delay(300); //синхронизация времени
rtc.begin();
delay(1000);
}
setSyncInterval(3600); // Sync interval in seconds (час)
lastsend = 0;
irsend.begin();
term_log("ILife IR контроллер включён");
}

void loop() {
Blynk.run();

if ((millis() - lastlogc) > 10000) {
lastlogc = millis();
sent = false;
if (days[weekday() - 1] == 1) {
if ((weekday() == 1) || (weekday() == 7)) {
if ((hour() == dd2) && (minute() == dm2)) {
sent = true;
}
} else {
if ((hour() == dd1) && (minute() == dm1)) {
sent = true;
}
}
}
}
if (sent || send_test) {
if ((millis() - lastsend) > 61000) {
lastsend = millis();
for (int i = 0; i < rep; i++) {
irsend.sendRaw(rawData, 89, 50);
delay(40);
}
if (send_test) {
term_log("Запуск по запросу");
} else {
term_log("Запуск по графику");
}
}
}
}





техническое, esp8266, #include, arduino

Previous post Next post
Up