Вопросы по энкодеру и EEPROM

Alexey_09

✩✩✩✩✩✩✩
26 Фев 2021
14
0
Добрый день! Осваиваю Ардуино и прошу помощи знающих людей.

Стараюсь создать проект управления LED лентой, использую библиотеки GyverRGB и GyverEncoder.
Суть управления лентой:
  • клик кнопкой энкодера включает ленту (включает полевик, подающий + на ленту)
  • вращение энкодера увеличивает/уменьшает яркость
  • вращение энкодера с удержанием кнопки изменяет цветовую температуру
  • удержание кнопки энкодера выключает ленту (отключает полевик)

Cтолкнулся с 2 сложностями, не знаю как правильно их решить:
1. Сделать, чтобы при выключении ленты (удержание кнопки энкодера) происходила запись значения установленной цветовой температуры в EEPROM и при следующем включении цветовая температура считывалась из EEPROM и лента светила именно с этой температурой.
2. Сделать, чтобы при включении ленты кнопкой энкодера (нажатие кнопки энкодера) устанавливалась бы цветовая температура свечения такая, как была записана в EEPROM при прошлом выключении, а также чтобы яркость устанавливалась на указанное значение (30) вне зависимости от того, какая яркость была при выключении.

У меня при включении из EEPROM приходит 255, а не значение, сохраненное при выключении.


Скетч во вложении, к каждой строчке комментарии.
 

Вложения

Изменено:

fetus

✩✩✩✩✩✩✩
12 Дек 2020
17
0
C++:
// определяю к каким пинам подключен энкодер
#define CLK 2
#define DT 3
#define SW 4

#include <GyverEncoder.h> //подключаю библтиотеку Энкодера
#include <GyverRGB.h> // подключаю библиотеку RGB
#include <EEPROM.h> // подключаю библиотеку EEPROM

Encoder enc(CLK, DT, SW); //называем энкодер
GRGB diode(9, 10, 6);  // куда подключены цвета (R, G, B)
int brt = 0; // начальное значение яркости
int colTemp = EEPROM.get(0, colTemp); // начальное значение цветовой температуры
int address = 0; // переменная для хранения адреса ячейки памяти
byte colTempValue; // переменная для хранения значения цветовой температуры


void setup() {
  enc.setType(TYPE2); // выбираю тип энкодера
  enc.setTickMode(AUTO); //устанавливаю автоматический режим опроса энкодера
  Serial.begin(9600); //открываю монитор порта
  pinMode(13, OUTPUT); // светодиод на пин 13
  //pinMode(4, INPUT); // кнопка энкодера на пин 4
  diode.setDirection(REVERSE); // устанавливаем направление ленты (прямое-обратное)
  diode.setRGB(200, 180, 0);    // ставим жёлтый цвет
  delay(2000);                  // любуемся результатом 2 секунды
  // ограничиваем ток. Метод принимает в качестве аргументов:
  // количество светодиодов (тут 30)
  // напряжение питания в милливольтах (тут 12 вольт)
  // максимальный ток в миллиамперах (тут 50)
  // после вызова яркость ленты сразу упадёт до такой, при которой будет потребляться ~50 ма
  diode.setMaxCurrent(30, 12000, 1000);

}

void loop() {

  // этот метод меняет общую яркость ленты, принимает 0-255 (что мы и делаем с аналог пина)
  // можно почувствовать, как яркость упирается в лимит по току! Чудесно
  diode.setBrightness(brt);
  diode.setKelvin(colTemp);

  if (enc.isRight()) {
    brt += 10; // если был поворот направо, увеличиваем brt на 10
    brt = constrain(brt, 10, 255);
    Serial.println("Brightness=" + String(brt));   // выводим значение brt при повороте
  

  }
  if (enc.isLeft()) {
    brt -= 10; // если был поворот налево, уменьшаем brt на 10
    brt = constrain(brt, 10, 255);
    Serial.println("Brightness=" + String(brt));   // выводим значение brt при повороте
  

  }
  if (enc.isRightH()) {
    colTemp += 100;   // если было удержание + поворот направо, увеличиваем colTemp на 100
    colTemp = constrain(colTemp, 1000, 10000);
    Serial.println("Color Temperature=" + String(colTemp));   // выводим значение colTemp при повороте
  

  }
  if (enc.isLeftH()) {
    colTemp -= 100;  // если было удержание + поворот налево, уменьшаем colTemp на 100
    colTemp = constrain(colTemp, 1000, 10000);
    Serial.println("Color Temperature=" + String(colTemp));   // выводим значение colTemp при повороте
  
  }
  if (enc.isClick()) {   // если было нажатие
    brt=30;
    Serial.println("Read colTemp=" + String(colTemp));   // выводим значение colTemp, считанное из ячейки памяти
    digitalWrite (13, HIGH);  // если было нажатие, вкл LED
    Serial.println("POWER ON");   // выводим слово ВКЛ
  }
  if (enc.isHolded()) {   // если было удержание
    EEPROM.put(0, colTemp); // записываем значение colTemp в ячейку памяти 0
    Serial.println("Written colTemp=" + String(colTemp));   // выводим значение colTemp, записанное в ячейку памяти
    digitalWrite (13, LOW);  // выкл LED
    Serial.println("POWER OFF");   // выводим слово ВЫКЛ
    brt=0;
  }
}
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
посмотрите в описании библиотеки синтаксис команды EEPROM.get()
 
  • Лойс +1
