• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino Nano + HC05 - problem z funkcją "millis"
#9
Na oficjalnym forum arduino dostałem rozwiązanie odnośnie migania z 50 na 100%
Jednak pojawił się kolejny problem, a w zasadzie dwa:
1) Podczas "migania" prawymi lub lewymi kierunkowskazami przednie migają od 0 do 100% natomiast tylne od 50 do 100%, przy wyłączeniu migacza często ten przedni pozostaje włączony (50/50)
Kod odpowiedzialny za miganie:
Kod:
    //Left ON
    if(Data==('g')){
      turnSignalStateRearR = false;
      turnSignalStateFrontR = false;
      analogWrite(turnSignalRearR,constStateLed);
      turnSignalStateRearL = true;
      turnSignalStateFrontL = true;
      sendData("turn signal left ON");
    }
    //Left OFF
    if(Data==('h')){
      turnSignalStateRearL = false;
      turnSignalStateFrontL = false;
      analogWrite(turnSignalRearL,constStateLed);
      digitalWrite(turnSignalStateFrontL,0);
      sendData("turn signal left ON");
    }

    //Right ON
    if(Data==('i')){
      turnSignalStateRearL = false;
      turnSignalStateFrontL = false;
      analogWrite(turnSignalRearL,constStateLed);
      turnSignalStateRearR = true;
      turnSignalStateFrontR = true;
      sendData("turn signal right ON");
    }
    //Right OFF
    if(Data==('j')){
      turnSignalStateRearR = false;
      turnSignalStateFrontR = false;
      analogWrite(turnSignalRearR,constStateLed);
      digitalWrite(turnSignalStateFrontR,0);
      sendData("turn signal right OFF");
    }


2) podczas używania świateł awaryjnych występuje podobna sytuacja + jeżeli przejdę bezpośrednio z migacza na awaryjne te drugie nie są zsynchronizowane.

Kod na światła awaryjne:
Kod:
if(Data==('9')){
      turnSignalStateRearL = true;
      turnSignalStateRearR = true;
      turnSignalStateFrontL = true;
      turnSignalStateFrontR = true;
     
      sendData("HAZARD lights ON");
    }
    //Hazzard lights OFF
    if(Data==('0')){
      turnSignalStateRearL = false;
      turnSignalStateRearR = false;
      turnSignalStateFrontL = false;
      turnSignalStateFrontR = false;
      analogWrite(turnSignalRearL,constStateLed);
      analogWrite(turnSignalRearR,constStateLed);
      sendData("HAZARD lights OFF");
    }

Poniżej zamieszczam pełny kod odpowiedzialny za obsługę świateł w samochodzie:
Kod:
#include <SoftwareSerial.h>
int mainLights = 2; // 2x diode front + 6x diode rear + 3x diode inside
int rearLights = 3; //PWM 2x diode rear 
int reversingLight = 4; //2x diode reversing light
int turnSignalRearL = 5; //PWM 2x diode turn signal rear-left
int turnSignalRearR = 6; //PWM 2x diode turn signal rear-right
int turnSignalFrontL = 7; //2x diode turn signal front-left
int turnSignalFrontR = 8; //2x diode turn signal front-right
int frontLights = 9; //2x diode front lights


const int constStateLed = 50;
int stateLed = 50;
int stateLed2 = 50;


//BLINK / FADE
unsigned long currentTime1 = 0;
unsigned long currentTime2 = 0;
unsigned long currentTime3 = 0;
unsigned long currentTime4 = 0;
unsigned long savedTime1 = 0;
unsigned long savedTime2 = 0;
unsigned long savedTime3 = 0;
unsigned long savedTime4 = 0;
boolean turnSignalStateRearL = false; //turn signal rear left state
boolean turnSignalStateRearR = false; //turn signal rear right state
boolean turnSignalStateFrontL = false;//turn signal front left state
boolean turnSignalStateFrontR = false;//turn signal front right state
boolean hazardLights = false;         //hazard lights

SoftwareSerial Bluetooth(0, 1);
char Data;
void sendData(String transmitData){
Bluetooth.println(transmitData);}

void setup(){
  Bluetooth.begin(9600);
  pinMode(mainLights,OUTPUT);
  pinMode(rearLights,OUTPUT);   
  pinMode(reversingLight,OUTPUT);
  pinMode(turnSignalRearL,OUTPUT);
  pinMode(turnSignalRearR,OUTPUT);   
  pinMode(turnSignalFrontL,OUTPUT);
  pinMode(turnSignalFrontR,OUTPUT);
  pinMode(frontLights,OUTPUT);
}

void loop(){
  currentTime1 = millis();
  currentTime2 = millis();
  currentTime3 = millis();
  currentTime4 = millis();
  //=== REAR turn signal ===

  //REAR Left
  if (turnSignalStateRearL && currentTime1 - savedTime1 >= 300UL) {
    savedTime1 = currentTime1;
    if (stateLed == 50)
      stateLed = 255;
    else
      stateLed = 50;
    analogWrite(turnSignalRearL, stateLed);
  }
  //REAR Right
  if (turnSignalStateRearR && currentTime2 - savedTime2 >= 300UL) {
    savedTime2 = currentTime2;
    if (stateLed2 == 50)
      stateLed2 = 255;
    else
      stateLed2 = 50;
    analogWrite(turnSignalRearR, stateLed2);
  }
 
  //=== FRONT turn signal ===
 
  //FRONT Left
  if (turnSignalStateFrontL && currentTime3 - savedTime3 >= 300UL) {
    savedTime3 = currentTime3;
    digitalWrite(turnSignalFrontL, !digitalRead(turnSignalFrontL));
  }
  //FRONT Right
  if (turnSignalStateFrontR && currentTime4 - savedTime4 >= 300UL) {
    savedTime4 = currentTime4;
    digitalWrite(turnSignalFrontR, !digitalRead(turnSignalFrontR));  
  } 
  //=== HAZARD lights ===
 
  /*I tryed this:
  if (hazardLights && currentTime - savedTime1 >= 300UL) {
    savedTime1 = currentTime;
    if (stateLed == 50)
      stateLed = 255;
    else
      stateLed = 50;
    analogWrite((turnSignalFrontL && turnSignalRearR), stateLed);
  }
  */
 
  //=== BLUETOOTH commands ===
  if(Bluetooth.available()){
    Data=Bluetooth.read();
    if(Data==('a')){
      digitalWrite(mainLights,1);
      analogWrite(rearLights,constStateLed);
      analogWrite(turnSignalRearL,constStateLed);
      analogWrite(turnSignalRearR,constStateLed);
      sendData("main lights ON");
    }
    if(Data==('b')){
      digitalWrite(mainLights,0);
      digitalWrite(rearLights,0);
      digitalWrite(turnSignalRearL,0);
      digitalWrite(turnSignalRearR,0);
      sendData("main lights OFF");
    }
    if(Data==('c')){
      digitalWrite(rearLights,1);
      sendData("frontLights ON");
    }
    if(Data==('d')){
      digitalWrite(rearLights,0);
      sendData("frontLights OFF");
    }
    if(Data==('e')){
      digitalWrite(reversingLight,1);
      sendData("reversingLight ON");
    }
    if(Data==('f')){
      digitalWrite(reversingLight,0);
      sendData("reversingLight OFF");
    }


  //=== BLINKING / FADING ===
    //Left ON
    if(Data==('g')){
      turnSignalStateRearR = false;
      turnSignalStateFrontR = false;
      analogWrite(turnSignalRearR,constStateLed);
      turnSignalStateRearL = true;
      turnSignalStateFrontL = true;
      sendData("turn signal left ON");
    }
    //Left OFF
    if(Data==('h')){
      turnSignalStateRearL = false;
      turnSignalStateFrontL = false;
      analogWrite(turnSignalRearL,constStateLed);
      digitalWrite(turnSignalStateFrontL,0);
      sendData("turn signal left ON");
    }

    //Right ON
    if(Data==('i')){
      turnSignalStateRearL = false;
      turnSignalStateFrontL = false;
      analogWrite(turnSignalRearL,constStateLed);
      turnSignalStateRearR = true;
      turnSignalStateFrontR = true;
      sendData("turn signal right ON");
    }
    //Right OFF
    if(Data==('j')){
      turnSignalStateRearR = false;
      turnSignalStateFrontR = false;
      analogWrite(turnSignalRearR,constStateLed);
      digitalWrite(turnSignalStateFrontR,0);
      sendData("turn signal right OFF");
    }

    //Hazzard lights ON   
    if(Data==('9')){
      turnSignalStateRearL = true;
      turnSignalStateRearR = true;
      turnSignalStateFrontL = true;
      turnSignalStateFrontR = true;
     
      sendData("HAZARD lights ON");
    }
    //Hazzard lights OFF
    if(Data==('0')){
      turnSignalStateRearL = false;
      turnSignalStateRearR = false;
      turnSignalStateFrontL = false;
      turnSignalStateFrontR = false;
      analogWrite(turnSignalRearL,constStateLed);
      analogWrite(turnSignalRearR,constStateLed);
      sendData("HAZARD lights OFF");
    }
  }
}

Edit. Problem z wyłączeniem przednich kierunkowskazów rozwiązany, niestety problem z brakiem synchronizacji pozostaje Sad
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Arduino Nano + HC05 - problem z funkcją "millis" - przez raziel - 18-12-2022, 21:22

Skocz do:


Przeglądający: 1 gości