Вопросы по библиотеке GyverEncoder

Victor

✩✩✩✩✩✩✩
4 Ноя 2018
2
0
Собственно подключил библиотеку GyverEncoder. Загрузил пример. При компиляции получил вот такие ошибки.
 

Вложения

mechanic

★★★★✩✩✩
Команда форума
31 Июл 2018
403
202
@Victor, Но библиотека то работает с вашим девайсом ?
 

Victor

✩✩✩✩✩✩✩
4 Ноя 2018
2
0
Работает, но не правильно. При прокручивании ручки в одну сторону отображает, что ручка крутится то в одну сторону то в другую пепеременно. Типы в коде менял, не помогает. Скетч лью на Arduino UNO, энкодер вот такой модели A22 1pcs/lot Rotary Encoder Module Brick Sensor Development ky-040. До этого брал другие проэкты с сайта, всё работало отлично.

Пробовал другую библиотеку. Там всё ОК. Энкодер делает 4 тика за 1 деление.
 
Изменено:

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
357
564
Скачай самую свежую версию, там ошибок нет. Но по поводу 4 тиков - это очень странно. Возможно в старой версии был косяк, который вызывал 4 тика
 

Foxmaster

✩✩✩✩✩✩✩
9 Фев 2020
8
0
Уважаемые собратья вот проблему заимел. Терморегулятор (NODEmcu+ датчики+реле+енкодер+олед) При загрузке скетча примера при том же подключении все работает. При загрузке кода терморегулятора энкодер молчит. Помогите

C++:
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "DHT.h"
#define DHTTYPE DHT11
  #define CLK D7
  #define DT D6
  #define SW D5
#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);
float value = 10;


DHT dht (D4, DHTTYPE);
//DHT dht2 (D6, DHTTYPE);
#define DHTPIN D4
//#define DHTPIN D6
#include <Adafruit_BMP280.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET    LED_BUILTIN
#define BMP280_I2C_ADDRESS  0x76
//#include <Wire.h>
#define BLYNK_PRINT Serial
#define RELE D8
bool rele;
Adafruit_BMP280  bmp280;
const int oneWireBus = D3;
float velue;


   char auth[] = "UKL1WQF4sm4MIqqCoQpmkuktysEv9q_B";     
                                        
   char ssid[] = "Sosi"; 
    char pass[] = "12345678";

float Delta =  0.5;             // Дельта (Гистерезес) терморегулятора
float deltaT = 0.0;

OneWire oneWire(oneWireBus);
Adafruit_SSD1306 display(OLED_RESET);

DallasTemperature sensors(&oneWire);
WidgetLED led (V7);


const unsigned char myBitmap [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00,
  0xff, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0xe7, 0xf8, 0x00, 0x01, 0xc0, 0x67, 0xfc, 0x00, 0x01, 0x80,
  0x70, 0x00, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x77, 0xe0, 0x00, 0x01, 0x80, 0x77,
  0xe0, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x77, 0xfc,
  0x00, 0x01, 0x80, 0x73, 0xf8, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00,
  0x01, 0x80, 0x77, 0xe0, 0x00, 0x01, 0x80, 0x73, 0xe0, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01,
  0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x77, 0xf8, 0x00, 0x01, 0x80, 0x77, 0xf8, 0x00, 0x01, 0x80,
  0x70, 0x00, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x77, 0xe0, 0x00, 0x01, 0x9f, 0x73,
  0xe0, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x77, 0xfc,
  0x00, 0x01, 0x9f, 0x73, 0xf8, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00,
  0x01, 0x9f, 0x77, 0xe0, 0x00, 0x01, 0x9f, 0x77, 0xe0, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01,
  0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x77, 0xf8, 0x00, 0x01, 0x9f, 0x77, 0xf8, 0x00, 0x03, 0x9f,
  0x78, 0x00, 0x00, 0x07, 0x1f, 0x3c, 0x00, 0x00, 0x0e, 0x3f, 0x9c, 0x00, 0x00, 0x1c, 0xff, 0xce,
  0x00, 0x00, 0x1c, 0xff, 0xe6, 0x00, 0x00, 0x19, 0xff, 0xb7, 0x00, 0x00, 0x39, 0xff, 0x93, 0x00,
  0x00, 0x3b, 0xff, 0x93, 0x00, 0x00, 0x33, 0xff, 0xd3, 0x00, 0x00, 0x33, 0xff, 0xd3, 0x00, 0x00,
  0x3b, 0xff, 0x93, 0x00, 0x00, 0x39, 0xff, 0x97, 0x00, 0x00, 0x19, 0xff, 0xa6, 0x00, 0x00, 0x1c,
  0xff, 0xe6, 0x00, 0x00, 0x0c, 0x7f, 0xce, 0x00, 0x00, 0x06, 0x1f, 0x1c, 0x00, 0x00, 0x07, 0x80,
  0x38, 0x00, 0x00, 0x03, 0xe1, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x3f, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};







