• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Курилка

glory24

Member
BK3432-это высокоинтегрированный двойной режим Bluetooth 4.2 с опцией скорости передачи данных 2Mbps.Оно интегрирует приемопередатчик РФ высокой эффективности, основной диапазон, ядро ARM9E,богатые функциональные периферийные блоки,PR-поддержанные Programmable протоколы и профили для применений BLE.Флэш-память программы делает его подходящим для пользовательских приложений
160KB программируемой флэш-памяти программ,
20 кб оперативной памяти для данных,
программный код читать защиты
рабочее напряжение от 0. 9V до 3. 6В
частота: 16 МГц кварцевый генератор тактовых импульсов; 64MHz цифровой PLL часы; кольца 32 кГц осциллятор
интерфейса и периферийных устройств: разъем JTAG, I2C и SPI, двойной интерфейсы UART, GPIO с,
мульти-канальный ШИМ; интегрированный 10-битный общего назначения, АЦП и генератор случайных чисел
-------------------------
Выгляди красиво :)
Так что, попробуем его заставить на пользу родине? :)
1. Попытаться связать его по человечески со смартфоном, через пинкод и автоматическим подключением при появлении в зоне связи между ними.
2. Связать его с модулем Bluetooth 4.0 BLE на CC2541 ( я такие уже купил 2 шт. для бесчеловечных экспериментов над ними :) )
Так я человек в этом деле темный, не образованный, мне нужны подробные инструкции.
Буду за них признателен. :)
 

2007-i

Member
Если Вы намерены реализовать проект с этими датчиками, то я никак не смогу Вам помочь. Я не имею представления о программировании :)
Но если Вам нужен термостат, то есть устройство, которое будет поддерживать заданную температуру, то таких у меня уже как у "жаби мулу" или как "дурника фантіков"
Ознакомится с их работой можно тут. Вход на сервис по ссылке "демонтрация"
Посмотреть вложение 9874
Как это сделать, есть подробная видеоинструкция в виде целого сериал :) , ну и я помогу конечно :) .
Понятно, спасибо) У меня подобный умный дом только на MajorDomo.
Я хочу сам термостат реализовать именно отдельно, мало ли, может система глюканет или еще что, а это всё таки отопление. А им удаленно уже управлять.
 

nikolz

Well-known member
Если Вы намерены реализовать проект с этими датчиками, то я никак не смогу Вам помочь. Я не имею представления о программировании :)
Но если Вам нужен термостат, то есть устройство, которое будет поддерживать заданную температуру, то таких у меня уже как у "жаби мулу" или как "дурника фантіков"
Ознакомится с их работой можно тут. Вход на сервис по ссылке "демонтрация"
Посмотреть вложение 9874
Как это сделать, есть подробная видеоинструкция в виде целого сериал :) , ну и я помогу конечно :) .
посмотрел Вашу инструкцию.
попробуйте плоский цветной кабель. (цена в России 50 руб за 1 метр 10 жил) Отделяете сколько надо жил .
1600244823730.png
 

esp340

Active member
Я так понимаю можно создать новый заголовочный файл DHT22.h, подключить его на первой вкладке вместо bme280.h и с ней работать, а вкладку с bme временно отключить.
Проблема с самим кодом для dht.
Ничего сложного в замене быть не должно. Подключите библиотеку для DHT и посмотрите примеры.
 

2007-i

Member
Ничего сложного в замене быть не должно. Подключите библиотеку для DHT и посмотрите примеры.
/*
Version:
- 1.00 - starting point, old code with SH1106
- 1.01 - code was cleaned, 4th button added - PB Minus, PB Plus, PB Enter, PB Escape
- 1.02 - split the code, add BME280
- 1.03 - add PID controller and ThermoElectricalValve output

*/
#define MP_DEBUG // comment if you don't need the debug

#include <Arduino.h>
#include <U8g2lib.h>
#include <PID_v1.h>
#include <Bounce2.h>
//#include "BME280.h"
#include "ThermoElectricValve.h"
#include "MP_Polygon.h"

#include "DHT.h"
#include "DHT22.h"
#define DHTPIN 2
#define DHTTYPE DHT22
//DHT dht(DHTPIN, DHTTYPE);

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#define SDA 4
#define SCL 14

MP_DHT22 tempSensor; //i2c address; minimal sample time

// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA);


Bounce debouncerUp = Bounce();
Bounce debouncerDown = Bounce();
Bounce debouncerEnter = Bounce();

int buttonPinUp = 2;
int buttonPinDown = 0;
int buttonPinEnter = 12;
int buttonPinEsc = 13;
int debaunceTime = 20;

double SP = 22.0, PV = 22.0, MV = 0.0; // PID
//Define the aggressive and conservative Tuning Parameters
double aggKp=4, aggKi=0.2, aggKd=1;
double consKp=1, consKi=0.05, consKd=0.25;

PID myPID(&PV, &MV, &SP, consKp, consKi, consKd, DIRECT);
//ThermoElectricValve(float _setpoint, int _relayPin, bool invertedRelay)
//ThermoElectricValve valve(15, 0); // SSR PIN
ThermoElectricValve valve(16, 1); // ONBOARD LED FOR TEST

double scaledMV = MV;

int packet;
int voltage;

unsigned long lastMillis, startMillis, buttonMillis, currentMillis, lastUpdateDisplay;
float actTemp = 22.75;
float lastTemp = actTemp;
float setTemp = 22.0;
uint8_t actHum = 50;
uint16_t actPressure = 1014;
bool lastButtonUp, lastButtonDown, lastButtonEnter;
bool stateButtonUp, stateButtonDown, stateButtonEnter;
bool displayOn=0;

void setup(void)
{
Serial.begin(9600);
Wire.begin(SDA, SCL);
u8g2.begin();
u8g2.enableUTF8Print();
//tempSensor.Initiate();
pinMode(buttonPinEnter, INPUT_PULLUP);
pinMode(buttonPinUp, INPUT_PULLUP);
pinMode(buttonPinDown, INPUT_PULLUP);
debouncerUp.attach(buttonPinUp);
debouncerDown.attach(buttonPinDown);
debouncerEnter.attach(buttonPinEnter);
debouncerUp.interval(debaunceTime);
debouncerDown.interval(debaunceTime);
debouncerEnter.interval(debaunceTime);
updateDisplay();
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits(0, 100);
}

