Помогите с кодом кнопок и плавного включения ламп

Global
Offline
Зарегистрирован: 15.04.2021

Ребята, нужна Ваша помощь, так как в 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);
    }
  }
      
 } 

 

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

Так , а какая часть кода тут должна плавно это делать? Если у вас есть только high  и low!

Global
Offline
Зарегистрирован: 15.04.2021

От строчки 39 до 69 включение ближний - дальний  и  от строчки 70 до 92 включение габаритов

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

А ваше авто умеет плавно включать/выключать свет? Или что вы имеете в виду под словом "плавно"?

Global
Offline
Зарегистрирован: 15.04.2021

Авто так не умеет пока ))) при включении  кнопкой подается питание с плавным нарастанием выходного напряжения до 5В на транзисторный ключ  , при плавном открытии транзистора нагрузка, которой будет лампочка, также будет плавно разгораться. При повторном нажатии на кнопку все в обратной последовательности. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

и смотрите внимательно что вы делаете с одинокой  last_press

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

Global пишет:

Авто так не умеет пока ))) при включении  кнопкой подается питание с плавным нарастанием выходного напряжения до 5В на транзисторный ключ  , при плавном открытии транзистора нагрузка, которой будет лампочка, также будет плавно разгораться. При повторном нажатии на кнопку все в обратной последовательности. 

так, а где функция analogWrite ?  у вас есть только вкл и выкл.

...
057	      digitalWrite(5,HIGH);
058	      digitalWrite(6,LOW);
...

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Вообще-то это уже нарушение технического регламента, за такое можно нарваться на запрет эксплуатации ;) Да и блажь это, имхо, свет должен включаться быстро, а не задумчиво. От этого зависит ваша безопасность на дороге. Причем, не только лично ваша, но и безопасность для окружающих.

Плавное управление нагрузкой - это ШИМ, читайте даташиты, чтобы понять, на каких пинах оно есть.

Отслеживание длинного/короткого клика - это любая кнопочная библиотека умеет

Global
Offline
Зарегистрирован: 15.04.2021

analogWrite - пока был заменен обратно на digitalWrite, так как нечего кроме мигания ламп и зависания Arduino  не удалось, не чего добиться

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Кстати, ардуино в авто - это совсем не просто ;) - https://techno-mind.ru/elektronika-i-soft/pitanie-chuvstvitelnoj-elektroniki-ot-bortovoj-seti-legkovogo-avtomobilya.html

Global
Offline
Зарегистрирован: 15.04.2021

Это включение дополнительного освещения на грузовой машине, к включению основного автомобильного света это не имеет отношения.

ШИМ есть на тех выходах к которым подключено управление транзисторными ключами - 3, 5, 6.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

Global пишет:

analogWrite - пока был заменен обратно на digitalWrite, так как нечего кроме мигания ламп и зависания Arduino  не удалось, не чего добиться

так и выложите код с которым проблема. чтоб было понимание где у вас непонимание.

да и вот это (millis() - last_press > 200)  что делает и чему равно last_press.?

Global
Offline
Зарегистрирован: 15.04.2021
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;

      }
    }
}

Вот код который может работать с плавным включением/выключением отдельно, при попытке интегрировать его в мой код, нечего не получается.

Global
Offline
Зарегистрирован: 15.04.2021

Last_press - это пока не совсем удачная попытка избавиться от delay  

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Функция плавного включения, принимает номер пина, на котором нужно включить лампу

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 секунды, думаю, можно сильно уменьшить задержку

Global
Offline
Зарегистрирован: 15.04.2021
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));
}

Я правильно Вас понял ???

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Это бред какой-то ))))))

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);

b707
Offline
Зарегистрирован: 26.05.2017

v258 пишет:

Это бред какой-то ))))))

это вы про это?

void lightOn(byte 3) {

- конечно бред

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

Global пишет:

От строчки 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));
  }

 

Global
Offline
Зарегистрирован: 15.04.2021

Fenicksnet, спасибо большое за помощь!

Буду разбираться дальше! Ваш код сработал так как нужно!

По примеру попробую переделать и для строчек кода 70-92.