Помогите с кодом кнопок и плавного включения ламп
- Войдите на сайт для отправки комментариев
Ребята, нужна Ваша помощь, так как в Arduino это моя первая работа, не получается довести код до ума.
Суть работы кода:
при нажатии на кнопку 1(А0) - происходит включение габаритных огней, при повторном нажатии выключение;
при нажатии на кнопку 2 (А1) - происходит включение ближнего света, при повторном нажатии выключение ближнего и включение дальнего света, при третьем нажатии происходит выключение дальнего света.
Индикацию работы выходов вывел через адресную ленту.
Кнопка 3(А2) отвечает за включение пульта управления гидравликой, в этой части вроде все работает.
Что я только не пробовал, не могу заставить лампы плавно включаться и плавно выключаться .....
И чтобы при удержании кнопки 2(А1) происходило выключение ближнего света без включения дальнего.
Буду признателен за помощь.
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel pixels_1 = Adafruit_NeoPixel(8, 12, NEO_GRB + NEO_KHZ800);
int butt_two = 1; // включение ближний - дальний
int flag_butt_two = 0;
int butt_one = 1; // включение габаритов
int flag_butt_one = 0;
int butt_three = 1; // включение пульта
int flag_butt_three=0;
long last_press;
#define butt_1 A0;
void setup()
{
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12,OUTPUT);
pixels_1.begin();
pixels_1.setBrightness(70);
pixels_1.setPixelColor(8-1, pixels_1.Color(255,0,0));
}
void loop()
{
// включение ближний - дальний
pixels_1.show();
if(digitalRead(A1)==HIGH&&flag_butt_two==0 && millis() - last_press > 200) {
butt_two++;
flag_butt_two=1;
if(butt_two>3){
butt_two=1;}
}
if(digitalRead(A1)==LOW&&flag_butt_two==1 && millis() - last_press > 200){
flag_butt_two=0;
}
if(butt_two==1){
digitalWrite(5,LOW);
digitalWrite(6,LOW);
pixels_1.setPixelColor(2-1, pixels_1.Color(0,0,0));
pixels_1.setPixelColor(3-1, pixels_1.Color(0,0,0));
}
if(butt_two==2){
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
pixels_1.setPixelColor(2-1, pixels_1.Color(9,189,0));
pixels_1.setPixelColor(3-1, pixels_1.Color(0,0,0));
}
if(butt_two==3){
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
pixels_1.setPixelColor(2-1, pixels_1.Color(0,0,0));
pixels_1.setPixelColor(3-1, pixels_1.Color(0,66,255));
}
// включение габаритов
if(digitalRead(A0)==HIGH&&flag_butt_one==0 && millis() - last_press > 200) {
butt_one++;
flag_butt_one=1;
if(butt_one>2){
butt_one=1;
}
}
if(digitalRead(A0)==LOW&&flag_butt_one==1 && millis() - last_press > 200){
flag_butt_one=0;
}
if(butt_one==1 && millis() - last_press > 100){
digitalWrite(3,LOW);
pixels_1.setPixelColor(1-1, pixels_1.Color(0,0,0));
}
if(butt_one==2 && millis() - last_press > 100) {
// delay(50);
digitalWrite(3,HIGH);
pixels_1.setPixelColor(1-1, pixels_1.Color(252,237,0));
}
// включение пульта
if(digitalRead(A2)==HIGH&&flag_butt_three==0 && millis() - last_press > 200) {
delay(50);
butt_three++;
flag_butt_three=1;
if(butt_three>2){
delay(50);
butt_three=1;
}
}
if(digitalRead(A2)==LOW&&flag_butt_three==1){
flag_butt_three=0;
}
if(butt_three==1){
pixels_1.setPixelColor(4-1, pixels_1.Color(0,0,0));
}
if(butt_three==2) {
delay(50);
pixels_1.setPixelColor(4-1, pixels_1.Color(255,0,0));
// настройка пульта
if (analogRead(A4) < 150) {
if (analogRead(A5) > 500) {
if (analogRead(A5) < 600) {
digitalWrite(8,HIGH);
}
}
} else {
digitalWrite(8,LOW);
}
if (analogRead(A4) > 900) {
if (analogRead(A5) > 500) {
if (analogRead(A5) < 600) {
digitalWrite(9,HIGH);
}
}
} else {
digitalWrite(9,LOW);
}
if (analogRead(A5) < 150) {
if (analogRead(A4) > 450) {
if (analogRead(A4) < 550) {
digitalWrite(10,HIGH);
}
}
} else {
digitalWrite(10,LOW);
}
if (analogRead(A5) > 900) {
if (analogRead(A4) > 450) {
if (analogRead(A4) < 550) {
digitalWrite(11,HIGH);
}
}
} else {
digitalWrite(11,LOW);
}
}
}
Так , а какая часть кода тут должна плавно это делать? Если у вас есть только high и low!
От строчки 39 до 69 включение ближний - дальний и от строчки 70 до 92 включение габаритов
А ваше авто умеет плавно включать/выключать свет? Или что вы имеете в виду под словом "плавно"?
Авто так не умеет пока ))) при включении кнопкой подается питание с плавным нарастанием выходного напряжения до 5В на транзисторный ключ , при плавном открытии транзистора нагрузка, которой будет лампочка, также будет плавно разгораться. При повторном нажатии на кнопку все в обратной последовательности.
и смотрите внимательно что вы делаете с одинокой last_press
Авто так не умеет пока ))) при включении кнопкой подается питание с плавным нарастанием выходного напряжения до 5В на транзисторный ключ , при плавном открытии транзистора нагрузка, которой будет лампочка, также будет плавно разгораться. При повторном нажатии на кнопку все в обратной последовательности.
так, а где функция analogWrite ? у вас есть только вкл и выкл.
Вообще-то это уже нарушение технического регламента, за такое можно нарваться на запрет эксплуатации ;) Да и блажь это, имхо, свет должен включаться быстро, а не задумчиво. От этого зависит ваша безопасность на дороге. Причем, не только лично ваша, но и безопасность для окружающих.
Плавное управление нагрузкой - это ШИМ, читайте даташиты, чтобы понять, на каких пинах оно есть.
Отслеживание длинного/короткого клика - это любая кнопочная библиотека умеет
analogWrite - пока был заменен обратно на digitalWrite, так как нечего кроме мигания ламп и зависания Arduino не удалось, не чего добиться
Кстати, ардуино в авто - это совсем не просто ;) - https://techno-mind.ru/elektronika-i-soft/pitanie-chuvstvitelnoj-elektroniki-ot-bortovoj-seti-legkovogo-avtomobilya.html
Это включение дополнительного освещения на грузовой машине, к включению основного автомобильного света это не имеет отношения.
ШИМ есть на тех выходах к которым подключено управление транзисторными ключами - 3, 5, 6.
analogWrite - пока был заменен обратно на digitalWrite, так как нечего кроме мигания ламп и зависания Arduino не удалось, не чего добиться
так и выложите код с которым проблема. чтоб было понимание где у вас непонимание.
да и вот это (
millis() - last_press > 200)что делает и чему равноlast_press.?long pressing; long action; long bright; void setup() { Serial.begin(9600); pressing = 1; action = 0; bright = 0; pinMode(A0,INPUT_PULLUP); pinMode(5, OUTPUT); } void loop() { if ((!digitalRead(A0)) == true) { pressing = pressing * -1; action = 1; if (pressing == -1 && action == 1) { for (int count = 0; count < 255; count++) { bright = bright + 1; analogWrite(5,bright); delay(20); Serial.println(bright); } action = 0; } else { for (int count = 0; count < 255; count++) { bright = bright - 1; analogWrite(5,bright); delay(20); Serial.println(bright); } action = 0; } } }Вот код который может работать с плавным включением/выключением отдельно, при попытке интегрировать его в мой код, нечего не получается.
Last_press - это пока не совсем удачная попытка избавиться от delay
Функция плавного включения, принимает номер пина, на котором нужно включить лампу
void lightOn(byte pin) { for (byte count = 0; count < 255; count++) { analogWrite(pin, count); delay(20); } }Выключение аналогично
void lightOff(byte pin) { for (byte count = 255; count > 0; count--) { analogWrite(pin, count); delay(20); } }При delay(20) включение/выключение будет занимать примерно 2,5 секунды, думаю, можно сильно уменьшить задержку
if(butt_one==2) { // digitalWrite(3,HIGH); void lightOn(byte 3) { for (byte count = 0; count < 255; count++) { analogWrite(3, count); delay(20); } } pixels_1.setPixelColor(1-1, pixels_1.Color(252,237,0)); }Я правильно Вас понял ???
Это бред какой-то ))))))
void lightOn(byte 3) { for (byte count = 0; count < 255; count++) { analogWrite(3, count); delay(20); } void loop(){ if(butt_one==2) { // digitalWrite(3,HIGH); lightOn(3); pixels_1.setPixelColor(1-1, pixels_1.Color(252,237,0)); } }Только имейте в виду - включение/выключение будет занимать примерно 2,5 секунды, и в это время МК не будет ни на что реагировать. Поэтому задержку лучше уменьшить раз в пять - delay(4);
Это бред какой-то ))))))
это вы про это?
void lightOn(byte 3) {- конечно бред
От строчки 39 до 69 включение ближний - дальний и от строчки 70 до 92 включение габаритов
39-69 можно попробовать так
uint8_t butt_two = 0; // включение ближний - дальний bool flag_butt_two = false; uint8_t speed_light = 10, speed_light_m = 10 ; // влияют на скорость плавного включения\выключения (0-255) uint32_t last_press, timer; int i = 0; ...... pinMode(A1, INPUT_PULLUP); ....... // включение ближний - дальний pixels_1.show(); if (digitalRead(A1) == HIGH && millis() - last_press > 200) { // && flag_butt_two == 0)// && millis() - last_press > 200) { flag_butt_two = false ; last_press = millis(); } if (digitalRead(A1) == LOW && flag_butt_two == false && millis() - last_press > 200) { // && millis() - last_press > 200) { butt_two = butt_two + 1; if (butt_two > 2) { butt_two = 0; } flag_butt_two = true; last_press = millis(); } if (butt_two == 0) { digitalWrite(5, LOW); digitalWrite(6, LOW); i = 0; pixels_1.setPixelColor(2 - 1, pixels_1.Color(0, 0, 0)); pixels_1.setPixelColor(3 - 1, pixels_1.Color(0, 0, 0)); } if (butt_two == 1) { if (i >= 0 && i < 255 && millis() - timer > speed_light_m) { timer = millis(); i = i + speed_light; if (i > 250)i = 255; } analogWrite(5, i); pixels_1.setPixelColor(2 - 1, pixels_1.Color(9, 189, 0)); pixels_1.setPixelColor(3 - 1, pixels_1.Color(0, 0, 0)); } if (butt_two == 2) { if (i > 0 && i <= 255 && millis() - timer > speed_light_m) { timer = millis(); i = i - speed_light; if (i < 5)i = 0; } analogWrite(5, i); analogWrite(6, 255 - i); pixels_1.setPixelColor(2 - 1, pixels_1.Color(0, 0, 0)); pixels_1.setPixelColor(3 - 1, pixels_1.Color(0, 66, 255)); }Fenicksnet, спасибо большое за помощь!
Буду разбираться дальше! Ваш код сработал так как нужно!
По примеру попробую переделать и для строчек кода 70-92.