#1 28-09-2019 00:25:11

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Автоматика/термостат на базе ESP8266/DS18B20.

Термостат с локальным сервером и градусником DS18B20. Девайс имеет управление с ИК пульта и отображение данных по локальной сети.

15696054106156463782633898280647.jpg

15696054447848748475651427261899.jpg

15696055108257807240472180110304.jpg

15696055708492108330324506364838.jpg

Не в сети

#2 28-09-2019 00:38:42

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Screenshot-2019-09-28-00-37-02-713-com-android-chrome.png
На телефоне, у меня так выглядит локальный вебсервер. Телефон работает как точка доступа WiFi. Esp8266(подключён к телефону, как к точке доступа WiFi) присылает данные с градусника.

Изменено IvanAltay (28-09-2019 00:49:01)

Не в сети

#3 28-09-2019 01:27:58

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

#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>&nbsp;<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>&nbsp;<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>&nbsp;<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);
}

Не в сети

#4 28-09-2019 01:51:17

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Коды любого пульта ИК, идут в серийный порт на скорости 115200. В сериал порт считываем коды любого пульта ИК и подставляем в скетч.

Не в сети

#5 08-12-2019 22:21:31

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

15758183874965306023366855551192.jpg

15758185073896441506796666447039.jpg

15758186079276223663997806943667.jpg

Не в сети

#6 09-12-2019 00:13:40

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Распиновка чипа.

ESP12-E-Pinout.png


esp8266-esp12e-horizontal-01.png

Не в сети

#7 17-12-2019 16:23:53

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Подключил четырёхзначный семисегментный индикатор TM1637. ИК приёмник, пришлось отключить, потому как индикатору нужно два порта.


#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>
#include "TM1637.h"
#define CLK 16//GPIO 16 к дисплею
#define DIO 14//GPIO 14 к дисплею
TM1637 disp(CLK, DIO);
byte i = 0;
#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;
int TE=0;
float TE1=0;
String TEMP1 = "12345";
const uint16_t kRecvPin = A0;//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){
  //TM1637//
  Serial.begin(115200);
  disp.init();  // инициализация дисплея
  disp.set(1);  // яркость дисплея, 0 - 7 (минимум - максимум)
  // 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);
 
  //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);
    ///////////////////////// Вывод температуры на дисплей TM1637
    disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
    disp.displayInt(tempC*100);
   delay(300);
  }
  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>&nbsp;<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>&nbsp;<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>&nbsp;<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);
}

Не в сети

#8 17-12-2019 16:27:39

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

15765747904352933057232747933337.jpg

Не в сети

#9 17-12-2019 16:29:00

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

У индикатора нет десятичных точек, поэтому пришлось включить двоеточие в качестве запятой/разделителя десятичного.
15765748790469207058478441080931.jpg

Не в сети

#10 17-12-2019 16:39:24

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Ссылки на описание работы дисплея TM1637.
https://duino.ru/Segmentnyi-indikator.h … ns-tm1637/
https://www.youtube.com/watch?v=4D29T8PmsWQ

Не в сети

#11 20-12-2019 02:30:59

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

1576783766920160360363814473271.jpg

15767838165188216255491868721289.jpg
NAROD-TERMOSTAT-esp8266-1-0.jpg
Развёл первую плату.

Не в сети

#12 21-12-2019 13:57:30

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Собрал сегодня на плате термостат.

15769113155571636547978796539145.jpg

15769113963237090306354422280843.jpg

Не в сети

#13 21-12-2019 21:46:33

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Начал программу делать снова, для 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);//выключаем красный светодиод
}

15769395461732840816074430116107.jpg

1576939631221260821201196901309.jpg

15769397554917404469596569790698.jpg

Не в сети

#14 21-12-2019 23:52:24

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Добавлена индикация номера термодатчика.

