RGB Arduino EEPROM (ПОМОГИТЕ)
- Войдите на сайт для отправки комментариев
Пт, 12/01/2018 - 12:31
Всем привет! Кто чем может, пусть поможет)))Спасибо!
Сейчас постараюсь объяснить:
Хочу написать код для вкл подсветки ПП в авто на ардуино, с управление цвета по нажатию кнопки.
Суть:
При вкл габаритов загорается подсветка(плавно) при этом должна считывать последний выбранный цвет, который должен быть сохранен в 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);
}
}
После 38 строки EEPROM.update(0, ledMode) в сетапе ledMode = EEPROM.read(0)
Для кнопок лучше взять 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
Спасибо в этом и вопрос то что я не знаю как его правильно использовать для плавного разгорания светодиода
Спасибо буду пробовать
Спасибо в этом и вопрос то что я не знаю как его правильно использовать для плавного разгорания светодиода
Там же пример есть. Большее число функции передаешь - сильнее горит. В цикле от 1 до 255 меняйте и будет плавно.
Спасибо в этом и вопрос то что я не знаю как его правильно использовать для плавного разгорания светодиода
Там же пример есть. Большее число функции передаешь - сильнее горит. В цикле от 1 до 255 меняйте и будет плавно.
НУ да теперь то я понял... буду пробовать
Спасибо в этом и вопрос то что я не знаю как его правильно использовать для плавного разгорания светодиода
Там же пример есть. Большее число функции передаешь - сильнее горит. В цикле от 1 до 255 меняйте и будет плавно.
Просто я изночально использовал:
for (int i=0; i<=255; i=i+1) //Инкримент на 1 { analogWrite (pRED, i); delay (10); }Привет, как то по осени тоже озадачивался идеей 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);Только EEPROM.write замените на EEPROM.update, а то заклинит что-нибудь в алгоритме и протрете дырку в контроллере за пять сек.
Привет, как то по осени тоже озадачивался идеей 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);Спасибо!
Хорошо
#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. Не совсем понял. Как правильно использовать
Да хватит. Update запишет значение в еепром только если оно отличается от того которое уже записано по тому адресу. Первый параметр это адрес в еепром, второй это значение.
Да хватит. Update запишет значение в еепром только если оно отличается от того которое уже записано по тому адресу. Первый параметр это адрес в еепром, второй это значение.
Большое спасибо!
Да хватит. Update запишет значение в еепром только если оно отличается от того которое уже записано по тому адресу. Первый параметр это адрес в еепром, второй это значение.
Привет. Есть контактыы более удобные? Хотел посоветоваться)))
Если можно я запишу потом если что отредактируешь свое сообщение чтоб не видели