RGB Arduino EEPROM (ПОМОГИТЕ)

nserega.90
nserega.90 аватар
Offline
Зарегистрирован: 28.08.2016

Всем привет! Кто чем может, пусть поможет)))Спасибо!

Сейчас постараюсь объяснить:

Хочу написать код для вкл подсветки ПП в авто на ардуино, с управление цвета по нажатию кнопки.

Суть:

При вкл габаритов загорается подсветка(плавно) при этом должна считывать последний выбранный цвет, который должен быть сохранен в EEPROM. И разгораться плавно!

Код привел ниже:

Пока дошел до стадии вкл и выбора цвета по нажатию кнопки, но не могу разобраться как сохр в память последний выбранный цвет и при вкл как написать правильно код что б плано разгорался! Заранее спасибо, и если что то не правильно объяснил прошу прощения.

Код:

#include <EEPROM.h>
#define LEDRED 9        //9 ПОРТ КРАСНЫЙ
#define LEDGREEN 10     //10 ПОРТ ЗЕЛЕНЫЙ
#define LEDBLUE 11      //11 ПОРТ СИНИЙ
#define LEDARROW 6      // 6 ПОРТ СТРЕЛКИ
#define switchPin 7     //РЕГУЛИРОВКА ЯРКОСТИ ПОДСВЕТКИ
#define switchPin2 4    //СМЕНА ЦВЕТА ПОДСВЕТКИ
#define EN 2            // ПОРТ ОПРЕДЕЛЕНИЕ ВКЛ\ВЫКЛ ГАБАРИТОВ
int ledMode = 0; 
int i;


boolean lastswitchPin2 = LOW;
boolean currentswitchPin2 = LOW;
void setup()
{ 
  pinMode (LEDRED, OUTPUT);
  pinMode (LEDGREEN, OUTPUT);
  pinMode (LEDBLUE, OUTPUT);
  pinMode (switchPin, INPUT);
  pinMode (switchPin2, INPUT);
  pinMode (EN, INPUT);
  analogWrite (LEDARROW, HIGH);
      if (digitalRead (EN) == HIGH) // ЕСЛИ ВКЛ ГАБАРИТЫ
    {
      ???????
    }
}
void loop()
{
  currentswitchPin2 = debounce(lastswitchPin2);  //считываем состояние кнопки с применением "антидребезга"
  if (lastswitchPin2 == LOW && currentswitchPin2 == HIGH)  //если кнопка была нажата
     {
       ledMode++;  //инкрементируем значение переменной
     }
  lastswitchPin2 = currentswitchPin2;  //сохраняем текущее состояние кнопки в предыдущее
 
  if (ledMode == 8) ledMode = 0;  //если прошли по циклу все режимы свечения светодиода, делаем сброс до 0
  setMode(ledMode);  //изменить режим светодиода
} 
boolean debounce(boolean last)
{
  boolean current = digitalRead(switchPin2);  //считываем состояние кнопки
  if (last != current)  //если есть изменения
  {
    delay(5);  //ждем 5мс
    current = digitalRead(switchPin2);  //считываем состояние кнопки
  } 
  return current;  //возвращаем, считанное состояние кнопки
}
 
/*
* Выбор режима работы светодиода
* Передача номера режима и его установка
* Функция ничего не возвращает
*/
void setMode(int mode)
{
  //Красный
  if (mode == 1)
  {
    digitalWrite(LEDRED, HIGH);
    digitalWrite(LEDGREEN, LOW);
    digitalWrite(LEDBLUE, LOW);
  }
  //Зеленый
  else if (mode == 2)
  {
    digitalWrite(LEDRED, LOW);
    digitalWrite(LEDGREEN, HIGH);
    digitalWrite(LEDBLUE, LOW);
  }
  //Синий
  else if (mode == 3)
  {
    digitalWrite(LEDRED, LOW);
    digitalWrite(LEDGREEN, LOW);
    digitalWrite(LEDBLUE, HIGH);
  }
  //Пурпурный(Красный + Синий)
  else if (mode == 4)
  {
    analogWrite(LEDRED, 127);
    analogWrite(LEDGREEN, 0);
    analogWrite(LEDBLUE, 127);
  }
  //Бирюзовый(Синий + Зеленый)
  else if (mode == 5)
  {
    analogWrite(LEDRED, 0);
    analogWrite(LEDGREEN, 127);
    analogWrite(LEDBLUE, 127);
  }
  //Оранжевый(Зеленый + Красный)
  else if (mode == 6)
  {
    analogWrite(LEDRED, 127);
    analogWrite(LEDGREEN, 127);
    analogWrite(LEDBLUE, 0);
  }
  //Белый(Красный + Зеленый + Синий)
  else if (mode == 7)
  {
    analogWrite(LEDRED, 85);
    analogWrite(LEDGREEN, 85);
    analogWrite(LEDBLUE, 85);
  }
  //Выключен
  else
  {
    digitalWrite(LEDRED, LOW);
    digitalWrite(LEDGREEN, LOW);
    digitalWrite(LEDBLUE, LOW);
  }
}

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