void setup()

{
  enc1.setType(TYPE2);

  pinMode(RELE, OUTPUT);
  digitalWrite(RELE, LOW);
Serial.begin(115200);
dht.begin();
//dht2.begin();
sensors.begin();
bmp280.begin(BMP280_I2C_ADDRESS);
Blynk.begin(auth, ssid, pass);

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
  //delay(200);
  display.clearDisplay();

  

}
BLYNK_CONNECTED()
{
Blynk.syncVirtual(V6);
}
BLYNK_WRITE (V6)
{
velue = param.asInt();
}

BLYNK_WRITE (V0)

{
  rele = param.asInt();
digitalWrite(RELE, rele);

}

void loop()
{
   {enc1.tick();
   GetEncoderState();

  if (enc1.isRight()) value++;        // если был поворот направо, увеличиваем на 1
  if (enc1.isLeft()) value--;         // если был поворот налево, уменьшаем на 1           
  Serial.print(value);            // выводим значение при повороте
   Serial.print("  enkoder");
   }

float temp     = bmp280.readTemperature ();   // get temperature
float pressure = bmp280.readPressure();      // get pressure

  //Serial.print("bmp280: ºC ");
// Serial.print(temp);
  // Serial.print("bmp280: pas ");
    // Serial.print(pressure);
 

float h = dht.readHumidity();
float t = dht.readTemperature();
//Serial.print("H1: ");
//Serial.print(h);
//Serial.print(" %\t");
//Serial.print("T1: ");
//Serial.print(t);
//Serial.print(" ºC ");
  sensors.requestTemperatures();
  float temperatureC = sensors.getTempCByIndex(0);

  //Serial.print(temperatureC);
   //Serial.println(" Ds18b20ºC ");

Blynk.virtualWrite(V1, t);
Blynk.virtualWrite(V3, h);
Blynk.virtualWrite(V5, temperatureC);
Blynk.virtualWrite(V8, temp);
Blynk.virtualWrite(V9, pressure/100*0.75);
Blynk.virtualWrite(V10, deltaT);

deltaT = (t+temperatureC+temp)/3;
     //Serial.print(deltaT);
     //Serial.println(" deltaTºC ");
     Serial.print(velue);
     Serial.println(" Slaider ");
 

  
  
    display.setTextSize(1);   
    display.setTextColor(WHITE);
    display.setCursor(40, 0);         
    display.print("Temperatyra");
    display.drawBitmap(0, 5,  myBitmap, 33, 60, WHITE, BLACK);
  

            display.setTextSize(2);   
            display.setTextColor(WHITE);
            display.setCursor(33, 15);
            display.print(deltaT, 1);
            display.print(":C");
            //display.display();


  display.setTextSize(2);   
  display.setTextColor(WHITE);
  display.setCursor(33, 40);
  display.print(velue, 1);
  //display.setTextSize(1);
  display.print(":Vc");
  //display.display();


if(deltaT <= velue-Delta)
{
  led.on();
  digitalWrite(RELE, LOW);
  //Serial.println(" LOW");
}
else if (deltaT >= velue+Delta)
{
  led.off();
digitalWrite(RELE, HIGH);
  //Serial.println(" HIGH ");
}




display.display();

//delay (1000);
display.clearDisplay();
Blynk.run();

}
 

