#1 03-10-2020 12:35:37

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

WiFi градусник на ESP8266+DS18B20+MAX7219.

Описание библиотеки для дисплея на MAX7219.
https://github.com/BugerDread/esp8266-h … x7219-7seg

Код.

#include <esp8266_hw_spi_max7219_7seg.h>
#define SPI_SPEED             20000000 //SPI@20MHZ частота шины SPI
#define SPI_CSPIN             16       //SPI CS=GPIO16 любой свободный порт,CLK обязательно на GPIO14, DIN обязательно на GPO13(на этом же порту синий светодиод, который совершенно не мешает обмену данными с дисплеем) 
#define DISP_BRGTH            8       //brightness of the display (0-15)
#define DISP_AMOUNT           2       //number of max 7seg modules connected
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5//ПОРТ ПОДКЛЮЧЕНИЯ DS18B20
#define TEMPERATURE_PRECISION 12//разрешение 12 бит для ds18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer0;
#define MY_BUTTON 4//порт кнопки
float tempC =0;
BgrMax7seg ld = BgrMax7seg(SPI_SPEED, SPI_CSPIN, DISP_AMOUNT);
float a=0;
float DIGIT=4;//РАЗРЯДНОСТЬ ОТОБРАЖЕНИЯ ТЕМПЕРАТУРЫ ПОСЛЕ ЗАПЯТОЙ
void setup() {
  /* init displays*/
  ld.init();
  ld.setBright(DISP_BRGTH, ALL_MODULES);
  ld.print("test.test", ALL_MODULES);   // prints string "test.test" on all connected modules
ld.clear(ALL_MODULES);              //clear all displays
Serial.begin(115200);
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(Thermometer0, 0)) Serial.println("Unable to find address for Device 0");
  Serial.print("Device 0 Address: ");
  printAddress(Thermometer0);
  Serial.println();
// set the resolution to 12 bit per device
  sensors.setResolution(Thermometer0, TEMPERATURE_PRECISION);
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(Thermometer0), 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("ОШИБКА!!!");
  
  }
}
// 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();
}

void loop() {
    sensors.requestTemperatures();
     tempC = sensors.getTempCByIndex(0);
   if (tempC != DEVICE_DISCONNECTED_C)//обработка ошибки термодатчика
  {
   
   ld.print(String(tempC,DIGIT), 1);   
  } 
  else 
  {
    ld.print("error", 1);  
    }
//////////////ОБРАБОТКА НАЖАТЯ КНОПКИ///////
for (int i=0; i <= 50; i++){
       if(LOW == digitalRead(MY_BUTTON))
{
DIGIT=DIGIT-1;
if (DIGIT<0) {DIGIT=4;} 
}
}
}

ESP8266-Witty-Cloud-Pinout.jpg
FCPLLA4-IYOQCC3-V.jpg

Не в сети

#2 03-10-2020 12:40:15

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

MAX7219 подключается к ESP следующим образом. CS=GPIO16 или любой свободный порт,CLK обязательно к GPIO14, DIN обязательно к GPO13(на этом же порту синий светодиод, который совершенно не мешает обмену данными с дисплеем).
При нажатии кнопки, разрядность отображения температуры после запятой, уменьшается на один разряд.

Не в сети

#3 03-10-2020 13:17:44

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

16017041700208976690203810029228.jpg

16017042538262331546723895501724.jpg

1601704401201244084272570158287.jpg

16017044916581263013945879926293.jpg

16017057690502979096994067802614.jpg

Не в сети

#4 08-10-2020 18:00:03

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

2 градусника ds18b20 на одном порту с индикацией потери любого из датчиков.

#include <esp8266_hw_spi_max7219_7seg.h>
#define SPI_SPEED             20000000 //SPI@20MHZ частота шины SPI
#define SPI_CSPIN             16       //SPI CS=GPIO16 любой свободный порт,CLK обязательно на GPIO14, DIN обязательно на GPO13(на этом же порту синий светодиод, который совершенно не мешает обмену данными с дисплеем) 
#define DISP_BRGTH            8       //brightness of the display (0-15)
#define DISP_AMOUNT           2       //number of max 7seg modules connected
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5//ПОРТ ПОДКЛЮЧЕНИЯ DS18B20
#define TEMPERATURE_PRECISION 12//разрешение 12 бит для ds18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer0;
#define MY_BUTTON 4//порт кнопки
float tempC =0;
float tempC1 =0;
BgrMax7seg ld = BgrMax7seg(SPI_SPEED, SPI_CSPIN, DISP_AMOUNT);
float a=0;
float DIGIT=2;//РАЗРЯДНОСТЬ ОТОБРАЖЕНИЯ ТЕМПЕРАТУРЫ ПОСЛЕ ЗАПЯТОЙ
void setup() {
  /* init displays*/
  ld.init();
  ld.setBright(DISP_BRGTH, ALL_MODULES);
  ld.print("test.test", ALL_MODULES);   // prints string "test.test" on all connected modules
ld.clear(ALL_MODULES);              //clear all displays
Serial.begin(115200);
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(Thermometer0, 0)) Serial.println("Unable to find address for Device 0");
  Serial.print("Device 0 Address: ");
  printAddress(Thermometer0);
  Serial.println();