#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(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);
///////////////////////// Вывод температуры на дисплей 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
  disp.point(0);//ВЫЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _1); 
 digitalWrite(G, HIGH);//включаем зелёный светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(insideThermometer);
  
  delay(3000);
  digitalWrite(G, LOW);//выключаем зелёный светодиод
  disp.point(0);//ВЫЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _2); 
  digitalWrite(B, HIGH);//включаем синий светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(outsideThermometer);
 
  delay(2000);
  digitalWrite(B, LOW);//выключаем синий светодиод
  disp.point(0);//ВЫЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _3); 
 digitalWrite(R, HIGH);//включаем красный светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(outsideThermometer1);
  
  delay(2000);
  digitalWrite(R, LOW);//выключаем красный светодиод
}

Не в сети

#15 22-12-2019 00:26:16

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Добавил обработку ошибки/индикацию ошибки термодатчика.

#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(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);
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.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
  disp.point(0);//ВЫЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _1); 
 digitalWrite(G, HIGH);//включаем зелёный светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(insideThermometer);
  
  delay(3000);
  digitalWrite(G, LOW);//выключаем зелёный светодиод
  disp.point(0);//ВЫЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _2); 
  digitalWrite(B, HIGH);//включаем синий светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(outsideThermometer);
 
  delay(2000);
  digitalWrite(B, LOW);//выключаем синий светодиод
  disp.point(0);//ВЫЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _3); 
 digitalWrite(R, HIGH);//включаем красный светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(outsideThermometer1);
  
  delay(2000);
  digitalWrite(R, LOW);//выключаем красный светодиод
}

Не в сети

#16 22-12-2019 02:40:31

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Добавил функцию термостата на канал t1/зелёный. При привышении температуры 30 градусов(на канале t1), зелёный зелёный светодиод начинает моргать.

#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(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.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
  disp.point(0);//ВЫКЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _1); 
 digitalWrite(G, HIGH);//включаем зелёный светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(insideThermometer);
  if (TEMP >= (30))//функция термостата 30 градусов t1
  {
    Serial.print("!!! ");
    tone(G,10,4000);//моргаем зелёным светодиод при привышении температуры датчика t1 30 градусов
    }
  delay(3000);
  digitalWrite(G, LOW);//выключаем зелёный светодиод
  disp.point(0);//ВЫКЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _2); 
  digitalWrite(B, HIGH);//включаем синий светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(outsideThermometer);
 
  delay(2000);
  digitalWrite(B, LOW);//выключаем синий светодиод
  disp.point(0);//ВЫКЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _3); 
 digitalWrite(R, HIGH);//включаем красный светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(outsideThermometer1);
  
  delay(2000);
  digitalWrite(R, LOW);//выключаем красный светодиод
}

Не в сети

#17 22-12-2019 02:56:34

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Плата. Размеры рисунка 100мм/30мм. Рисунок нужно уменьшить до таких размеров и печатать в таком виде, зеркалка печати не нужна.

1-0.gif

1-0.jpg

Не в сети

#18 24-12-2019 21:02:31

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Исправлено отображение нуля при t<10 градусов. В таком виде, скетч не отображает температуру ниже нуля градусов Цельсия. Всё что ниже нуля, будет отображаться как 00:00. В серийный порт идёт правильное значение отрицательной температуры. Особенности отображения информации дисплеем.

#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(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
  disp.point(0);//ВЫКЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _1); 
 digitalWrite(G, HIGH);//включаем зелёный светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(insideThermometer);
  if (TEMP >= (30))//функция термостата 30 градусов t1
  {
    Serial.print("!!! ");
    tone(G,10,4000);//моргаем зелёным светодиод при привышении температуры датчика t1 30 градусов
    }
  delay(3000);
  digitalWrite(G, LOW);//выключаем зелёный светодиод
  disp.point(0);//ВЫКЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _2); 
  digitalWrite(B, HIGH);//включаем синий светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(outsideThermometer);
 
  delay(2000);
  digitalWrite(B, LOW);//выключаем синий светодиод
  disp.point(0);//ВЫКЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _3); 
 digitalWrite(R, HIGH);//включаем красный светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(outsideThermometer1);
  
  delay(2000);
  digitalWrite(R, LOW);//выключаем красный светодиод
}