void updateDisplay()
{
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_t0_11_tf);
u8g2.drawStr(0,8,"12:24");

u8g2.setCursor(100, 8);
u8g2.print(actHum);
u8g2.print(" %");

u8g2.setCursor(80, 63);
u8g2.print(actPressure);
u8g2.print(" hPa");

u8g2.setCursor(0, 20);
u8g2.print("T");
u8g2.setFont(u8g2_font_u8glib_4_tf);
u8g2.print("SET ");

u8g2.setFont(u8g2_font_logisoso16_tf);
u8g2.setCursor(0, 44);
u8g2.print(setTemp, 1);

u8g2.setFont(u8g2_font_t0_11_tf);
u8g2.setCursor(44, 8);
//u8g2.print(lastMillis);
u8g2.print(MV);
u8g2.print("/");
u8g2.print(scaledMV);
// u8g2.print(" ms"); // requires enableUTF8Print()

u8g2.drawHLine(0, 10, 130);
u8g2.drawHLine(0, 50, (int)scaledMV*128/100); //Progress bar - valve output
u8g2.drawHLine(0, 51, (int)MV*128/100); //Progress bar - valve output
u8g2.drawHLine(0, 52, 130);
u8g2.setFont(u8g2_font_logisoso24_tf);
u8g2.setCursor(66, 44);
u8g2.print(actTemp, 1);
//u8g2.print("°C"); // requires enableUTF8Print()

u8g2.setFont(u8g2_font_t0_11_tf);
u8g2.setCursor(1, 62);

// u8g2.setFontMode(1); // 0=solid, 1=transparent
if(actTemp>setTemp)
{
u8g2.drawBox(28,53,27,11);
u8g2.setFontMode(1);
u8g2.setDrawColor(2);
u8g2.print("Heat Cool");
}
else
{
u8g2.drawBox(0,53,27,11);
u8g2.setFontMode(1);
u8g2.setDrawColor(2);
u8g2.print("Heat Cool");
}

} while ( u8g2.nextPage() );

}

void updateSetpoint()
{
u8g2.firstPage();
do
{
u8g2.setFont(u8g2_font_logisoso50_tf);
u8g2.setCursor(7, 57);
u8g2.print(setTemp, 1);
} while ( u8g2.nextPage() );
}

void loop(void)
{
// GET DATA FROM SENSOR
lastTemp = actTemp;
actTemp = tempSensor.getTemperature();
actHum = (int)tempSensor.getHumidity();
actPressure = (int)tempSensor.getPressure();

if(actTemp != actTemp) //NaN
{
actTemp = lastTemp;
}

// PID BEBIN ******************************************************
PV = actTemp;
SP = setTemp;

double gap = abs(SP-PV); //distance away from setpoint
if (gap < 0.25)
{ //we're close to setpoint, use conservative tuning parameters
myPID.SetTunings(consKp, consKi, consKd);
}
else
{
//we're far from setpoint, use aggressive tuning parameters
myPID.SetTunings(aggKp, aggKi, aggKd);
}

myPID.Compute();
scaledMV = MP_Polygon(MV, 0, 5, 95, 100, 0, 2, 8, 100);
valve.Update(scaledMV);
// END PID ********************************************************

if (debouncerUp.update())
{
// Get the update value.
stateButtonUp = debouncerUp.read();
// Send in the new value.
if(stateButtonUp == LOW)
{
buttonMillis=millis();
if(displayOn)
{
setTemp += 0.5;
updateSetpoint();
}
}
}
if (debouncerDown.update())
{
// Get the update value.
stateButtonDown = debouncerDown.read();
// Send in the new value.
if(stateButtonDown == LOW)
{
buttonMillis=millis();
if(displayOn)
{
setTemp -= 0.5;
updateSetpoint();
}
}
}
if (debouncerEnter.update())
{
// Get the update value.
stateButtonEnter = debouncerEnter.read();
// Send in the new value.
if(stateButtonEnter == LOW)
{
buttonMillis=millis();
}
}

startMillis = millis();
lastMillis = millis() - startMillis;

if(millis() - buttonMillis > 60000)
{
if(displayOn)
{
u8g2.setPowerSave(1);
displayOn = 0;
}
}
else
{
if(!displayOn)
{
u8g2.setPowerSave(0);
displayOn = 1;
}
}
if(millis() - buttonMillis > 1000 && millis() - lastUpdateDisplay > 1000 && displayOn)
{
updateDisplay();
lastUpdateDisplay = millis();
}

}

Ругается на 35 строку MP_DHT22 tempSensor; //i2c address; minimal sample time
no matching function for call to 'MP_DHT22::MP_DHT22()'
Пока на этом застрял.
 

2007-i

Member
заголовочный файл DHT22.h

#include <Adafruit_Sensor.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

class MP_DHT22
{
//Adafruit_BME280 bme; // I2C
//int BME280address;
float temperature = 0.0, humidity = 0.0;
uint32_t lastReading = 0;
uint32_t refreshTime = 0;

public:
MP_DHT22(uint32_t _refresh)
//{
//Serial.println(F("BME280 test"));
//BME280address = _address;
//refreshTime = _refresh;
//}

void Update()
{
if(millis() - lastReading > refreshTime)
{
temperature = dht.readTemperature();
//pressure = dht.readPressure() / 100.0F;
humidity = dht.readHumidity();
lastReading = millis();
}
}

float getTemperature()
{
Update();
return temperature;
}

float getHumidity()
{
Update();
return humidity;
}


void printValues() {
Serial.print("Temperature = ");
Serial.print(dht.readTemperature());
Serial.println(" *C");

//Serial.print("Pressure = ");

//Serial.print(dht.readPressure() / 100.0F);
//Serial.println(" hPa");

Serial.print("Humidity = ");
Serial.print(dht.readHumidity());
Serial.println(" %");

Serial.println();
}
};
 

esp340

Active member
Пока на этом застрял.
Попробуйте так

C++:
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

#define DHTPIN 3     // Digital pin connected to the DHT sensor
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.

// Uncomment the type of sensor in use:

#define DHTTYPE    DHT22     // DHT 22 (AM2302)


DHT_Unified tempSensor(DHTPIN, DHTTYPE);
#define MP_DEBUG // comment if you don't need the debug