// set the resolution to 12 bit per device
  sensors.setResolution(Thermometer0, TEMPERATURE_PRECISION);
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(Thermometer0), 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("ОШИБКА!!!");
  
  }
}
// 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();
}

void loop() {
    sensors.requestTemperatures();
     tempC = sensors.getTempCByIndex(0);
     tempC1 = sensors.getTempCByIndex(1);
   if (tempC != DEVICE_DISCONNECTED_C)//обработка ошибки термодатчика
  {  
  } 
  else 
  {
    ld.print("error-0", 1);  
    delay(1000);
    }
  
   if (tempC1 != DEVICE_DISCONNECTED_C)//обработка ошибки термодатчика
  {
  } 
  else 
  {
    ld.print("error-1", 1);  
    delay(1000);
    }
  ld.print(String(tempC1,DIGIT)+String(tempC,2), 0);     
}

Не в сети

#5 11-10-2020 15:04:59

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Прикрутил к GPIO 4 ИК приёмник VS1838B. На этом порту, висит кнопка и подтягивающий резистор на + питания, что совершенно не мешает работать ИК приёмнику.

#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>
#include <esp8266_hw_spi_max7219_7seg.h>
#define SPI_SPEED             20000000 //SPI@20MHZ частота шины SPI
#define SPI_CSPIN             16       //SPI CS=GPIO16 любой свободный порт,CLK обязательно на GPIO14, DIN обязательно на GPO13(на этом же порту синий светодиод, который совершенно не мешает обмену данными с дисплеем) 
#define DISP_BRGTH            8       //brightness of the display (0-15)
#define DISP_AMOUNT           2       //number of max 7seg modules connected
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5//ПОРТ ПОДКЛЮЧЕНИЯ DS18B20
#define TEMPERATURE_PRECISION 12//разрешение 12 бит для ds18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer0;
String IR = "";
float tempC =0;
float tempC1 =0;
BgrMax7seg ld = BgrMax7seg(SPI_SPEED, SPI_CSPIN, DISP_AMOUNT);
float a=0;
float DIGIT=2;//РАЗРЯДНОСТЬ ОТОБРАЖЕНИЯ ТЕМПЕРАТУРЫ ПОСЛЕ ЗАПЯТОЙ
const uint16_t kRecvPin = 4;
IRrecv irrecv(kRecvPin);
decode_results results;
void setup() {
  /* init displays*/
  ld.init();
  ld.setBright(DISP_BRGTH, ALL_MODULES);
  ld.print("test.test", ALL_MODULES);   // prints string "test.test" on all connected modules
ld.clear(ALL_MODULES);              //clear all displays
Serial.begin(115200);
irrecv.enableIRIn();  // Start the receiver
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(Thermometer0, 0)) Serial.println("Unable to find address for Device 0");
  Serial.print("Device 0 Address: ");
  printAddress(Thermometer0);
  Serial.println();
// set the resolution to 12 bit per device
  sensors.setResolution(Thermometer0, TEMPERATURE_PRECISION);
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(Thermometer0), 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("ОШИБКА!!!");
  
  }
}
// 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();
}

void loop() {
    sensors.requestTemperatures();
     tempC = sensors.getTempCByIndex(0);
     tempC1 = sensors.getTempCByIndex(1);
   if (tempC != DEVICE_DISCONNECTED_C)//обработка ошибки термодатчика
  {  
  } 
  else 
  {
    ld.print("error-0", 1);  
    delay(1000);
    }
  
   if (tempC1 != DEVICE_DISCONNECTED_C)//обработка ошибки термодатчика
  {
  } 
  else 
  {
    ld.print("error-1", 1);  
    delay(1000);
    }
  ld.print(String(tempC1,DIGIT)+String(tempC,2), 0);     
if (irrecv.decode(&results)) {
    // print() & println() can't handle printing long longs. (uint64_t)
    serialPrintUint64(results.value, HEX);
    Serial.println("");
  ld.print("IR", 0);    
  delay(1000);
irrecv.resume();  // Receive the next value
}
}

Не в сети

#6 12-10-2020 08:43:30

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Развёл плату для нового термостата.

16024671147564822331085668840289.jpg

16024671606431360108414953541872.jpg

16024672314911997518523841833027.jpg
esp8266-max7219.jpg

Не в сети

#7 12-10-2020 08:58:17

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Плата для печати. Размер рисунка/платы 90мм/57мм. Зеркалить не нужно(платы я развожу обычно сразу в зеркальном отображении), печатаем прям так и утюжим.

plata.jpg

Не в сети

#8 12-10-2020 10:42:11

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

