• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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/
 
Сверху Снизу