#include <Arduino.h>
#include <U8g2lib.h>
#include <PID_v1.h>
#include <Bounce2.h>

#include "ThermoElectricValve.h"
#include "MP_Polygon.h"


#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#define SDA 4
#define SCL 14

//MP_DHT22 tempSensor; //i2c address; minimal sample time

// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA);


Bounce debouncerUp = Bounce();
Bounce debouncerDown = Bounce();
Bounce debouncerEnter = Bounce();

int buttonPinUp = 2;
int buttonPinDown = 0;
int buttonPinEnter = 12;
int buttonPinEsc = 13;
int debaunceTime = 20;

double SP = 22.0, PV = 22.0, MV = 0.0; // PID
//Define the aggressive and conservative Tuning Parameters
double aggKp=4, aggKi=0.2, aggKd=1;
double consKp=1, consKi=0.05, consKd=0.25;

PID myPID(&PV, &MV, &SP, consKp, consKi, consKd, DIRECT);
//ThermoElectricValve(float _setpoint, int _relayPin, bool invertedRelay)
//ThermoElectricValve valve(15, 0); // SSR PIN
ThermoElectricValve valve(16, 1); // ONBOARD LED FOR TEST

double scaledMV = MV;

int packet;
int voltage;

unsigned long lastMillis, startMillis, buttonMillis, currentMillis, lastUpdateDisplay;
float actTemp = 22.75;
float lastTemp = actTemp;
float setTemp = 22.0;
uint8_t actHum = 50;
uint16_t actPressure = 1014;
bool lastButtonUp, lastButtonDown, lastButtonEnter;
bool stateButtonUp, stateButtonDown, stateButtonEnter;
bool displayOn=0;

void setup(void)
{
Serial.begin(9600);
Wire.begin(SDA, SCL);
u8g2.begin();
u8g2.enableUTF8Print();
tempSensor.begin();
pinMode(buttonPinEnter, INPUT_PULLUP);
pinMode(buttonPinUp, INPUT_PULLUP);
pinMode(buttonPinDown, INPUT_PULLUP);
debouncerUp.attach(buttonPinUp);
debouncerDown.attach(buttonPinDown);
debouncerEnter.attach(buttonPinEnter);
debouncerUp.interval(debaunceTime);
debouncerDown.interval(debaunceTime);
debouncerEnter.interval(debaunceTime);
updateDisplay();
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits(0, 100);
}

void updateDisplay()
{
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_t0_11_tf);
u8g2.drawStr(0,8,"12:24");

u8g2.setCursor(100, 8);
u8g2.print(actHum);
u8g2.print(" %");

u8g2.setCursor(80, 63);
u8g2.print(actPressure);
u8g2.print(" hPa");

u8g2.setCursor(0, 20);
u8g2.print("T");
u8g2.setFont(u8g2_font_u8glib_4_tf);
u8g2.print("SET ");

u8g2.setFont(u8g2_font_logisoso16_tf);
u8g2.setCursor(0, 44);
u8g2.print(setTemp, 1);

u8g2.setFont(u8g2_font_t0_11_tf);
u8g2.setCursor(44, 8);
//u8g2.print(lastMillis);
u8g2.print(MV);
u8g2.print("/");
u8g2.print(scaledMV);
// u8g2.print(" ms"); // requires enableUTF8Print()

u8g2.drawHLine(0, 10, 130);
u8g2.drawHLine(0, 50, (int)scaledMV*128/100); //Progress bar - valve output
u8g2.drawHLine(0, 51, (int)MV*128/100); //Progress bar - valve output
u8g2.drawHLine(0, 52, 130);
u8g2.setFont(u8g2_font_logisoso24_tf);
u8g2.setCursor(66, 44);
u8g2.print(actTemp, 1);
//u8g2.print("°C"); // requires enableUTF8Print()

u8g2.setFont(u8g2_font_t0_11_tf);
u8g2.setCursor(1, 62);

// u8g2.setFontMode(1); // 0=solid, 1=transparent
if(actTemp>setTemp)
{
u8g2.drawBox(28,53,27,11);
u8g2.setFontMode(1);
u8g2.setDrawColor(2);
u8g2.print("Heat Cool");
}
else
{
u8g2.drawBox(0,53,27,11);
u8g2.setFontMode(1);
u8g2.setDrawColor(2);
u8g2.print("Heat Cool");
}

} while ( u8g2.nextPage() );

}

void updateSetpoint()
{
u8g2.firstPage();
do
{
u8g2.setFont(u8g2_font_logisoso50_tf);
u8g2.setCursor(7, 57);
u8g2.print(setTemp, 1);
} while ( u8g2.nextPage() );
}

void loop(void)
{
// GET DATA FROM SENSOR
lastTemp = actTemp;
actTemp = tempSensor.getTemperature();
actHum = (int)tempSensor.getHumidity();
//actPressure = (int)tempSensor.getPressure();

if(actTemp != actTemp) //NaN
{
actTemp = lastTemp;
}

// PID BEBIN ******************************************************
PV = actTemp;
SP = setTemp;

double gap = abs(SP-PV); //distance away from setpoint
if (gap < 0.25)
{ //we're close to setpoint, use conservative tuning parameters
myPID.SetTunings(consKp, consKi, consKd);
}
else
{
//we're far from setpoint, use aggressive tuning parameters
myPID.SetTunings(aggKp, aggKi, aggKd);
}

myPID.Compute();
scaledMV = MP_Polygon(MV, 0, 5, 95, 100, 0, 2, 8, 100);
valve.Update(scaledMV);
// END PID ********************************************************

if (debouncerUp.update())
{
// Get the update value.
stateButtonUp = debouncerUp.read();
// Send in the new value.
if(stateButtonUp == LOW)
{
buttonMillis=millis();
if(displayOn)
{
setTemp += 0.5;
updateSetpoint();
}
}
}
if (debouncerDown.update())
{
// Get the update value.
stateButtonDown = debouncerDown.read();
// Send in the new value.
if(stateButtonDown == LOW)
{
buttonMillis=millis();
if(displayOn)
{
setTemp -= 0.5;
updateSetpoint();
}
}
}
if (debouncerEnter.update())
{
// Get the update value.
stateButtonEnter = debouncerEnter.read();
// Send in the new value.
if(stateButtonEnter == LOW)
{
buttonMillis=millis();
}
}

startMillis = millis();
lastMillis = millis() - startMillis;

if(millis() - buttonMillis > 60000)
{
if(displayOn)
{
u8g2.setPowerSave(1);
displayOn = 0;
}
}
else
{
if(!displayOn)
{
u8g2.setPowerSave(0);
displayOn = 1;
}
}
if(millis() - buttonMillis > 1000 && millis() - lastUpdateDisplay > 1000 && displayOn)
{
updateDisplay();
lastUpdateDisplay = millis();
}

}
 