С этой библиотекой управления MAX7219 последовательное соединение нескольких таких индикаторов, работает довольно стабильно. Последовательно, можно подключить до 7 дисплеев. При этом, частота шины SPI , желательно должна быть не выше 14 мегагерц.
#define SPI_SPEED             14000000 //SPI@14MHZ частота шины SPI
На фото, при длине соединительных проводов около 10 см, при 14 мегагерцах шины SPI , всё работает довольно стабильно. При двух дисплеях, вполне достаточно 8..12 мегагерц шины SPI.

16024744013795708847997531551101.jpg

Не в сети

#9 12-10-2020 10:42:40

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>
#include <esp8266_hw_spi_max7219_7seg.h>
#define SPI_SPEED             14000000 //SPI@14MHZ частота шины SPI
#define SPI_CSPIN             16       //SPI CS=GPIO16 любой свободный порт,CLK обязательно на GPIO14, DIN обязательно на GPO13(на этом же порту синий светодиод, который совершенно не мешает обмену данными с дисплеем) 
#define DISP_BRGTH            8       //brightness of the display (0-15)
#define DISP_AMOUNT           2       //number of max 7seg modules connected
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5//ПОРТ ПОДКЛЮЧЕНИЯ DS18B20
#define TEMPERATURE_PRECISION 12//разрешение 12 бит для ds18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer0;
String IR = "";
float tempC =0;
float tempC1 =0;
BgrMax7seg ld = BgrMax7seg(SPI_SPEED, SPI_CSPIN, DISP_AMOUNT);
float a=0;
float DIGIT=2;//РАЗРЯДНОСТЬ ОТОБРАЖЕНИЯ ТЕМПЕРАТУРЫ ПОСЛЕ ЗАПЯТОЙ
const uint16_t kRecvPin = 4;
IRrecv irrecv(kRecvPin);
decode_results results;
void setup() {
  /* init displays*/
  ld.init();
  ld.setBright(DISP_BRGTH, ALL_MODULES);
  ld.print("test.test", ALL_MODULES);   // prints string "test.test" on all connected modules
ld.clear(ALL_MODULES);              //clear all displays
Serial.begin(115200);
irrecv.enableIRIn();  // Start the receiver
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(Thermometer0, 0)) Serial.println("Unable to find address for Device 0");
  Serial.print("Device 0 Address: ");
  printAddress(Thermometer0);
  Serial.println();
// set the resolution to 12 bit per device
  sensors.setResolution(Thermometer0, TEMPERATURE_PRECISION);
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(Thermometer0), 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("ОШИБКА!!!");
  
  }
}
// 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();
}

void loop() {
    sensors.requestTemperatures();
     tempC = sensors.getTempCByIndex(0);
     tempC1 = sensors.getTempCByIndex(1);
   if (tempC != DEVICE_DISCONNECTED_C)//обработка ошибки термодатчика
  {  
  } 
  else 
  {
    ld.print("error-0", 1);  
    delay(1000);
    }
  
   if (tempC1 != DEVICE_DISCONNECTED_C)//обработка ошибки термодатчика
  {
  } 
  else 
  {
    ld.print("error-1", 1);  
    delay(1000);
    }
  ld.print(String(tempC1,DIGIT)+String(tempC,2), 0);     
ld.print("12345678", 1);     
//ld.print(String(tempC1,DIGIT)+String(tempC,2), 2);     
//ld.print(String(tempC1,DIGIT)+String(tempC,2), 3);  

if (irrecv.decode(&results)) {
    // print() & println() can't handle printing long longs. (uint64_t)
    serialPrintUint64(results.value, HEX);
    Serial.println("");
  ld.print("IR", 0);    
  delay(1000);
irrecv.resume();  // Receive the next value
}
}

Не в сети

#10 12-10-2020 12:26:22

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

ИК приёмник VS1838B, лучше питать от стабилизатора питания процессора 3,3В. Случайные срабатывания ИК приёмника будут происходить реже, чем при питании от линии 5В. На плате Witty Cloud, есть переходное отверстие между слоями платы, там как раз +3,3В идёт со стабилизатора AMS1117 3.3v и туда хорошо вставляется ножка VS1838.

16024806580497571551191465568654.jpg

1602480743714110019631717350337.jpg

Не в сети

#11 12-10-2020 12:27:57

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

В конце кода, добавлена обработка кнопок 1-2-3 с такого китайского ИК пульта.