Реакции: kostyamat

Alexey_09

✩✩✩✩✩✩✩
26 Фев 2021
14
0
fetus, спасибо огромное за правки! Многое стало понятнее.
Остался один непонятный момент, а именно чтение значения цветовой температуры из EEPROM происходит до void setup. Это получается, что значение будет считано только при подаче питания на Ардуино, верно?
Получается, что удерживая кнопку энкодера я выключаю только ленту, записываю значение цветовой температуры в EEPROM, но сама Ардуино продолжает работать ожидая команды энкодера?
 

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
@Alexey_09, да не за што спасибо говорить, потому как вот это не верно.
int colTemp = EEPROM.get(0, colTemp); // начальное значение цветовой температуры
int address = 0; // переменная для хранения адреса ячейки памяти

Правильно так
uint16_t address = 0; // переменная для хранения адреса ячейки памяти
uint8_t colTemp;
EEPROM.get(address, colTemp); // начальное значение цветовой температуры
И по ходу - почитайте про размерность разных типов данных в языке C. Учитесь экономить память, ее в ардуино очень мало.
int, unsigned int, uint8_t, int8_t, uint_16_t, int16_t, uint32_t, int32_t, byte, float, char и тому подобное
 
Изменено:

fetus

✩✩✩✩✩✩✩
12 Дек 2020
17
0
int colTemp = EEPROM.get(0, colTemp);
Такая запись вполне работоспособна.
 

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
int colTemp = EEPROM.get(0, colTemp);
Такая запись вполне работоспособна.
Да, но абсолютно бесполезна и приводит к лишнему переписыванию переменной из себя в себя (тупо лишнее действие. Вся надежда на то, что компилятор покрутит пальцем у виска, и просто уберет ненужную операцию из результирующего бинарника). Зачем? Научить новичка неправильной практике? Ведь человек же точно углубляться не будет, а будет так дальше писать, думая, что так и надо.
 

Alexey_09

✩✩✩✩✩✩✩
26 Фев 2021
14
0
А почему для цветовой температуры (ColTemp) используется тип переменной uint_8t (от 0 до 255), если значение цветовой температуры варьируется от 1000 до 10000 (в библиотеке GyverRGB)? Или я неправильно что-то понимаю?
 

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
@Alexey_09, ок, подловили, молодец. :)
Я честно говоря подумал, что ТС хочет регулировать цвет ленты. Тогда стоит использовать diod.setHSV(colTemp, 255,255);
Ну а если именно температуру в Кельвинах, - то да, правильно будет
uint16_t colTemp;
но таки не int. int занимает в ОЗУ 4 байта, а uint16_t только два, и принимает 0-65535.

Поправка: А не, наврал. В AVR int тоже 2 байта. Давно с классическими дунями не работал, подзабил.

Но, так или иначе - переменные стоит четко детерменировать изначально, и привыкать к правильным подходам. Тогда код можно легко переносить между разными архитектурами и ожидать одинакового поведения, и избежать утечек памяти. К примеру, в esp8266 int таки занимает 4 байта.
А теперь вопрос, что будет если вы например захотите в еепром положить два int, один вслед другого, при этом тупо прописав адрес в скетче как 0 и 2?.
Ответ, в ардуино нано все будет работать корректно, а в esp8266 - второй int частично перепишет первый, и вы будете долго искать где проблема. А описав обе переменные как int16_t, вы получите совместимость для обох контроллеров.
 