2007-i

Member
Попробуйте так

C++:
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

#define DHTPIN 3     // Digital pin connected to the DHT sensor
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.

// Uncomment the type of sensor in use:

#define DHTTYPE    DHT22     // DHT 22 (AM2302)


DHT_Unified tempSensor(DHTPIN, DHTTYPE);
#define MP_DEBUG // comment if you don't need the debug

#include <Arduino.h>
#include <U8g2lib.h>
#include <PID_v1.h>
#include <Bounce2.h>

#include "ThermoElectricValve.h"
#include "MP_Polygon.h"


#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#define SDA 4
#define SCL 14

//MP_DHT22 tempSensor; //i2c address; minimal sample time

// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA);


Bounce debouncerUp = Bounce();
Bounce debouncerDown = Bounce();
Bounce debouncerEnter = Bounce();

int buttonPinUp = 2;
int buttonPinDown = 0;
int buttonPinEnter = 12;
int buttonPinEsc = 13;
int debaunceTime = 20;

double SP = 22.0, PV = 22.0, MV = 0.0; // PID
//Define the aggressive and conservative Tuning Parameters
double aggKp=4, aggKi=0.2, aggKd=1;
double consKp=1, consKi=0.05, consKd=0.25;

PID myPID(&PV, &MV, &SP, consKp, consKi, consKd, DIRECT);
//ThermoElectricValve(float _setpoint, int _relayPin, bool invertedRelay)
//ThermoElectricValve valve(15, 0); // SSR PIN
ThermoElectricValve valve(16, 1); // ONBOARD LED FOR TEST

double scaledMV = MV;

int packet;
int voltage;

unsigned long lastMillis, startMillis, buttonMillis, currentMillis, lastUpdateDisplay;
float actTemp = 22.75;
float lastTemp = actTemp;
float setTemp = 22.0;
uint8_t actHum = 50;
uint16_t actPressure = 1014;
bool lastButtonUp, lastButtonDown, lastButtonEnter;
bool stateButtonUp, stateButtonDown, stateButtonEnter;
bool displayOn=0;

void setup(void)
{
Serial.begin(9600);
Wire.begin(SDA, SCL);
u8g2.begin();
u8g2.enableUTF8Print();
tempSensor.begin();
pinMode(buttonPinEnter, INPUT_PULLUP);
pinMode(buttonPinUp, INPUT_PULLUP);
pinMode(buttonPinDown, INPUT_PULLUP);
debouncerUp.attach(buttonPinUp);
debouncerDown.attach(buttonPinDown);
debouncerEnter.attach(buttonPinEnter);
debouncerUp.interval(debaunceTime);
debouncerDown.interval(debaunceTime);
debouncerEnter.interval(debaunceTime);
updateDisplay();
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits(0, 100);
}

void updateDisplay()
{
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_t0_11_tf);
u8g2.drawStr(0,8,"12:24");

u8g2.setCursor(100, 8);
u8g2.print(actHum);
u8g2.print(" %");

u8g2.setCursor(80, 63);
u8g2.print(actPressure);
u8g2.print(" hPa");

u8g2.setCursor(0, 20);
u8g2.print("T");
u8g2.setFont(u8g2_font_u8glib_4_tf);
u8g2.print("SET ");

u8g2.setFont(u8g2_font_logisoso16_tf);
u8g2.setCursor(0, 44);
u8g2.print(setTemp, 1);

u8g2.setFont(u8g2_font_t0_11_tf);
u8g2.setCursor(44, 8);
//u8g2.print(lastMillis);
u8g2.print(MV);
u8g2.print("/");
u8g2.print(scaledMV);
// u8g2.print(" ms"); // requires enableUTF8Print()

u8g2.drawHLine(0, 10, 130);
u8g2.drawHLine(0, 50, (int)scaledMV*128/100); //Progress bar - valve output
u8g2.drawHLine(0, 51, (int)MV*128/100); //Progress bar - valve output
u8g2.drawHLine(0, 52, 130);
u8g2.setFont(u8g2_font_logisoso24_tf);
u8g2.setCursor(66, 44);
u8g2.print(actTemp, 1);
//u8g2.print("°C"); // requires enableUTF8Print()

u8g2.setFont(u8g2_font_t0_11_tf);
u8g2.setCursor(1, 62);

// u8g2.setFontMode(1); // 0=solid, 1=transparent
if(actTemp>setTemp)
{
u8g2.drawBox(28,53,27,11);
u8g2.setFontMode(1);
u8g2.setDrawColor(2);
u8g2.print("Heat Cool");
}
else
{
u8g2.drawBox(0,53,27,11);
u8g2.setFontMode(1);
u8g2.setDrawColor(2);
u8g2.print("Heat Cool");
}

} while ( u8g2.nextPage() );

}

void updateSetpoint()
{
u8g2.firstPage();
do
{
u8g2.setFont(u8g2_font_logisoso50_tf);
u8g2.setCursor(7, 57);
u8g2.print(setTemp, 1);
} while ( u8g2.nextPage() );
}

