Hardware

ESP8266

Интернет вещей с микроконтроллером ESP8266.

Проект по созданию универсального ИК-пульта управления всей техникой в доме.

Для проекта я использовал отладочную плату NODEMCU v 1.0. Это микроконтроллер ESP2866 + стабализатор напряжения + программатор. Экономит кучу времени.

Драйвер, чтобы при подключении через USB компьютер определил контроллер и добавил в список устройств последовательный (COM) порт.

Скачать драйвер для windows (NodeMcu USB)

Создан прототип на макетной плате: 

Скетч для микроконтроллера:

#include <SPI.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <TroykaDHT11.h>
#include <IRsend.h>
#include <Servo.h>
#include <IRremoteESP8266.h>
#include <ir_Mitsubishi.h>
#include <aREST.h>

#define BLYNK_PRINT Serial
#define DHTPIN 2 // Пин для подключения датчкика DTH на плате D4 // Uncomment whatever type you're using! //#define DHTTYPE DHT11 // DHT 11
#define IR_LED 4 // ESP8266 GPIO pin to use. Recommended: 4 (D2).
#define LISTEN_PORT 80

IRsend irsend(IR_LED); // Set the GPIO to be used to sending the message.
IRMitsubishiAC mitsubir(IR_LED);
Servo myservo;

aREST rest = aREST();
DHT11 dht(DHTPIN);
SimpleTimer timer;

// Create an instance of the server
WiFiServer server(LISTEN_PORT);

char auth[] = "d2c1b35e3c6b45ef8078383e2d0bcb3e"; // Token Blynk

// Your WiFi credentials.
char ssid[] = "SEsin";
char pass[] = "izaporro";

int khz = 38; // 38kHz carrier frequency for the NEC protocol
int tekVol = 0;
int tekPer = 0;
int tekCVol = 0;
int tekCurs = 0;

//Для обратной связи с Есин ТВ
// FFFFFFFFFPPPPPPPPPKKKKK
String startF ="00000000000000000000000"; //Команды для Есин ТВ F - кнопки с F, P - цифры с каналами, K - нажатия на клавиатуру

uint16_t rawDataTechPow[99] = {3450,1750, 400,450, 450,1250, 450,400, 450,450, 400,500, 400,400, 450,400, 450,450, 450,400, 450,400, 450,450, 400,450, 450,400, 450,1250, 450,450, 400,450, 450,450, 400,400, 450,450, 450,400, 450,450, 400,1300, 450,400, 450,1250, 450,450, 450,400, 450,1250, 450,1300, 450,1250, 450,450, 450,400, 450,400, 450,1300, 450,400, 450,1250, 450,1300, 450,1250, 450,1300, 450,400, 450,400, 450,1300, 450,400, 450,400, 450,450, 450,400, 450,400, 450,400, 450,1300, 450}; // UNKNOWN D5AD0B51
uint16_t rawDataTechVolP[99] = {3450,1700, 500,400, 450,1250, 500,400, 450,400, 450,450, 400,450, 400,450, 400,450, 450,450, 400,450, 400,450, 400,450, 450,450, 400,1250, 500,400, 450,450, 400,450, 400,450, 450,400, 400,500, 400,450, 400,1300, 450,450, 400,1250, 500,400, 450,450, 400,450, 450,400, 400,450, 450,450, 400,450, 400,450, 400,450, 450,450, 400,450, 400,450, 400,450, 450,1250, 500,400, 450,400, 450,450, 400,450, 400,450, 400,450, 450,450, 400,450, 400,450, 400,1300, 450};
uint16_t rawDataTechVolM[99] = {3450,1750, 450,400, 450,1300, 400,450, 450,450, 400,450, 400,450, 400,450, 450,450, 400,450, 400,450, 400,450, 450,450, 400,450, 400,1300, 450,450, 400,450, 400,450, 400,450, 450,450, 400,450, 400,450, 400,1300, 450,450, 400,1300, 450,450, 400,450, 400,450, 400,450, 450,450, 400,450, 400,450, 400,450, 450,1250, 450,450, 400,450, 450,450, 400,450, 400,1300, 450,450, 400,450, 400,1300, 450,450, 400,450, 400,450, 400,450, 450,450, 400,450, 400,1300, 450};
uint16_t rawDataTechEQ[99] = {3450,1700, 450,400, 450,1300, 450,400, 450,400, 450,450, 400,450, 450,450, 400,400, 450,450, 450,400, 450,400, 450,450, 400,450, 450,1250, 450,400, 450,450, 450,400, 450,400, 450,400, 450,450, 400,450, 450,1250, 450,450, 400,1300, 450,400, 450,450, 400,450, 450,400, 450,1300, 400,450, 450,400, 450,400, 450,1300, 450,1250, 450,450, 400,450, 450,450, 400,400, 450,450, 450,1250, 450,1300, 450,1250, 450,400, 450,450, 450,1250, 450,1300, 450,400, 450,400, 450};

