#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#define ONE_WIRE_BUS_1 5
OneWire oneWire_in(ONE_WIRE_BUS_1);
DallasTemperature sensor_inhouse(&oneWire_in);
MDNSResponder mdns;
// Wi-Fi
const char* ssid = "tele2";
const char* password = "ta20242024";
byte arduino_mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(192,168,43,155);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
ESP8266WebServer server(80);
int a = 0;
int b = 0;
int c = 0;
int t = 0;
int D0_pin = 15;
int D2_pin = 12;
int D1_pin = 13;
const uint16_t kRecvPin = 14;
/////////////////
const int ledPinG = 12;//ЗЕЛЁНЫЙ
const int ledPinB = 13;//СИНИЙ
const int ledPinR = 15;//красный
const int ledPin16 = 16;//GPIO 16 белый провод
const int ledPin5 = 5;//GPIO 5 жёлтый провод
IRrecv irrecv(kRecvPin);
decode_results results;
void setup(void){
// preparing GPIOs
pinMode(D0_pin, OUTPUT);
digitalWrite(D0_pin, LOW);
pinMode(D2_pin, OUTPUT);
digitalWrite(D2_pin, LOW);
pinMode(D1_pin, OUTPUT);
digitalWrite(D1_pin, LOW);
delay(100);
Serial.begin(115200);
//ds18b20
sensor_inhouse.begin();
//////////////////////
pinMode(ledPinG, OUTPUT);
pinMode(ledPinB, OUTPUT);
pinMode(ledPinR, OUTPUT);
pinMode(ledPin16, OUTPUT);
pinMode(ledPin5, OUTPUT);
irrecv.enableIRIn(); // Start the receiver
while (!Serial) // Wait for the serial connection to be establised.
delay(50);
Serial.println();
Serial.print("IRrecvDemo is now running and waiting for IR message on Pin ");
Serial.println(kRecvPin);
/////////////////////
WiFi.begin(ssid, password);
WiFi.config(ip, gateway, subnet);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (a==30){break;}
a=a+1;
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (mdns.begin("esp8266", WiFi.localIP())) {
Serial.println("MDNS responder started");
}
//+++++++++++++++++++++++ START LED-1 ++++++++++++++++++++
server.on("/", [](){
server.send(200, "text/html", webPage());
});
server.on("/socket1On", [](){
digitalWrite(D0_pin, HIGH);
server.send(200, "text/html", webPage());
delay(100);
});
server.on("/socket1Off", [](){
digitalWrite(D0_pin, LOW);
server.send(200, "text/html", webPage());
delay(100);
//+++++++++++++++++++++++ END LED-1 ++++++++++++++++++++
//+++++++++++++++++++++++ START LED-2 ++++++++++++++++++++
});
server.on("/socket2On", [](){
digitalWrite(D2_pin, HIGH);
server.send(200, "text/html", webPage());
delay(100);
});
server.on("/socket2Off", [](){
digitalWrite(D2_pin, LOW);
server.send(200, "text/html", webPage());
delay(100);
// +++++++++++++++++++++++ END LED-2 ++++++++++++++++++++
//+++++++++++++++++++++++ START LED-3 ++++++++++++++++++++
});
server.on("/socket3On", [](){
digitalWrite(D1_pin, HIGH);
server.send(200, "text/html", webPage());
delay(100);
});
server.on("/socket3Off", [](){
digitalWrite(D1_pin, LOW);
server.send(200, "text/html", webPage());
delay(100);
// +++++++++++++++++++++++ END LED-3 ++++++++++++++++++++
});
server.begin();
Serial.println("HTTP server started");
}
void loop(void){
//ds18b20//
sensor_inhouse.requestTemperatures();
Serial.print("Inhouse: ");
Serial.println(sensor_inhouse.getTempCByIndex(0));
float tempC = sensor_inhouse.getTempCByIndex(0);
if (tempC != DEVICE_DISCONNECTED_C)
{
Serial.println("ТЕМПЕРАТУРА 1");
Serial.print(tempC);
}
else Serial.print("DEVICE1 ds18b20 DISCONNECTED");
Serial.print(" ");
if (tempC >= (27+t))
{
Serial.print("T1 !!! ");
digitalWrite(ledPinB, HIGH);
digitalWrite(ledPin16, HIGH);
delay(1000);
digitalWrite(ledPin16, LOW);
delay(1000);
tone(12,25,1000);
}
// else {digitalWrite(ledPinR, LOW);}
if (tempC <= (26+t))
{
Serial.print("T1 !!! ");
digitalWrite(ledPinB, LOW );
}
///////////////////////////
if (irrecv.decode(&results)) {
serialPrintUint64(results.value, HEX);
Serial.println("-");
if (results.value==0x5FA9A65){t=t+1;}//UP telefanken AB
if (results.value==0x1FE20DF) {t=t+1;}//UP
if (results.value==0x5FA8A75) {t=t-1;}//down telefanken AB
if (results.value==0x1FE609F) {t=t-1;}//down
Serial.println(t);
if (results.value==0x1FE40BF){//REC/RED
digitalWrite(ledPinR, HIGH);}
if (results.value==0xFB6A95){//REC/RED
digitalWrite(ledPinR, HIGH);}
if (results.value==0x1FE609F) {//DOWN//жёлтый
digitalWrite(ledPin5,HIGH);}
if (results.value==0xFBF807) {//DOWN//жёлтый
digitalWrite(ledPin5,HIGH);}
if (results.value==0x1FEA05F) {//MENU
digitalWrite(ledPinG,HIGH);}
if (results.value==0xFBEA15) {//MENU
digitalWrite(ledPinG,HIGH);}
if (results.value==0x1FE10EF) {//MODE
digitalWrite(ledPinB,HIGH);}
if (results.value==0xFBDA25) {//MODE
digitalWrite(ledPinB,HIGH);}
if (results.value==0x1FE7887) {//ON/OFF//mute
digitalWrite(ledPinR,LOW);
digitalWrite(ledPinG,LOW);
digitalWrite(ledPinB,LOW);
//digitalWrite(ledPin16,LOW);
digitalWrite(ledPin5,LOW);
}
if (results.value==0xFB10EF) {//ON/OFF//mute
digitalWrite(ledPinR,LOW);
digitalWrite(ledPinG,LOW);
digitalWrite(ledPinB,LOW);
//digitalWrite(ledPin16,LOW);
digitalWrite(ledPin5,LOW);
}
irrecv.resume();
}
a=0;
// Wait for connection
if (WiFi.status() != WL_CONNECTED) {
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (a==2){break;}
a=a+1;
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (mdns.begin("esp8266", WiFi.localIP())) {
Serial.println("MDNS responder started");
}
}
server.handleClient();
}
String webPage()
{
String web;
web += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/> <meta charset=\"utf-8\"><title>ESP 8266</title><style>button{color:red;padding: 10px 27px;}</style></head>";
//web += "<h1 style=\"text-align: center;font-family: Open sans;font-weight: 100;font-size: 20px;\">ESP8266 Web Server</h1><div>";
web += "<h1 style=\"text-align: center;font-family: Open sans;font-weight: 100;font-size: 20px;\">ТЕМПЕРАТУРА - </h1><div>";
web += (sensor_inhouse.getTempCByIndex(0));
web += "<h1 style=\"text-align: center;font-family: Open sans;font-weight: 100;font-size: 20px;\">ТЕМПЕРАТУРА АКТИВАЦИИ - </h1><div>";
web += (30+t);
//++++++++++ LED-1 +++++++++++++
web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">----RED----</p>";
if (digitalRead(D0_pin) == 1)
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">ON</div>";
}
else
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">OFF</div>";
}
web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket1On\"><button>ON</button></a> <a href=\"socket1Off\"><button>OFF</button></a></div>";
// ++++++++ LED-1 +++++++++++++
//++++++++++ LED-2 +++++++++++++
web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">----GREEN----</p>";
if (digitalRead(D2_pin) == 1)
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">ON</div>";
}
else
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">OFF</div>";
}
web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket2On\"><button>ON</button></a> <a href=\"socket2Off\"><button>OFF</button></a></div>";
// ++++++++ LED-2 +++++++++++++
//++++++++++ LED-3 +++++++++++++
web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">---BLUE---</p>";
if (digitalRead(D1_pin) == 1)
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">ON</div>";
}
else
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">OFF</div>";
}
web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket3On\"><button>ON</button></a> <a href=\"socket3Off\"><button>OFF</button></a></div>";
// ++++++++ LED-2 +++++++++++++
// ========REFRESH=============
web += "<div style=\"text-align:center;margin-top: 20px;\"><a href=\"/\"><button style=\"width:158px;\">REFRESH</button></a></div>";
// ========REFRESH=============
web += "</div>";
return(web);
}
surami56
Магистр
СПб
202 71
Отв.1 05 Дек. 19, 08:30
Можно немного поподробнее расписать работу устройства и выложить скетч на файлообменник или Yandex - диск к примеру.
сообщение удалено
IvanAltay
Доцент
Бийск
1.6K 326
Отв.2 08 Дек. 19, 14:12
surami56, да всё будет. Хочу сделать подробное описание девайса, чтоб любой начинающий мог собрать и прошить самостоятельно скетч. Программа в первом посту, довольно навороченная. Там разворачивается локальный сервер и подключается любое андроидное устройство в качестве дисплея/пульта ДУ. Это скриншот с моего телефона, который на связи с термостатом по локальному серверу.
Evgeny_Ch
Бакалавр
Минск
93 22
Отв.3 08 Дек. 19, 14:38, через 26 мин
да всё будет.IvanAltay, 08 Дек. 19, 14:12
Спасибо. Термостат предполагает наличие управляющего выхода для исполнительного устройства. Т. е. будут каие-то модули расширения? По возможности ссылку на ТХ модулей, у китайцев всё уныло.
IvanAltay
Доцент
Бийск
1.6K 326
Отв.4 08 Дек. 19, 14:40, через 3 мин
Сейчас, жду доставки дисплеев для этого термостата. Заказал такие. https://ru.aliexpress.com/....274233edAPzZth Ну и реальный телевизор 1,8" https://ru.aliexpress.com/....274233edAPzZth Термостат, всёж должен иметь свой персональный дисплей. Как показала практика, передача данных на дисплей/управление на андроидном устройстве - хорошо, но не достаточно(не очень удобно). Добавлено через 4мин.:
Термостат предполагает наличие управляющего выхода для исполнительного устройства. Т. е. будут каие-то модули расширения?Evgeny_Ch, 08 Дек. 19, 14:38
Плата ESP8266, на которой будет собрано устройство, уже имеет на борту RGB светодиод/ака линии управления выходными силовыми устройствами. Первый пост ветки, добавил ссыль на наше головное устройство ESP8266. https://ru.aliexpress.com/....274233edI5j59u
Добавлено через 9мин.:
Т. е. будут каие-то модули расширения?Evgeny_Ch, 08 Дек. 19, 14:38
Сделал на таком ESP8266 дома управление светом с ИК пульта, с андроидного смартфона. Управление светодиодной лентой 12В. Схема жуткая получилась, сам в ней путаюсь. Потом перерисую красиво.
Добавлено через 2мин.:
Со смартфона, тоже можно включать/выключать три канала мощной нагрузки.
Добавлено через 30мин.:
Модуль управления светом, сейчас выглядит так. Светодиодной лентой на 12В управляет. Скетч, практически аналогичный выложенному выше. Силовые транзисторы взяты с убитых материнок.
Добавлено через 1ч. 5мин.:
В теории, хочу сделать полнейшее описание с абсолютного нуля, для начала программирования ESP в среде Arduino IDE. Сделаю полнейшее описание установки Arduino IDE под Windows(будем ориентироваться на Windows 7/32-64). Разворачиваем среду программирования Arduino IDE под Windows. Сайт разработчика https://www.arduino.cc/ Переходим на страницу загрузок. https://www.arduino.cc/en/Main/Software Переходим на страницу скачивания/пожертвований прожекту. https://www.arduino.cc/en/Main/Donate Нажимаем на "Просто скачать". Проект открытый/бесплатный, но можно и пожертвовать в будущем 3,5,10$ если сильно понравится. Начинается загрузка инсталятора arduino-1.8.10-windows.exe Запускаем этот файл и начинается установка Arduino IDE. http://tabak.aaa22.ru/viewtopic.php?id=90
argon43
Кандидат наук
ст.Динская
330 62
Отв.5 08 Дек. 19, 19:00
Ссылки на Али не открываются.
IvanAltay
Доцент
Бийск
1.6K 326
Отв.6 08 Дек. 19, 19:08, через 9 мин
argon43, сейчас проверю.
Добавлено через 2мин.:
argon43, все не открываются? Проверил, у меня открываются.
Добавлено через 1мин.:
Может Али глючит, может у твоего провайдера сеть. Переконнектись и попробуй снова зайти.
Добавлено через 2мин.:
Может быть, мне надо перезагрузиться... двигун форума, ещё тех петухов пускает
Добавлено через 22мин.:
Сам модуль ESP8266(ESP-12-E/Witty Cloud) имеет такой внешний вид.
Добавлено через 5мин.:
Т.е. за 150..200 руб, получаем модуль ESP8266 + плата программатора. Оба модуля, имеют гнёзда MicroUSB для раздельного питания по линии 5В. Очень удобный гаджет. Возможно, это лучший модуль из всех ESP8266. Более удобного модуля разработчика, я не встречал(а у меня, десяток разных есть ESP).
Добавлено через 6мин.:
В принципе, к любому порту выходному можно подключить пищалку громкую. Например такую. https://ru.aliexpress.com/....274233edkEi30M Оралка на 5в, при питающем выходном напряжении девайса 3.3В, орёт громко и ток потребляет ниже 20 мА предельных.
Добавлено через 12мин.:
Если собираетесь повторять мой проект, есть смысл закупиться ещё переходными панельками такими. https://ru.aliexpress.com/....274233edykyXKd Стандартный шаг ног у всех ESP - 2.54мм. В конечном итоге, будет основная/материнская плата для этого девайса. Очень удобно перетыкивать туда/сюда с таким коннектом.
Mikrocod
Студент
Челябинск
43 5
Отв.7 11 Дек. 19, 15:49
Что то текст постов сильно смахивает на машинный перевод.... Плагиат ?
IvanAltay
Доцент
Бийск
1.6K 326
Отв.8 11 Дек. 19, 17:04
Mikrocod, значит я думаю, как машинный перевод. Части кода, взяты у разных людей, частично из примеров идущих вместе с библиотеками. Собрано всё в кучу, лично мной. Испытано персонально. Я пока не так круто владею С++(чуть больше года его изучаю).
Добавлено через 8мин.:
Собственно, в разработке находится термостат на (недорогой удобной плате) ESP8266 + DS18B20 + один из вышеупомянутых дисплеев не дорогих. Сейчас, жду доставки дисплеев, с недели на неделю должны приехать. Хочу, сделать полноценный и недорогой термостат, с соответственной точностью DS18B20. Найдите мне готовый прожект такой. Возможно, я изобретаю уже придуманный велосипед? Весь процесс будет происходить на ваших глазах. Надеюсь на помощь разбирающихся в вопросе людей.
Добавлено через 28мин.:
Ещё одна полезная для нас функция/деталь. Звуковая сигнализация/активный электромагнитный зуммер. По простому, пищалка со встроенным генератором. Очень удобно прикручивается к любому порту, без разных дополнительных элементов. Просто надо подать напряжение на такой зуммер, чтоб получить громкий звук(при малом токе потребления). Таки мне приехали, их ещё не проверял. https://ru.aliexpress.com/....274233edoveEuY А такие, уже давно юзаю, на 3.3В ток потребления порядка 10..12 мА. Орут, как потерпевшие и даже токоограничительный резистор не нужен, ляпаем непосредственно на любой выход, хоть в параллель со встроенным светодиодом. И светодиод горит, и пищалка орёт со страшной силой. https://ru.aliexpress.com/....274233edfc387t
Добавлено через 4дн. 2ч. 58мин.:
Про пищалки электромагнитные на 5В, немножко наврал. Ток потребления у них приличный, нужен балластный резистор для них(чтоб к выходу ESP подключать). Зуммер к ESP непосредственно я подключал, скорее всего на 12В такой. https://ru.aliexpress.com/....4ca5220cVuexkd
Добавлено через 11мин.:
Индикаторы/дисплеи, возможно мне и к НГ не приедут. Чтоб тема не останавливалась, сделаю описание своего уже не столь народного термостата, подороже будет устройство. Вернее, уже больше термостата с модулем дальней дуплексной связи на 433мГц + терминал на аналогичном модуле. В основе девайса, два модуля от Heltec ESP32 LoRa. https://ru.aliexpress.com/...rchweb201603_55 Ссыль, уже на вторую версию этого прибора V2. У меня, первая версия.
Добавлено через 34мин.:
Код для двух Heltec ESP32 LoRa, каждый модуль имеет два температурных датчика DS18B20. Модули измеряют/отображают температуру своих датчиков и обмениваются данными друг с другом.
Приехали сегодня дисплеи. Четырёхбитный на 7 сегментов, уже прикрутил к ESP8266. Два порта сожрал индикатор. Порты кончились.
Добавлено через 2дн. 6ч. 10мин.:
Развёл первую плату для ESP8266.
Добавлено через 1дн. 19ч. 16мин.:
Первый прототип градусника готов в железе. Начал программу делать снова, для ESP8266. Теперь, к порту 5 подключено 3шт DS18B20. В этом скетче, RGB светодиод зажигается своим цветом при индикации температуры определённого термодатчика. Скетч.
//#include <Arduino.h> #include <DallasTemperature.h> #include <OneWire.h> #include "TM1637.h" #define CLK 16//GPIO 16 к дисплею #define DIO 14//GPIO 14 к дисплею TM1637 disp(CLK, DIO); #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 5//ПОРТ ПОДКЛЮЧЕНИЯ DS18B20 #define TEMPERATURE_PRECISION 12 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress insideThermometer, outsideThermometer,outsideThermometer1; float TEMP=0; const int G = 12;//ЗЕЛЁНЫЙ светодиод GPIO 12 const int B = 13;//СИНИЙ светодиод GPIO 13 const int R = 15;//красный светодиод GPIO 15 void setup(void) {
pinMode(G, OUTPUT); digitalWrite(G, LOW); pinMode(B, OUTPUT); digitalWrite(B, LOW); pinMode(R, OUTPUT); digitalWrite(R, LOW); //TM1637// Serial.begin(115200); disp.init(); // инициализация дисплея disp.set(2); // яркость дисплея, 0 - 7 (минимум - максимум) disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ. Serial.println("Dallas Temperature IC Control Library Demo"); sensors.begin(); Serial.print("Locating devices..."); Serial.print("Found "); Serial.print(sensors.getDeviceCount(), DEC); Serial.println(" devices."); Serial.print("Parasite power is: "); if (sensors.isParasitePowerMode()) Serial.println("ON"); else Serial.println("OFF"); if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1"); if (!sensors.getAddress(outsideThermometer1, 2)) Serial.println("Unable to find address for Device 2"); Serial.print("Device 0 Address: "); printAddress(insideThermometer); Serial.println(); Serial.print("Device 1 Address: "); printAddress(outsideThermometer); Serial.println(); Serial.print("Device 2 Address: "); printAddress(outsideThermometer1); Serial.println(); // set the resolution to 12 bit per device sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION); sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION); sensors.setResolution(outsideThermometer1, TEMPERATURE_PRECISION); Serial.print("Device 0 Resolution: "); Serial.print(sensors.getResolution(insideThermometer), DEC); Serial.println();
// function to print a device address void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { // zero pad the address if necessary if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } }
// function to print the temperature for a device void printTemperature(DeviceAddress deviceAddress) { float tempC = sensors.getTempC(deviceAddress); Serial.print("Temp C: "); Serial.print(tempC); ///////////////////////// Вывод температуры на дисплей TM1637 disp.displayInt(tempC*100); }
// function to print a device's resolution void printResolution(DeviceAddress deviceAddress) { Serial.print("Resolution: "); Serial.print(sensors.getResolution(deviceAddress)); Serial.println(); }
// main function to print information about a device void printData(DeviceAddress deviceAddress) { Serial.print("Device Address: "); printAddress(deviceAddress); Serial.print(" "); printTemperature(deviceAddress); Serial.println();
}
/* Main function, calls the temperatures in a loop. */ void loop(void) { // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus Serial.print("Requesting temperatures...");
// function to print a device address void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { // zero pad the address if necessary if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } }
// function to print the temperature for a device void printTemperature(DeviceAddress deviceAddress) { float tempC = sensors.getTempC(deviceAddress); Serial.print("Temp C: "); Serial.print(tempC); TEMP=tempC; if (tempC != DEVICE_DISCONNECTED_C)//обработка ошибки термодатчика { Serial.println("ТЕМПЕРАТУРА"); Serial.print(tempC);
// function to print a device's resolution void printResolution(DeviceAddress deviceAddress) { Serial.print("Resolution: "); Serial.print(sensors.getResolution(deviceAddress)); Serial.println(); }
// main function to print information about a device void printData(DeviceAddress deviceAddress) { Serial.print("Device Address: "); printAddress(deviceAddress); Serial.print(" "); printTemperature(deviceAddress); Serial.println();
}
/* Main function, calls the temperatures in a loop. */ void loop(void) { // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus Serial.print("Requesting temperatures...");