void loop(void)
{
// GET DATA FROM SENSOR
lastTemp = actTemp;
actTemp = tempSensor.getTemperature();
actHum = (int)tempSensor.getHumidity();
//actPressure = (int)tempSensor.getPressure();

if(actTemp != actTemp) //NaN
{
actTemp = lastTemp;
}

// PID BEBIN ******************************************************
PV = actTemp;
SP = setTemp;

double gap = abs(SP-PV); //distance away from setpoint
if (gap < 0.25)
{ //we're close to setpoint, use conservative tuning parameters
myPID.SetTunings(consKp, consKi, consKd);
}
else
{
//we're far from setpoint, use aggressive tuning parameters
myPID.SetTunings(aggKp, aggKi, aggKd);
}

myPID.Compute();
scaledMV = MP_Polygon(MV, 0, 5, 95, 100, 0, 2, 8, 100);
valve.Update(scaledMV);
// END PID ********************************************************

if (debouncerUp.update())
{
// Get the update value.
stateButtonUp = debouncerUp.read();
// Send in the new value.
if(stateButtonUp == LOW)
{
buttonMillis=millis();
if(displayOn)
{
setTemp += 0.5;
updateSetpoint();
}
}
}
if (debouncerDown.update())
{
// Get the update value.
stateButtonDown = debouncerDown.read();
// Send in the new value.
if(stateButtonDown == LOW)
{
buttonMillis=millis();
if(displayOn)
{
setTemp -= 0.5;
updateSetpoint();
}
}
}
if (debouncerEnter.update())
{
// Get the update value.
stateButtonEnter = debouncerEnter.read();
// Send in the new value.
if(stateButtonEnter == LOW)
{
buttonMillis=millis();
}
}

startMillis = millis();
lastMillis = millis() - startMillis;

if(millis() - buttonMillis > 60000)
{
if(displayOn)
{
u8g2.setPowerSave(1);
displayOn = 0;
}
}
else
{
if(!displayOn)
{
u8g2.setPowerSave(0);
displayOn = 1;
}
}
if(millis() - buttonMillis > 1000 && millis() - lastUpdateDisplay > 1000 && displayOn)
{
updateDisplay();
lastUpdateDisplay = millis();
}

}
Ошибка в 177 строке actTemp = tempSensor.getTemperature();
'class DHT_Unified' has no member named 'getTemperature'

В заголовочном файле DHT22.h не нужно ничего менять, ругается на класс DHT как понял, а он в DHT22.h
 

esp340

Active member
Ошибка в 177 строке actTemp = tempSensor.getTemperature();
'class DHT_Unified' has no member named 'getTemperature'
попробуйте заменить на
actTemp = tempSensor.readTemperature();
actHum = (int)tempSensor.readHumidity();
Возможно используются разные библиотеки. Я сейчас сам проверить не могу, т.к. у меня не установлена библиотека под индикатор. Позже дома попробую

В заголовочном файле DHT22.h не нужно ничего менять, ругается на класс DHT как понял, а он в DHT22.h
В каком заголовочном файле? Подключаете библиотеку DHT и все, больше никаких файлов
 

2007-i

Member
попробуйте заменить на
actTemp = tempSensor.readTemperature();
actHum = (int)tempSensor.readHumidity();

В каком заголовочном файле? Подключаете библиотеку DHT и все, больше никаких файлов
Заменил, ошибка
'class DHT_Unified' has no member named 'readTemperature'

Так в заглавочных файлах настройки же еще есть, посмотрите проект, там ещё файлы есть, вот у меня и не выходит, там устанавлены классы и есть математические расчеты, хотя последние не нужно трогать а наверное только BME280.h заменить.

Вот проект сам.
 

esp340

Active member
C++:
#include <Adafruit_Sensor.h>
#include <DHT.h>

#define DHTPIN 3     // Digital pin connected to the DHT sensor
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.

#define DHTTYPE    DHT22     // DHT 22 (AM2302)

#define MP_DEBUG // comment if you don't need the debug

#include <Arduino.h>
#include <U8g2lib.h>
#include <PID_v1.h>
#include <Bounce2.h>

#include "ThermoElectricValve.h"
#include "MP_Polygon.h"

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif

#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#define SDA 4
#define SCL 14

DHT tempSensor(DHTPIN, DHTTYPE);

// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA);


Bounce debouncerUp = Bounce();
Bounce debouncerDown = Bounce();
Bounce debouncerEnter = Bounce();

int buttonPinUp = 2;
int buttonPinDown = 0;
int buttonPinEnter = 12;
int buttonPinEsc = 13;
int debaunceTime = 20;

double SP = 22, PV = 22, MV = 0; // PID

//Define the aggressive and conservative Tuning Parameters
double aggKp = 4, aggKi = 0.2, aggKd = 1;
double consKp = 1, consKi = 0.05, consKd = 0.25;

PID myPID(&PV, &MV, &SP, consKp, consKi, consKd, DIRECT);
//ThermoElectricValve(float _setpoint, int _relayPin, bool invertedRelay)
//ThermoElectricValve valve(15, 0); // SSR PIN
ThermoElectricValve valve(16, 1); // ONBOARD LED FOR TEST

double scaledMV = MV;

int packet;
int voltage;

unsigned long lastMillis, startMillis, buttonMillis, currentMillis, lastUpdateDisplay;
float actTemp = 22.75;
float lastTemp = actTemp;
float setTemp = 22.0;
uint8_t actHum = 50;
uint16_t actPressure = 1014;
bool lastButtonUp, lastButtonDown, lastButtonEnter;
bool stateButtonUp, stateButtonDown, stateButtonEnter;
bool displayOn = 0;

void setup(void)
{
  Serial.begin(9600);
  Wire.begin(SDA, SCL);
  u8g2.begin();
  u8g2.enableUTF8Print();
  tempSensor.begin();
  pinMode(buttonPinEnter, INPUT_PULLUP);
  pinMode(buttonPinUp, INPUT_PULLUP);
  pinMode(buttonPinDown, INPUT_PULLUP);
  debouncerUp.attach(buttonPinUp);
  debouncerDown.attach(buttonPinDown);
  debouncerEnter.attach(buttonPinEnter);
  debouncerUp.interval(debaunceTime);
  debouncerDown.interval(debaunceTime);
  debouncerEnter.interval(debaunceTime);
  updateDisplay();
  myPID.SetMode(AUTOMATIC);
  myPID.SetOutputLimits(0, 100);
}