Не в сети

#19 25-12-2019 02:26:42

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Смеха ради, встроил в градусник WiFi часы. Сам удивился, что получилось. Время, для часового пояса Алтайского края кажут часы. Московобадское + 4 часа. "MSK-7MSD,M3.5.0/2,M10.5.0/3"
Московское будет "MSK-3MSD,M3.5.0/2,M10.5.0/3"
Время берётся с сайта точного времени(естественно надо в скетче вставить SSID/ПАРОЛЬ своей сети, чтоб ESP получил эталонное время). Дальше, даже без сети, ESP8266 будет считать время сам, как может. ESP32  , за неделю без сети, убежал на несколько секунд всего. Посмотрим, как ESP8266 сможет считать время самостоятельно.
Извините, за сырость скетча. Там реально, много лишних комментов. Потом почищу/доработаю код.

Не в сети

#20 25-12-2019 02:28:13

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

#ifdef ESP8266
#include <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <time.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
#ifdef CREDENTIALS
const char* ssid = mySSID;
const char* password = myPASSWORD;
#else
const char* ssid = "tele2";
const char* password = "ta20242024";
#endif

const char* NTP_SERVER = "ch.pool.ntp.org";
const char* TZ_INFO    = "MSK-7MSD,M3.5.0/2,M10.5.0/3";  //"MSK-7MSD,M3.5.0/2,M10.5.0/3"-ЧАСОВОЙ ПОЯС АЛТАЙСКОГО КРАЯ
//const char* TZ_INFO    = "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00";  // enter your time zone (https://remotemonitoringsystems.ca/time-zone-abbreviations.php)

tm timeinfo;
time_t now;
long unsigned lastNTPtime;
unsigned long lastEntryTime;
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);
  ////////time
  
  Serial.println("\n\nNTP Time Test\n");
  WiFi.begin(ssid, password);

  int counter = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    if (++counter > 100) ESP.restart();
    Serial.print ( "." );
  }
  Serial.println("\n\nWiFi connected\n\n");

  configTime(0, 0, NTP_SERVER);
  // See https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv for Timezone codes for your region
  setenv("TZ", TZ_INFO, 1);

  if (getNTPtime(10)) {  // wait up to 10sec to sync
  } else {
    Serial.println("Time not set");
    ESP.restart();
  }
  showTime(timeinfo);
  lastNTPtime = time(&now);
  lastEntryTime = millis();
  ////////time END
  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);
//TEMP=localTime.tm_min;
//disp.displayInt(localTime.tm_mday);
}

// 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)
{
  /////////time
  getNTPtime(10);
  showTime(timeinfo);
  delay(1000);
  /////////time end

  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  
  sensors.requestTemperatures();
  Serial.println("DONE");
//displayClock(1,2);
 //printData(TEMP);
  // print the device information
  disp.point(0);//ВЫКЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _1); 
 digitalWrite(G, HIGH);//включаем зелёный светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(insideThermometer);
  if (TEMP >= (30))//функция термостата 30 градусов t1
  {
    Serial.print("!!! ");
    tone(G,10,4000);//моргаем зелёным светодиод при привышении температуры датчика t1 30 градусов
    }
  delay(3000);
  digitalWrite(G, LOW);//выключаем зелёный светодиод
  disp.point(0);//ВЫКЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _2); 
  digitalWrite(B, HIGH);//включаем синий светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(outsideThermometer);
 
  delay(2000);
  digitalWrite(B, LOW);//выключаем синий светодиод
  disp.point(0);//ВЫКЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _3); 
 digitalWrite(R, HIGH);//включаем красный светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(outsideThermometer1);
  
  delay(2000);
  digitalWrite(R, LOW);//выключаем красный светодиод
}
bool getNTPtime(int sec) {

  {
    uint32_t start = millis();
    do {
      time(&now);
      localtime_r(&now, &timeinfo);
      Serial.print(".");
      delay(10);
    } while (((millis() - start) <= (1000 * sec)) && (timeinfo.tm_year < (2016 - 1900)));
    if (timeinfo.tm_year <= (2016 - 1900)) return false;  // the NTP call was not successful
    Serial.print("now ");  Serial.println(now);
    char time_output[30];
    strftime(time_output, 30, "%a  %d-%m-%y %T", localtime(&now));
    Serial.println(time_output);
    Serial.println();
  }
  return true;
}


