Форум самогонщиков Сайт Барахолка Магазин Помощь солдатам

Народный термостат ESP8266+DS18B20 с локальным сервером для Android.

Форум самогонщиков Автоматика
IvanAltay Доцент Бийск 1.6K 324
03 Дек. 19, 23:18
Идея простая. В основе ESP8266 + несколько датчиков ds18b20.
Среда разработки - Arduino IDE 1.8.10. Совершенно простая/бесплатная среда разработки.
Колхозим точный цифровой термостат, на дешманском железе с AliExpress.
Проверенный мной скетч. Тут есть ещё управление с ИК пульта и локальный вебсервер.
ESP8266, брал тут(200 руб с доставкой).
https://ru.aliexpress.com/....274233edI5j59u
Потом брал ещё 5шт таких, получилось сильно дешевле(ссыль найти не могу).
DS18B20 брал тут. Ещё их не проверил, но заказ пришёл нормально.
https://ru.aliexpress.com/....274233edAPzZth
Планирую прикрутить такие индикатор/дисплей к этому термостату.
https://ru.aliexpress.com/...8479893f73a99f4
https://ru.aliexpress.com/...8479893f73a99f4
Одноимённая тема на моём сайте.
http://tabak.aaa22.ru/viewtopic.php?id=75

#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 324
Отв.2  08 Дек. 19, 14:12
surami56, да всё будет. Хочу сделать подробное описание девайса, чтоб любой начинающий мог собрать и прошить самостоятельно скетч. Программа в первом посту, довольно навороченная. Там разворачивается локальный сервер и подключается любое андроидное устройство в качестве дисплея/пульта ДУ. Это скриншот с моего телефона, который на связи с термостатом по локальному серверу.
Народный термостат ESP8266+DS18B20 с локальным сервером для Android
Народный термостат ESP8266+DS18B20 с локальным сервером для Android. Автоматика.
Evgeny_Ch Бакалавр Минск 93 22
Отв.3  08 Дек. 19, 14:38, через 26 мин
да всё будет.IvanAltay, 08 Дек. 19, 14:12
Спасибо.
Термостат предполагает наличие управляющего выхода для исполнительного устройства.
Т. е. будут каие-то модули расширения?
По возможности ссылку на ТХ модулей, у китайцев всё уныло.
IvanAltay Доцент Бийск 1.6K 324
Отв.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В.
Схема жуткая получилась, сам в ней путаюсь. Потом перерисую красиво.
Народный термостат ESP8266+DS18B20 с локальным сервером для Android
Народный термостат ESP8266+DS18B20 с локальным сервером для Android. Автоматика.


Добавлено через 2мин.:

Народный термостат ESP8266+DS18B20 с локальным сервером для Android
Народный термостат ESP8266+DS18B20 с локальным сервером для Android. Автоматика.

Со смартфона, тоже можно включать/выключать три канала мощной нагрузки.

Добавлено через 30мин.:

Модуль управления светом, сейчас выглядит так.
Народный термостат ESP8266+DS18B20 с локальным сервером для Android
Народный термостат ESP8266+DS18B20 с локальным сервером для Android. Автоматика.

Светодиодной лентой на 12В управляет.
Народный термостат ESP8266+DS18B20 с локальным сервером для Android
Народный термостат ESP8266+DS18B20 с локальным сервером для Android. Автоматика.

Скетч, практически аналогичный выложенному выше.
Силовые транзисторы взяты с убитых материнок.

Добавлено через 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 324
Отв.6  08 Дек. 19, 19:08, через 9 мин
argon43, сейчас проверю.

Добавлено через 2мин.:

argon43, все не открываются? Проверил, у меня открываются.

Добавлено через 1мин.:

Может Али глючит, может у твоего провайдера сеть. Переконнектись и попробуй снова зайти.

Добавлено через 2мин.:

Может быть, мне надо перезагрузиться... двигун форума, ещё тех петухов пускает Улыбающийся

Добавлено через 22мин.:

Сам модуль ESP8266(ESP-12-E/Witty Cloud) имеет такой внешний вид.
Народный термостат ESP8266+DS18B20 с локальным сервером для Android
Народный термостат ESP8266+DS18B20 с локальным сервером для Android. Автоматика.

Народный термостат ESP8266+DS18B20 с локальным сервером для Android
Народный термостат ESP8266+DS18B20 с локальным сервером для Android. Автоматика.

Народный термостат ESP8266+DS18B20 с локальным сервером для Android
Народный термостат ESP8266+DS18B20 с локальным сервером для Android. Автоматика.


Добавлено через 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 324
Отв.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. Модули измеряют/отображают температуру своих датчиков и обмениваются данными друг с другом.

#include "heltec.h"
#include "WiFi.h"
#include <DallasTemperature.h>
#include <OneWire.h>
#define ONE_WIRE_BUS_1 0
#define BAND    433E6  //you can set band here directly,e.g. 868E6,915E6
OneWire oneWire_in(ONE_WIRE_BUS_1);
DallasTemperature sensor_inhouse(&oneWire_in);
String in13 = "";
String TEMP = "";
String TEMP1 = "";
String rssi = "RSSI --";
String packSize = "--";
String packet;
unsigned int counter = 0;
bool receiveflag = false; // software flag for LoRa receiver, received data makes it true.
long lastSendTime = 0;        // last send time
int interval = 1000;          // interval between sends
#define RFOPIN false
void WIFISetUp(void)
{
// Set WiFi to station mode and disconnect from an AP if it was previously connected
WiFi.disconnect(true);
delay(100);
WiFi.mode(WIFI_STA);
WiFi.setAutoConnect(true);
WiFi.begin("Your WiFi SSID","Your Password");//fill in "Your WiFi SSID","Your Password"
delay(100);
Heltec.display->clear();
byte count = 0;
while(WiFi.status() != WL_CONNECTED && count < 10)
{
count ++;
delay(500);
Heltec.display->drawString(0, 0, "Connecting...");
Heltec.display->display();
}
//Heltec.display->clear();
if(WiFi.status() == WL_CONNECTED)
{
//Heltec.display->drawString(35, 38, "WIFI SETUP");
Heltec.display->drawString(0, 9, "OK");
Heltec.display->display();
delay(1000);
Heltec.display->clear();
}
else
{
//Heltec.display->clear();
Heltec.display->drawString(0, 9, "Failed");
Heltec.display->display();
delay(1000);
Heltec.display->clear();
}
}
void WIFIScan(unsigned int value)
{
unsigned int i;
if(WiFi.status() != WL_CONNECTED)
{
WiFi.mode(WIFI_MODE_NULL);

for(i=0;i<value;i++)
{
Heltec.display->drawString(0, 0, "Scan start...");
Heltec.display->display();
int n = WiFi.scanNetworks();
Heltec.display->drawString(0, 9, "Scan done");
Heltec.display->display();
delay(500);
Heltec.display->clear();
if (n == 0)
{
Heltec.display->clear();
Heltec.display->drawString(0, 18, "no network found");
Heltec.display->display();
//while(1);
}
else
{
Heltec.display->drawString(0, 18, (String)n + " nets found");
Heltec.display->display();
delay(2000);
Heltec.display->clear();
}
}
}
bool resendflag=false;
bool deepsleepflag=false;
void interrupt_GPIO0()
{
delay(10);
if(digitalRead(0)==0)
{
if(digitalRead(LED)==LOW)
{resendflag=true;}
else
{
deepsleepflag=true;
}   
}
}
void setup()
{
/////////////////ds18b20////////////
Serial.begin(115200);
sensor_inhouse.begin();
/////////////////ds18b20////////////
pinMode(LED,OUTPUT);
Heltec.begin(true /*DisplayEnable Enable*/, true /*LoRa Disable*/, true /*Serial Enable*/, true /*PABOOST Enable*/, BAND /**/);
WIFISetUp();
WIFIScan(1);
attachInterrupt(0,interrupt_GPIO0,FALLING);
LoRa.onReceive(onReceive);
send();
LoRa.receive();
displaySendReceive();
}
void loop()
{
Serial.begin(115200);
Serial.println(ReadVoltage(13),3);
Serial.println(analogRead(13));
in13=ReadVoltage(13)*2;
//ds18b20//
sensor_inhouse.requestTemperatures();
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(" ");
TEMP = tempC;
TEMP1 = tempC;
Heltec.display->init();
Heltec.display->flipScreenVertically();
Heltec.display->setFont(ArialMT_Plain_24);
Heltec.display->drawString(0,0,TEMP);
Heltec.display -> display();
delay(3000);
Heltec.display -> clear();
//ds18b20//
if(deepsleepflag)
{
LoRa.end();
LoRa.sleep();
delay(100);
// pinMode(4,INPUT);
// pinMode(5,INPUT);
//  pinMode(14,INPUT);
// pinMode(15,INPUT);
// pinMode(16,INPUT);
// pinMode(17,INPUT);
// pinMode(18,INPUT);
// pinMode(19,INPUT);
// pinMode(26,INPUT);
// pinMode(27,INPUT);
digitalWrite(Vext,HIGH);
delay(2);
esp_deep_sleep_start();
}
if(resendflag)
{
resendflag=false;
send();     
LoRa.receive();
displaySendReceive();
}
if(receiveflag)
{
digitalWrite(25,HIGH);
displaySendReceive();
delay(1000);
receiveflag = false; 
send();
LoRa.receive();
displaySendReceive();
}
}
void send()
{
LoRa.beginPacket();
LoRa.print("T2=");
LoRa.print(TEMP1);
LoRa.endPacket();
}
void displaySendReceive()
{
// Heltec.display->drawString(0, 0, (String)(counter-1) + " sent done");
// Heltec.display->drawString(0,9, "Received " + packSize);
Heltec.display->setFont(ArialMT_Plain_24);
Heltec.display->drawString(0,20, packet);
Heltec.display->drawString(0,0,"T1=" + TEMP);
Heltec.display->drawString(0,40, rssi);
Heltec.display -> display();
delay(2000);
Heltec.display -> clear();
//Heltec.display->setFont(ArialMT_Plain_24);
//Serial.println(ReadVoltage(13),3);
// Serial.println(analogRead(13));
// in13=ReadVoltage(13)*2;
//Heltec.display->drawString(0, 0, in13 + "V");
// Heltec.display -> display();
// delay(1000);
// Heltec.display -> clear();
}
void onReceive(int packetSize)//LoRa receiver interrupt service
{
//if (packetSize == 0) return;
packet = "";
packSize = String(packetSize,DEC);
while (LoRa.available())
{
packet += (char) LoRa.read();
}
Serial.println(packet);
rssi = "RSSI: " + String(LoRa.packetRssi(), DEC);
receiveflag = true;
}
double ReadVoltage(byte pin){
double reading = analogRead(pin); // Reference voltage is 3v3 so maximum reading is 3v3 = 4095 in range 0 to 4095
if(reading < 1 || reading >= 4095)
return 0;
return -0.000000000009824 * pow(reading,3) + 0.000000016557283 * pow(reading,2) + 0.000854596860691 * reading + 0.065440348345433;
// return -0.000000000000016 * pow(reading,4) + 0.000000000118171 * pow(reading,3)- 0.000000301211691 * pow(reading,2)+ 0.001109019271794 * reading + 0.034143524634089;
}

Добавлено через 1дн. 19ч. 16мин.:

Приехали сегодня дисплеи. Четырёхбитный на 7 сегментов, уже прикрутил к ESP8266. Два порта сожрал индикатор. Порты кончились.
Народный термостат ESP8266+DS18B20 с локальным сервером для Android
Народный термостат ESP8266+DS18B20 с локальным сервером для Android. Автоматика.


Добавлено через 2дн. 6ч. 10мин.:

Развёл первую плату для ESP8266.
Народный термостат ESP8266+DS18B20 с локальным сервером для Android
Народный термостат ESP8266+DS18B20 с локальным сервером для Android. Автоматика.

Народный термостат ESP8266+DS18B20 с локальным сервером для Android
Народный термостат ESP8266+DS18B20 с локальным сервером для Android. Автоматика.

Народный термостат ESP8266+DS18B20 с локальным сервером для Android
Народный термостат ESP8266+DS18B20 с локальным сервером для Android. Автоматика.


Добавлено через 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();

Serial.print("Device 1 Resolution: ");
Serial.print(sensors.getResolution(outsideThermometer), DEC);
Serial.println();
Serial.print("Device 2 Resolution: ");
Serial.print(sensors.getResolution(outsideThermometer1), 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...");

sensors.requestTemperatures();
Serial.println("DONE");

// print the device information
printData(insideThermometer);
digitalWrite(G, HIGH);//включаем зелёный светодиод
delay(3000);
digitalWrite(G, LOW);//выключаем зелёный светодиод
printData(outsideThermometer);
digitalWrite(B, HIGH);//включаем синий светодиод
delay(2000);
digitalWrite(B, LOW);//выключаем синий светодиод
printData(outsideThermometer1);
digitalWrite(R, HIGH);//включаем красный светодиод
delay(2000);
digitalWrite(R, LOW);//выключаем красный светодиод
}

Народный термостат ESP8266+DS18B20 с локальным сервером для Android
Народный термостат ESP8266+DS18B20 с локальным сервером для Android. Автоматика.


Добавлено через 14дн. 23ч. 39мин.:

#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;
#define MY_BUTTON 4
float TEMP=0;
const int G = 12;//ЗЕЛЁНЫЙ светодиод GPIO 12
const int B = 13;//СИНИЙ светодиод GPIO 13
const int R = 15;//красный светодиод GPIO 15
int t1srab = 30;
int t2srab = 80;
int t3srab = 30;
void setup(void)
{

pinMode( MY_BUTTON, INPUT_PULLUP);
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(3);  // яркость дисплея, 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();

Serial.print("Device 1 Resolution: ");
Serial.print(sensors.getResolution(outsideThermometer), DEC);
Serial.println();
Serial.print("Device 2 Resolution: ");
Serial.print(sensors.getResolution(outsideThermometer1), 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);
TEMP=tempC;
if (tempC != DEVICE_DISCONNECTED_C)//обработка ошибки термодатчика
{
Serial.println("ТЕМПЕРАТУРА");
Serial.print(tempC);

}
else
{
Serial.println("ОШИБКА!!!");
disp.point(0);//ВЫКЛЮЧИТЬ ДВОЕТОЧИЕ.
disp.displayByte(_dash, _dash, _dash, _dash); //индикация ошибки термодатчика
delay(3000);
}
///////////////////////// Вывод температуры на дисплей TM1637
disp.displayByte(_0, _0, _0, _0);
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...");

sensors.requestTemperatures();
Serial.println("DONE");

// print the device information
//////////////////T1/////////////////////
disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
disp.displayByte(_t, _1, _0, _0);
disp.displayInt(t1srab);//индикация температуры срабатывания термодатчика t1
for (int i=0; i <= 100; i++){
if(LOW == digitalRead(MY_BUTTON))
{
disp.displayByte(_0, _0, _0, _0);
disp.displayInt(t1srab);
for (int i=0; i <= 100; i++){
if(LOW == digitalRead(MY_BUTTON))
{
t1srab=t1srab+1;
if (t1srab>(105)) {
t1srab=0;}
disp.displayByte(_0, _0, _0, _0);
disp.displayInt(t1srab);
delay(200);
}
}
}
delay(50);   
}
disp.displayByte(_0, _0, _0, _0);
disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
printData(insideThermometer);
if (TEMP >= (t1srab))//функция термостата
digitalWrite(G, HIGH);//включаем зелёный светодиод
else
digitalWrite(G, LOW);//выключаем зелёный светодиод
delay(2000);
/////////////T1 END///////////
/////////////T2///////////
disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
disp.displayByte(_t, _2, _0, _0);
disp.displayInt(t2srab);
for (int i=0; i <= 100; i++){
if(LOW == digitalRead(MY_BUTTON))
{
disp.displayByte(_0, _0, _0, _0);
disp.displayInt(t2srab);
for (int i=0; i <= 100; i++){
if(LOW == digitalRead(MY_BUTTON))
{
t2srab=t2srab+1;
if (t2srab>(105)) {
t2srab=0;}
disp.displayByte(_0, _0, _0, _0);
disp.displayInt(t2srab);
delay(200);
}
}
}
delay(50);   
}
disp.displayByte(_0, _0, _0, _0);
disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
printData(outsideThermometer);
if (TEMP >= (t2srab))//функция термостата
digitalWrite(B, HIGH);//включаем СИНИЙ светодиод
else
digitalWrite(B, LOW);//выключаем СИНИЙ светодиод
delay(2000);
/////////////T2 END///////////
/////////////T3 ///////////
disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
disp.displayByte(_t, _3, _0, _0);
disp.displayInt(t3srab);
for (int i=0; i <= 100; i++){
if(LOW == digitalRead(MY_BUTTON))
{
disp.displayByte(_0, _0, _0, _0);
disp.displayInt(t3srab);
for (int i=0; i <= 100; i++){
if(LOW == digitalRead(MY_BUTTON))
{
t3srab=t3srab+1;
if (t3srab>(105)) {
t3srab=0;}
disp.displayByte(_0, _0, _0, _0);
disp.displayInt(t3srab);
delay(200);
}
}
}
delay(50);   
}
disp.displayByte(_0, _0, _0, _0);
disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
printData(outsideThermometer1);
if (TEMP >= (t3srab))//функция термостата
{ tone(R,10,4000);//моргаем красным светодиодом при привышении температуры датчика
}
else
digitalWrite(R, LOW);//выключаем СИНИЙ светодиод
delay(2000);
/////////////T3 END///////////
}

Добавлено через 2мин.:

Новый скетч, температура срабатывания каждого канала изменяется нажатием встроенной кнопки.

Добавлено через 11дн. 1ч. 46мин.:

Вариация термостата на Arduino UNO R3+128x160TFT дисплей ST7735+светодиодный дисплей TM1637.
Народный термостат ESP8266+DS18B20 с локальным сервером для Android
Народный термостат ESP8266+DS18B20 с локальным сервером для Android. Автоматика.

http://tabak.aaa22.ru/viewtopic.php?id=94