void updateDisplay()
{
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_t0_11_tf);
    u8g2.drawStr(0, 8, "12:24");

    u8g2.setCursor(100, 8);
    u8g2.print(actHum);
    u8g2.print(" %");

    u8g2.setCursor(80, 63);
    u8g2.print(actPressure);
    u8g2.print(" hPa");

    u8g2.setCursor(0, 20);
    u8g2.print("T");
    u8g2.setFont(u8g2_font_u8glib_4_tf);
    u8g2.print("SET ");

    u8g2.setFont(u8g2_font_logisoso16_tf);
    u8g2.setCursor(0, 44);
    u8g2.print(setTemp, 1);

    u8g2.setFont(u8g2_font_t0_11_tf);
    u8g2.setCursor(44, 8);
    //u8g2.print(lastMillis);
    u8g2.print(MV);
    u8g2.print("/");
    u8g2.print(scaledMV);
    //    u8g2.print(" ms");    // requires enableUTF8Print()

    u8g2.drawHLine(0, 10, 130);
    u8g2.drawHLine(0, 50, (int)scaledMV * 128 / 100); //Progress bar - valve output
    u8g2.drawHLine(0, 51, (int)MV * 128 / 100); //Progress bar - valve output
    u8g2.drawHLine(0, 52, 130);
    u8g2.setFont(u8g2_font_logisoso24_tf);
    u8g2.setCursor(66, 44);
    u8g2.print(actTemp, 1);
    //u8g2.print("°C");    // requires enableUTF8Print()

    u8g2.setFont(u8g2_font_t0_11_tf);
    u8g2.setCursor(1, 62);

    //    u8g2.setFontMode(1);    // 0=solid, 1=transparent
    if (actTemp > setTemp)
    {
      u8g2.drawBox(28, 53, 27, 11);
      u8g2.setFontMode(1);
      u8g2.setDrawColor(2);
      u8g2.print("Heat Cool");
    }
    else
    {
      u8g2.drawBox(0, 53, 27, 11);
      u8g2.setFontMode(1);
      u8g2.setDrawColor(2);
      u8g2.print("Heat Cool");
    }

  } while ( u8g2.nextPage() );

}

void updateSetpoint()
{
  u8g2.firstPage();
  do
  {
    u8g2.setFont(u8g2_font_logisoso50_tf);
    u8g2.setCursor(7, 57);
    u8g2.print(setTemp, 1);
  } while ( u8g2.nextPage() );
}

void loop(void)
{
  // GET DATA FROM SENSOR
  lastTemp = actTemp;
  actTemp = tempSensor.readTemperature();
  actHum = (int)tempSensor.readHumidity();
//  actPressure = (int)tempSensor.getPressure();

  if (actTemp != actTemp) //NaN
  {
    actTemp = lastTemp;
  }

  // PID BEBIN ******************************************************
  PV = actTemp;
  SP = setTemp;

  double gap = abs(SP - PV); //distance away from setpoint
  if (gap < 0.25)
  { //we're close to setpoint, use conservative tuning parameters
    myPID.SetTunings(consKp, consKi, consKd);
  }
  else
  {
    //we're far from setpoint, use aggressive tuning parameters
    myPID.SetTunings(aggKp, aggKi, aggKd);
  }

  myPID.Compute();
  scaledMV = MP_Polygon(MV, 0, 5, 95, 100, 0, 2, 8, 100);
  valve.Update(scaledMV);
  // END PID  ********************************************************

  if (debouncerUp.update())
  {
    // Get the update value.
    stateButtonUp = debouncerUp.read();
    // Send in the new value.
    if (stateButtonUp == LOW)
    {
      buttonMillis = millis();
      if (displayOn)
      {
        setTemp += 0.5;
        updateSetpoint();
      }
    }
  }
  if (debouncerDown.update())
  {
    // Get the update value.
    stateButtonDown = debouncerDown.read();
    // Send in the new value.
    if (stateButtonDown == LOW)
    {
      buttonMillis = millis();
      if (displayOn)
      {
        setTemp -= 0.5;
        updateSetpoint();
      }
    }
  }
  if (debouncerEnter.update())
  {
    // Get the update value.
    stateButtonEnter = debouncerEnter.read();
    // Send in the new value.
    if (stateButtonEnter == LOW)
    {
      buttonMillis = millis();
    }
  }

  startMillis = millis();
  lastMillis = millis() - startMillis;

  if (millis() - buttonMillis > 60000)
  {
    if (displayOn)
    {
      u8g2.setPowerSave(1);
      displayOn = 0;
    }
  }
  else
  {
    if (!displayOn)
    {
      u8g2.setPowerSave(0);
      displayOn = 1;
    }
  }
  if (millis() - buttonMillis > 1000 && millis() - lastUpdateDisplay > 1000 && displayOn)
  {
    updateDisplay();
    lastUpdateDisplay = millis();
  }

}

У меня компилируется.
 

2007-i

Member
C++:
#include <Adafruit_Sensor.h>
#include <DHT.h>

#define DHTPIN 3     // Digital pin connected to the DHT sensor
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.

#define DHTTYPE    DHT22     // DHT 22 (AM2302)

#define MP_DEBUG // comment if you don't need the debug

#include <Arduino.h>
#include <U8g2lib.h>
#include <PID_v1.h>
#include <Bounce2.h>

#include "ThermoElectricValve.h"
#include "MP_Polygon.h"

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif

#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#define SDA 4
#define SCL 14

DHT tempSensor(DHTPIN, DHTTYPE);

// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA);


Bounce debouncerUp = Bounce();
Bounce debouncerDown = Bounce();
Bounce debouncerEnter = Bounce();

int buttonPinUp = 2;
int buttonPinDown = 0;
int buttonPinEnter = 12;
int buttonPinEsc = 13;
int debaunceTime = 20;

double SP = 22, PV = 22, MV = 0; // PID

//Define the aggressive and conservative Tuning Parameters
double aggKp = 4, aggKi = 0.2, aggKd = 1;
double consKp = 1, consKi = 0.05, consKd = 0.25;

PID myPID(&PV, &MV, &SP, consKp, consKi, consKd, DIRECT);
//ThermoElectricValve(float _setpoint, int _relayPin, bool invertedRelay)
//ThermoElectricValve valve(15, 0); // SSR PIN
ThermoElectricValve valve(16, 1); // ONBOARD LED FOR TEST

double scaledMV = MV;

int packet;
int voltage;

unsigned long lastMillis, startMillis, buttonMillis, currentMillis, lastUpdateDisplay;
float actTemp = 22.75;
float lastTemp = actTemp;
float setTemp = 22.0;
uint8_t actHum = 50;
uint16_t actPressure = 1014;
bool lastButtonUp, lastButtonDown, lastButtonEnter;
bool stateButtonUp, stateButtonDown, stateButtonEnter;
bool displayOn = 0;

