Не работает энкодер.

Foxmaster
Offline
Зарегистрирован: 24.07.2017

Тупо не работает энкодер. хочу просто чтобы енкодером тоже изменять заданную температуру. А он тупо не работает. На тестах Работает на ура. Ну просто не могу ничего понять. В скетче просто подставлено значение не реагирует. Кто может ПОМОГИТЕ.

#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();
  
  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();

}

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Обратитесь к автору библиотеки энкодера - https://community.alexgyver.ru/

Foxmaster
Offline
Зарегистрирован: 24.07.2017

Дело не в библиотеке. Дело в том что я не правильно зацепил код в цикле. Я ламер и не могу пока понять как правильно.

SLKH
Offline
Зарегистрирован: 17.08.2015

Foxmaster пишет:

Дело не в библиотеке. Дело в том что я не правильно зацепил код в цикле. Я ламер и не могу пока понять как правильно.

А как он должен работать?

Значение в сериал (строка 119) он выводит? Да/нет?

Больше от него ничего не требуется.

Foxmaster
Offline
Зарегистрирован: 24.07.2017

дак вот именно что нет (((. А что посоветуете?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

В комментарии #1 посоветовано всё.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Ну, заведите логическую переменную - флаг, по нажатию инвертируйте его. При вращении пусть энкодер пишет в одну или другую переменную в зависимости от значения флага.

Foxmaster
Offline
Зарегистрирован: 24.07.2017

Енкодер не подает признаков. при вращении в сериал выходит только на 10 раз. Я думаю проблема в медленном выполнении цикла loop. ибо если оттуда убрать половин у то он просыпается. как ускорить или оптимизировать? Не шарю я сильно. 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Искать другую библиотеку, которая по прерыванию работает.

Foxmaster
Offline
Зарегистрирован: 24.07.2017
Делаю с прерыванием согласно примера виснет есп
/*
Пример работы с энкодером с прерыванием. Максимальная чёткость работы
в любом быдлокоде!
*/
#define CLK 2
#define DT 3
#define SW 4
#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);
void setup() {
Serial.begin(9600);
attachInterrupt(0, isr, CHANGE);    // прерывание на 2 пине! CLK у энка
}
void isr() {
enc1.tick();  // отработка в прерывании
}
void loop() {
enc1.tick();  // отработка
if (enc1.isRight()) Serial.println("Right");         // если был поворот
if (enc1.isLeft()) Serial.println("Left");
if (enc1.isRightH()) Serial.println("Right holded"); // если было удержание + поворот
if (enc1.isLeftH()) Serial.println("Left holded");
}

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

У ESP внешнее прерывание тоже на D2?

Foxmaster
Offline
Зарегистрирован: 24.07.2017

нашел такое

Прерывания могут быть присоединены к любому контактакту GPIO , за исключением GPIO 16.

у меня attachInterrupt(D7, isr, CHANGE); 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Хорошо.

Foxmaster
Offline
Зарегистрирован: 24.07.2017
 Ничего хорошего. (Покрасить и выбросить)
 
ets Jan  8 2013,rst cause:2, boot mode:(3,6)
 
load 0x4010f000, len 1392, room 16 
tail 0
chksum 0xd0
csum 0xd0
v3d128e5c
~ld
b707
Offline
Зарегистрирован: 26.05.2017

и че? - у меня есп32 тоже такую фигню в Сериал порт выдает при запуске... потом работать начинает.

Foxmaster
Offline
Зарегистрирован: 24.07.2017

У меня не начинает.