#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>
#include <esp8266_hw_spi_max7219_7seg.h>
#define SPI_SPEED             14000000 //SPI@14MHZ частота шины SPI
#define SPI_CSPIN             16       //SPI CS=GPIO16 любой свободный порт,CLK обязательно на GPIO14, DIN обязательно на GPO13(на этом же порту синий светодиод, который совершенно не мешает обмену данными с дисплеем) 
#define DISP_BRGTH            8       //brightness of the display (0-15)
#define DISP_AMOUNT           1       //number of max 7seg modules connected
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5//ПОРТ ПОДКЛЮЧЕНИЯ DS18B20
#define TEMPERATURE_PRECISION 12//разрешение 12 бит для ds18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer0;
String IR = "";
float tempC =0;
float tempC1 =0;
BgrMax7seg ld = BgrMax7seg(SPI_SPEED, SPI_CSPIN, DISP_AMOUNT);
float a=0;
float DIGIT=2;//РАЗРЯДНОСТЬ ОТОБРАЖЕНИЯ ТЕМПЕРАТУРЫ ПОСЛЕ ЗАПЯТОЙ
const uint16_t kRecvPin = 4;
IRrecv irrecv(kRecvPin);
decode_results results;
void setup() {
  /* init displays*/
  ld.init();
  ld.setBright(DISP_BRGTH, ALL_MODULES);
  ld.print("test.test", ALL_MODULES);   // prints string "test.test" on all connected modules
ld.clear(ALL_MODULES);              //clear all displays
Serial.begin(115200);
irrecv.enableIRIn();  // Start the receiver
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(Thermometer0, 0)) Serial.println("Unable to find address for Device 0");
  Serial.print("Device 0 Address: ");
  printAddress(Thermometer0);
  Serial.println();
// set the resolution to 12 bit per device
  sensors.setResolution(Thermometer0, TEMPERATURE_PRECISION);
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(Thermometer0), 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("ОШИБКА!!!");
  
  }
}
// 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();
}

void loop() {
    sensors.requestTemperatures();
     tempC = sensors.getTempCByIndex(0);
     tempC1 = sensors.getTempCByIndex(1);
   if (tempC != DEVICE_DISCONNECTED_C)//обработка ошибки термодатчика
  {  
  } 
  else 
  {
    ld.print("error-0", 0);  
    delay(1000);
    }
  
   if (tempC1 != DEVICE_DISCONNECTED_C)//обработка ошибки термодатчика
  {
  } 
  else 
  {
    ld.print("error-1", 0);  
    delay(1000);
    }
  ld.print(String(tempC1,DIGIT)+String(tempC,2), 0);     


if (irrecv.decode(&results)) {
    // print() & println() can't handle printing long longs. (uint64_t)
    serialPrintUint64(results.value, HEX);
    Serial.println("");
if (results.value==0x1FE50AF){//1
ld.print("1", 0); 
delay(1000);}
if (results.value==0x1FED827){//2
ld.print("2", 0); 
delay(1000);}
if (results.value==0x1FEF807){//3
ld.print("3", 0); 
delay(1000);}
irrecv.resume();  // Receive the next value
}

}

16024805702908727365442699551492.jpg

Не в сети

#12 12-10-2020 12:43:35

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

VS1838B Лист данных
Согласно VS1838B спецификации, он имеет:
ИК - пульт дистанционного управления ресивера
Встроенный фильтр на 38KHz
Совместимость с Arduino, Raspberry Pi
Простой интерфейс использовать его
Рабочее напряжение: 2.7 - 5.5V DC
Receiver Расстояние: 22 - 25 м
Инфракрасный датчик VS1838B используется в определенных схемах, единственная сложность - это строгие требования к инфракрасному свету. сигнал передатчика.

VS1838-B-PINOUT.jpg

Схема включения из даташита такая. У меня, всё работает хорошо и без дополнительных фильтрующих компонентов. Первая нога (левая) VS1838B идёт на GPIO 4, вторая на массу, третья на + питания 5 В или 3,3 В.
VS1838-B-CIRCUIT.jpg

Не в сети

#13 12-10-2020 13:12:06

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Фотоприёмники брал тут.
83,01 руб. | Приемник инфракрасный GREATZT TL1838 VS1838B 1838
https://a.aliexpress.com/_etuWn6
Покупал до кучи, с другими девайсами, можно найти и подешевле.

Не в сети

#14 12-10-2020 15:17:19

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Заменил короткую перемычку на плате. Должно быть так.

16024922969042190271120437303567.jpg

Не в сети

#15 12-10-2020 21:23:38

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Схема электрическая принципиальная.

esp8266-max7219-DS18-B20.gif

Не в сети

#16 25-11-2020 16:22:07

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Скетч простого двухканального градусника на вышеупомянутой плате. Оба DS18B20 сидят на GPIO 5.