void setup(void)
{
  Serial.begin(9600);
  Wire.begin(SDA, SCL);
  u8g2.begin();
  u8g2.enableUTF8Print();
  tempSensor.begin();
  pinMode(buttonPinEnter, INPUT_PULLUP);
  pinMode(buttonPinUp, INPUT_PULLUP);
  pinMode(buttonPinDown, INPUT_PULLUP);
  debouncerUp.attach(buttonPinUp);
  debouncerDown.attach(buttonPinDown);
  debouncerEnter.attach(buttonPinEnter);
  debouncerUp.interval(debaunceTime);
  debouncerDown.interval(debaunceTime);
  debouncerEnter.interval(debaunceTime);
  updateDisplay();
  myPID.SetMode(AUTOMATIC);
  myPID.SetOutputLimits(0, 100);
}

void updateDisplay()
{
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_t0_11_tf);
    u8g2.drawStr(0, 8, "12:24");

    u8g2.setCursor(100, 8);
    u8g2.print(actHum);
    u8g2.print(" %");

    u8g2.setCursor(80, 63);
    u8g2.print(actPressure);
    u8g2.print(" hPa");

    u8g2.setCursor(0, 20);
    u8g2.print("T");
    u8g2.setFont(u8g2_font_u8glib_4_tf);
    u8g2.print("SET ");

    u8g2.setFont(u8g2_font_logisoso16_tf);
    u8g2.setCursor(0, 44);
    u8g2.print(setTemp, 1);

    u8g2.setFont(u8g2_font_t0_11_tf);
    u8g2.setCursor(44, 8);
    //u8g2.print(lastMillis);
    u8g2.print(MV);
    u8g2.print("/");
    u8g2.print(scaledMV);
    //    u8g2.print(" ms");    // requires enableUTF8Print()

    u8g2.drawHLine(0, 10, 130);
    u8g2.drawHLine(0, 50, (int)scaledMV * 128 / 100); //Progress bar - valve output
    u8g2.drawHLine(0, 51, (int)MV * 128 / 100); //Progress bar - valve output
    u8g2.drawHLine(0, 52, 130);
    u8g2.setFont(u8g2_font_logisoso24_tf);
    u8g2.setCursor(66, 44);
    u8g2.print(actTemp, 1);
    //u8g2.print("°C");    // requires enableUTF8Print()

    u8g2.setFont(u8g2_font_t0_11_tf);
    u8g2.setCursor(1, 62);

    //    u8g2.setFontMode(1);    // 0=solid, 1=transparent
    if (actTemp > setTemp)
    {
      u8g2.drawBox(28, 53, 27, 11);
      u8g2.setFontMode(1);
      u8g2.setDrawColor(2);
      u8g2.print("Heat Cool");
    }
    else
    {
      u8g2.drawBox(0, 53, 27, 11);
      u8g2.setFontMode(1);
      u8g2.setDrawColor(2);
      u8g2.print("Heat Cool");
    }

  } while ( u8g2.nextPage() );

}

void updateSetpoint()
{
  u8g2.firstPage();
  do
  {
    u8g2.setFont(u8g2_font_logisoso50_tf);
    u8g2.setCursor(7, 57);
    u8g2.print(setTemp, 1);
  } while ( u8g2.nextPage() );
}

void loop(void)
{
  // GET DATA FROM SENSOR
  lastTemp = actTemp;
  actTemp = tempSensor.readTemperature();
  actHum = (int)tempSensor.readHumidity();
//  actPressure = (int)tempSensor.getPressure();

  if (actTemp != actTemp) //NaN
  {
    actTemp = lastTemp;
  }

  // PID BEBIN ******************************************************
  PV = actTemp;
  SP = setTemp;

  double gap = abs(SP - PV); //distance away from setpoint
  if (gap < 0.25)
  { //we're close to setpoint, use conservative tuning parameters
    myPID.SetTunings(consKp, consKi, consKd);
  }
  else
  {
    //we're far from setpoint, use aggressive tuning parameters
    myPID.SetTunings(aggKp, aggKi, aggKd);
  }

  myPID.Compute();
  scaledMV = MP_Polygon(MV, 0, 5, 95, 100, 0, 2, 8, 100);
  valve.Update(scaledMV);
  // END PID  ********************************************************

  if (debouncerUp.update())
  {
    // Get the update value.
    stateButtonUp = debouncerUp.read();
    // Send in the new value.
    if (stateButtonUp == LOW)
    {
      buttonMillis = millis();
      if (displayOn)
      {
        setTemp += 0.5;
        updateSetpoint();
      }
    }
  }
  if (debouncerDown.update())
  {
    // Get the update value.
    stateButtonDown = debouncerDown.read();
    // Send in the new value.
    if (stateButtonDown == LOW)
    {
      buttonMillis = millis();
      if (displayOn)
      {
        setTemp -= 0.5;
        updateSetpoint();
      }
    }
  }
  if (debouncerEnter.update())
  {
    // Get the update value.
    stateButtonEnter = debouncerEnter.read();
    // Send in the new value.
    if (stateButtonEnter == LOW)
    {
      buttonMillis = millis();
    }
  }

  startMillis = millis();
  lastMillis = millis() - startMillis;

  if (millis() - buttonMillis > 60000)
  {
    if (displayOn)
    {
      u8g2.setPowerSave(1);
      displayOn = 0;
    }
  }
  else
  {
    if (!displayOn)
    {
      u8g2.setPowerSave(0);
      displayOn = 1;
    }
  }
  if (millis() - buttonMillis > 1000 && millis() - lastUpdateDisplay > 1000 && displayOn)
  {
    updateDisplay();
    lastUpdateDisplay = millis();
  }

}

У меня компилируется.
Да, скомпилировалось!
Спасибо! )
 

2007-i

Member
Файл ThermoElectricValve.h

Код:
#include <math.h>

class ThermoElectricValve
{
  int relayPin = 13;
  bool relayON;
  bool relayOFF;
  uint32_t lastMillis; 
  uint16_t counter = 0;
  uint16_t sum = 0;
  uint16_t samples = 1000;
  float actual = 0; 
  float setpoint = 0;
 
 
  public:
  ThermoElectricValve(int _relayPin, bool invertedRelay)
  {
    relayPin = _relayPin;
    relayON = !invertedRelay;
    relayOFF = invertedRelay;
    digitalWrite(relayPin, relayOFF);     // Make sure relay is off when starting up
    pinMode(relayPin, OUTPUT);            // Then set relay pins in output mode           
  }