// This function is obsolete because the time() function only calls the NTP server every hour. So you can always use getNTPtime()
// It can be deleted and only stays here for the video

/*
  void getTimeReducedTraffic(int sec) {
  tm *ptm;
  if ((millis() - lastEntryTime) < (1000 * sec)) {
    now = lastNTPtime + (int)(millis() - lastEntryTime) / 1000;
  } else {
    lastEntryTime = millis();
    lastNTPtime = time(&now);
    now = lastNTPtime;
    Serial.println("Get NTP time");
  }
  ptm = localtime(&now);
  timeinfo = *ptm;
  }
*/

void showTime(tm localTime) {
  Serial.print(localTime.tm_mday);
  Serial.print('/');
  Serial.print(localTime.tm_mon + 1);
  Serial.print('/');
  Serial.print(localTime.tm_year - 100);
  Serial.print('-');
  Serial.print(localTime.tm_hour);
  Serial.print(':');
  Serial.print(localTime.tm_min);
  Serial.print(':');
  Serial.print(localTime.tm_sec);
  Serial.print(" Day of Week ");
 disp.displayInt(localTime.tm_hour*100);
 disp.displayInt(localTime.tm_min);
  delay(5000);
  if (localTime.tm_wday == 0)   Serial.println(7);
  else Serial.println(localTime.tm_wday);
}


/*
 // Shorter way of displaying the time
  void showTime(tm localTime) {
  Serial.printf(
    "%04d-%02d-%02d %02d:%02d:%02d, day %d, %s time\n",
    localTime.tm_year + 1900,
    localTime.tm_mon + 1,
    localTime.tm_mday,
    localTime.tm_hour,
    localTime.tm_min,
    localTime.tm_sec,
    (localTime.tm_wday > 0 ? localTime.tm_wday : 7 ),
    (localTime.tm_isdst == 1 ? "summer" : "standard")
  );
  }

*/

Не в сети

#21 25-12-2019 03:01:47

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Поправил индикацию 0 в часах.

#ifdef ESP8266
#include <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <time.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
#ifdef CREDENTIALS
const char* ssid = mySSID;
const char* password = myPASSWORD;
#else
const char* ssid = "tele2";
const char* password = "ta20242024";
#endif

const char* NTP_SERVER = "ch.pool.ntp.org";
const char* TZ_INFO    = "MSK-7MSD,M3.5.0/2,M10.5.0/3";  //"MSK-7MSD,M3.5.0/2,M10.5.0/3"-ЧАСОВОЙ ПОЯС АЛТАЙСКОГО КРАЯ
//const char* TZ_INFO    = "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00";  // enter your time zone (https://remotemonitoringsystems.ca/time-zone-abbreviations.php)

tm timeinfo;
time_t now;
long unsigned lastNTPtime;
unsigned long lastEntryTime;
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);
  ////////time
  
  Serial.println("\n\nNTP Time Test\n");
  WiFi.begin(ssid, password);

  int counter = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    if (++counter > 100) ESP.restart();
    Serial.print ( "." );
  }
  Serial.println("\n\nWiFi connected\n\n");

  configTime(0, 0, NTP_SERVER);
  // See https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv for Timezone codes for your region
  setenv("TZ", TZ_INFO, 1);

  if (getNTPtime(10)) {  // wait up to 10sec to sync
  } else {
    Serial.println("Time not set");
    ESP.restart();
  }
  showTime(timeinfo);
  lastNTPtime = time(&now);
  lastEntryTime = millis();
  ////////time END
  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);
