Не работает управление с помощью энкодера

Не работает управление энкодера в основном коде по отдельности все прекрасно работает

В основном коде когда пытаешься повернуть энкодер в право то число меняется в положительную сторону, крутишь в лево тоже самое хотя должно быть на оборот.

Код управления:

#include <Encoder.h>  const int encoderPinA = 5; const int encoderPinB = 6; const int buttonPin = 4;  Encoder encoder(encoderPinA, encoderPinB);  long lastPosition = 0; int currentValue = 0; bool editing = false;  void setup() {   Serial.begin(9600);   pinMode(buttonPin, INPUT_PULLUP);   Serial.println("Нажмите кнопку для начала редактирования"); }  void loop() {   if (digitalRead(buttonPin) == LOW) {     delay(50); // антидребезг     if (digitalRead(buttonPin) == LOW) {       editing = !editing;       if (editing) {         Serial.println("Режим редактирования: вращайте энкодер");         encoder.write(0); // сбросим позицию энкодера         lastPosition = 0;       } else {         Serial.print("Значение установлено: ");         Serial.println(currentValue);       }       while (digitalRead(buttonPin) == LOW); // ждём отпускания кнопки       delay(50);     }   }    if (editing) {     long newPosition = encoder.read();     long delta = (newPosition - lastPosition) / 4; // делим на 4 для одного полного шага      if (delta != 0) {       int newValue = currentValue + delta;        // Ограничиваем диапазон от 0 до 60       if (newValue < 0) {         newValue = 0;       } else if (newValue > 60) {         newValue = 60;       }        currentValue = newValue;        Serial.print("Текущее значение: ");       Serial.println(currentValue);        lastPosition += delta * 4; // обновляем lastPosition     }   } }

Основной код:


//------ Здесь приведены все цвета которые можно менять в тексте .
//#define ST7735_BLACK       0x0000      /*   0,   0,   0 */
//#define ST7735_NAVY        0x000F      /*   0,   0, 128 */
//#define ST7735_DARKGREEN   0x03E0      /*   0, 128,   0 */
//#define ST7735_DARKCYAN    0x03EF      /*   0, 128, 128 */
//#define ST7735_MAROON      0x7800      /* 128,   0,   0 */
#define ST7735_PURPLE      0x780F      /* 128,   0, 128 */
//#define ST7735_OLIVE       0x7BE0      /* 128, 128,   0 */
//#define ST7735_LIGHTGREY   0xC618      /* 192, 192, 192 */
//#define ST7735_LIGHTGREY     0x7BEF      /* 128, 128, 128 */
//#define ST7735_BLUE        0x001F      /*   0,   0, 255 */
//#define ST7735_GREEN       0x07E0      /*   0, 255,   0 */
//#define ST7735_CYAN        0x07FF      /*   0, 255, 255 */
//#define ST7735_RED         0xF800      /* 255,   0,   0 */
//#define ST7735_MAGENTA     0xF81F      /* 255,   0, 255 */
//#define ST7735_YELLOW      0xFFE0      /* 255, 255,   0 */
//#define ST7735_WHITE       0xFFFF      /* 255, 255, 255 */
//#define ST7735_ORANGE      0xFD20      /* 255, 165,   0 */
//#define ST7735_GREENYELLOW 0xAFE5      /* 173, 255,  47 */
//#define ST7735_PINK        0xF81F 
//------
//------Добавляем все необходимые библиотеки

const int encoderPinA = 5;
const int encoderPinB = 6;
const int  SW= 4;

#include <Encoder.h>
#include <SPI.h>
#include <TFT_ST7735.h> 
#include <Wire.h>
#include <Adafruit_ADS1X15.h> 
//------
#define TFT_CS 10 // Chip select control pin
#define TFT_DC  7  // Data Command control pin
#define TFT_RST 9