#include <esp8266_hw_spi_max7219_7seg.h>
#define SPI_SPEED             20000000 //SPI@20MHZ частота шины SPI
#define SPI_CSPIN             16       //SPI CS=GPIO16 любой свободный порт,CLK обязательно на GPIO14, DIN обязательно на GPO13(на этом же порту синий светодиод, который совершенно не мешает обмену данными с дисплеем) 
#define DISP_BRGTH            8       //brightness of the display (0-15)
#define DISP_AMOUNT           2       //number of max 7seg modules connected
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5//ПОРТ ПОДКЛЮЧЕНИЯ DS18B20
#define TEMPERATURE_PRECISION 12//разрешение 12 бит для ds18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer0;
#define MY_BUTTON 4//порт кнопки
float tempC =0;
float tempC1 =0;
BgrMax7seg ld = BgrMax7seg(SPI_SPEED, SPI_CSPIN, DISP_AMOUNT);
float a=0;
float DIGIT=3;//РАЗРЯДНОСТЬ ОТОБРАЖЕНИЯ ТЕМПЕРАТУРЫ ПОСЛЕ ЗАПЯТОЙ
void setup() {
  /* init displays*/
  ld.init();
  ld.setBright(DISP_BRGTH, ALL_MODULES);
  ld.print("test.test", ALL_MODULES);   // prints string "test.test" on all connected modules
ld.clear(ALL_MODULES);              //clear all displays
Serial.begin(115200);
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(Thermometer0, 0)) Serial.println("Unable to find address for Device 0");
  Serial.print("Device 0 Address: ");
  printAddress(Thermometer0);
  Serial.println();
// set the resolution to 12 bit per device
  sensors.setResolution(Thermometer0, TEMPERATURE_PRECISION);
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(Thermometer0), 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("ОШИБКА!!!");
  
  }
}
// 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();
}

void loop() {
    sensors.requestTemperatures();
     tempC = sensors.getTempCByIndex(0);
     tempC1 = sensors.getTempCByIndex(1);
   if (tempC != DEVICE_DISCONNECTED_C)//обработка ошибки термодатчика
  {
   
   ld.print(String(tempC,DIGIT)+" "+String(tempC1,0), 1);   
  } 
  else 
  {
    ld.print("error-1", 1);  
    delay(1000);
    }
if (tempC1 != DEVICE_DISCONNECTED_C)//обработка ошибки термодатчика
  {
   
  // ld.print(String(tempC1,0), 1);   
  } 
  else 
  {
    ld.print("error-2", 1);  
     delay(1000);
    }
}

Не в сети

#17 27-11-2020 17:57:13

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Не в сети

#18 25-12-2020 02:03:08

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

16088365018962994970355664444582.jpg

Не в сети

#19 25-12-2020 02:05:15

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Screenshot-2020-12-25-02-03-12-111-com-android-chrome.jpg

Не в сети