  void Update(float _setpoint)
  {   
    setpoint = constrain(_setpoint, 0, 100) * samples / 100.0; // set the internal range to 0-1000
    if(millis() - lastMillis >= 20)
    {
      if(setpoint == 0)
      {
        digitalWrite(relayPin, relayOFF);
      }
      else
      {       
        if(setpoint >= actual)
        {
          digitalWrite(relayPin, relayON);
          sum++;
        }
        else
        {
          digitalWrite(relayPin, relayOFF);
        }
      }
      
      actual = float(samples) * sum / (counter + 1);
      
      #ifdef MY_DEBUG_MP
        Serial.print("SP: ");
        Serial.print(setpoint, 0);
        Serial.print("\tACT: ");
        Serial.println(actual, 0);       
      #endif

      
      counter++;
      if(counter>samples-1)
      {
        counter = 0;
        sum = 0;
      }
      lastMillis = millis();
    }

    
    
    
  }         
 

};
Так должен же быть сигнал на 13 пине при уменьшении-увеличении температуры? Нет почему то сигнала.
Было по умолчанию так:
Но там прописан пин в библиотеке

Код:
#include <math.h>

class ThermoElectricValve
{
  int relayPin;
  bool relayON;
  bool relayOFF;
  uint32_t lastMillis; 
  uint16_t counter = 0;
  uint16_t sum = 0;
  uint16_t samples = 1000;
  float actual = 0; 
  float setpoint = 0;
 
 
  public:
  ThermoElectricValve(int _relayPin, bool invertedRelay)
  {
    relayPin = _relayPin;
    relayON = !invertedRelay;
    relayOFF = invertedRelay;
    digitalWrite(relayPin, relayOFF);     // Make sure relay is off when starting up
    pinMode(relayPin, OUTPUT);            // Then set relay pins in output mode           
  }

  void Update(float _setpoint)
  {   
    setpoint = constrain(_setpoint, 0, 100) * samples / 100.0; // set the internal range to 0-1000
    if(millis() - lastMillis >= 20)
    {
      if(setpoint == 0)
      {
        digitalWrite(relayPin, relayOFF);
      }
      else
      {       
        if(setpoint >= actual)
        {
          digitalWrite(relayPin, relayON);
          sum++;
        }
        else
        {
          digitalWrite(relayPin, relayOFF);
        }
      }
      
      actual = float(samples) * sum / (counter + 1);
      
      #ifdef MY_DEBUG_MP
        Serial.print("SP: ");
        Serial.print(setpoint, 0);
        Serial.print("\tACT: ");
        Serial.println(actual, 0);       
      #endif

      
      counter++;
      if(counter>samples-1)
      {
        counter = 0;
        sum = 0;
      }
      lastMillis = millis();
    }

    
    
    
  }         
 

};
 

esp340

Active member
С пинами там каша. Смотрите в основном коде 13 пин назначен кнопке buttonPinEsc. Поэтому пересмотрите все и при необходимости перепропишите.

з/ы откуда вы все это берете? Вы код вообще не смотрите?
ThermoElectricValve valve(16, 1); // ONBOARD LED FOR TEST
 

2007-i

Member
С пинами там каша. Смотрите в основном коде 13 пин назначен кнопке buttonPinEsc. Поэтому пересмотрите все и при необходимости перепропишите.
Да, я поменял в основном коде 13 пин уже.
В либе стоит пин 6 по дефолту.

Код:
/********************************************************
 * PID RelayOutput Example
 * Same as basic example, except that this time, the output
 * is going to a digital pin which (we presume) is controlling
 * a relay.  the pid is designed to Output an analog value,
 * but the relay can only be On/Off.
 *
 *   to connect them together we use "time proportioning
 * control"  it's essentially a really slow version of PWM.
 * first we decide on a window size (5000mS say.) we then
 * set the pid to adjust its output between 0 and that window
 * size.  lastly, we add some logic that translates the PID
 * output into "Relay On Time" with the remainder of the
 * window being "Relay Off Time"
 ********************************************************/

#include <PID_v1.h>

#define PIN_INPUT 0
#define RELAY_PIN 6

//Define Variables we'll be connecting to
double Setpoint, Input, Output;

//Specify the links and initial tuning parameters
double Kp=2, Ki=5, Kd=1;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

int WindowSize = 5000;
unsigned long windowStartTime;

void setup()
{
  windowStartTime = millis();

  //initialize the variables we're linked to
  Setpoint = 100;

  //tell the PID to range between 0 and the full window size
  myPID.SetOutputLimits(0, WindowSize);

  //turn the PID on
  myPID.SetMode(AUTOMATIC);
}

void loop()
{
  Input = analogRead(PIN_INPUT);
  myPID.Compute();

  /************************************************
   * turn the output pin on/off based on pid output
   ************************************************/
  if (millis() - windowStartTime > WindowSize)
  { //time to shift the Relay Window
    windowStartTime += WindowSize;
  }
  if (Output < millis() - windowStartTime) digitalWrite(RELAY_PIN, HIGH);
  else digitalWrite(RELAY_PIN, LOW);

}
 

2007-i

Member
С пинами там каша. Смотрите в основном коде 13 пин назначен кнопке buttonPinEsc. Поэтому пересмотрите все и при необходимости перепропишите.

з/ы откуда вы все это берете? Вы код вообще не смотрите?
ThermoElectricValve valve(16, 1); // ONBOARD LED FOR TEST
Это я видел, но почему то не было сигнала вчера, может потому что не видел датчик температуры. Сейчас попробую снова по дефолту )
 

2007-i

Member
Всё заработало, но если температура установленная и текущая близки, реле (в моём случае пока светодиод) не просто выключается а выкл/вкл в зависимости от текущей температуры постоянно т.е. щелкает. Когда разница становится более 1~2 градусов тогда выключает нагрузку. Но это я думаю из за примененной библиотеке ПИД.
Спасибо за помощь! ) только бы еще управление сделать по MQTT или обычными get запросами.
 
лучший вариант NRf52832:
и со смартфоном и без него.
один модуль в кармане, второй на шлагбауме.
------------
В карман можно это положить:
Тежело не согласиться только брал здесь https://haustier.ua/
 
Сверху Снизу