Foxmaster

✩✩✩✩✩✩✩
9 Фев 2020
8
0
Вот чтобы небыло вопросов. Енкодер выдает в сериал гдето 10й поворот.

C++:
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "DHT.h"

#define DHTTYPE DHT11
  #define CLK D7
  #define DT D6
  #define SW D5
#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);

DHT dht (D4, DHTTYPE);

#define DHTPIN D4

#include <Adafruit_BMP280.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET    LED_BUILTIN
#define BMP280_I2C_ADDRESS  0x76

#define BLYNK_PRINT Serial
#define RELE D8
bool rele;
Adafruit_BMP280  bmp280;
const int oneWireBus = D3;
float velue;


   char auth[] = "UKL1WQF4sm4MIqqCoQpmkuktysEv9q_B";      
                                         
   char ssid[] = "Sosi";  
    char pass[] = "12345678";

float Delta =  0.5;             // Дельта (Гистерезес) терморегулятора
float deltaT = 0.0;

OneWire oneWire(oneWireBus);
Adafruit_SSD1306 display(OLED_RESET);

DallasTemperature sensors(&oneWire);
WidgetLED led (V7);


const unsigned char myBitmap [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00,
  0xff, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0xe7, 0xf8, 0x00, 0x01, 0xc0, 0x67, 0xfc, 0x00, 0x01, 0x80,
  0x70, 0x00, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x77, 0xe0, 0x00, 0x01, 0x80, 0x77,
  0xe0, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x77, 0xfc,
  0x00, 0x01, 0x80, 0x73, 0xf8, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00,
  0x01, 0x80, 0x77, 0xe0, 0x00, 0x01, 0x80, 0x73, 0xe0, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01,
  0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x77, 0xf8, 0x00, 0x01, 0x80, 0x77, 0xf8, 0x00, 0x01, 0x80,
  0x70, 0x00, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x77, 0xe0, 0x00, 0x01, 0x9f, 0x73,
  0xe0, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x77, 0xfc,
  0x00, 0x01, 0x9f, 0x73, 0xf8, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00,
  0x01, 0x9f, 0x77, 0xe0, 0x00, 0x01, 0x9f, 0x77, 0xe0, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01,
  0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x77, 0xf8, 0x00, 0x01, 0x9f, 0x77, 0xf8, 0x00, 0x03, 0x9f,
  0x78, 0x00, 0x00, 0x07, 0x1f, 0x3c, 0x00, 0x00, 0x0e, 0x3f, 0x9c, 0x00, 0x00, 0x1c, 0xff, 0xce,
  0x00, 0x00, 0x1c, 0xff, 0xe6, 0x00, 0x00, 0x19, 0xff, 0xb7, 0x00, 0x00, 0x39, 0xff, 0x93, 0x00,
  0x00, 0x3b, 0xff, 0x93, 0x00, 0x00, 0x33, 0xff, 0xd3, 0x00, 0x00, 0x33, 0xff, 0xd3, 0x00, 0x00,
  0x3b, 0xff, 0x93, 0x00, 0x00, 0x39, 0xff, 0x97, 0x00, 0x00, 0x19, 0xff, 0xa6, 0x00, 0x00, 0x1c,
  0xff, 0xe6, 0x00, 0x00, 0x0c, 0x7f, 0xce, 0x00, 0x00, 0x06, 0x1f, 0x1c, 0x00, 0x00, 0x07, 0x80,
  0x38, 0x00, 0x00, 0x03, 0xe1, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x3f, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};


void setup()

{
  enc1.setType(TYPE2);
  //enc1.setTickMode(AUTO);




  pinMode(RELE, OUTPUT);
  digitalWrite(RELE, LOW);
Serial.begin(115200);
dht.begin();

sensors.begin();
bmp280.begin(BMP280_I2C_ADDRESS);
Blynk.begin(auth, ssid, pass);

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();

  display.clearDisplay();


}
BLYNK_CONNECTED()
{
Blynk.syncVirtual(V6);
}
BLYNK_WRITE (V6)
{
velue = param.asInt();
}

BLYNK_WRITE (V0)