#20 25-01-2021 19:11:04

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Допилил сегодня код своего градусника с локальным вебсервером и автоматическим обновлением страницы/показаний датчика(каждую секунду). Содрано тут https://randomnerdtutorials.com/esp8266 … r-arduino/

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <ESP8266WiFi.h>
#include "ESPAsyncWebServer.h"
// Replace with your network credentials
const char* ssid = "Имя вашей WiFi сети";
const char* password = "Пароль сети";
float temperature=0;
int iwifi=0;
AsyncWebServer server(80);
AsyncEventSource events("/events");
unsigned long lastTime = 0;  
unsigned long timerDelay = 1000;  // send readings timer
//////////////////////////////////////////////////////////////////
#include <esp8266_hw_spi_max7219_7seg.h>
#define SPI_SPEED             20000000 //SPI@20MHZ частота шины SPI
#define SPI_CSPIN             16       //SPI CS=GPIO16 любой свободный порт,CLK обязательно на GPIO14, DIN обязательно на GPO13(на этом же порту синий светодиод, который совершенно не мешает обмену данными с дисплеем) 
#define DISP_BRGTH            8       //brightness of the display (0-15)
#define DISP_AMOUNT           2       //number of max 7seg modules connected
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5//ПОРТ ПОДКЛЮЧЕНИЯ DS18B20
#define TEMPERATURE_PRECISION 12//разрешение 12 бит для ds18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer0;
#define MY_BUTTON 4//порт кнопки
float tempC =0;
float tempC1 =0;
BgrMax7seg ld = BgrMax7seg(SPI_SPEED, SPI_CSPIN, DISP_AMOUNT);
float a=0;
int DIGIT=2;//РАЗРЯДНОСТЬ ОТОБРАЖЕНИЯ ТЕМПЕРАТУРЫ ПОСЛЕ ЗАПЯТОЙ
int DIGIT1=2;
String processor(const String& var){
  //Serial.println(var);
  if(var == "TEMPERATURE"){
    return String(temperature);
  }
}
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <title>DS18B20 Web Server</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <link rel="icon" href="data:,">
  <style>
    html {font-family: Arial; display: inline-block; text-align: center;}
    p {  font-size: 1.2rem;}
    body {  margin: 0;}
    .topnav { overflow: hidden; background-color: #4B1D3F; color: white; font-size: 1.7rem; }
    .content { padding: 20px; }
    .card { background-color: white; box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); }
    .cards { max-width: 700px; margin: 0 auto; display: grid; grid-gap: 2rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
    .reading { font-size: 2.8rem; }
    .card.temperature { color: #0e7c7b; }
    .card.humidity { color: #17bebb; }
    .card.pressure { color: #3fca6b; }
    .card.gas { color: #d62246; }
  </style>
</head>
<body>
  <div class="topnav">
    <h3>DS18B20 WEB Server.</h3>
  </div>
  <div class="content">
    <div class="cards">
      <div class="card temperature">
        <h4><i class="fas fa-thermometer-half"></i> TEMPERATURE</h4><p><span class="reading"><span id="temp">%TEMPERATURE%</span> &deg;C</span></p>
      </div>
      
    </div>
  </div>
<script>
if (!!window.EventSource) {
 var source = new EventSource('/events');
 
 source.addEventListener('open', function(e) {
  console.log("Events Connected");
 }, false);
 source.addEventListener('error', function(e) {
  if (e.target.readyState != EventSource.OPEN) {
    console.log("Events Disconnected");
  }
 }, false);
 
 source.addEventListener('message', function(e) {
  console.log("message", e.data);
 }, false);
 
 source.addEventListener('temperature', function(e) {
  console.log("temperature", e.data);
  document.getElementById("temp").innerHTML = e.data;
 }, false);
}
</script>
</body>
</html>)rawliteral";

void setup() {
  Serial.begin(115200);
 ld.init();
  ld.setBright(DISP_BRGTH, ALL_MODULES);
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(Thermometer0, 0)) Serial.println("Unable to find address for Device 0");
  Serial.print("Device 0 Address: ");
 // printAddress(Thermometer0);
  Serial.println();
// set the resolution to 12 bit per device
  sensors.setResolution(Thermometer0, TEMPERATURE_PRECISION);
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(Thermometer0), DEC);
  Serial.println();
  // Set the device as a Station and Soft Access Point simultaneously
 WiFi.disconnect();
//  WiFi.mode(WIFI_MODE_STA);
  WiFi.begin(ssid, password);
  Serial.print("\nConnecting to WiFi SSID " + String(ssid) + " ...");
  while (WiFi.status() != WL_CONNECTED and iwifi<59) {
    ld.print(String (iwifi), 1);   // prints string "test.test" on all connected modules
    delay(1000);
    ld.clear(ALL_MODULES);              //clear all displays iwifi++;
    Serial.print(".");
  iwifi++;
  }
  Serial.println("\nConnected. ");
  Serial.print("The IP number assigned by DHCP is ");
  Serial.println(WiFi.localIP());
  // Handle Web Server
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });
  // Handle Web Server Events
  events.onConnect([](AsyncEventSourceClient *client){
    if(client->lastId()){
      Serial.printf("Client reconnected! Last message ID that it got is: %u\n", client->lastId());
    }
    // send event with message "hello!", id current millis
    // and set reconnect delay to 1 second
    client->send("hello!", NULL, millis(), 500);
  });
  server.addHandler(&events);
  server.begin();
}
// 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("ОШИБКА!!!");
  
  }
}
// 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();
}
void loop() {
   sensors.requestTemperatures();
     tempC = sensors.getTempCByIndex(0);
   if (tempC == DEVICE_DISCONNECTED_C) //обработка ошибки термодатчика
{ while (tempC != DEVICE_DISCONNECTED_C)
 {
  sensors.requestTemperatures();
     tempC = sensors.getTempCByIndex(0);
 }
}

  if ((millis() - lastTime) >= timerDelay) {
ld.print(String(tempC,5), 1);   
   temperature=tempC;
    events.send("ping",NULL,millis());
    events.send(String(temperature).c_str(),"temperature",millis());   
    lastTime = millis(); 
  }
}

Не в сети

#21 25-01-2021 19:16:33

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Screenshot-2021-01-25-19-12-08-560-com-android-chrome.jpg

Не в сети

#22 25-01-2021 19:18:27

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Железо, всё то же.
16115769636752270157089875532262.jpg

Не в сети

#23 25-01-2021 19:26:20

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Без светодиодного дисплея, код тоже работает. Можно сделать WiFi градусник из трёх деталей: ESP8266+DS18B20+резистор смещения(с ноги данных DS18B20 на + питания, 5..10 кОм).
Мой градусник подключён к домашнему роутеру, можно смотреть температуру на домашнем ПК/смартфоне/планшете и т.д.(все девайсы, должны быть подключены к локальной сети). Можно организовать точку доступа на смартфоне и подключать градусник непосредственно к локальной сети смартфона. Такой вариант, тоже работает.

Не в сети

#24 17-04-2021 21:20:12

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Теперь градусник, с двумя дисплеями.
1618669017800354315420285828729.jpg

Не в сети

#25 17-04-2021 21:24:04

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Решил для датчиков, применять разъёмы Jack 3,5 mm.
1618669194631773797377790312769.jpg

16186692280817525360730146502000.jpg
Нашёл, нормальные не дорогие гнёзда 3,5 мм, для установки в стенку корпуса.
PJ392A 3,5 мм аудиоразъем, 3-полюсный черный стерео.
https://aliexpress.ru/item/400037621713 … 1540011655

