Не работает энкодер.
- Войдите на сайт для отправки комментариев
Вс, 09/02/2020 - 14:48
Тупо не работает энкодер. хочу просто чтобы енкодером тоже изменять заданную температуру. А он тупо не работает. На тестах Работает на ура. Ну просто не могу ничего понять. В скетче просто подставлено значение не реагирует. Кто может ПОМОГИТЕ.
#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();
}
Обратитесь к автору библиотеки энкодера - https://community.alexgyver.ru/
Дело не в библиотеке. Дело в том что я не правильно зацепил код в цикле. Я ламер и не могу пока понять как правильно.
Дело не в библиотеке. Дело в том что я не правильно зацепил код в цикле. Я ламер и не могу пока понять как правильно.
А как он должен работать?
Значение в сериал (строка 119) он выводит? Да/нет?
Больше от него ничего не требуется.
дак вот именно что нет (((. А что посоветуете?
В комментарии #1 посоветовано всё.
Ну, заведите логическую переменную - флаг, по нажатию инвертируйте его. При вращении пусть энкодер пишет в одну или другую переменную в зависимости от значения флага.
Енкодер не подает признаков. при вращении в сериал выходит только на 10 раз. Я думаю проблема в медленном выполнении цикла loop. ибо если оттуда убрать половин у то он просыпается. как ускорить или оптимизировать? Не шарю я сильно.
Искать другую библиотеку, которая по прерыванию работает.
/* Пример работы с энкодером с прерыванием. Максимальная чёткость работы в любом быдлокоде! */ #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"); }У ESP внешнее прерывание тоже на D2?
нашел такое
Прерывания могут быть присоединены к любому контактакту GPIO , за исключением GPIO 16.
у меня attachInterrupt(D7, isr, CHANGE);
Хорошо.
и че? - у меня есп32 тоже такую фигню в Сериал порт выдает при запуске... потом работать начинает.
У меня не начинает.