Program zajęć z cyklu "Rozwiń skrzydła"
Politechnika Śląska
Temat: Rozwiń skrzydła z mechatroniką
Arduino UNO – Sygnalizator drogowo (semafor) na bazie LED podłączonych do pinu 11, 12 i 13
[Arduino UNO, 3 x LED]
//ROZWIŃ SKRZYDŁA
//LED - sygnalizacja świetlna
//Adam Mańka
void setup() {
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(11,HIGH);
delay(100);
digitalWrite(12,HIGH);
delay(100);
digitalWrite(13,HIGH);
delay(100);
delay(1000);
digitalWrite(11,LOW);
delay(100);
digitalWrite(12,LOW);
delay(100);
digitalWrite(13,LOW);
delay(100);
delay(1000);
}
Program do sterowania sygnalizatorem z Arduino UNO poprzez PC oraz poprzez Bluetooth (SoftwareSerial) z wykorzystaniem np. telefonu z Androidem.
[Sygnalizator / semafor Arduino UNO, sterowanie PC, komunikacja z komputerem, Bluetooth, SoftwareSerial]
//ROZWIŃ SKRZYDŁA
//LED - sygnalizacja świetlna - sterowana komendami r=3, y=1, g=2, b=1
//Adam Mańka
// Definicje pinów
const int RED = 13;
const int YEL = 12;
const int GRN = 11;
// Czasy świecenia (w milisekundach, domyślnie np. 2s)
unsigned long tRed = 2000, tYel = 1000, tGrn = 2000, tBot = 1000;
unsigned long previousMillis = 0;
int stan = 0; // 0: Czerwone, 1: Czerw+Zółte, 2: Zielone, 3: Żółte
bool d= 0;
unsigned long currentMillis;
unsigned long interval;
String komenda;
void setup() {
Serial.begin(9600);
pinMode(RED, OUTPUT);
pinMode(YEL, OUTPUT);
pinMode(GRN, OUTPUT);
Serial.println("Rozwin skrzydla - sygnalizator [r,y,g,b,on,of np. r=200]");
}
void loop() {
// Obsługa komend z PC (np. "r=30", "y=10", "g=50")
if (Serial.available() > 0) {
komenda = Serial.readStringUntil('\n');
komenda.trim();
komenda.toLowerCase();
if (komenda=="on") {
d=true;
Serial.println("Demo mode on");
}
else if (komenda=="off") {
d=false;
Serial.println("Demo mode off");
}
//czasy
if (sscanf(komenda.c_str(), "r=%lu", &tRed)) {
Serial.print("Nowy czas RED: "); Serial.println(tRed);
}
else if (sscanf(komenda.c_str(), "y=%lu", &tYel)) {
Serial.print("Nowy czas YELLOW: "); Serial.println(tYel);
}
else if (sscanf(komenda.c_str(), "g=%lu", &tGrn)) {
Serial.print("Nowy czas GREEN: "); Serial.println(tGrn);
}
else if (sscanf(komenda.c_str(), "b=%lu", &tBot)) {
Serial.print("Nowy czas BOTH: "); Serial.println(tBot);
}
}
currentMillis = millis(); // Sygnalizacja (bez delay)
if (d==true) demo();
// Ustalanie czasu trwania obecnej fazy
if (stan == 0) interval = tRed; // Czerwone
else if (stan == 1) interval = tBot; // Czerw+Żółte
else if (stan == 2) interval = tGrn; // Zielone
else interval = tYel; // Żółte (3)
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
stan++;
if (stan > 3) stan = 0;
// Przełączanie świateł
digitalWrite(RED, (stan == 0 || stan == 1));
digitalWrite(YEL, (stan == 1 || stan == 3));//3 jak chcemy żółte po zielonym
digitalWrite(GRN, (stan == 2));
}
}
void demo (){
bool syg[][3] = {
{1, 0, 0},
{1, 1, 0},
{1, 1, 1},
{1, 1, 1},
{0, 1, 1},
{0, 0, 1},
{0, 0, 1},
{0, 1, 1},
{1, 1, 1},
{1, 1, 1},
{1, 1, 0},
{1, 0, 0}};
if (currentMillis - previousMillis >= 150) {
previousMillis = currentMillis;
digitalWrite(RED, syg[stan][0]); digitalWrite(YEL, syg[stan][1]); digitalWrite(GRN, syg[stan][2]);
stan++;
if (stan >= (sizeof(syg) / sizeof(syg[0]))) stan = 0;
}
}
Adam Mańka - adam.manka(znak)polsl.pl