Изменено:
  • Лойс +1
Реакции: Alexey_09

Alexey_09

✩✩✩✩✩✩✩
26 Фев 2021
14
0
@kostyamat, спасибо большое за помощь! Очень полезно для меня в самом начале освоения Ардуино.
Для цветовой температуры я использовал diode.SetKelvin(). А с помощью HSV тоже температуру регулировать можно?
 

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
@Alexey_09, давайте разберемся одинаково ли мы понимаем термин "температуру". Вы хотите залить ленту белым и менять "температуру" белого цвета, или менять в полном диапазоне сам цвет ленты? Потому как по факту одно другому не мешает, это не взаимоисключающие понятия. К примеру hsv это три значения от 0-255: hue "цвет", saturation "насыщенность", value "яркость". Чтобы получить белый, достаточно установить любой "цвет", "насыщенность" в 0, "яркость" - ну это понятно. Оперируя этими тремя значениями можно получить практически любой цвет и оттенок белого. Тут и Кельвины не нужна. Хотя если сначало установить цвет, а потом наложить Кельвины, то оттенок тоже поменяться немного.
 

Alexey_09

✩✩✩✩✩✩✩
26 Фев 2021
14
0
Хм... попробую и Кельвины и HSV. И глазами увижу чего же я хочу ))) А вообще нужно получить "теплый" белый
 

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
@Alexey_09, у меня сын увлекается фото-видео. Я ему сделал специально эффект в нашем проекте Гайвер Лампы, называется эффект - "Блики на воде, цвета". Там можно крутить яркость, насыщенность и цвет отдельно в пространстве HSV. Вроде полностью покрывает его потребности. К примеру, если ему нужен белый "дневной", он ставит (160, 20, 255). Если "ламповый" то (85, 30, 255). Как то так. Кельвины вообще не применяются.

Если что, проект тут https://community.alexgyver.ru/threads/wifi-lampa-budilnik-proshivka-firelamp_jeeui-gpl.2739/
 
  • Лойс +1
Реакции: Alexey_09

Alexey_09

✩✩✩✩✩✩✩
26 Фев 2021
14
0
Спасибо, я посмотрю. Очень интересная информация!

Столкнулся еще с таким моментом: когда я для яркости (0-255) ставлю переменную uint8_t и потом энкодером регулирую яркость, то дойдя до 255 регулировка не останавливается, а перескакивает на ноль, несмотря на constrain.

uint8_t Value = 0; // переменная яркости

if (enc.isRight()) {
Value += 10; // если был поворот направо, увеличиваем Value на 10
Value = constrain(Value, 10, 255); //ограничиваем значение Value от 10 до 255
Serial.println("Brightness=" + String(Value)); // выводим значение Value при повороте
}

А если использую uint16_t Value = 0; // переменная яркости, то значение ограничивается 0-255
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
все верно, Value ограничена от 10 до 255. 255 разрешено! В начале следующего поворота будет Value +=10; , т..е 255+10, а это будет 9, т.к. тип данных Value целый байт, а 9 это уже запрещено, и оно ниже 10, то будет 10. А uint16_t число спокойно уходит за 255 в 265 и логика работает корректно
Вообще хорошо не сначала делать (+10) а потом проверять что же вышло (constrain ) , а наоборот, а что будет если я прибавлю 10 к Value , не будет ли жопы какой ?
 

Alexey_09

✩✩✩✩✩✩✩
26 Фев 2021
14
0
Спасибо за пояснения! Да я без constrain проверял. Будет 255 и потом снова 0.
 

Alexey_09

✩✩✩✩✩✩✩
26 Фев 2021
14
0
Добрый день!

Прошу помочь спецов проверить мой скетч. Скетч во вложении.

Суть проекта - светильник на RGB ленте. При нажатии энкодера свет вкл и выкл, при вращении влево-вправо меняется яркость, при вращении с нажатием влево-вправо меняется цветовая температура.

Результаты работы скетча выводятся в монитор порта и там показывает все правильно (изменение переменных яркости и цветовой температуры), но в реальности светодиодная лента просто светит белым, ни яркость, ни цветовая температура не меняется. Единственно при значениях яркости выше 150 цвет ленты уходит в синий. Также при выключении кнопкой энкодера не ставится яркость RGB каналов на 0, лента продолжает просто светить без изменений. При этом в мониторе порта все время показывается значение на пинах RGB =0, хотя лента светит. Пришлось поставить P-канальный MOSFET чтобы отключать + 12 от ленты.