//Проектор
uint16_t rawDataPrOn[67] = {8950,4450, 600,550, 550,550, 600,500, 600,550, 600,500, 600,550, 600,550, 550,550, 550,550, 600,550, 550,550, 600,550, 550,1700, 550,1650, 600,500, 600,550, 600,1650, 600,1600, 600,1700, 550,1650, 600,550, 550,550, 600,1650, 600,500, 600,550, 550,550, 600,500, 600,550, 600,1650, 600,1650, 550,550, 600,1650, 550}; // NEC CF20D
uint16_t rawDataPrOff[67] = {8950,4450, 600,500, 600,550, 550,550, 600,550, 550,550, 600,550, 550,550, 550,600, 550,550, 550,550, 600,550, 550,550, 600,1650, 550,1650, 600,550, 600,500, 600,550, 600,1650, 550,1650, 600,1650, 600,550, 550,550, 600,1650, 600,500, 600,1650, 600,550, 550,550, 600,550, 550,1700, 550,1650, 600,550, 550,1650, 600}; // NEC C728D
int pos = 0;
void sendSensor()
{
float h;
float t; // or dht.readTemperature(true) for Fahrenheit
int check;
// мониторинг ошибок
// считывание данных с датчика DHT11
check = dht.read();
switch (check) {
// всё OK
case DHT_OK:
// выводим показания влажности и температуры
Serial.print("Temperature = ");
Serial.print(dht.getTemperatureC());
Serial.print("C \t");
Serial.print("Humidity = ");
Serial.print(dht.getHumidity());
Serial.println("%");
h = dht.getHumidity();
t = dht.getTemperatureC();

break;
// ошибка контрольной суммы
case DHT_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
// превышение времени ожидания
case DHT_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
// неизвестная ошибка
default:
Serial.println("Unknown error");
break;
}

Blynk.virtualWrite(V5, h);
Blynk.virtualWrite(V6, t);//-2 - калибровка

}

void Blynk_Delay(int milli){
int end_time = millis() + milli;
while(millis() < end_time){
Blynk.run();
yield();
}
}

BLYNK_WRITE(V0) //Оставлю для теста
{
int pinData = param.asInt();

if (pinData == 1)
{
for (int i = 0; i < 5; i++) {
digitalWrite(5,HIGH);
Blynk_Delay(500);
digitalWrite(5,LOW);
Blynk_Delay(500);}
}
}

//SONY
BLYNK_WRITE(V1) {

int pinData = param.asInt();

if (pinData == 1)
{

for (int i = 0; i < 3; i++) {irsend.sendSony(0xa90, 12, 2); Blynk_Delay(100);} Blynk_Delay(100);
}

} //Кнопка 1 //Включение

//Кнопка Громче/Тише
BLYNK_WRITE(V2) {

int pinData = param.asInt();

if (pinData < tekVol)
{irsend.sendSony(0xC90, 12, 2);}
else
{irsend.sendSony(0x490, 12, 2);}

tekVol = pinData;

}

