• 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"
#11
50 do 255 oznacza to samo co 50 do 100%
PWM na 255 = 100%
50 nie oznacza 50% a poziom mocy napięcia diody.
Mój błąd, że zastosowałem oba zapisy naprzemiennie.

Niestety program zmuszał mnie do stosowani 4 timerów, gdy opieram się na jednym włączał się tylko jeden kierunkowskaz. reszta nawet się nie odpalała
.
Po próbie uproszczenia kodu, udało mi się zejść do 2 timerów, każdy  odpowiada za jedną ze stron migaczy czyli odpowiednio:
1. Para migaczy z prawej strony (przód/tył).
2. Para migaczy z lewej strony (przód/tył).
Przy próbie zastosowania jednego timera światła awaryjne (funkcja odpalająca wszystkie kierunkowskazy jednocześnie) powoduje, że tylko jedna strona się włącza.
Ale to nie wszystko... Pomimo zastosowania osobnego timera dla pary migaczy (przednich i tylnych) także one potrafią przy 2 - 3 włączeniu nie działać synchronicznie, np. jeżeli wyłączę kierunkowskaz gdy jest zapalony i włączę go ponownie.

Poniżej przesyłam okrojony kod zawierający tylko niezbędne informacje do jego działania:
Kod:
#include <SoftwareSerial.h>
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

const int constStateLed = 50;
int stateLed1 = 50;
int stateLed2 = 50;

//BLINK / FADE
unsigned long currentTime1 = 0;
unsigned long savedTime1 = 0;
unsigned long savedTime2 = 0;
boolean kierunkiLewe = false;
boolean kierunkiPrawe = false;

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

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

void loop(){
  currentTime1 = millis();
 
  //=== LEFT turn signal ===
  if (kierunkiLewe && currentTime1 - savedTime1 >= 300UL) {
    savedTime1 = currentTime1;
    digitalWrite(turnSignalFrontL, !digitalRead(turnSignalFrontL));
    if (stateLed1 == 50)
      stateLed1 = 255;
    else
      stateLed1 = 50;
    analogWrite(turnSignalRearL, stateLed1);
  }

  //=== RIGHT turn signal ===
  if (kierunkiPrawe && currentTime1 - savedTime2 >= 300UL) {
    savedTime2 = currentTime1;
    digitalWrite(turnSignalFrontR, !digitalRead(turnSignalFrontR));
    if (stateLed2 == 50)
      stateLed2 = 255;
    else
      stateLed2 = 50;
    analogWrite(turnSignalRearR, stateLed2);
  }
 

  if(Bluetooth.available()){
    Data=Bluetooth.read();

    //Left ON
    if(Data==('g')){
      kierunkiPrawe = false;
      analogWrite(turnSignalRearR,constStateLed);
      kierunkiLewe = true;
      sendData("turn signal left ON");
    }
    //Left OFF
    if(Data==('h')){
      kierunkiLewe = false;
      analogWrite(turnSignalRearL,constStateLed);
      digitalWrite(turnSignalFrontL,0);;
      sendData("turn signal left OFF");
    }

    //Right ON
    if(Data==('i')){
      kierunkiLewe = false;
      analogWrite(turnSignalRearL,constStateLed);
      kierunkiPrawe = true;
      sendData("turn signal right ON");
    }
    //Right OFF
    if(Data==('j')){
      kierunkiPrawe = false;
      analogWrite(turnSignalRearR,constStateLed);
      digitalWrite(turnSignalFrontR,0);
      sendData("turn signal right OFF");
    }
   
    //Hazzard lights OM
    if(Data==('9')){     
      kierunkiLewe = true;
      kierunkiPrawe = true;
      sendData("HAZARD lights ON");
    }
    //Hazzard lights OFF
    if(Data==('0')){
      kierunkiLewe = false;
      kierunkiPrawe = false;
      digitalWrite(turnSignalFrontL,0);
      digitalWrite(turnSignalFrontR,0);
      analogWrite(turnSignalRearL,constStateLed);
      analogWrite(turnSignalRearR,constStateLed);
      sendData("HAZARD lights OFF");
    }
  }
}
W obecnej formie kodu muszę posługiwać się dwiema zmiennymi przechowującymi stan diod (stateLed1 i stateLed2) oraz dwiema zmiennymi savedTime1 i savedTime2
 
Odpowiedź
#12
Przebudowałem kod w oparciu o switch.
Wszystko wygląda / działa ok i jest zsynchronizowane.
Dziękuję za sugestie.

Poniżej wklejam kod na trochę nietypowe kierunkowskazy oraz światła awaryjne:
Kod:
#include <SoftwareSerial.h>

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

bool turnSignalIsOn = false;
bool turnSignalIsOn2 = false;
bool turnSignalIsOn3 = false;
bool ledIsOn = false;
unsigned long lastBlinkTime;
int currentFadeValue;

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

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