Непонятно, то ли проблема в скетче, то ли в железе. Полевики проверял, вроде исправные. Вечером посмотрю осциллографом сигналы на затворах полевиков.

C++:
//====================Настройки======================

//-------------------- Энкодер------------------------
#define CLK 2
#define DT 3
#define SW 4 //пин подключения кнопки энкодера

//------------------Лента-----------------------
#define PIN_R 9 // Пин R
#define PIN_G 10 // Пин G
#define PIN_B 11 // Пин B

//------------------Остальные пины---------------------
#define P_MOSFET 6 // пин, куда подключен мосфет подачи +12 на ленту
//#define PhotoResVCC 19 // +5v на фоторезистор (А5)
//#define PhotoResSIG 17 // вход с делителя фоторезистора (А3)
#define POWER 13 // Светодиод питания

//------------------Библиотеки----------------
#include <GyverEncoder.h> //подключаю библтиотеку Энкодера
Encoder enc(CLK, DT, SW); //называем энкодер (энк и кнопка)

#include <GyverRGB.h> // подключаю библиотеку RGB
GRGB strip(PIN_R, PIN_G, PIN_B);  // пины, куда подключены цвета (R, G, B)

#include <EEPROM.h> // подключаю библиотеку EEPROM

//-----------------Переменные------------------------
int16_t brightness = 0; // переменная яркости
int16_t colorTemp = 3200; // переменная цветовой температуры, начальное значение
uint16_t address = 0; // переменная для хранения адреса ячейки памяти
boolean flagOn = 0; // флажок включения системы
uint8_t R = analogRead (PIN_R); //считываю значение R на выходе
uint8_t G = analogRead (PIN_G);  //считываю значение G на выходе
uint8_t B = analogRead (PIN_B);  //считываю значение B на выходе

void setup() {
  //-----Энкодер-----
  enc.setType(TYPE2); // выбираю тип энкодера
  enc.setTickMode(AUTO); //устанавливаю автоматический режим опроса энкодера

  //-----Лента-----
  //pinMode(PIN_R, OUTPUT);
  //pinMode(PIN_G, OUTPUT);
  //pinMode(PIN_B, OUTPUT);
  strip.setDirection(REVERSE); // устанавливаем направление ленты (прямое-обратное)
  strip.setMaxCurrent(3, 12000, 300); //Ограничение тока ленты. Метод принимает в качестве аргументов:(кол-во светодиодов, напряжение питания ленты в мВ, ток в mА)

  //-----Монитор порта------
  Serial.begin(9600); //открываю монитор порта

  //-----Прочие пины-----
  pinMode(POWER, OUTPUT); // светодиод на пин 13
  pinMode (P_MOSFET, OUTPUT); // пин для P-MOSFET
  //pinMode (PhotoResVCC, OUTPUT); // +5v на фоторезистор
  //pinMode (PhotoResSIG, INPUT); // вход с делителя фоторезистора

}

