• Ten serwis używa "ciasteczek" (cookies). Korzystając z niego, wyrażasz zgodę na użycie plików cookies. Learn more.
  • Szanowny Użytkowniku, serwisy w domenie modelarstwo.info wykorzystują pliki cookie by ułatwić korzystanie z naszych serwisów. Jeśli nie chcesz, by pliki cookies były zapisywane na Twoim dysku zmień ustawienia swojej przeglądarki.

Pytanie Sterowanie semaforami przez Arduino

MJM

Użytkownik
#1
Witam,
Mógłby ktoś wytłumaczyć jak napisać kod tak, żeby można było sterować semaforami z INPUT-a?
Wszystkie moje semafory posiadają wspólny plus i to stanowi jedyny problem, bo jako taki kod już mam a nie chce przelutowywać diód :)
 

JanuszJ

Aktywny użytkownik
T M M
#2
Arduino bardzo ładnie steruje semaforami świetlnymi :)
Wspólny + nie przeszkadza.
Poniżej kawałek kodu :

const byte led = 22; // nr wyjscia
boolean zgas = HIGH; // sterowanie LED +5v
boolean zapal = LOW; // sterowanie LED +5v


void setup() {
pinMode(led, OUTPUT);
.... }

void loop() {
if ... digitalWrite(led, zgas);
if ... digitalWrite(led, zapal);
}
 

MJM

Użytkownik
#3
Dzięki! ;)
Zrobiłem coś takiego na próbę ale nic nie wyszło, możliwe że jest tu jakiś błąd:


const byte led = 22; // nr wyjscia
boolean zgas = HIGH; // sterowanie LED +5v
boolean zapal = LOW; // sterowanie LED +5v
#define ledx 21
#define ledy 20
String odebraneDane = "";


void setup() {
pinMode(led, OUTPUT);
pinMode(ledx, INPUT);
}

void loop() {
if(Serial.available() > 0) { //Czy Arduino odebrano dane
//Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
odebraneDane = Serial.readStringUntil('\n');

if (odebraneDane == "ledx");
digitalWrite(led, zgas);
if (odebraneDane == "ledy");
digitalWrite(led, zapal);
}
}

A nie lepiej było by odwrócić działanie I/O tak, żeby się świeciło gdy na pinie sterującym będzie LOW? Tylko tu też nie za bardzo wiem jak to napisać poprawnie o_O
 

JanuszJ

Aktywny użytkownik
T M M
#5
Dabas ma rację.

if (odebraneDane == "ledx")
{
digitalWrite(led, zgas);
}
if (odebraneDane == "ledy")
{
digitalWrite(led, zapal);
}


Serial na pewno działa ?
A "ledy" zdefiniowałeś jako INPUT ?
"boolean zapal = LOW;" - świeci przy stanie niskim
 

MJM

Użytkownik
#6
Rzeczywiście- człowiek uczy się na błędach zmieniłem i poprawiłem tak jak napisaliście (dzięki!), niby wszystko juz powinno być ok, ale nadal nie świeci :niepewny:
Może lepiej spróbuję najpierw napisać sterowanie z minusa dla pojedynczej diody- jak poprawnie odwrócić działanie I/O? :rolleyes:
 

zuk

Aktywny użytkownik
FREMO Polska
KSK Wrocław
#7
sprawdź najpierw może, czy przez komendy z seriala zapalisz diodkę na wyjściu 13
 

JanuszJ

Aktywny użytkownik
T M M
#8
Odpal ten programik i zobacz czy dioda świeci.
Ledy dobrze podłączyłeś ? Dałeś oporniki ?

const byte prz1 = 8; // przycisk ( mogą być kabelki )
const byte led1 = 22; // led , możesz dać adr 13 - wtedy led na płytce - tak jak pisał Zuk
const byte op1 = 10; // opóźnienie - stuki

boolean p1 = LOW; // zmienna do odczytu stanu przełącznika , LOW - stop, HIGH jazda
boolean zgas = HIGH; // sterowanie LED +5v
boolean zapal = LOW; // sterowanie LED +5v
boolean jazda = HIGH;
boolean stoj = LOW;

void setup() {
pinMode(led1, OUTPUT);
pinMode(prz1, INPUT_PULLUP);
}