//TEMP=localTime.tm_min;
//disp.displayInt(localTime.tm_mday);
}

// 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)
{
  /////////time
  getNTPtime(10);
  showTime(timeinfo);
  delay(1000);
  /////////time end

  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  
  sensors.requestTemperatures();
  Serial.println("DONE");
//displayClock(1,2);
 //printData(TEMP);
  // print the device information
  disp.point(0);//ВЫКЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _1); 
 digitalWrite(G, HIGH);//включаем зелёный светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(insideThermometer);
  if (TEMP >= (30))//функция термостата 30 градусов t1
  {
    Serial.print("!!! ");
    tone(G,10,4000);//моргаем зелёным светодиод при привышении температуры датчика t1 30 градусов
    }
  delay(3000);
  digitalWrite(G, LOW);//выключаем зелёный светодиод
  disp.point(0);//ВЫКЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _2); 
  digitalWrite(B, HIGH);//включаем синий светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(outsideThermometer);
 
  delay(2000);
  digitalWrite(B, LOW);//выключаем синий светодиод
  disp.point(0);//ВЫКЛЮЧИТЬ ДВОЕТОЧИЕ.
  disp.displayByte(_t, _dash, _dash, _3); 
 digitalWrite(R, HIGH);//включаем красный светодиод
 delay(2000);
  disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
  printData(outsideThermometer1);
  
  delay(2000);
  digitalWrite(R, LOW);//выключаем красный светодиод
}
bool getNTPtime(int sec) {

  {
    uint32_t start = millis();
    do {
      time(&now);
      localtime_r(&now, &timeinfo);
      Serial.print(".");
      delay(10);
    } while (((millis() - start) <= (1000 * sec)) && (timeinfo.tm_year < (2016 - 1900)));
    if (timeinfo.tm_year <= (2016 - 1900)) return false;  // the NTP call was not successful
    Serial.print("now ");  Serial.println(now);
    char time_output[30];
    strftime(time_output, 30, "%a  %d-%m-%y %T", localtime(&now));
    Serial.println(time_output);
    Serial.println();
  }
  return true;
}


// This function is obsolete because the time() function only calls the NTP server every hour. So you can always use getNTPtime()
// It can be deleted and only stays here for the video

/*
  void getTimeReducedTraffic(int sec) {
  tm *ptm;
  if ((millis() - lastEntryTime) < (1000 * sec)) {
    now = lastNTPtime + (int)(millis() - lastEntryTime) / 1000;
  } else {
    lastEntryTime = millis();
    lastNTPtime = time(&now);
    now = lastNTPtime;
    Serial.println("Get NTP time");
  }
  ptm = localtime(&now);
  timeinfo = *ptm;
  }
*/

void showTime(tm localTime) {
  Serial.print(localTime.tm_mday);
  Serial.print('/');
  Serial.print(localTime.tm_mon + 1);
  Serial.print('/');
  Serial.print(localTime.tm_year - 100);
  Serial.print('-');
  Serial.print(localTime.tm_hour);
  Serial.print(':');
  Serial.print(localTime.tm_min);
  Serial.print(':');
  Serial.print(localTime.tm_sec);
  Serial.print(" Day of Week ");
 disp.displayByte(_0, _0, _0, _0);
 disp.displayInt(localTime.tm_hour*100);
 disp.displayInt(localTime.tm_min);
  delay(5000);
  if (localTime.tm_wday == 0)   Serial.println(7);
  else Serial.println(localTime.tm_wday);
}


/*
 // Shorter way of displaying the time
  void showTime(tm localTime) {
  Serial.printf(
    "%04d-%02d-%02d %02d:%02d:%02d, day %d, %s time\n",
    localTime.tm_year + 1900,
    localTime.tm_mon + 1,
    localTime.tm_mday,
    localTime.tm_hour,
    localTime.tm_min,
    localTime.tm_sec,
    (localTime.tm_wday > 0 ? localTime.tm_wday : 7 ),
    (localTime.tm_isdst == 1 ? "summer" : "standard")
  );
  }

*/

