Witam, mam mały problem z stołem obrotowym.
Założenia:
- Po naciśnięciu przycisku 1 stół przejeżdża do pozycji 1 i zapala się led 1. (analogicznie dla każdej pozycji).
- uniemożliwienie zmiany położenia podczas obrotu stołu (naciśnięcie przycisku nie wpływa na prace).
- zatrzymanie stołu w miejscu czujnika
- sygnalizacja położenia stołu poprzez lampkę kontrolną\
- brak zmiany pozycji podczas gdy stół znajduję się w odpowiednim miejscu.
- stół obraca się tylko w jednym kierunku
Chciałbym propozycję jak wysterować tym stołem. Jakich pętli użyć próby z instrukcjami IF skończyły się porażką
Poglądowy szkic poniżej.
Gdybyś przedstawił kod to łatwiej byłoby pomóc.
Cytat:Jakich pętli użyć próby z instrukcjami IF skończyły się porażką
Nieważne czego użyjesz, ważna aby działało i było czytelne.
Najprościej zrobić to z użyciem maszyny stanów np:
http://ep.com.pl/files/1436.pdf
Jestem początkujący to kod raczej też "bardzo" początkujący.
Kod:
#define krancowka1 digitalRead(8)
#define krancowka2 digitalRead(9)
#define krancowka3 digitalRead(10)
#define krancowka4 digitalRead(11)
#define przycisk1 digitalRead(4)
#define przycisk2 digitalRead(3)
#define przycisk3 digitalRead(2)
#define przycisk4 digitalRead(1)
#define led1 7
#define led2 6
#define led3 5
#define sil 12
void setup() {
pinMode(przycisk1, INPUT_PULLUP);
pinMode(przycisk2, INPUT_PULLUP);
pinMode(przycisk3, INPUT_PULLUP);
pinMode(przycisk4, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
}
void loop() {
long czas = millis() / 1000;
if ( krancowka1 == HIGH and przycisk1 == LOW ) {
sil == HIGH;
if (krancowka1 == HIGH) {
sil == LOW;
digitalWrite(led1, HIGH);
}
}
if ( krancowka2 == HIGH and przycisk2 == LOW ) {
sil == HIGH;
if (krancowka2 == HIGH) {
sil == LOW;
digitalWrite(led2, HIGH);
}
}
if ( krancowka3 == HIGH and przycisk3 == LOW ) {
sil == HIGH;
if (krancowka3 == HIGH) {
sil == LOW;
digitalWrite(led3, HIGH);
}
}
if ( krancowka4 == HIGH and przycisk4 == LOW ) {
sil == HIGH;
if (krancowka2 == HIGH) {
sil == LOW;
digitalWrite(led3, HIGH);
}
}
}
Do takich rzeczy najlepszy jest symulator np:
https://www.sites.google.com/site/unoardusim/services
Nie podałeś co prawda jaki jest stan krańcówki gdy jest zadziałana ale masz błąd bo zakładam że oczekujesz zmiany stanu krańcówki a Ty sprawdzasz ten sam stan.
Kod:
if ( (krancowka1 == HIGH) and (przycisk1 == LOW )) {
sil == HIGH;
if (krancowka1 == HIGH) {
sil == LOW;
digitalWrite(led1, HIGH);
}
}
Dodatkowo taki kod (poprawiony) będzie niepoprawny bo nie możesz oczekiwać że w tym samym cyklu programu stan krańcówki będzie raz wysoki a raz niski. Może się co prawda tak zdarzyć ale nie powinieneś tego oczekiwać.
Kod:
if ( (krancowka1 == HIGH) and (przycisk1 == LOW )) {
sil == HIGH;
if (krancowka1 == LOW) {
sil == LOW;
digitalWrite(led1, HIGH);
}
}
Ponieważ w programie brakuje komentarzy to nie wiem czy moje domysły są słuszne.
Proponuję dokładnie rozpisać algorytm działania programu i dopiero wtedy zacząć pisać program.
Witam,
Mała sugestia. Nie trzeba stosować 4-ech czujników/krańcówek. Do określenia 4-ech położeń stołu (według rysunku co 90 stopni) wystarczą 3 czujniki. Załóżmy, że użyjesz 3-ech transoptorów szczelinowych, umieszczonych co 90 stopni, a na stole obrotowym umieścisz 2-ie przesłony "oddalone" o 90 stopni. W ten sposób jesteś w stanie uzyskać wystarczającą dla Ciebie ilość stanów.
Pozdrawiam,
Tomek.