{
  rele = param.asInt();
digitalWrite(RELE, rele);

}


void loop()

{
    enc1.tick();{
    if (enc1.isTurn())Serial.println("ya rabotay");
  }

float temp     = bmp280.readTemperature ();   // get temperature
float pressure = bmp280.readPressure();      // get pressure
float h = dht.readHumidity();
float t = dht.readTemperature();
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);

Blynk.virtualWrite(V1, t);
Blynk.virtualWrite(V3, h);
Blynk.virtualWrite(V5, temperatureC);
Blynk.virtualWrite(V8, temp);
Blynk.virtualWrite(V9, pressure/100*0.75);
Blynk.virtualWrite(V10, deltaT);

deltaT = (t+temperatureC+temp)/3;
 

    display.setTextSize(1);    
    display.setTextColor(WHITE);
    display.setCursor(40, 0);          
    display.print("Temperatyra");
    display.drawBitmap(0, 5,  myBitmap, 33, 60, WHITE, BLACK);
   

            display.setTextSize(2);    
            display.setTextColor(WHITE);
            display.setCursor(33, 15);
            display.print(deltaT, 1);
            display.print(":C");
            //display.display();


  display.setTextSize(2);    
  display.setTextColor(WHITE);
  display.setCursor(33, 40);
  display.print(velue, 1);

  display.print(":Vc");



if(deltaT <= velue-Delta)
{
  led.on();
  digitalWrite(RELE, LOW);

}
else if (deltaT >= velue+Delta)
{
  led.off();
digitalWrite(RELE, HIGH);

}

display.display();

//delay (1000);
display.clearDisplay();
Blynk.run();

Serial.println("the end");
}
 

Roman-RV

★✩✩✩✩✩✩
21 Июн 2019
51
13
45
А сколько по времени один проход loop выполняется? Такое ощущение, что очень долго, а encTick() должен обрабатываться как можно чаще. Если один проход loop длится более 5 мкс , то уже пропуски энкодера
 

Foxmaster

✩✩✩✩✩✩✩
9 Фев 2020
8
0
А сколько по времени один проход loop выполняется? Такое ощущение, что очень долго, а encTick() должен обрабатываться как можно чаще. Если один проход loop длится более 5 мкс , то уже пропуски энкодера
Так и есть. Сам заметил.

19:31:59.557 -> the end
19:32:01.714 -> the end
19:32:03.821 -> the end
19:32:05.980 -> the end
19:32:08.132 -> the end

Как провести оптимизацию?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Вот только что занимался почти тем же. Добавляю в loop небольшой код, который позволяет оценить работоспособность программы, у меня получается не менее 35 тысяч циклов в секунду, это если активно крутить энкодером. а так 45к
При определенном пороге энкодер будет глючить, если не использовать прерывания. С ними будет лучше, но возможны глючик в других местах.

C++:
void loop() {
// добавлять  отсюда
  static uint32_t tm_m = 0;
  static uint32_t cnt_m = 0;
  cnt_m++;
  if ((millis() - tm_m) > 1000)
  {
    Serial.println(cnt_m);
    cnt_m = 0;
    tm_m = millis();
  }
// и до отсюда


  enc.tick();
  proc_menu();
  Motors_tick();
  Place_tick();
}
 

Mix_man

✩✩✩✩✩✩✩
21 Янв 2020
91
9
Касаемо самого первого поста. В описании ошибки написано что конструктор имеет 4 параметра которые надо ему передать при объявлении объекта, а ты ему передаешь только три.
Более добавить нечего.
 

Mix_man

✩✩✩✩✩✩✩
21 Янв 2020
91
9
А сколько по времени один проход loop выполняется? Такое ощущение, что очень долго, а encTick() должен обрабатываться как можно чаще. Если один проход loop длится более 5 мкс , то уже пропуски энкодера
Вопрос с большим количеством "но" и "если" - По времени - никто тебе не скажет. Это зависит от длины кода, и его содержания, ибо разные операции выпоняются разное время, всумме набирается время чтения кода. Можешь проверить очень легко, В конце лупа вставь Serial.print() и выводи микросекунды через micros() узнаешь сколько времени код выполняется. НО!!! вывод в сериал занимает очень много времени поэтому если в коде много вывода в порт, то Луп сильно будет тормозить. Поэтому надо четко отдуплять что ты хочешь реализовать, какова будет нагрузка на проц. и какие инструменты ты будешь юзать.