void loop() {
 
  switch (Bluetooth.read()) {
   
    //=== LEFT turn signal ===
    case 'g':
      analogWrite(turnSignalRearR, 0);    // Right off
      digitalWrite(turnSignalFrontR, 0);  // Right off
      turnSignalIsOn2 = false;            // Right off
      turnSignalIsOn3 = false;            // Hazzard off
      analogWrite(turnSignalRearL, 255);
      digitalWrite(turnSignalFrontL, 1);
      turnSignalIsOn = true;
      lastBlinkTime = millis();
      ledIsOn = true;
      currentFadeValue = 255;
      break;
    case 'h':
      analogWrite(turnSignalRearL, 0);
      digitalWrite(turnSignalFrontL, 0);
      turnSignalIsOn = false;
      ledIsOn = false;
      break;
     
    //=== RIGHT turn signal ===
    case 'i':
      analogWrite(turnSignalRearL, 0);   // Left off
      digitalWrite(turnSignalFrontL, 0); // Left off
      turnSignalIsOn = false;            // Left off
      turnSignalIsOn3 = false;           // Hazzard off
      analogWrite(turnSignalRearR, 255);
      digitalWrite(turnSignalFrontR, 1);
      turnSignalIsOn2 = true;
      lastBlinkTime = millis();
      ledIsOn = true;
      currentFadeValue = 255;
      break;
    case 'j':
      analogWrite(turnSignalRearR, 0);
      digitalWrite(turnSignalFrontR,0);
      turnSignalIsOn2 = false;
      ledIsOn = false;
      break;
     
    //=== HAZZARD signal ===
    case '9':
      analogWrite(turnSignalRearL, 0);    // Left off
      digitalWrite(turnSignalFrontL, 0);  // Left off
      turnSignalIsOn = false;             // Left off
      analogWrite(turnSignalRearR, 0);    // Right off
      digitalWrite(turnSignalFrontR, 0);  // Right off
      turnSignalIsOn2 = false;            // Right off
      analogWrite(turnSignalRearL, 255);
      digitalWrite(turnSignalFrontL, 1);
      analogWrite(turnSignalRearR, 255);
      digitalWrite(turnSignalFrontR, 1);
      turnSignalIsOn3 = true;
      lastBlinkTime = millis();
      ledIsOn = true;
      currentFadeValue = 255;
      break;
    case '0':
      analogWrite(turnSignalRearL, 0);
      digitalWrite(turnSignalFrontL, 0);
      analogWrite(turnSignalRearR, 0);
      digitalWrite(turnSignalFrontR, 0);
      turnSignalIsOn3 = false;
      ledIsOn = false;
      break;
    default: break;
  }

  //=== BLINKING / FADING code ===
 
  //LEFT
  if (turnSignalIsOn) {
    if (millis() - lastBlinkTime >= 300) {
      if (ledIsOn) {
        analogWrite(turnSignalRearL, 50);
        digitalWrite(turnSignalFrontL, 0);
        if (currentFadeValue <= 50)  turnSignalIsOn = false;
      } else {
        Serial.println(currentFadeValue);
        analogWrite(turnSignalRearL, currentFadeValue);
        digitalWrite(turnSignalFrontL, 1);
      }
      ledIsOn = ! ledIsOn;
      lastBlinkTime = millis();
    }
  }
 
  //RIGHT
  if (turnSignalIsOn2) {
    if (millis() - lastBlinkTime >= 300) {
      if (ledIsOn) {
        analogWrite(turnSignalRearR, 50);
        digitalWrite(turnSignalFrontR, 0);
        if (currentFadeValue <= 50)  turnSignalIsOn2 = false;
      } else {
        Serial.println(currentFadeValue);
        analogWrite(turnSignalRearR, currentFadeValue);
        digitalWrite(turnSignalFrontR, 1);
      }
      ledIsOn = ! ledIsOn;
      lastBlinkTime = millis();
    }
  }
 
  //HAZZARD
  if (turnSignalIsOn3) {
    if (millis() - lastBlinkTime >= 300) {
      if (ledIsOn) {
        analogWrite(turnSignalRearL, 50);
        digitalWrite(turnSignalFrontL, 0);
        analogWrite(turnSignalRearR, 50);
        digitalWrite(turnSignalFrontR, 0);
        if (currentFadeValue <= 50)  turnSignalIsOn3 = false;
      } else {
        Serial.println(currentFadeValue);
        analogWrite(turnSignalRearL, currentFadeValue);
        digitalWrite(turnSignalFrontL, 1);
        analogWrite(turnSignalRearR, currentFadeValue);
        digitalWrite(turnSignalFrontR, 1);
      }
      ledIsOn = ! ledIsOn;
      lastBlinkTime = millis();
    }
  }
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości