RE: Arduino Nano + HC05 - problem z funkcją "millis" - raziel - 18-12-2022
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
RE: Arduino Nano + HC05 - problem z funkcją "millis" - raziel - 19-12-2022
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();
}
}
}
|