Разное о выращивании табака на Алтае
Вы не вошли.
Описание библиотеки для дисплея на 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;}
}
}
}
Не в сети
MAX7219 подключается к ESP следующим образом. CS=GPIO16 или любой свободный порт,CLK обязательно к GPIO14, DIN обязательно к GPO13(на этом же порту синий светодиод, который совершенно не мешает обмену данными с дисплеем).
При нажатии кнопки, разрядность отображения температуры после запятой, уменьшается на один разряд.
Не в сети
Не в сети
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);
}
Не в сети
Прикрутил к 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
}
}
Не в сети
Не в сети
Не в сети
С этой библиотекой управления MAX7219 последовательное соединение нескольких таких индикаторов, работает довольно стабильно. Последовательно, можно подключить до 7 дисплеев. При этом, частота шины SPI , желательно должна быть не выше 14 мегагерц.
#define SPI_SPEED 14000000 //SPI@14MHZ частота шины SPI
На фото, при длине соединительных проводов около 10 см, при 14 мегагерцах шины SPI , всё работает довольно стабильно. При двух дисплеях, вполне достаточно 8..12 мегагерц шины SPI.
Не в сети
#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
}
}
Не в сети
ИК приёмник VS1838B, лучше питать от стабилизатора питания процессора 3,3В. Случайные срабатывания ИК приёмника будут происходить реже, чем при питании от линии 5В. На плате Witty Cloud, есть переходное отверстие между слоями платы, там как раз +3,3В идёт со стабилизатора AMS1117 3.3v и туда хорошо вставляется ножка VS1838.
Не в сети
В конце кода, добавлена обработка кнопок 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
}
}
Не в сети
VS1838B Лист данных
Согласно VS1838B спецификации, он имеет:
ИК - пульт дистанционного управления ресивера
Встроенный фильтр на 38KHz
Совместимость с Arduino, Raspberry Pi
Простой интерфейс использовать его
Рабочее напряжение: 2.7 - 5.5V DC
Receiver Расстояние: 22 - 25 м
Инфракрасный датчик VS1838B используется в определенных схемах, единственная сложность - это строгие требования к инфракрасному свету. сигнал передатчика.
Схема включения из даташита такая. У меня, всё работает хорошо и без дополнительных фильтрующих компонентов. Первая нога (левая) VS1838B идёт на GPIO 4, вторая на массу, третья на + питания 5 В или 3,3 В.
Не в сети
Фотоприёмники брал тут.
83,01 руб. | Приемник инфракрасный GREATZT TL1838 VS1838B 1838
https://a.aliexpress.com/_etuWn6
Покупал до кучи, с другими девайсами, можно найти и подешевле.
Не в сети
Не в сети
Не в сети
Скетч простого двухканального градусника на вышеупомянутой плате. Оба 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);
}
}
Не в сети
Не в сети
Не в сети
Не в сети
Допилил сегодня код своего градусника с локальным вебсервером и автоматическим обновлением страницы/показаний датчика(каждую секунду). Содрано тут 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> °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();
}
}
Не в сети
Не в сети
Не в сети
Без светодиодного дисплея, код тоже работает. Можно сделать WiFi градусник из трёх деталей: ESP8266+DS18B20+резистор смещения(с ноги данных DS18B20 на + питания, 5..10 кОм).
Мой градусник подключён к домашнему роутеру, можно смотреть температуру на домашнем ПК/смартфоне/планшете и т.д.(все девайсы, должны быть подключены к локальной сети). Можно организовать точку доступа на смартфоне и подключать градусник непосредственно к локальной сети смартфона. Такой вариант, тоже работает.
Не в сети
Не в сети
Решил для датчиков, применять разъёмы Jack 3,5 mm.
Нашёл, нормальные не дорогие гнёзда 3,5 мм, для установки в стенку корпуса.
PJ392A 3,5 мм аудиоразъем, 3-полюсный черный стерео.
https://aliexpress.ru/item/400037621713 … 1540011655
Не в сети
Не в сети
Не в сети
Поправил код, была ошибка.
#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> °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());
}
Не в сети
На плате установлены два DC/DC преобразователя понижающих MINI560. Один на 5В(для питания esp8266), другой на 12В(для питания насоса). Такая же плата, будет стоять у меня в солнечной водогрейке на даче.
DC/DC MINI560:
https://aliexpress.ru/item/100500188660 … 2cEALw_wcB
Насос:
https://aliexpress.ru/item/33021085819. … 2cEALw_wcB
Не в сети
Питаться девайс будет от аккумуляторов/солнечных панелей с напряжением 13..24В.
Не в сети
DC/DC MINI560 довольно мощный и эффективный преобразователь. 2..3А держит довольно легко. Поэтому, от него будут ещё заряжаться телефоны на даче. Только для питания esp8266 его использовать, довольно расточительно.
Не в сети