20-11-2022, 14:29
Cześć,
Od kilku dni pracuje nad swoim pierwszym projektem.
W projekcie mamy do czynienia z trzema diodami led z funkcją on / off. Dwie z nich działają w trybie ciągłym, trzeci ma działać w trybie przerywanym (migotanie). Sterowanie odbywa się za pośrednictwem modułu BT (HC05).
Problem dotyczy działania funkcji millis (migotanie LED - 0,5s) w przypadku gdy jej wykonanie znajduje się w funkcji sprawdzającej dostępność modułu BT - dioda włącza się i działa w trybie ciągłym lub nie włącza się zupełnie (najprawdopodobniej zależy to od tego czy "wstrzelę się" w ustawione 0,5s).
Gdy wyciągam "migotanie LED" poza "Bluetooth.available" dioda się włącza i migoce zgodnie z założeniem.
Komunikacja BT i reszta kodu działa poprawnie.
Proszę o pomoc.
Kod poniżej (linijki mające wpływ na działanie migotania LED zakomentowane są "migająca led"):
#include <SoftwareSerial.h>
#define SWGlowne 5
#define SWDodatkowe 6
#define SWAwaryjne 7 // migająca led
int stanLED1 = LOW; // migająca led
unsigned long aktualnyCzas = 0; // migająca led
unsigned long zapamietanyCzasLED1 = 0; // migająca led
SoftwareSerial Bluetooth(0, 1);
char Data;
void sendData(String transmitData){
Bluetooth.println(transmitData);}
void setup(){
Bluetooth.begin(9600);
pinMode(SWGlowne,OUTPUT);
pinMode(SWDodatkowe,OUTPUT);
pinMode(SWAwaryjne,OUTPUT);
}
void loop(){
aktualnyCzas = millis(); // migająca led / Pobierz liczbe milisekund od startu
if(Bluetooth.available()){
Data=Bluetooth.read();
if(Data==('4')){
digitalWrite(SWGlowne,1);
sendData("SwiataGlowne ON");
}
if(Data==('1')){
digitalWrite(SWGlowne,0);
sendData("SwiataGlowne OFF");
}
if(Data==('5')){
digitalWrite(SWDodatkowe,1);
sendData("SWDodatkowe ON");
}
if(Data==('2')){
digitalWrite(SWDodatkowe,0);
sendData("SWDodatkowe OFF");
}
if(Data==('6')){
if (aktualnyCzas - zapamietanyCzasLED1 >= 500UL) {
zapamietanyCzasLED1 = aktualnyCzas; // migająca led / Zapamietaj aktualny czas
if (stanLED1 == LOW) { // migająca led / Zmieniamy stan diody na przeciwny
stanLED1 = HIGH;
} else {
stanLED1 = LOW;
}
digitalWrite(SWAwaryjne, stanLED1); // migająca led / ustawiamy nowy stan na diodzie
}
}
if(Data==('3')){
digitalWrite(SWAwaryjne,0);
sendData("SWAwaryjne OFF");
}
if(Data==('9')){
digitalWrite(SWGlowne,1);
digitalWrite(SWDodatkowe,1);
digitalWrite(SWAwaryjne,1);
sendData("ALL LIGHTS ON");
}
if(Data==('0')){
digitalWrite(SWGlowne,0);
digitalWrite(SWDodatkowe,0);
digitalWrite(SWAwaryjne,0);
sendData("ALL LIGHTS OFF");
}
}
}
Od kilku dni pracuje nad swoim pierwszym projektem.
W projekcie mamy do czynienia z trzema diodami led z funkcją on / off. Dwie z nich działają w trybie ciągłym, trzeci ma działać w trybie przerywanym (migotanie). Sterowanie odbywa się za pośrednictwem modułu BT (HC05).
Problem dotyczy działania funkcji millis (migotanie LED - 0,5s) w przypadku gdy jej wykonanie znajduje się w funkcji sprawdzającej dostępność modułu BT - dioda włącza się i działa w trybie ciągłym lub nie włącza się zupełnie (najprawdopodobniej zależy to od tego czy "wstrzelę się" w ustawione 0,5s).
Gdy wyciągam "migotanie LED" poza "Bluetooth.available" dioda się włącza i migoce zgodnie z założeniem.
Komunikacja BT i reszta kodu działa poprawnie.
Proszę o pomoc.
Kod poniżej (linijki mające wpływ na działanie migotania LED zakomentowane są "migająca led"):
#include <SoftwareSerial.h>
#define SWGlowne 5
#define SWDodatkowe 6
#define SWAwaryjne 7 // migająca led
int stanLED1 = LOW; // migająca led
unsigned long aktualnyCzas = 0; // migająca led
unsigned long zapamietanyCzasLED1 = 0; // migająca led
SoftwareSerial Bluetooth(0, 1);
char Data;
void sendData(String transmitData){
Bluetooth.println(transmitData);}
void setup(){
Bluetooth.begin(9600);
pinMode(SWGlowne,OUTPUT);
pinMode(SWDodatkowe,OUTPUT);
pinMode(SWAwaryjne,OUTPUT);
}
void loop(){
aktualnyCzas = millis(); // migająca led / Pobierz liczbe milisekund od startu
if(Bluetooth.available()){
Data=Bluetooth.read();
if(Data==('4')){
digitalWrite(SWGlowne,1);
sendData("SwiataGlowne ON");
}
if(Data==('1')){
digitalWrite(SWGlowne,0);
sendData("SwiataGlowne OFF");
}
if(Data==('5')){
digitalWrite(SWDodatkowe,1);
sendData("SWDodatkowe ON");
}
if(Data==('2')){
digitalWrite(SWDodatkowe,0);
sendData("SWDodatkowe OFF");
}
if(Data==('6')){
if (aktualnyCzas - zapamietanyCzasLED1 >= 500UL) {
zapamietanyCzasLED1 = aktualnyCzas; // migająca led / Zapamietaj aktualny czas
if (stanLED1 == LOW) { // migająca led / Zmieniamy stan diody na przeciwny
stanLED1 = HIGH;
} else {
stanLED1 = LOW;
}
digitalWrite(SWAwaryjne, stanLED1); // migająca led / ustawiamy nowy stan na diodzie
}
}
if(Data==('3')){
digitalWrite(SWAwaryjne,0);
sendData("SWAwaryjne OFF");
}
if(Data==('9')){
digitalWrite(SWGlowne,1);
digitalWrite(SWDodatkowe,1);
digitalWrite(SWAwaryjne,1);
sendData("ALL LIGHTS ON");
}
if(Data==('0')){
digitalWrite(SWGlowne,0);
digitalWrite(SWDodatkowe,0);
digitalWrite(SWAwaryjne,0);
sendData("ALL LIGHTS OFF");
}
}
}