После 38 строки EEPROM.update(0, ledMode) в сетапе ledMode = EEPROM.read(0)

sadman41
Offline
Зарегистрирован: 19.10.2016

Для кнопок лучше взять https://github.com/thomasfredericks/Bounce2

Для плавности: http://arduino.ru/Reference/AnalogWrite

Не вижу, где EEPROM используете, но вам нужен EEPROM.update , например: http://wikihandbk.com/wiki/Arduino:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B/EEPROMUpdate

nserega.90
nserega.90 аватар
Offline
Зарегистрирован: 28.08.2016

Спасибо в этом и вопрос то что я не знаю как его правильно использовать для плавного разгорания светодиода

 

nserega.90
nserega.90 аватар
Offline
Зарегистрирован: 28.08.2016

Penni пишет:
После 38 строки EEPROM.update(0, ledMode) в сетапе ledMode = EEPROM.read(0)

Спасибо буду пробовать

sadman41
Offline
Зарегистрирован: 19.10.2016

nserega.90 пишет:

Спасибо в этом и вопрос то что я не знаю как его правильно использовать для плавного разгорания светодиода

Там же пример есть. Большее число функции передаешь - сильнее горит. В цикле от 1 до 255 меняйте и будет плавно.

nserega.90
nserega.90 аватар
Offline
Зарегистрирован: 28.08.2016

sadman41 пишет:

nserega.90 пишет:

Спасибо в этом и вопрос то что я не знаю как его правильно использовать для плавного разгорания светодиода

Там же пример есть. Большее число функции передаешь - сильнее горит. В цикле от 1 до 255 меняйте и будет плавно.

НУ да теперь то я понял... буду пробовать

nserega.90
nserega.90 аватар
Offline
Зарегистрирован: 28.08.2016

sadman41 пишет:

nserega.90 пишет:

Спасибо в этом и вопрос то что я не знаю как его правильно использовать для плавного разгорания светодиода

Там же пример есть. Большее число функции передаешь - сильнее горит. В цикле от 1 до 255 меняйте и будет плавно.

Просто я изночально использовал:

for (int i=0; i<=255; i=i+1)   //Инкримент на 1
{
analogWrite (pRED, i);
delay (10);
}

 

AntonHT
Offline
Зарегистрирован: 29.12.2017

Привет, как то по осени тоже озадачивался идеей rgb подсветки ПП. Но что то не срослось. Отложил на потом. У меня запись в ЕПРОМ оргонизована была по длинному нажатию, цвета настраивались потенциометром, скетч ниже, может чем и поможет

#include <TimerOne.h>  // библиотека прерываний по таймер1

#include <EEPROM.h>  // библиотека для работы с энергонезависимой памятью

#define led1 3 // первый светодиод на 3 пине
#define led2 5
#define led3 6
#define led4 12 // контрольный светодиод
#define pot A5 // потенциометр подключен в пин А5
#define button 2 // кнопка

int button_set = 0; // переменная с номером режима работы
int led1set = 0;  // переменная хранения режима работы светодиода
int led2set = 0;
int led3set = 0;
int pot_data;  // данные с потенциометра
long previousMillis = 0;  // хранит время для борьбы с дребезгом, последнее нажатие

////////////////////////////////// для долгово нажатия

// long saweMillis = 0;
long button_st_time = 0;  // запоминает когда была нажата кнопка для длинного нажатия
int pr =0;  //  контрольная переменная, ни где роли не играет

boolean button_state = false; // состояние кнопки

/////////////////////////////////// для долгово нажатия по прерыванию

int bt_on = 0;

///////////////////////////////////

void setup() {

//////////////////////////////////

  Serial.begin(9600);

  pinMode(led1, INPUT);
  pinMode(led2, INPUT);
  pinMode(led3, INPUT);
  pinMode(led4, OUTPUT);
  pinMode(pot, INPUT);
  pinMode(button, INPUT);

  led1set = EEPROM.read(0);
  led2set = EEPROM.read(1);
  led3set = EEPROM.read(2);

/////////////////////////////////// для долгово нажатия по прерыванию
Timer1.initialize(1000000);  //Значение дтIЯ переполнения 1000000 мкс (1 секунда)
Timer1.attachInterrupt(bt);  // выполнить "void bt()" при переполнении
  
}

/////////////////////////////////// для долгово нажатия по прерыванию

void bt() {
  if (button_state == true){
    bt_on ++;
  }
      else {
        bt_on = 0;
      }
  if (bt_on == 3){
//     EEPROM.write(0, led1set);
//     EEPROM.write(1, led2set);
//     EEPROM.write(2, led3set);
  bt_on = 0;
  }
}

///////////////////////////////////

void loop() {

////////////////////////////////// долгое нажатие на кнопку

  if (digitalRead(button) == HIGH && button_state == false) {
       button_state = !button_state;
       button_st_time = millis();
  }
       if (millis() - button_st_time > 5000 && button_state == true){
        pr = 22;
        EEPROM.write(0, led1set);
        EEPROM.write(1, led2set);
        EEPROM.write(2, led3set);
      }
  
      if (digitalRead(button) == LOW && button_state == true){
        button_state = false;
        button_st_time = millis();
        pr = 0;
      }
  /////////////////////////////////// переключение режимов регулировки RGB

  if (digitalRead(button) == HIGH && pr == 0) {
    if (millis() - previousMillis > 200) {
      previousMillis = millis();
      button_set = button_set + 1;
    }
  }

  if (button_set == 4) {
    button_set = 0;
  }

  ///////////////////////////////////  режимы регулировки RGB

  if (button_set == 1 && digitalRead(button) == LOW) {
    pot_data = analogRead(pot) / 4;
    led1set = pot_data;
    analogWrite(led1, led1set);
  }

  if (button_set == 2 && digitalRead(button) == LOW) {
    pot_data = analogRead(pot) / 4;
    led2set = pot_data;
    analogWrite(led2, led2set);
  }

   if (button_set == 3 && digitalRead(button) == LOW) {
    pot_data = analogRead(pot) / 4;
    led3set = pot_data;
    analogWrite(led3, led3set);
  }

if (button_set == 0){   // начальный режим работы
  digitalWrite(led4, HIGH);
  analogWrite(led1, led1set);
  analogWrite(led2, led2set);
  analogWrite(led3, led3set);
  }
    else{
      digitalWrite(led4, LOW);
    }

  ///////////////////////////////////  вывод данных в серийный порт

  Serial.println(bt_on);

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Только EEPROM.write замените на EEPROM.update, а то заклинит что-нибудь в алгоритме и протрете дырку в контроллере за пять сек.

nserega.90
nserega.90 аватар
Offline
Зарегистрирован: 28.08.2016

AntonHT пишет:

Привет, как то по осени тоже озадачивался идеей rgb подсветки ПП. Но что то не срослось. Отложил на потом. У меня запись в ЕПРОМ оргонизована была по длинному нажатию, цвета настраивались потенциометром, скетч ниже, может чем и поможет

#include <TimerOne.h>  // библиотека прерываний по таймер1

#include <EEPROM.h>  // библиотека для работы с энергонезависимой памятью

#define led1 3 // первый светодиод на 3 пине
#define led2 5
#define led3 6
#define led4 12 // контрольный светодиод
#define pot A5 // потенциометр подключен в пин А5
#define button 2 // кнопка

int button_set = 0; // переменная с номером режима работы
int led1set = 0;  // переменная хранения режима работы светодиода
int led2set = 0;
int led3set = 0;
int pot_data;  // данные с потенциометра
long previousMillis = 0;  // хранит время для борьбы с дребезгом, последнее нажатие

////////////////////////////////// для долгово нажатия

// long saweMillis = 0;
long button_st_time = 0;  // запоминает когда была нажата кнопка для длинного нажатия
int pr =0;  //  контрольная переменная, ни где роли не играет

boolean button_state = false; // состояние кнопки

/////////////////////////////////// для долгово нажатия по прерыванию

int bt_on = 0;

///////////////////////////////////

void setup() {

//////////////////////////////////

  Serial.begin(9600);

  pinMode(led1, INPUT);
  pinMode(led2, INPUT);
  pinMode(led3, INPUT);
  pinMode(led4, OUTPUT);
  pinMode(pot, INPUT);
  pinMode(button, INPUT);

  led1set = EEPROM.read(0);
  led2set = EEPROM.read(1);
  led3set = EEPROM.read(2);

/////////////////////////////////// для долгово нажатия по прерыванию
Timer1.initialize(1000000);  //Значение дтIЯ переполнения 1000000 мкс (1 секунда)
Timer1.attachInterrupt(bt);  // выполнить "void bt()" при переполнении
  
}

/////////////////////////////////// для долгово нажатия по прерыванию

void bt() {
  if (button_state == true){
    bt_on ++;
  }
      else {
        bt_on = 0;
      }
  if (bt_on == 3){
//     EEPROM.write(0, led1set);
//     EEPROM.write(1, led2set);
//     EEPROM.write(2, led3set);
  bt_on = 0;
  }
}

///////////////////////////////////

void loop() {

////////////////////////////////// долгое нажатие на кнопку

  if (digitalRead(button) == HIGH && button_state == false) {
       button_state = !button_state;
       button_st_time = millis();
  }
       if (millis() - button_st_time > 5000 && button_state == true){
        pr = 22;
        EEPROM.write(0, led1set);
        EEPROM.write(1, led2set);
        EEPROM.write(2, led3set);
      }
  
      if (digitalRead(button) == LOW && button_state == true){
        button_state = false;
        button_st_time = millis();
        pr = 0;
      }
  /////////////////////////////////// переключение режимов регулировки RGB

  if (digitalRead(button) == HIGH && pr == 0) {
    if (millis() - previousMillis > 200) {
      previousMillis = millis();
      button_set = button_set + 1;
    }
  }

  if (button_set == 4) {
    button_set = 0;
  }

  ///////////////////////////////////  режимы регулировки RGB

  if (button_set == 1 && digitalRead(button) == LOW) {
    pot_data = analogRead(pot) / 4;
    led1set = pot_data;
    analogWrite(led1, led1set);
  }

  if (button_set == 2 && digitalRead(button) == LOW) {
    pot_data = analogRead(pot) / 4;
    led2set = pot_data;
    analogWrite(led2, led2set);
  }

   if (button_set == 3 && digitalRead(button) == LOW) {
    pot_data = analogRead(pot) / 4;
    led3set = pot_data;
    analogWrite(led3, led3set);
  }

if (button_set == 0){   // начальный режим работы
  digitalWrite(led4, HIGH);
  analogWrite(led1, led1set);
  analogWrite(led2, led2set);
  analogWrite(led3, led3set);
  }
    else{
      digitalWrite(led4, LOW);
    }

  ///////////////////////////////////  вывод данных в серийный порт

  Serial.println(bt_on);

 

Спасибо!

nserega.90
nserega.90 аватар
Offline
Зарегистрирован: 28.08.2016

Хорошо

nserega.90
nserega.90 аватар
Offline
Зарегистрирован: 28.08.2016

Penni пишет:
После 38 строки EEPROM.update(0, ledMode) в сетапе ledMode = EEPROM.read(0)

#include <EEPROM.h>
#define LEDRED 9        //9 ПОРТ КРАСНЫЙ
#define LEDGREEN 10     //10 ПОРТ ЗЕЛЕНЫЙ
#define LEDBLUE 11      //11 ПОРТ СИНИЙ
#define LEDARROW 6      // 6 ПОРТ СТРЕЛКИ
#define switchPin 7     //РЕГУЛИРОВКА ЯРКОСТИ ПОДСВЕТКИ
#define switchPin2 4    //СМЕНА ЦВЕТА ПОДСВЕТКИ
#define EN 2            // ПОРТ ОПРЕДЕЛЕНИЕ ВКЛ\ВЫКЛ ГАБАРИТОВ
int ledMode; 
int i;

boolean lastButton = LOW;
boolean currentButton = LOW;

void setup()
{ 
  pinMode (LEDRED, OUTPUT);
  pinMode (LEDGREEN, OUTPUT);
  pinMode (LEDBLUE, OUTPUT);
  pinMode (switchPin, INPUT);
  pinMode (switchPin2, INPUT);
  pinMode (EN, INPUT);
  analogWrite (LEDARROW, HIGH); 
  ledMode = EEPROM.read(3);
}

void loop()
  {
     currentButton = debounce(lastButton);                //считываем состояние кнопки с применением "антидребезга"
      if (lastButton == LOW && currentButton == HIGH)      //если кнопка была нажата
      {
         ledMode++;                                         //инкрементируем значение переменной
       }
        lastButton = currentButton;                          //сохраняем текущее состояние кнопки в предыдущее
        if (ledMode == 8) ledMode = 0; //если прошли по циклу все режимы свечения светодиода, делаем сброс до 0
        EEPROM.update(3, ledMode); 
  		setMode(ledMode);                                   //изменить режим светодиода
  } 
 
/*
* Функция антидребезга
* принимает предыдущее значение кнопки и возвращает текущее состояние кнопки с подавлением дребезга контактов
*/
boolean debounce(boolean last)
{
  boolean current = digitalRead(switchPin2);             //считываем состояние кнопки
  if (last != current)                               //если есть изменения
  {
    delay(5);                                        //ждем 5мс
    current = digitalRead(switchPin2);                   //считываем состояние кнопки
  }
  return current;                                    //возвращаем, считанное состояние кнопки
}
/*
* Выбор режима работы светодиода
* Передача номера режима и его установка
* Функция ничего не возвращает
*/
void setMode(int mode)
{
  //Красный
  if (mode == 1)
  {
    digitalWrite(LEDRED, HIGH);
    digitalWrite(LEDGREEN, LOW);
    digitalWrite(LEDBLUE, LOW);
  }
  //Зеленый
  else if (mode == 2)
  {
    digitalWrite(LEDRED, LOW);
    digitalWrite(LEDGREEN, HIGH);
    digitalWrite(LEDBLUE, LOW);
  }
  //Синий
  else if (mode == 3)
  {
    digitalWrite(LEDRED, LOW);
    digitalWrite(LEDGREEN, LOW);
    digitalWrite(LEDBLUE, HIGH);
  }
  //Пурпурный(Красный + Синий)
  else if (mode == 4)
  {
    analogWrite(LEDRED, 127);
    analogWrite(LEDGREEN, 0);
    analogWrite(LEDBLUE, 127);
  }
  //Бирюзовый(Синий + Зеленый)
  else if (mode == 5)
  {
    analogWrite(LEDRED, 0);
    analogWrite(LEDGREEN, 127);
    analogWrite(LEDBLUE, 127);
  }
  //Оранжевый(Зеленый + Красный)
  else if (mode == 6)
  {
    analogWrite(LEDRED, 127);
    analogWrite(LEDGREEN, 127);
    analogWrite(LEDBLUE, 0);
  }
  //Белый(Красный + Зеленый + Синий)
  else if (mode == 7)
  {
    analogWrite(LEDRED, 85);
    analogWrite(LEDGREEN, 85);
    analogWrite(LEDBLUE, 85);
  }
  //Выключен
  else
  {
    digitalWrite(LEDRED, LOW);
    digitalWrite(LEDGREEN, LOW);
    digitalWrite(LEDBLUE, LOW);
  }
}

Этого хватит? Для Сохранения. Почитал про EEPROM.update. Не совсем понял. Как правильно использовать

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Да хватит. Update запишет значение в еепром только если оно отличается от того которое уже записано по тому адресу. Первый параметр это адрес в еепром, второй это значение.

nserega.90
nserega.90 аватар
Offline
Зарегистрирован: 28.08.2016

Penni пишет:

Да хватит. Update запишет значение в еепром только если оно отличается от того которое уже записано по тому адресу. Первый параметр это адрес в еепром, второй это значение.

Большое спасибо!

nserega.90
nserega.90 аватар
Offline
Зарегистрирован: 28.08.2016

Penni пишет:

Да хватит. Update запишет значение в еепром только если оно отличается от того которое уже записано по тому адресу. Первый параметр это адрес в еепром, второй это значение.

Привет. Есть контактыы более удобные? Хотел посоветоваться)))

Если можно я запишу потом если что отредактируешь свое сообщение чтоб не видели