Не в сети

#22 27-12-2019 00:06:35

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Удивительно, но на ESP8266, тоже довольно точно идут часы(в автономном режиме, без коррекции с сервера точного времени). На несколько секунд убегают в сутки, но погрешность плавает в +/-. На ESP32, уже две недели шлёпают часы автономно, как был разбег 3..5 секунд, так и остался.

Не в сети

#23 31-12-2019 01:46:46

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Сегодня, эксплуатирую термостат в качестве градусника куба и градусника воды охлаждения. Добавил функцию звуковой сигнализации, при превышении температуры воды охлаждения. Дальше, добавлю силовые ключи+реле.

Не в сети

#24 05-01-2020 21:33:59

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Новая программа для трёхканального термостата. Прошить в железо пока не могу, проблемы у меня с кабелями дома. Компилируется без ошибок.

#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///////////
}

Не в сети

#25 05-01-2020 21:42:27

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Теперь, задействовал встроенную кнопку на плате(порт 4). При помощи кнопки, температура срабатывания увеличивается на 1 градус при каждом нажатии/зажатии кнопки. Теперь, транслируется номер термостата и температура его сработки. Далее, транслируется реальная температура с этого канала. Изображение "t1:30" означает, что температура срабатывания по каналу 1 равна 30 градусам. Если во время трансляции "t1:30" нажать встроенную кнопку, то температура сработки термостата увеличится на 1 градус. Аналогично и для других каналов. При сработке термостата одного из каналов, зажигается соотвествующий светодиод.

Не в сети

#26 06-01-2020 01:38:13

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Прошивку последнюю проверил, работает нормально.

Не в сети

#27 07-01-2020 15:05:10

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

ESP8266-Witty-Cloud-Pinout.jpg

Не в сети

#28 17-03-2020 23:52:37

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Надоело мне ежедневно включать/выключать подсветку рассады(в одно и то же время). На базе этого термостата, развёл универсальную плату для wifi часов/реле временного +/или термостат. Не знаю, на сколько можно будет совместить функцию часов/термостата программно, но вроде скетч из поста 21 и точное время кажет из сети или автономно(может довольно точно отсчитывать время месяцами и без сети, после первой синхронизации с сайтом точного времени)  и температуру с трёх ds18b20 показывает. С ESP32, были постоянно проблемы(если WIFI работает, то порты/прерывания глючат, возможно я не те порты использовал). Поставил три силовых ключа(транзисторы D882 NPN) на выходы RGB и 2 шт реле. Реле управляют уже эти транзисторы.
P/S. Сегодня посылка с Али приехала. Вроде, китайские радости, снова стали доступны.

Не в сети

#29 17-03-2020 23:56:53

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

1584464143658453233956040044441.jpg

15844641879574484972758937669298.jpg

Не в сети

#30 18-03-2020 00:10:59

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

time-relay.jpg

Не в сети

#31 26-03-2020 21:30:19

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Собрал в железе свой термостат/таймер/часы реального времени. Времени было 28 минут десятого.

15852328851682890173023419167267.jpg

15852329543718947730139367357102.jpg

15852333270891299014965659577609.jpg

Не в сети

#32 08-04-2020 07:39:21

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Скетч термостата для теплицы. Канал t1 включает вентилятор проветривания теплицы/открывает люк, при превышении температуры 35 градусов (по умолчанию).
Канал t2 включает вентилятор обогрева, при понижении температуры ниже 18 градусов (по умолчанию). Скетч для платы из поста #31.
Используется только один ds18b20 на плате. Можно подключить все три датчика, они в автоматическом порядке разберутся по каналам.