void loop() {

p1 = digitalRead(prz1); // odczyt przycisku
delay(op1); // opóźnienie stuki przełącznika

if (p1 == jazda)
{
digitalWrite(led1, zapal);
}

if (p1 == stoj)
{
digitalWrite(led11, zgas);
}
}
 

Misiek

Znany użytkownik
#9
pinMode(prz1, INPUT_PULLUP);
input_pullup wykorzystuje wewnętrzne oporniki Arduino i dawanie zewnętrznych może nie być konieczne. u mnie to zadziałało.
coś kojarzę, że input_pulup odwraca działanie Low z High "na wyjściu" np. do diody.
jak działanie będzie odwrotne od zamierzanego to powinno wystarczyć zamiana LOW/high w parametrach
boolean jazda =
boolean stoj =
 

PiotrK

Aktywny użytkownik
#12
Dzięki! ;)
Zrobiłem coś takiego na próbę ale nic nie wyszło, możliwe że jest tu jakiś błąd:
...
Najważniejsze to to, że zapomniałeś o zainicjowaniu portu szeregowego...
Trochę zmodyfikowałem Twój program, tak byś mógł przetestować sterowanie jednej diody.

#define led 13 // PK: zmieniłem deklarację zmiennych
// nr wyjscia PK:zmieniłem numer pinu wyjściowego by zastosować diodę z płytki Arduino
#define zgas LOW
// sterowanie LED +5v //PK:zamieniłem bo dioda na pinie 13 jest sterowana odwrotnymi poziomami

#define zapal HIGH
// sterowanie LED +5v
//#define ledx 21 //PK: Pominąłem, bo i tak dalej nie używasz

//#define ledy 20 //PK: Pominąłem, bo i tak dalej nie używasz
String odebraneDane = "";

void setup() {
// put your setup code here, to run once:
Serial.begin(9600); //PK: inicjacja Portu szeregowego (szybkość transmisji możesz oczywiście zmienić)

pinMode(led, OUTPUT);
//pinMode(ledx, INPUT); //PK: Pominąłem, bo i tak dalej nie używasz

}

void loop() {
// put your main code here, to run repeatedly:
if (Serial.available() > 0) { //Czy Arduino odebrano dane
//Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
odebraneDane = Serial.readStringUntil('\n');

Serial.print(odebraneDane); //Tylko dla testów z monitorem szeregowym by zobaczyć co odczytano


if (odebraneDane == "ledx")
{
Serial.print(" OFF"); //Tylko dla testów z monitorem szeregowym by zobaczyć czy wykonano instrucje dla if

digitalWrite(led, zgas);
}
if (odebraneDane == "ledy")
{
Serial.print(" ON"); //Tylko dla testów z monitorem szeregowym by zobaczyć czy wykonano instrucje dla if

digitalWrite(led, zapal);
}
Serial.println(); //Tylko dla testów z monitorem szeregowym, przejście do nowej linii

}
}


Po włączeniu w monitora szeregowego pamiętaj by ustawić odpowiednią szybkość transmisji oraz koniec linii jako nowa linia.
MJM napisał(a):
A nie lepiej było by odwrócić działanie I/O tak, żeby się świeciło gdy na pinie sterującym będzie LOW? Tylko tu też nie za bardzo wiem jak to napisać poprawnie o_O
Zmiana taka nie jest konieczna. A jeśli byś chciał to zrobić to wystarczy zamienić deklaracje zgas i zapal (zresztą dokładnie to samo zrobiłem ja by dostosować kod do sprzętu).

Miłej zabawy z programowaniem. a i jeszcze jedno warto napisać zawsze jaką wersję arduino się używa, bo jest ich troche...
 
#13
Dzięki za pomoc! ;) Gdyby nie ten wspólny plus, to już dawno miałbym to z głowy :confused: Wszystko działa, tylko że na "plusie". Jak zmienić poniższy kod tak, by można było wysterować z minusa pojedynczą diodę, a plus wsadzić np. do 5V?

void setup() {
pinMode(8, OUTPUT);
}
void loop() {
digitalWrite(8, HIGH);
delay(1000);
digitalWrite(8, LOW);
delay(1000);
}

Aha... Moje Arduino to Mega 2560