Поэтому до решения вопроса пропуска энкодера очень много вопросов.
мы же не видим картины в целом, а твоё утверждение выдернуто из контекста твоего дела. Мож ты там пару delay влупил в код и щас сетуешь на пропуски :))
 

Foxmaster

✩✩✩✩✩✩✩
9 Фев 2020
8
0
Ребяты. Демогогию розводить можна долго. Я предоставил полный код. Есть какието предложения по решению проблемы?
 

Foxmaster

✩✩✩✩✩✩✩
9 Фев 2020
8
0
8:02:33.568 -> 1
08:02:34.612 -> 1
08:02:35.694 -> 1
08:02:36.701 -> 1
08:02:37.764 -> 1
08:02:38.805 -> 1
08:02:39.873 -> 1
08:02:40.913 -> 1
08:02:41.990 -> 1
08:02:43.027 -> 1
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Жопа козырная )
Нормально цикл , как я уже писал , крутится 40К+ в секунду. У тебя явно задержки сильные. И скорее всего при обращении к блинку. Ты уверен, что тебе надо обращаться к нему 40 тыщ раз в секунду и следить за температурой с такой скоростью?
Обращайся к нему раз в 5 , 10 секунд, выше крыши будет. Скорее всего это поможет.
 

Roman-RV

★✩✩✩✩✩✩
21 Июн 2019
51
13
45
И скорее всего при обращении к блинку. Ты уверен, что тебе надо обращаться к нему 40 тыщ раз в секунду и следить за температурой с такой скоростью?
И ещё он в каждом лупе отрисовывает экран, очень затратное дело! Нужно отрисовывать если изменились данные для вывода на экран.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
@Roman-RV, Полностью поддерживаю, если изменение в разных местах идут, то достаточно завести глобальный флаг типа булеан и ставить его в тру после каждого изменения выводимых данных, а после вывода сбрасывать в фальш
 

Foxmaster

✩✩✩✩✩✩✩
9 Фев 2020
8
0
Извините конечно я это и сам понял что проблема в долгом лупе. Спасибо за подсказки. С меня кодер слабоват. Логику я понимаю и понимаю что нужна оптимизация. Можете пару примеров кинуть? или хоть чуток помочь? Ибо это только начало проекта. Еще дс18б20 будет следить за температурой теплоносителя и будет еще меню по изменению данных. проект не очень прост как для меня. никакой комерции.
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
А пример я тебе уже давал... Но могу и скопипастить опять, мне не сложно
C++:
void loop() {
// добавлять  отсюда
  static uint32_t tm_m = 0;
  static uint32_t cnt_m = 0;
  cnt_m++;
  if ((millis() - tm_m) > 1000)
  {
    Serial.println(cnt_m);
    cnt_m = 0;
    tm_m = millis();
  }
// и до отсюда


  enc.tick();
  proc_menu();
  Motors_tick();
  Place_tick();
}
Этот код увеличивает счетчик каждый цикл, а выводит его только раз в секунду... Подсказка понятна ? Если время увеличить с секунды на заданный интервал, (для минуты .. правильно, в 60 раз , как пример) то будет работать с другим интервалом. Вот эту строку поправить if ((millis() - tm_m) > 1000) на if ((millis() - tm_m) > 60000) . А вообще может и раз в 5 минут будет достаточно.

