Не работает управление энкодера в основном коде по отдельности все прекрасно работает
В основном коде когда пытаешься повернуть энкодер в право то число меняется в положительную сторону, крутишь в лево тоже самое хотя должно быть на оборот.
Код управления:
#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);
}
Помогите с кодом. Буду Благодарен)