BLYNK_WRITE(V3) {

int pinData = param.asInt();

if (pinData > tekPer)
{irsend.sendSony(0x90, 12, 2);}
else
{for (int i = 0; i < 3; i++) {irsend.sendSony(0x890, 12, 2); Blynk_Delay(100);} Blynk_Delay(100);}

tekPer = pinData;

}

BLYNK_WRITE(V4) {

int pinData = param.asInt();

if (pinData == 1)
{

irsend.sendSony(0xA50, 12, 2); Blynk_Delay(200);
}

} //Кнопка 4 //Режим


//TECHNICS
BLYNK_WRITE(V7) {

int pinData = param.asInt();

if (pinData == 1)
{
irsend.sendRaw(rawDataTechPow, 99, khz);
Blynk_Delay(2000);
}

} //Вкл

BLYNK_WRITE(V8) {

int pinData = param.asInt();

if (pinData < tekCVol)
{irsend.sendRaw(rawDataTechVolM, 99, khz); Blynk_Delay(100);}
else
{irsend.sendRaw(rawDataTechVolP, 99, khz); Blynk_Delay(100);}

tekCVol = pinData;

}

BLYNK_WRITE(V10) {irsend.sendRaw(rawDataTechEQ, 99, khz); Blynk_Delay(100);} //EQ

//Кондиционер
BLYNK_WRITE(V11) {

mitsubir.on();
mitsubir.setFan(1);
mitsubir.setMode(MITSUBISHI_AC_COOL);
mitsubir.setTemp(25);
mitsubir.setVane(MITSUBISHI_AC_VANE_AUTO);



mitsubir.send();

Blynk_Delay(2000);

}

BLYNK_WRITE(V12) {

mitsubir.off();
Blynk_Delay(200);

mitsubir.send();

}

BLYNK_WRITE(V13) {irsend.sendRaw(rawDataPrOn, 67, khz); Blynk_Delay(100);} //Включить Проектор
BLYNK_WRITE(V14) {irsend.sendRaw(rawDataPrOff, 67, khz); Blynk_Delay(100);} //Выключить Проектор

//Открыть шторку
BLYNK_WRITE(V15) {

int pinData = param.asInt();

if (pinData == 1)
{

if (myservo.read() != 180)
{
for (pos = 0; pos <= 180; pos += 1) {myservo.write(pos);Blynk_Delay(15);}
}
myservo.write(0);//Вернем обратно
Blynk_Delay(2000);

}

}

//Связь с Есин ТВ
BLYNK_WRITE(V40) {

int pinData = param.asInt(); if (pinData == 1){

for (int i = 0; i < 3; i++) {irsend.sendSony(0xa90, 12, 2); Blynk_Delay(100);} Blynk_Delay(4000); //Включим телек
irsend.sendSony(0xA50, 12, 2); Blynk_Delay(200); //Переключим режим
if (startF[3] =='0') {startF[3] = '1';} else {startF[3] = '0';} //Запустим эфир без робота

}

}

BLYNK_WRITE(V41) {

int pinData = param.asInt(); if (pinData == 1){

for (int i = 0; i < 3; i++) {irsend.sendSony(0xa90, 12, 2); Blynk_Delay(100);} Blynk_Delay(4000); //Включим телек
irsend.sendSony(0xA50, 12, 2); Blynk_Delay(200); //Переключим режим
if (startF[0] =='0') {startF[0] = '1';} else {startF[0] = '0';} //Запустим эфир с роботом

}
}

 


BLYNK_WRITE(V42) {int pinData = param.asInt(); if (pinData == 1){if (startF[1] =='0') {startF[1] = '1';} else {startF[1] = '0';}}}
BLYNK_WRITE(V43) {int pinData = param.asInt(); if (pinData == 1){if (startF[2] =='0') {startF[2] = '1';} else {startF[2] = '0';}}}
BLYNK_WRITE(V44) {int pinData = param.asInt(); if (pinData == 1){if (startF[3] =='0') {startF[3] = '1';} else {startF[3] = '0';}}}
BLYNK_WRITE(V45) {int pinData = param.asInt(); if (pinData == 1){if (startF[4] =='0') {startF[4] = '1';} else {startF[4] = '0';}}}
BLYNK_WRITE(V46) {int pinData = param.asInt(); if (pinData == 1){if (startF[5] =='0') {startF[5] = '1';} else {startF[5] = '0';}}}
BLYNK_WRITE(V47) {int pinData = param.asInt(); if (pinData == 1){if (startF[6] =='0') {startF[6] = '1';} else {startF[6] = '0';}}}
BLYNK_WRITE(V48) {int pinData = param.asInt(); if (pinData == 1){if (startF[7] =='0') {startF[7] = '1';} else {startF[7] = '0';}}}
BLYNK_WRITE(V49) {int pinData = param.asInt(); if (pinData == 1){if (startF[8] =='0') {startF[8] = '1';} else {startF[8] = '0';}}}

BLYNK_WRITE(V51) {int pinData = param.asInt(); if (pinData == 1){if (startF[9] =='0') {startF[9] = '1';} else {startF[9] = '0';}}}
BLYNK_WRITE(V52) {int pinData = param.asInt(); if (pinData == 1){if (startF[10] =='0') {startF[10] = '1';} else {startF[10] = '0';}}}
BLYNK_WRITE(V53) {int pinData = param.asInt(); if (pinData == 1){if (startF[11] =='0') {startF[11] = '1';} else {startF[11] = '0';}}}
BLYNK_WRITE(V54) {int pinData = param.asInt(); if (pinData == 1){if (startF[12] =='0') {startF[12] = '1';} else {startF[12] = '0';}}}
BLYNK_WRITE(V55) {int pinData = param.asInt(); if (pinData == 1){if (startF[13] =='0') {startF[13] = '1';} else {startF[13] = '0';}}}
BLYNK_WRITE(V56) {int pinData = param.asInt(); if (pinData == 1){if (startF[14] =='0') {startF[14] = '1';} else {startF[14] = '0';}}}
BLYNK_WRITE(V57) {int pinData = param.asInt(); if (pinData == 1){if (startF[15] =='0') {startF[15] = '1';} else {startF[15] = '0';}}}
BLYNK_WRITE(V58) {int pinData = param.asInt(); if (pinData == 1){if (startF[16] =='0') {startF[16] = '1';} else {startF[16] = '0';}}}
BLYNK_WRITE(V59) {int pinData = param.asInt(); if (pinData == 1){if (startF[17] =='0') {startF[17] = '1';} else {startF[17] = '0';}}}

BLYNK_WRITE(V61) {int pinData = param.asInt(); if (pinData == 1){if (startF[18] =='0') {startF[18] = '1';} else {startF[18] = '0';}}}
BLYNK_WRITE(V62) {int pinData = param.asInt(); if (pinData == 1){if (startF[19] =='0') {startF[19] = '1';} else {startF[19] = '0';}}}
BLYNK_WRITE(V63) {

int pinData = param.asInt();

if (pinData > tekCurs)
{
if (startF[20] =='0') {startF[20] = '1';} else {startF[20] = '0';}
}
else
{
if (startF[21] =='0') {startF[21] = '1';} else {startF[21] = '0';}
}

tekCurs = pinData;

} //Курсор
//BLYNK_WRITE(V64) {int pinData = param.asInt(); if (pinData == 1){if (startF[21] =='0') {startF[21] = '1';} else {startF[21] = '0';}}} //Курсор
BLYNK_WRITE(V65) {int pinData = param.asInt(); if (pinData == 1){if (startF[22] =='0') {startF[22] = '1';} else {startF[22] = '0';}}}