Encoder encoder(encoderPinA, encoderPinB);
 Adafruit_ADS1115 ads;              //  Выбираем необходимый модуль АЦП, можно выбрать между asd1115  или  ads1015.                   //  Указываем номер ножки, куда подключено датчик температуры 18b20.

 TFT_ST7735 tft = TFT_ST7735();
  //Adafruit_ST7735_AS tft = Adafruit_ST7735_AS(cs, dc, rst);
 //------Место для настроек.
  float  V_max = 35 ;   // При изменении этого значения нужно сделать расчет  делителя напряжения и учесть коэффициент усиления АЦП.  K = Vin / Vацп. K-коэффициент делителя напряжения ,Vin-максимально измеряемое напряжение, Vацп-напряжение усиления АЦП   K=35/1.024 K=34,17.             
  float  A_max = 5.12; // Этот параметр настраивается программно. I=U/R    U= 1.024 усиления АЦП  , R=0.2 сопротивление шунта.    I=1.024 / 0.2 ,  I= 5.12 A. 
  float  Temp_min = 30 ; // Минимальная температура при которой начнет работать ШИМ вентилятора.
  float  Temp_max = 60 ; // Температура при которой скорость вентилятора будет максимальной.
 //------
 //-------Здесь хранятся все переменные
 float  ASP = 32768 ;// // Переміна розрядності  
 float  V , A , W , Wh ;
 float  fil_A ,fil_V ;
 float  adc_V , adc_A;
 int    V_graf , A_graf;
 int var, var2, var3, var4;
 unsigned long  new_Millis ;
   // переменные фильтра для калмана.
    float varVolt = 40;  // среднее отклонение (ищем в excel)
    float varProcess = 15; // скорость реакции на изменение (подбирается вручную)
    float Pc = 0.0;
    float G = 0.0;
    float P = 1.0;
    float Xp = 0.0;
    float Zp = 0.0;
    float Xe = 0.0;
    unsigned long startTime;
    unsigned long duration = 5000;
   // переменные фильтра  для калмана.
 //------
  long lastPosition = 0;
  int currentValue = 0;
  bool editing = false;


void setup()
{
  Serial.begin(9600);
  pinMode(SW, INPUT_PULLUP);
 //----- Здесь можно выбрать коэффициент усиления АЦП
  //                                                              ADS1015  ADS1115
  //                                                              -------  -------
    // ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  
 //ads.setGain(GAIN_ONE);         // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
   //ads.setGain(GAIN_TWO);         // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
 ads.setGain(GAIN_FOUR);        // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV
 //-----
   //uint16_t config = ADS1015_REG_CONFIG_DR_128SPS; // настройка скорости АЦП.   
   ads.begin();                // Инициализация модуля АЦП. 
   tft.init();                 // Инициализация дисплея.
   tft.setRotation(1);         // Переворачиваем дисплей. 
   tft.fillScreen(TFT_BLACK);  // Указываем цвет заливки дисплея
//-----В этом месте все статические данные, которые будут отображаться на дисплее.
    //----- Рисуем рамку. 
     // ( цвет текста , цвет заливки текста )

  tft.fillRect(-1, -2,160, 128, ST7735_LIGHTGREY);
  tft.fillRect(2, 1, 154, 122, ST7735_BLACK);
  tft.fillRect(-1, 109, 160, 3, ST7735_LIGHTGREY);
     //----- Отображение символов величин. 
     tft.setTextColor(ST7735_RED,ST7735_BLACK);       // ( цвет текста , цвет заливки текста )
     tft.drawRightString("Amp", 145, 8, 2);           // ( "Текст" , положение по оси Х , положение по оси Y , размер шрифта)  
     tft.setTextColor(ST7735_YELLOW,ST7735_BLACK  );
     tft.drawRightString("Watt", 147, 85, 2);
     tft.setTextColor(ST7735_ORANGE,ST7735_BLACK);
     tft.drawRightString("VasyaMalyar",115, 114, 1);
      
 
//-----
   
  new_Millis = millis();  

  delay (1000);

} 