Не в сети

#26 17-04-2021 21:31:09

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

16186696250458302027259364831714.jpg

16186696670935016145116149498841.jpg

16186697085402029747945083276654.jpg

Не в сети

#27 17-04-2021 21:36:38

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Добавил ИК приёник( висит на GPIO 4 вместе с кнопкой встроенной, питание 3.3В от стабилизатора питания процессора). ИК приёмник VS1838B.
Сабильно работает ИК приёмник.

1618669996322404363853845820273.jpg
На фото ниже, на нижнем дисплее отображается код нажатой кнопки пульта.

16186705343319011942719505941835.jpg

Не в сети

#28 17-04-2021 22:05:22

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Поправил код, была ошибка.

#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>
const uint16_t kRecvPin = 4;
IRrecv irrecv(kRecvPin);
decode_results results;
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <ESP8266WiFi.h>
#include "ESPAsyncWebServer.h"
// Replace with your network credentials 
const char* ssid = "77777";
const char* password = "5K9S7Y8B875K9S7Y8B87";
char ss=0;
float temperature=0;
int iwifi=0;
int m=0;//количество активных датчиков ds18b20
char GRADUS=22;
AsyncWebServer server(80);
AsyncEventSource events("/events");
unsigned long lastTime = 0;  
//////////////////////////////////////////////////////////////////
#include <esp8266_hw_spi_max7219_7seg.h>
#define SPI_SPEED             10000000 //SPI@10MHZ частота шины SPI
#define SPI_CSPIN             16       //SPI CS=GPIO16 любой свободный порт,CLK обязательно на GPIO14, DIN обязательно на GPO13(на этом же порту синий светодиод, который совершенно не мешает обмену данными с дисплеем) 
#define DISP_BRGTH            8       //brightness of the display (0-15)
#define DISP_AMOUNT           2       //number of max 7seg modules connected
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5//ПОРТ ПОДКЛЮЧЕНИЯ DS18B20
#define TEMPERATURE_PRECISION 12//разрешение 12 бит для ds18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer0;
#define MY_BUTTON 4//порт кнопки
float tempC =0;
float tempC1 =0;
BgrMax7seg ld = BgrMax7seg(SPI_SPEED, SPI_CSPIN, DISP_AMOUNT);
float a=0;
int DIGIT=2;//РАЗРЯДНОСТЬ ОТОБРАЖЕНИЯ ТЕМПЕРАТУРЫ ПОСЛЕ ЗАПЯТОЙ
int DIGIT1=2;
String processor(const String& var){
  if(var == "TEMPERATURE"){
    return String(temperature);
  }
}
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <title>DS18B20 Web Server</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <link rel="icon" href="data:,">
  <style>
    html {font-family: Arial; display: inline-block; text-align: center;}
    p {  font-size: 1.2rem;}
    body {  margin: 0;}
    .topnav { overflow: hidden; background-color: #4B1D3F; color: white; font-size: 1.7rem; }
    .content { padding: 20px; }
    .card { background-color: white; box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); }
    .cards { max-width: 700px; margin: 0 auto; display: grid; grid-gap: 2rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
    .reading { font-size: 2.8rem; }
    .card.temperature { color: #0e7c7b; }
    .card.humidity { color: #17bebb; }
    .card.pressure { color: #3fca6b; }
    .card.gas { color: #d62246; }
  </style>
</head>
<body>
  <div class="topnav">
    <h3>DS18B20 WEB Server.</h3>
  </div>
  <div class="content">
    <div class="cards">
      <div class="card temperature">
        <h4><i class="fas fa-thermometer-half"></i> TEMPERATURE</h4><p><span class="reading"><span id="temp">%TEMPERATURE%</span> &deg;C</span></p>
      </div>
      
    </div>
  </div>
<script>
if (!!window.EventSource) {
 var source = new EventSource('/events');
  source.addEventListener('open', function(e) {
  console.log("Events Connected");
 }, false);
 source.addEventListener('error', function(e) {
  if (e.target.readyState != EventSource.OPEN) {
    console.log("Events Disconnected");
  }
 }, false);
  source.addEventListener('message', function(e) {
  console.log("message", e.data);
 }, false);
  source.addEventListener('temperature', function(e) {
  console.log("temperature", e.data);
  document.getElementById("temp").innerHTML = e.data;
 }, false);
}
</script>
</body>
</html>)rawliteral";
void setup() {
  Serial.begin(115200);
 irrecv.enableIRIn(); 
 pinMode(15, OUTPUT);//пищалка
digitalWrite(15, HIGH);
 ld.init();
  ld.setBright(DISP_BRGTH, ALL_MODULES);
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(Thermometer0, 0)) Serial.println("Unable to find address for Device 0");
  Serial.print("Device 0 Address: ");
 // printAddress(Thermometer0);
  Serial.println();
// set the resolution to 12 bit per device
  sensors.setResolution(Thermometer0, TEMPERATURE_PRECISION);
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(Thermometer0), DEC);
  Serial.println();
 /////////////////поиск и определение количества подключеных датчиков ds18b20///
     sensors.requestTemperatures();
  while (sensors.getTempCByIndex(m)!=DEVICE_DISCONNECTED_C){
  m++;
    sensors.requestTemperatures(); 
 }
 if (m==0){   ld.print("n0------", 1);
delay(2000);
 ld.print("ds18b20", 1);
 delay(2000);  
  }
ld.print("ds18b20-", 1);
delay(2000);
 ld.print("s18b20-"+String(m), 1);
 delay(2000);
if (m==1) DIGIT=3;
 //////////////////////////
 WiFi.disconnect();
//  WiFi.mode(WIFI_MODE_STA);
  WiFi.begin(ssid, password);
  Serial.print("\nConnecting to WiFi SSID " + String(ssid) + " ...");
  while (WiFi.status() != WL_CONNECTED and iwifi<5) {
    ld.print(String (iwifi), 1);   // prints string "test.test" on all connected modules
    delay(1000);
    ld.clear(ALL_MODULES);              //clear all displays iwifi++;
    Serial.print(".");
  iwifi++;
  }
  Serial.println("\nConnected. ");
  Serial.print("The IP number assigned by DHCP is ");
  Serial.println(WiFi.localIP());
  // Handle Web Server
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });
  // Handle Web Server Events
  events.onConnect([](AsyncEventSourceClient *client){
    if(client->lastId()){
      Serial.printf("Client reconnected! Last message ID that it got is: %u\n", client->lastId());
    }
    // send event with message "hello!", id current millis
    // and set reconnect delay to 1 second
    client->send("hello!", NULL, millis(), 500);
  });
  server.addHandler(&events);
  server.begin();
}
// 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("ОШИБКА!!!"); 
  }
}
// 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();
}
void PIK()//звуковой сигнал на порт 12/зелёный светодиод
{
 tone(12,3,300);
}
void IR() {
 if (irrecv.decode(&results)) {
if (results.value==16476821)
{
digitalWrite(15, HIGH); 
}
if (results.value==16492631)DIGIT=3; //КНОПКА 3
if (results.value==16452341)DIGIT=4; //КНОПКА 4
if (results.value==16464071)
{
digitalWrite(15, LOW); 
}
a=results.value;
  ld.print(String(a,0), 1);
    serialPrintUint64(results.value, HEX);
    Serial.println("");
    serialPrintUint64(results.value);
    Serial.println("");
    irrecv.resume();  // Receive the next value
 delay(1000);
  } 
}
void showTemp(int f)
{
 if (m==1) {ld.print(String(tempC,2)+String(GRADUS)+"C", 2);
 ld.print(String(tempC,DIGIT)+String(GRADUS)+"C", 1);}
 if (m==2) {ld.print(String(tempC,DIGIT)+String(GRADUS)+"C", 1); 
ld.print(String(tempC1,DIGIT)+String(GRADUS)+"C", 2);}
}
void loop() {
IR();
 ///////////////////////////датчик 0/////////////////
   sensors.requestTemperatures();
     tempC = sensors.getTempCByIndex(0);   
  if (tempC >= 55) tone(12,1,2000);;
//if (tempC <= 40) PIK();
   if (tempC == DEVICE_DISCONNECTED_C) //обработка ошибки термодатчика
{  PIK();} 
///////////////////////////датчик 1/////////////////
 if (m==2){
     tempC1 = sensors.getTempCByIndex(1);   
   if (tempC1 == DEVICE_DISCONNECTED_C) //обработка ошибки термодатчика
{  PIK();}  
 }
 /////////////////////////////////////////// 
  if ((millis() - lastTime) >= 1000)
  {lastTime = millis(); 
   showTemp(m);}
   temperature=tempC;
    events.send("ping",NULL,millis());
    events.send(String(temperature).c_str(),"temperature",millis());   
}

Не в сети

#29 17-04-2021 22:34:56

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

На плате установлены два DC/DC преобразователя понижающих MINI560. Один на 5В(для питания esp8266), другой на  12В(для питания насоса). Такая же плата, будет стоять у меня в солнечной водогрейке на даче.
DC/DC MINI560:
https://aliexpress.ru/item/100500188660 … 2cEALw_wcB
Насос:
https://aliexpress.ru/item/33021085819. … 2cEALw_wcB

Не в сети

#30 17-04-2021 22:38:10

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

Питаться девайс будет от аккумуляторов/солнечных панелей с напряжением 13..24В.

Не в сети

#31 17-04-2021 23:12:07

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

Re: WiFi градусник на ESP8266+DS18B20+MAX7219.

DC/DC MINI560 довольно мощный и эффективный преобразователь. 2..3А держит довольно легко. Поэтому, от него будут ещё заряжаться телефоны на даче. Только для питания esp8266 его использовать, довольно расточительно.

Не в сети

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

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