void loop() {
  strip.setBrightness(brightness);// // этот метод меняет общую яркость ленты, принимает 0-255 (что мы и делаем с аналог пина)
  strip.setKelvin(colorTemp);//устанавливаем цветовую температуру 1000-10000

  //==========обработка нажатий кнопки==========
  if (enc.isClick()) {
    if (flagOn) {
      digitalWrite (POWER, LOW);  // выкл LED
      digitalWrite (P_MOSFET, LOW); // выкл P-MOSFet
      flagOn = false; //опускаю флажок
      brightness = 0; // устанавливаем яркость 0
      strip.setBrightness(brightness);// устанавливаю яркость ленты 0
      EEPROM.put(0, colorTemp); // записываем значение colTemp в ячейку памяти 0
      delay(200);
      Serial.println("Written colorTemp=" + String(colorTemp));   // выводим значение colorTemp, записанное в ячейку памяти
      Serial.println("Brightness=" + String(brightness));   // выводим значение brightness
      Serial.println("R_" + String (R));
      Serial.println("G_" + String (G));
      Serial.println("B_" + String (B));
      Serial.println("POWER OFF");   // выводим слово ВЫКЛ
    }
    else {
      digitalWrite (POWER, HIGH);  // вкл LED
      digitalWrite (P_MOSFET, HIGH); // вкл P-MOSFet
      flagOn = true; // поднимаю флажок
      brightness = 50; // устанавливаю яркость ленты 50
      EEPROM.get(0, colorTemp); //читаем записанное значение цветовой температуры из ячейки памяти 0
      Serial.println("FLAG ON");   // выводим слово Флажок поднят
      Serial.println("POWER ON");   // выводим слово ВКЛ
      Serial.println("ColorTemp=" + String(colorTemp));   // выводим значение colorTemp, считанное из ячейки памяти 0
      Serial.println("Brightness=" + String(brightness));   // выводим значение brightness
      Serial.println("R_" + String (R));
      Serial.println("G_" + String (G));
      Serial.println("B_" + String (B));
    }
  }

  // ===========обработка поворотов энкодера==========

  if (flagOn) { //если флажок поднят

    if (enc.isRight()) {
      brightness += 10; // если был поворот направо, увеличиваем brightness на 10
      brightness = constrain(brightness, 10, 255); //ограничиваем значение brightness от 10 до 255
      Serial.println("Brightness=" + String(brightness));   // выводим значение brightness при повороте
      Serial.println("R_" + String (R));
      Serial.println("G_" + String (G));
      Serial.println("B_" + String (B));
    }
    if (enc.isLeft()) {
      brightness -= 10; // если был поворот налево, уменьшаем brightness на 10
      brightness = constrain(brightness, 10, 255); //ограничиваем значение brightness от 10 до 255
      Serial.println("Brightness=" + String(brightness));   // выводим значение brightness при повороте
      Serial.println("R_" + String (R));
      Serial.println("G_" + String (G));
      Serial.println("B_" + String (B));
    }
    if (enc.isRightH()) {
      colorTemp += 100;   // если было удержание + поворот направо, увеличиваем colorTemp на 100
      colorTemp = constrain(colorTemp, 1000, 10000); // ограничение цветовой температуры от 1000 до 10000
      Serial.println("Color Temperature=" + String(colorTemp));   // выводим значение colTemp при повороте
      Serial.println("R_" + String (R));
      Serial.println("G_" + String (G));
      Serial.println("B_" + String (B));
    }
    if (enc.isLeftH()) {
      colorTemp -= 100;  // если было удержание + поворот налево, уменьшаем colorTemp на 100
      colorTemp = constrain(colorTemp, 1000, 10000); // ограничение цветовой температуры от 1000 до 10000
      Serial.println("Color Temperature=" + String(colorTemp));   // выводим значение colTemp при повороте
      Serial.println("R_" + String (R));
      Serial.println("G_" + String (G));
      Serial.println("B_" + String (B));
    }
  }
}
 
Изменено:

fetus

✩✩✩✩✩✩✩
12 Дек 2020
17
0
Неплохо бы код нормально вставлять тогда желающих помочь было бы больше)
У вас лента с общим анодом?
Ну если особо не вникать я бы сделал так (без serial):
C++:
//====================Настройки======================

//-------------------- Энкодер------------------------
#define CLK 2
#define DT 3
#define SW 4 //пин подключения кнопки энкодера

//------------------Лента-----------------------
#define PIN_R 9 // Пин R
#define PIN_G 10 // Пин G
#define PIN_B 11 // Пин B

//------------------Остальные пины---------------------
#define P_MOSFET 6 // пин, куда подключен мосфет подачи +12 на ленту
//#define PhotoResVCC 19 // +5v на фоторезистор (А5)
//#define PhotoResSIG 17 // вход с делителя фоторезистора (А3)
#define POWER 13 // Светодиод питания

//------------------Библиотеки----------------
#include <GyverEncoder.h> //подключаю библтиотеку Энкодера
Encoder enc(CLK, DT, SW); //называем энкодер (энк и кнопка)

#include <GyverRGB.h> // подключаю библиотеку RGB
GRGB strip(PIN_R, PIN_G, PIN_B);  // пины, куда подключены цвета (R, G, B)

#include <EEPROM.h> // подключаю библиотеку EEPROM