Что касается вывода на экран только при наличии изменений пример вот. Для примера будет понятно.
C++:
void PrintBalcon(int16_t T) // тестовая функция обратного вызова, печатает только измененное значение
{
  static float oldtm;
  float tm = (float)T / 16.0;
  if (oldtm != tm)
  {
    Serial.print(F("Температура на балконе: "));
    Serial.println(tm);
    oldtm = tm;
  }
}
Тут идет вывод температуры в монитор порта, если ее значение изменилось. Не люблю когда монитор порта мельтешит
oldtm значение предыдущей температуры, директива static говорит компилятору (грубо, что бы понятно было) не обнулять переменную прсле выхода из функции. tm новое значение температуры. Тут надо помнить, что точно сравниваются только целые числа, с float могут быть проблемы
и сравнивать их надо по другому, В 3-ей строчке кода идет сравнение старой и новой температур и если было изменение, то происходит вывод на экран, т.е. в монитор. И не забывать запомнить новое значение , заместо предыдущего.
Теперь о флоат. Их надо сравнивать вычитанием или умножением и округлением , приведя к целому числу.
Пример по 1-му варианту
А=1.57777777
Б=1.57777778
будут не равны, но фактически для вас это может быть одно и то же. Тогда надо из одного вычесть другое и абсолютную величину разности сравнить с какой то дельтой
если abs(А-Б)<0.001 то считаем что значения равны!
Для 2-го варианта
А=1.57777777
Б=1.57777778
Априв=округл(А*1000)=-1578
Бприв=округл(Б*1000)=-1578
далее просто сравниваем А и Б
 

Foxmaster

✩✩✩✩✩✩✩
9 Фев 2020
8
0
Все какбы перестроил переделал НОО. При передаче данных в блинк, енкодер жестко тормозит и путается.
 

Foxmaster

✩✩✩✩✩✩✩
9 Фев 2020
8
0
Вот так работает отлично. Есть у кого какие идеи?

C++:
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "DHT.h"

#define DHTTYPE DHT11
#define CLK D6
#define DT D7
#define SW D5
#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);

DHT dht (D4, DHTTYPE);

#define DHTPIN D4

#include <Adafruit_BMP280.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET    LED_BUILTIN
#define BMP280_I2C_ADDRESS  0x76

#define BLYNK_PRINT Serial
#define RELE D8
bool rele;
Adafruit_BMP280  bmp280;
const int oneWireBus = D3;
float velue =19 ;


char auth[] = "UKL1WQF4sm4MIqqCoQpmkuktysEv9q_B";

char ssid[] = "Sosi";
char pass[] = "12345678";

//BlynkTimer timer;


float Delta =  0.5;             // Дельта (Гистерезес) терморегулятора
float deltaT = 0.0;
float temp = 0.0;
float pressure = 0;
float h = 0.0;
float t = 0.0;
float temperatureC = 0.0;
float deltaT_last;
float velue_last;
uint32_t reg;
int enk;
OneWire oneWire(oneWireBus);
Adafruit_SSD1306 display(OLED_RESET);

DallasTemperature sensors(&oneWire);
WidgetLED led (V7);


const unsigned char myBitmap [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00,
  0xff, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0xe7, 0xf8, 0x00, 0x01, 0xc0, 0x67, 0xfc, 0x00, 0x01, 0x80,
  0x70, 0x00, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x77, 0xe0, 0x00, 0x01, 0x80, 0x77,
  0xe0, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x77, 0xfc,
  0x00, 0x01, 0x80, 0x73, 0xf8, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00,
  0x01, 0x80, 0x77, 0xe0, 0x00, 0x01, 0x80, 0x73, 0xe0, 0x00, 0x01, 0x80, 0x70, 0x00, 0x00, 0x01,
  0x80, 0x70, 0x00, 0x00, 0x01, 0x80, 0x77, 0xf8, 0x00, 0x01, 0x80, 0x77, 0xf8, 0x00, 0x01, 0x80,
  0x70, 0x00, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x77, 0xe0, 0x00, 0x01, 0x9f, 0x73,
  0xe0, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x77, 0xfc,
  0x00, 0x01, 0x9f, 0x73, 0xf8, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00,
  0x01, 0x9f, 0x77, 0xe0, 0x00, 0x01, 0x9f, 0x77, 0xe0, 0x00, 0x01, 0x9f, 0x70, 0x00, 0x00, 0x01,
  0x9f, 0x70, 0x00, 0x00, 0x01, 0x9f, 0x77, 0xf8, 0x00, 0x01, 0x9f, 0x77, 0xf8, 0x00, 0x03, 0x9f,
  0x78, 0x00, 0x00, 0x07, 0x1f, 0x3c, 0x00, 0x00, 0x0e, 0x3f, 0x9c, 0x00, 0x00, 0x1c, 0xff, 0xce,
  0x00, 0x00, 0x1c, 0xff, 0xe6, 0x00, 0x00, 0x19, 0xff, 0xb7, 0x00, 0x00, 0x39, 0xff, 0x93, 0x00,
  0x00, 0x3b, 0xff, 0x93, 0x00, 0x00, 0x33, 0xff, 0xd3, 0x00, 0x00, 0x33, 0xff, 0xd3, 0x00, 0x00,
  0x3b, 0xff, 0x93, 0x00, 0x00, 0x39, 0xff, 0x97, 0x00, 0x00, 0x19, 0xff, 0xa6, 0x00, 0x00, 0x1c,
  0xff, 0xe6, 0x00, 0x00, 0x0c, 0x7f, 0xce, 0x00, 0x00, 0x06, 0x1f, 0x1c, 0x00, 0x00, 0x07, 0x80,
  0x38, 0x00, 0x00, 0x03, 0xe1, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x3f, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};