//ТЕРМОСТАТ ДЛЯ ТЕПЛИЦЫ 08.04.2020
#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 = 35;//начальная температура срабатывания термостата t1, G = 12;//ЗЕЛЁНЫЙ светодиод GPIO 12
int t2srab = 18;//начальная температура срабатывания термостата t2, B = 13;//СИНИЙ светодиод GPIO 13
int t3srab = 40;//начальная температура срабатывания термостата t3, R = 15;//красный светодиод GPIO 15
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(1000);
  /////////////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, LOW);//выключаем СИНИЙ светодиод
  else
  digitalWrite(B, HIGH);//включаем СИНИЙ светодиод
delay(1000); 
  /////////////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(1000);
  /////////////T3 END///////////
}

Не в сети

#33 08-04-2020 07:44:12

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

15863065404047262898012395582458.jpg

15863066052952941513997108592633.jpg

Не в сети

#34 08-04-2020 08:01:13

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

plata1.jpg

Не в сети

#35 08-04-2020 08:08:34

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Плата имеет размер 135 мм/38 мм(размер распечатываемого рисунка). Зеркалить не нужно, нужно печать в таком виде.
plata2-135mm-38mm.jpg

Не в сети

#36 08-04-2020 14:42:02

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Автоматика/термостат на базе ESP8266/DS18B20.

Скетч термостата с WiFi часами. Если вайфая нет или точное время с сервера не получено, время не отображается.

//ТЕРМОСТАТ + WIFI ЧАСЫ ДЛЯ ТЕПЛИЦЫ 08.04.2020
#include <ESP8266WiFi.h>
#include <time.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;
#define MY_BUTTON 4
const char* ssid = "tele2";
const char* password = "ta20242024";
const char* NTP_SERVER = "ch.pool.ntp.org";
const char* TZ_INFO    = "MSK-6MSD,M3.5.0/2,M10.5.0/3";  //"MSK-7MSD,M3.5.0/2,M10.5.0/3"-ЧАСОВОЙ ПОЯС АЛТАЙСКОГО КРАЯ
//const char* TZ_INFO    = "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00";  // enter your time zone (https://remotemonitoringsystems.ca/time-zone-abbreviations.php)
tm timeinfo;
time_t now;
long unsigned lastNTPtime;
unsigned long lastEntryTime;
float TEMP=0;
float timeNOset=0;
const int G = 12;//ЗЕЛЁНЫЙ светодиод GPIO 12
const int B = 13;//СИНИЙ светодиод GPIO 13
const int R = 15;//красный светодиод GPIO 15
int t1srab = 35;//начальная температура срабатывания термостата t1, G = 12;//ЗЕЛЁНЫЙ светодиод GPIO 12
int t2srab = 18;//начальная температура срабатывания термостата t2, B = 13;//СИНИЙ светодиод GPIO 13
int t3srab = 40;//начальная температура срабатывания термостата t3, R = 15;//красный светодиод GPIO 15

void setup(void)
{
  Serial.begin(115200);
  //TM1637//
  
  disp.init();  // инициализация дисплея
  disp.set(3);  // яркость дисплея, 0 - 7 (минимум - максимум)
   disp.point(1);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ.
   
  WiFi.begin(ssid, password);

  int counter = 0;
  
  while (WiFi.status() != WL_CONNECTED and ++counter < 51) {
    delay(200);
    disp.displayInt(counter);
    Serial.print ( "." );
  }
  Serial.println("\n\nWiFi connected\n\n");

  configTime(0, 0, NTP_SERVER);
  // See https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv for Timezone codes for your region
  setenv("TZ", TZ_INFO, 1);

 if (getNTPtime(10)) {  // wait up to 10sec to sync
  } else {
    Serial.println("Time not set");
   timeNOset=1;
   // ESP.restart();
  }
  //showTime(timeinfo);
 if (timeNOset==0) showTime(timeinfo);
 lastNTPtime = time(&now);
  lastEntryTime = millis();
  ////////time END
  pinMode( MY_BUTTON, INPUT_PULLUP);
  pinMode(G, OUTPUT);
  digitalWrite(G, LOW);
  pinMode(B, OUTPUT);
  digitalWrite(B, LOW);
  pinMode(R, OUTPUT);
  digitalWrite(R, LOW);
  
  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)
{
/////////time
 if (timeNOset==0) {
 showTime(timeinfo);
  getNTPtime(10);}
  /////////time end
 // 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(1000);
  /////////////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, LOW);//выключаем СИНИЙ светодиод
  else
  digitalWrite(B, HIGH);//включаем СИНИЙ светодиод
delay(1000); 
  /////////////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(1000);
  /////////////T3 END///////////
}

