Помогите с кодом
- Войдите на сайт для отправки комментариев
Втр, 24/07/2018 - 21:07
Ниже приложенный код (ардуино UNO) должен при загрузке на плату и при нажатии кнопки "заставлять" RGB-светодиод загараться разными цветами (всего 7) -это работает правильно. Но далее, согласно коду, при повторном нажатии на кнопку RGB-светодиод должен загараться теми же цветами, но при этом мигать каждым -этого не происходит (я нажимаю кнопку второй раз, но светодиод продолжает загараться разными цветами без мигания).
Подскажи пож., что не так?
Вот код:
const int GLED = 10;
const int RLED = 11;
const int BLED = 9;
const int BUTTON = 2;
int RLEDState = LOW;
int BLEDState = LOW;
int GLEDState = LOW;
long previousMillis = 0;
long interval = 1000;
boolean lastButton = LOW;
boolean currentButton = LOW;
int ledMode = 0;
void setup()
{
pinMode (BLED, OUTPUT);
pinMode (GLED, OUTPUT);
pinMode (RLED, OUTPUT);
pinMode (BUTTON, INPUT);
}
boolean debounce(boolean last)
{
boolean current = digitalRead(BUTTON);
if (last != current)
{
delay(5);
current = digitalRead (BUTTON);
return current;
}
}
void setMode(int mode)
{
if ( mode == 1)
{
//КРАСНЫЙ
digitalWrite(RLED, HIGH);
digitalWrite(GLED, LOW );
digitalWrite(BLED, LOW);
delay(1000);
// зеленый
digitalWrite(RLED, LOW);
digitalWrite(GLED, HIGH );
digitalWrite(BLED, LOW);
delay(1000);
// синий
digitalWrite(RLED, LOW);
digitalWrite(GLED, LOW);
digitalWrite(BLED, HIGH);
delay(1000);
//ПУРПУРНЫЙ КР+С
analogWrite(RLED, 127);
analogWrite(GLED, 0);
analogWrite(BLED, 127);
delay(1000);
//бирюзовый с+зел
analogWrite(RLED, 0);
analogWrite(GLED, 200);
analogWrite(BLED, 90);
delay(1000);
//ОРАНЖЕВЫЙ ЗЕЛ+КР
analogWrite(RLED, 224);
analogWrite(GLED, 20);
analogWrite(BLED, 0);
delay(1000);
// БЕЛЫЙ ЗЕЛ+КР+С
analogWrite(RLED, 127);
analogWrite(GLED, 127);
analogWrite(BLED, 127);
delay(1000);
analogWrite(RLED, LOW);
analogWrite(GLED, LOW);
analogWrite(BLED, LOW);
delay(1000);
}
else if ( mode == 2)
{
// КРАСНЫЙ
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (RLEDState == LOW)
RLEDState = HIGH;
else
RLEDState = LOW;
digitalWrite(RLED, RLEDState);
}
delay(5000);
// зеленый
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (GLEDState == LOW)
GLEDState = HIGH;
else
GLEDState = LOW;
digitalWrite(GLED, GLEDState);
}
delay(5000);
// синий
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (BLEDState == LOW)
BLEDState = HIGH;
else
BLEDState = LOW;
digitalWrite(BLED, BLEDState);
}
delay(5000);
//ПУРПУРНЫЙ КР+С
unsigned long currentMillis = millis();
if (currentMillis4 - previousMillis >= interval) {
previousMillis = currentMillis;
if (BLEDState == 0)
BLEDState = 127;
else
BLEDState = 0;
analogWrite(BLED, BLEDState);
if (RLEDState == 0)
RLEDState = 150;
else
RLEDState = 0;
analogWrite(RLED, RLEDState);
}
delay(5000);
//бирюзовый с+зел
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (GLEDState == 0)
GLEDState = 200;
else
GLEDState = 0;
analogWrite(GLED, GLEDState);
if (BLEDState == 0)
BLEDState = 90;
else
BLEDState = 0;
analogWrite(BLED, BLEDState);
}
delay(1000);
//ОРАНЖЕВЫЙ ЗЕЛ+КР
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (RLEDState == 0)
RLEDState = 224;
else
RLEDState = 0;
analogWrite(RLED, RLEDState);
if (GLEDState == 0)
GLEDState = 18;
else
GLEDState = 0;
analogWrite(GLED, GLEDState);
}
delay(5000);
// БЕЛЫЙ ЗЕЛ+КР+С
unsigned long currentMillis = millis();
if (currentMillis1 - previousMillis >= interval) {
previousMillis = currentMillis;
if (BLEDState == 0)
BLEDState = 127;
else
BLEDState = 0;
analogWrite(BLED, BLEDState);
if (RLEDState == 0)
RLEDState = 140;
else
RLEDState = 0;
analogWrite(RLED, RLEDState);
if (GLEDState == 0)
GLEDState = 127;
else
GLEDState = 0;
analogWrite(GLED, GLEDState);
}
delay(5000);
}
}
void loop()
{
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
{
ledMode++;
}
lastButton = currentButton;
if (ledMode == 3)
ledMode = 0;
setMode(ledMode);
}
Neznayka_V_shlape. Разумеется. Я бы дальше сказал, что вам надо укреплять свои программисткие мускулы, потому что с этими вы никуда не прийдете https://www.youtube.com/watch?v=P-5-HZi6OW4
ПС:#7
Спасибо, любитель мультиков)
Пробуйте
const int GLED = 10; const int RLED = 11; const int BLED = 9; const int BUTTON = 2; int RLEDState = LOW; int BLEDState = LOW; int GLEDState = LOW; //uint32_t previousMillis = 0; long interval = 1000; byte kolor = 0;// 0-КРАСНЫЙ; 1-зеленый;2-синий;3-ПУРПУРНЫЙ;4-бирюзовый;5-ОРАНЖЕВЫЙ;6-БЕЛЫЙ; byte variant_kolor = 0; unsigned long currentMillis = millis(); boolean lastButton = LOW; boolean currentButton = LOW; int ledMode = 0; void setup() { pinMode (BLED, OUTPUT); pinMode (GLED, OUTPUT); pinMode (RLED, OUTPUT); pinMode (BUTTON, INPUT); } boolean debounce(boolean last) { boolean current = digitalRead(BUTTON); if (last != current) { delay(5); current = digitalRead (BUTTON); return current; } } void setMode(int mode) { if ( mode == 1) { if (millis() - currentMillis >= interval) { switch (kolor) { case 0: digitalWrite(RLED, HIGH); digitalWrite(GLED, LOW ); digitalWrite(BLED, LOW); currentMillis = millis(); kolor++; break; case 1: digitalWrite(RLED, LOW); digitalWrite(GLED, HIGH ); digitalWrite(BLED, LOW); currentMillis = millis(); kolor++; break; case 2: digitalWrite(RLED, LOW); digitalWrite(GLED, LOW); digitalWrite(BLED, HIGH); currentMillis = millis(); kolor++; break; case 3: analogWrite(RLED, 127); analogWrite(GLED, 0); analogWrite(BLED, 127); currentMillis = millis(); kolor++; break; case 4: analogWrite(RLED, 0); analogWrite(GLED, 200); analogWrite(BLED, 90); currentMillis = millis(); kolor++; break; case 5: analogWrite(RLED, 224); analogWrite(GLED, 20); analogWrite(BLED, 0); currentMillis = millis(); kolor++; break; case 6: analogWrite(RLED, 127); analogWrite(GLED, 127); analogWrite(BLED, 127); currentMillis = millis(); kolor++; analogWrite(RLED, LOW); analogWrite(GLED, LOW); analogWrite(BLED, LOW); currentMillis = millis(); kolor++; break; case 7: analogWrite(RLED, LOW); analogWrite(GLED, LOW); analogWrite(BLED, LOW); currentMillis = millis(); kolor = 0; break; } } } else if ( mode == 2){ interval = 500; if (millis() - currentMillis >= interval) { switch (variant_kolor){ case 0: if (RLEDState == LOW) RLEDState = HIGH; else { RLEDState = LOW; digitalWrite(RLED, RLEDState); } currentMillis = millis(); variant_kolor++; break; case 1: if (GLEDState == LOW) GLEDState = HIGH; else{ GLEDState = LOW; digitalWrite(GLED, GLEDState); } currentMillis = millis(); variant_kolor++; break; case 2: if (BLEDState == LOW) BLEDState = HIGH; else{ BLEDState = LOW; digitalWrite(BLED, BLEDState); } currentMillis = millis(); variant_kolor++; break; case 3: if (BLEDState == 0) BLEDState = 127; else{ BLEDState = 0; analogWrite(BLED, BLEDState); } if (RLEDState == 0) RLEDState = 150; else{ RLEDState = 0; analogWrite(RLED, RLEDState); } currentMillis = millis(); variant_kolor++; break; case 4: if (GLEDState == 0) GLEDState = 200; else{ GLEDState = 0; analogWrite(GLED, GLEDState); } if (BLEDState == 0) BLEDState = 90; else{ BLEDState = 0; analogWrite(BLED, BLEDState); } currentMillis = millis(); variant_kolor++; break; case 5: if (RLEDState == 0) RLEDState = 224; else{ RLEDState = 0; analogWrite(RLED, RLEDState); } if (GLEDState == 0) GLEDState = 18; else{ GLEDState = 0; analogWrite(GLED, GLEDState); } currentMillis = millis(); variant_kolor++; break; case 6: if (BLEDState == 0) BLEDState = 127; else{ BLEDState = 0; analogWrite(BLED, BLEDState); } if (RLEDState == 0) RLEDState = 140; else{ RLEDState = 0; analogWrite(RLED, RLEDState); } if (GLEDState == 0) GLEDState = 127; else{ GLEDState = 0; analogWrite(GLED, GLEDState); } currentMillis = millis(); variant_kolor = 0; break; } } } } void loop() { currentButton = debounce(lastButton); if (lastButton == LOW && currentButton == HIGH) { ledMode++; if (ledMode == 1) { interval = 1000; kolor = 0; } if (ledMode == 2) { interval = 5000; variant_kolor = 0; } } lastButton = currentButton; if (ledMode == 3) ledMode = 0; setMode(ledMode); }спасибо, попробую!