void loop()
{
  if (digitalRead(SW) == LOW) {
    delay(50); // антидребезг
    if (digitalRead(SW) == LOW) {
      editing = !editing;
      if (editing) {
        Serial.println("Режим редактирования: вращайте энкодер");
        encoder.write(0); // сбросим позицию энкодера
        lastPosition = 0;
      } else {
        Serial.print("Значение установлено: ");
        Serial.println(currentValue);
      }
      while (digitalRead(SW) == LOW); // ждём отпускания кнопки
      delay(50);
    }
  }

  if (editing) {
    long newPosition = encoder.read();
    long delta = (newPosition - lastPosition) / 4; // делим на 4 для одного полного шага

    if (delta != 0) {
      int newValue = currentValue + delta;

      // Ограничиваем диапазон от 0 до 60
      if (newValue < 0) {
        newValue = 0;
      } else if (newValue > 60) {
        newValue = 60;
      }

      currentValue = newValue;

      Serial.print("Текущее значение: ");
      Serial.println(currentValue);

      lastPosition += delta * 4; // обновляем lastPosition
    }
  }

      adc_V = 20000;
      adc_A = 30000;

  
  // fil_V = filter(adc_V);
   fil_V = adc_V;
   fil_A = adc_A;
  
 //----- Расчет и отображение всех динамических данных.
    V = fil_V * V_max / ASP;
   A = fil_A * A_max / ASP;
  if ( A<0) {A=0;}
  if (V<0) {V=0;}



 W = A * V;

  char V_out[7]; dtostrf( V , 5, 2, V_out);
  char W_out[8]; dtostrf( W , 3, 2, W_out);
  char A_out[8]; dtostrf( A , 7, 2, A_out);

    tft.setTextColor( ST7735_WHITE,ST7735_BLACK); 
    tft.drawRightString(V_out,140, 35, 6);
        if (V < 0)  {
          tft.drawRightString("  ",35, 35, 6);
          }

    tft.setTextColor(ST7735_RED,ST7735_BLACK );
    tft.drawRightString(A_out, 110, 7, 4);
    tft.setTextColor(ST7735_YELLOW,ST7735_BLACK );
    tft.drawRightString(W_out,110, 83, 4);
        if (W < 0)  { 
          tft.drawRightString("  ",46, 83, 4);
          } 
                         
    tft.setTextColor(ST7735_ORANGE,ST7735_BLACK);
    tft.setTextColor(ST7735_ORANGE,ST7735_BLACK);

 //-----       
   //----- Отображение шкал заполнения.      
          V_graf = V / V_max * 100 ;
  if (V_graf < 0) {V_graf = -V_graf;}
  tft.fillRect(5, 5, 4, 100- V_graf, ST7735_BLACK);
  tft.fillRect(5, 105 - V_graf, 4, V_graf+1, ST7735_WHITE);

  A_graf = A / A_max * 100 ;
  if (A_graf < 0) {A_graf = -A_graf;}
  tft.fillRect(150, 6, 4, 100- A_graf, ST7735_BLACK);
  tft.fillRect(150, 106 - A_graf, 4, A_graf+1, ST7735_RED);

}
    float filter(float val) {  //функция фильтрации
  Pc = P + varProcess;
  G = Pc/(Pc + varVolt);
  P = (1-G)*Pc;
  Xp = Xe;
  Zp = Xp;
  Xe = G*(val-Zp)+Xp; // "фильтрованное" значение
  return(Xe); 
   }


Помогите с кодом. Буду Благодарен)

не в той теме, надеюсь перенесут:

/******* Простой энкодер *******/
#define PIN_ENCODER1 6
#define PIN_ENCODER2 7
#include <util/atomic.h> // для атомарности чтения данных в прерываниях
#include “RotaryEncoder.h” // https://www.arduino.cc/reference/en/libraries/rotaryencoder/
RotaryEncoder encoder(PIN_ENCODER1, PIN_ENCODER2);

volatile int newEncoderPos; // новая позиция энкодера
static int currentEncoderPos = 0; // текущая позиция энкодера
/*** Обработчик прерывания для энкодера ***/
ISR(PCINT2_vect) {
encoder.tick();
}

// функция выбора времени работы
void setTimer() {
// если энкодер крутим по часовой
if (newEncoderPos - currentEncoderPos > 0) {
if (timerPosition == maxTimers - 1) {
timerPosition = 0;
} else {
timerPosition += 1;
}
} else if (newEncoderPos - currentEncoderPos < 0) {
// если энкодер крутим против часовой
if (timerPosition == 0) {
timerPosition = maxTimers - 1;
} else {
timerPosition -= 1;
}
}
memTimers = availableTimers[timerPosition];
}


вставьте код управления нормально, он у вас в одну строчку свернулся

#include <Encoder.h>

const int encoderPinA = 5;
const int encoderPinB = 6;
const int buttonPin = 4;

Encoder encoder(encoderPinA, encoderPinB);

long lastPosition = 0;
int currentValue = 0;
bool editing = false;

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.println("Нажмите кнопку для начала редактирования");
}

void loop() {
  if (digitalRead(buttonPin) == LOW) {
    delay(50); // антидребезг
    if (digitalRead(buttonPin) == LOW) {
      editing = !editing;
      if (editing) {
        Serial.println("Режим редактирования: вращайте энкодер");
        encoder.write(0); // сбросим позицию энкодера
        lastPosition = 0;
      } else {
        Serial.print("Значение установлено: ");
        Serial.println(currentValue);
      }
      while (digitalRead(buttonPin) == LOW); // ждём отпускания кнопки
      delay(50);
    }
  }

  if (editing) {
    long newPosition = encoder.read();
    long delta = (newPosition - lastPosition) / 4; // делим на 4 для одного полного шага

    if (delta != 0) {
      int newValue = currentValue + delta;

      // Ограничиваем диапазон от 0 до 60
      if (newValue < 0) {
        newValue = 0;
      } else if (newValue > 60) {
        newValue = 60;
      }

      currentValue = newValue;

      Serial.print("Текущее значение: ");
      Serial.println(currentValue);

      lastPosition += delta * 4; // обновляем lastPosition
    }
  }
}

решил вопрос?

Я делал программку с энкодером, но из примеров штатных, всё работало корректно. Вот только сегодня никак не смогу пример показать

если ещё актуально, напомни через ватсап (+79206207920) - в понедельник. можно голосом :slight_smile: