22-09-2015, 15:29
Witam,
Zaczynam dopiero przygodę z arduino i proszę o wyrozumiałość. Wszystkiego uczę się z internetu i składam programowe klocki w jeden projekt: Sterownik świateł drogowych, czyli 3 diody (czerwona, żółta, zielona). Dodatkowo PIN na input (guzik), który pozwala przełączyć w tryb "party", czyli wszystkie światła włączają się w losowych odstępach czasu na losowy okres czasu.
Coś mam nie tak w programie gdyż kiedy zmienię stan guzika z trybu "party" na tryb świateł drogowych często program nie idzie pokolei wg schematu: czerwona, czerwona i żółta, zielona, żółta, czerwona, czerwona i żółta, itd... tylko z diody żółtej potrafi przejść na czerwoną i zieloną równocześnie...
Może to coś oczywistego a ja tego nie widzę? Jakieś śmieci w pamięci? Proszę o pomoc dobrzy ludzie
P.S.
Zrobiłem przejścia świateł drogowych na delay, nie przeszkadza mi to, że guzik będzie czytany dopiero po zmienie światła. Wiem, że można to robić jakoś na mills, ale przerosło mnie to.
Zaczynam dopiero przygodę z arduino i proszę o wyrozumiałość. Wszystkiego uczę się z internetu i składam programowe klocki w jeden projekt: Sterownik świateł drogowych, czyli 3 diody (czerwona, żółta, zielona). Dodatkowo PIN na input (guzik), który pozwala przełączyć w tryb "party", czyli wszystkie światła włączają się w losowych odstępach czasu na losowy okres czasu.
Coś mam nie tak w programie gdyż kiedy zmienię stan guzika z trybu "party" na tryb świateł drogowych często program nie idzie pokolei wg schematu: czerwona, czerwona i żółta, zielona, żółta, czerwona, czerwona i żółta, itd... tylko z diody żółtej potrafi przejść na czerwoną i zieloną równocześnie...
Może to coś oczywistego a ja tego nie widzę? Jakieś śmieci w pamięci? Proszę o pomoc dobrzy ludzie
P.S.
Zrobiłem przejścia świateł drogowych na delay, nie przeszkadza mi to, że guzik będzie czytany dopiero po zmienie światła. Wiem, że można to robić jakoś na mills, ale przerosło mnie to.
Kod:
#define numberOfLEDs 3
long nextFlash[3];
int ledPin[] = { 8, 9, 10}; // LED pins to use.
int ledState[3];
int guzik = 0;
int red_time = 4000; //4000
int yellow_time = 2000; //2000
int green_time = 4000; //4000
void setup() {
pinMode(8, OUTPUT); //Konfiguracja pinu 8 jako wyjście RED
pinMode(9, OUTPUT); //Konfiguracja pinu 9 jako wyjście YELLOW
pinMode(10, OUTPUT); //Konfiguracja pinu 10 jako wyjście GREEN
pinMode(11, INPUT); //Konfiguracja pinu 11 jako guzik
}
void loop()
{
guzik = digitalRead(11); // read input value
if (guzik == LOW)
{
traffic();
}
else losowe();
}
void guzik_on()
{
guzik = digitalRead(11); // read input value
if (guzik == LOW)
{
traffic();
}
}
void guzik_off()
{
guzik = digitalRead(11); // read input value
if (guzik == HIGH)
{
losowe();
}
}
void traffic() {
digitalWrite(8, HIGH); //Włączenie diody RED
delay(red_time);
guzik_off();
digitalWrite(9, HIGH); //Włączenie diody YELLOW
delay(yellow_time);
guzik_off();
digitalWrite(8, LOW); //Wyłączenie diody RED
digitalWrite(9, LOW); //Wyłączenie diody YELLOW
digitalWrite(10, HIGH); //Włączenie diody GREEN
delay(green_time);
guzik_off();
digitalWrite(10, LOW); //Wyłączenie diody GREEN
digitalWrite(9, HIGH); //Włączenie diody YELLOW
delay(2000);
guzik_off();
digitalWrite(9, LOW); //Wyłączenie diody YELLOW
}
void losowe()
{
for (int i = 0; i < numberOfLEDs; i++) {
pinMode(ledPin[i], OUTPUT);
ledState[i] = LOW;
digitalWrite(ledPin[i], LOW); // all LEDs off
nextFlash[i] = millis() + random(20, 300);
}
while (true) {
for (int i = 0; i < numberOfLEDs; i++) {
if (millis() > nextFlash[i]) {
if (ledState[i] == LOW) ledState[i] = HIGH; else ledState[i] = LOW;
digitalWrite(ledPin[i], ledState[i]);
nextFlash[i] = millis() + random(20, 300) ; // next toggle random time
guzik_on();
}
}
}
}