//-----------------Переменные------------------------
int16_t brightness = 0; // переменная яркости
int16_t colorTemp ; // переменная цветовой температуры, начальное значение
uint16_t address = 0; // переменная для хранения адреса ячейки памяти
boolean flagOn = 0; // флажок включения системы
//uint8_t R = analogRead (PIN_R); //считываю значение R на выходе
//uint8_t G = analogRead (PIN_G);  //считываю значение G на выходе
//uint8_t B = analogRead (PIN_B);  //считываю значение B на выходе

void setup() {
  //-----Энкодер-----
  enc.setType(TYPE2); // выбираю тип энкодера
  enc.setTickMode(AUTO); //устанавливаю автоматический режим опроса энкодера

  //-----Лента-----
  //pinMode(PIN_R, OUTPUT);
  //pinMode(PIN_G, OUTPUT);
  //pinMode(PIN_B, OUTPUT);
  strip.setDirection(REVERSE); // устанавливаем направление ленты (прямое-обратное)
  strip.setMaxCurrent(3, 12000, 300); //Ограничение тока ленты. Метод принимает в качестве аргументов:(кол-во светодиодов, напряжение питания ленты в мВ, ток в mА)

  //-----Монитор порта------
  Serial.begin(9600); //открываю монитор порта

  //-----Прочие пины-----
  pinMode(POWER, OUTPUT); // светодиод на пин 13
  pinMode (P_MOSFET, OUTPUT); // пин для P-MOSFET
  //pinMode (PhotoResVCC, OUTPUT); // +5v на фоторезистор
  //pinMode (PhotoResSIG, INPUT); // вход с делителя фоторезистора
  EEPROM.get(0, colorTemp); //читаем записанное значение цветовой температуры из ячейки памяти 0
}

void loop() {
  strip.setBrightness(brightness);// // этот метод меняет общую яркость ленты, принимает 0-255 (что мы и делаем с аналог пина)
  strip.setKelvin(colorTemp);//устанавливаем цветовую температуру 1000-10000

  //==========обработка нажатий кнопки==========
  if (enc.isClick()) {
    flagOn = !flagOn; //опускаю флажок
    brightness = !brightness * 50;
    digitalWrite (POWER, flagOn); // выкл LED
    digitalWrite (P_MOSFET, flagOn); // выкл P-MOSFet
    EEPROM.put(0, colorTemp); // записываем значение colTemp в ячейку памяти 0
  }

  // ===========обработка поворотов энкодера==========


  if (flagOn && enc.isTurn()) {

    if (enc.isRight())  brightness += 10; // если был поворот направо, увеличиваем brightness на 10
    if (enc.isLeft())  brightness -= 10; // если был поворот налево, уменьшаем brightness на 10
    brightness = constrain(brightness, 10, 255); //ограничиваем значение brightness от 10 до 255


    if (enc.isRightH()) colorTemp += 100;   // если было удержание + поворот направо, увеличиваем colorTemp на 100
    if (enc.isLeftH())  colorTemp -= 100;  // если было удержание + поворот налево, уменьшаем colorTemp на 100
    colorTemp = constrain(colorTemp, 1000, 10000); // ограничение цветовой температуры от 1000 до 10000


  }
}
 

Alexey_09

✩✩✩✩✩✩✩
26 Фев 2021
14
0
Прошу прощения за неправильное вложение кода. Я исправлюсь :) Код правильно вставлять с помощью значка </> на панели, верно?
Лента да, с общим анодом.
Спасибо за ваш вариант, буду изучать.

Подскажите пожалуйста 2 момента:
1. Что означает brightness = !brightness * 50; При включении brightness=0. ! меняет 0 на 1? Это умножение 1*50? Или еще что-то?
2. Значение цветовой температуры, сохраненное при предыдущем выключении ленты, вытаскивается из EEPROM в void.setup, т.е. только при запуске Arduino? Кнопка энкодера лишь отключает ленту, но не саму ардуино. Все последующие изменения Цветовой температуры будут записываться в EEPROM при выключении энкодером, но из EEPROM будут вытащены только при включении-выключении самой Ардуино? Или я неправильно понимаю работу void setup?
 
Изменено:

Alexey_09

✩✩✩✩✩✩✩
26 Фев 2021
14
0
@fetus, спасибо за сокращение кода!И за то, что натолкнули на мысль. Проблема была в strip.setDirection.Я думал, что общий анод относится к типу ленты, а этот параметр вообще к типу драйвера относится. Поменял параметр на NORMAL вместо REVERSE и все заработало как нужно! Спасибо огромное за помощь.