void setup()
{
//BLYNK
// Debug console
Serial.begin(9600);
dht.begin();
irsend.begin();

Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,42), 8080);
timer.setInterval(10000L, sendSensor);

pinMode(5,OUTPUT);

mitsubir.begin();

myservo.attach(14); //D5
myservo.write(0);

rest.variable("startF",&startF);

// Give name and ID to device
rest.set_id("1");
rest.set_name("esin_tv");

// Запуск HTTP сервера для передачи параметров в Есин ТВ
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
Blynk_Delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");

// Start the server
server.begin();
Serial.println("Server started");

// Print the IP address
Serial.println(WiFi.localIP());

}

void loop()
{

//char c = 'T';
//startF2.setCharAt(2, c);
//startF2[1] = 'F';

Blynk.run();
timer.run(); // Initiates SimpleTimer
// Нужно почему-то избегать фунции delay()!

//РАБОТА С COM-ПОРТОМ
int val = Serial.read();

//Sony
if (val == 49) {
for (int i = 0; i < 3; i++) {irsend.sendSony(0xa90, 12, 2);
Blynk_Delay(100);}
digitalWrite(5,HIGH); //Мигаем светодиодом для проверки COM
Blynk_Delay(500);
digitalWrite(5,LOW);
Blynk_Delay(500);
while (Serial.read() != -1);
}

//Кнопка 2 //Тише
if (val == 50) {for (int i = 0; i < 1; i++) {irsend.sendSony(0xC90, 12, 2); Blynk_Delay(100);} Blynk_Delay(100); while (Serial.read() != -1);}

//Кнопка 3 //Громче
if (val == 51) {for (int i = 0; i < 1; i++) {irsend.sendSony(0x490, 12, 2); Blynk_Delay(100);} Blynk_Delay(100); while (Serial.read() != -1);}

//Кнопка 4 //Режим
if (val == 52) {for (int i = 0; i < 1; i++) {irsend.sendSony(0xA50, 12, 2); Blynk_Delay(100);} Blynk_Delay(100); while (Serial.read() != -1);}

//Сл. канал
if (val == 82) {for (int i = 0; i < 1; i++) {irsend.sendSony(0x90, 12, 2); Blynk_Delay(100);} Blynk_Delay(100); while (Serial.read() != -1);}

//Пред канал
if (val == 83) {for (int i = 0; i < 1; i++) {irsend.sendSony(0x890, 12, 2); Blynk_Delay(100);} Blynk_Delay(100); while (Serial.read() != -1);}

//TECHNICS

//Кнопка 5
if (val == 53) {irsend.sendRaw(rawDataTechPow, 99, khz); Blynk_Delay(200); while (Serial.read() != -1);}

//Кнопка 6
if (val == 54) {irsend.sendRaw(rawDataTechVolM, 99, khz); Blynk_Delay(100); while (Serial.read() != -1);}

//Кнопка 7
if (val == 55) {irsend.sendRaw(rawDataTechVolP, 99, khz); Blynk_Delay(100); while (Serial.read() != -1);}

//Кнопка 8
if (val == 56) {irsend.sendRaw(rawDataTechEQ, 99, khz); Blynk_Delay(100); while (Serial.read() != -1);}

//BenQ

//Кнопка 9
if (val == 57)
{
irsend.sendRaw(rawDataPrOn, 67, khz); Blynk_Delay(100);

if (myservo.read() != 180)
{
for (pos = 0; pos <= 180; pos += 1) {myservo.write(pos);Blynk_Delay(15);}
}

while (Serial.read() != -1);
}

//Кнопка 0
if (val == 48)
{
irsend.sendRaw(rawDataPrOff, 67, khz); Blynk_Delay(100);
if (myservo.read() != 0)
{
myservo.write(0);
}

while (Serial.read() != -1);
}

// Handle REST calls
WiFiClient client = server.available();
if (!client) {
return;
}
while(!client.available()){
Blynk_Delay(1);
}
rest.handle(client);

}