bool getNTPtime(int sec) {

  {
    uint32_t start = millis();
    do {
      time(&now);
      localtime_r(&now, &timeinfo);
      Serial.print(".");
      delay(10);
    } while (((millis() - start) <= (1000 * sec)) && (timeinfo.tm_year < (2016 - 1900)));
    if (timeinfo.tm_year <= (2016 - 1900)) return false;  // the NTP call was not successful
    Serial.print("now ");  Serial.println(now);
    char time_output[30];
    strftime(time_output, 30, "%a  %d-%m-%y %T", localtime(&now));
    Serial.println(time_output);
    Serial.println();
  }
  return true;
}


// This function is obsolete because the time() function only calls the NTP server every hour. So you can always use getNTPtime()
// It can be deleted and only stays here for the video

/*
  void getTimeReducedTraffic(int sec) {
  tm *ptm;
  if ((millis() - lastEntryTime) < (1000 * sec)) {
    now = lastNTPtime + (int)(millis() - lastEntryTime) / 1000;
  } else {
    lastEntryTime = millis();
    lastNTPtime = time(&now);
    now = lastNTPtime;
    Serial.println("Get NTP time");
  }
  ptm = localtime(&now);
  timeinfo = *ptm;
  }
*/

void showTime(tm localTime) {
  Serial.print(localTime.tm_mday);
  Serial.print('/');
  Serial.print(localTime.tm_mon + 1);
  Serial.print('/');
  Serial.print(localTime.tm_year - 100);
  Serial.print('-');
  Serial.print(localTime.tm_hour);
  Serial.print(':');
  Serial.print(localTime.tm_min);
  Serial.print(':');
  Serial.print(localTime.tm_sec);
  Serial.print(" Day of Week ");
 
 disp.point(1);
 disp.displayByte(_0, _0, _0, _0);
 disp.displayInt(localTime.tm_hour*100);
 disp.displayInt(localTime.tm_min);
  delay(1000);
  disp.point(0);
 disp.displayByte(_0, _0, _0, _0);
 disp.displayInt(localTime.tm_hour*100);
 disp.displayInt(localTime.tm_min);
  delay(1000);
 disp.point(1);
 disp.displayByte(_0, _0, _0, _0);
 disp.displayInt(localTime.tm_hour*100);
 disp.displayInt(localTime.tm_min);
  delay(1000);
  disp.point(0);
 disp.displayByte(_0, _0, _0, _0);
 disp.displayInt(localTime.tm_hour*100);
 disp.displayInt(localTime.tm_min);
  delay(1000);
  disp.point(1);
 disp.displayByte(_0, _0, _0, _0);
 disp.displayInt(localTime.tm_hour*100);
 disp.displayInt(localTime.tm_min);
  delay(1000);
  if (localTime.tm_wday == 0)   Serial.println(7);
  else Serial.println(localTime.tm_wday);
}


/*
 // Shorter way of displaying the time
  void showTime(tm localTime) {
  Serial.printf(
    "%04d-%02d-%02d %02d:%02d:%02d, day %d, %s time\n",
    localTime.tm_year + 1900,
    localTime.tm_mon + 1,
    localTime.tm_mday,
    localTime.tm_hour,
    localTime.tm_min,
    localTime.tm_sec,
    (localTime.tm_wday > 0 ? localTime.tm_wday : 7 ),
    (localTime.tm_isdst == 1 ? "summer" : "standard")
  );
  }

*/

Не в сети

Подвал раздела

Работает на FluxBB (перевод Laravel.ru)