void setup()

{
  enc1.setType(TYPE2);
  //enc1.setTickMode(AUTO);




  pinMode(RELE, OUTPUT);
  digitalWrite(RELE, LOW);
  Serial.begin(115200);
  dht.begin();

  sensors.begin();
  bmp280.begin(BMP280_I2C_ADDRESS);
  Blynk.begin(auth, ssid, pass);
 
 //timer.setInterval(6000L, myTimerEvent);


  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();

  display.clearDisplay();



}
//BLYNK_CONNECTED()
//{
//  Blynk.syncVirtual(V6);
//}
BLYNK_WRITE (V6)
{
  velue = param.asInt();
}

BLYNK_WRITE (V0)

{
  rele = param.asInt();
  digitalWrite(RELE, rele);

}


void myTimerEvent()
  {

if (millis() - reg >=40000){
reg = millis();
  Blynk.connect ();
  temp     = bmp280.readTemperature ();   // get temperature
  pressure = bmp280.readPressure();      // get pressure
  h = dht.readHumidity();
  t = dht.readTemperature();
  sensors.requestTemperatures();
  temperatureC = sensors.getTempCByIndex(0);
  deltaT = (t + temperatureC + temp) / 3;



 Blynk.virtualWrite(V1, t);
  Blynk.virtualWrite(V3, h);
  Blynk.virtualWrite(V5, temperatureC);
  Blynk.virtualWrite(V8, temp);
   Blynk.virtualWrite(V9, pressure / 100 * 0.75);
   Blynk.virtualWrite(V10, deltaT);
  Blynk.virtualWrite(V6, velue);
 
  Blynk.disconnect();
  //Blynk.run();
}
  }


void loop()

{
enk=velue;

  enc1.tick();
  if (enc1.isTurn()){Serial.println("ya rabotay");

  if (enc1.isRight()) enk++;
  if (enc1.isLeft()) enk--;
  velue=enk;
  Serial.println(enk);}
myTimerEvent();
  //timer.run();

  if (velue != velue_last || deltaT != deltaT_last )
  {
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(40, 0);
    display.print("Temperatyra");
    display.drawBitmap(0, 5,  myBitmap, 33, 60, WHITE, BLACK);


    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(33, 15);
    display.print(deltaT, 1);
    display.print(":C");



    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(33, 40);
    display.print(velue, 1);
    display.print(":Vc");

    deltaT_last = deltaT;
    velue_last = velue;
    Serial.println(deltaT);
    Serial.println(velue);
    display.display();
    display.clearDisplay();

  }
  if (deltaT <= velue - Delta)
  {
    led.on();
    digitalWrite(RELE, LOW);

  }
  else if (deltaT >= velue + Delta)
  {
    led.off();
    digitalWrite(RELE, HIGH);

  }
  // Serial.println(deltaT);
  // Serial.println("the end");

  //display.display();

 
 // Blynk.run();
//Serial.println("the end");

}