ethanak Lipiec 18, 2019 Udostępnij Lipiec 18, 2019 Czy jeśli odczytałeś z nastawnika że masz pasmo 160m, a po chwli odczytałeś 160m, to jest to zmiana pasma? Ze 160m na 160m? Jakaś niewielka ta zmiana... Cytuj Link do komentarza Share on other sites More sharing options...
qro9qs Lipiec 18, 2019 Autor tematu Udostępnij Lipiec 18, 2019 Nie, zmiana zachodzi po zmianie np. z 160m na 80m. Wszystko działa jak należy ze zmianą pasma. Zostawmy to. Zapytałem w jaki sposób przechodząc z jednego if do kolejnego if czyścić wyświetlacz zanim wyświetlą się nowe napisy na LCD. lcd.clear() na początku każdej if nie robi tego poprawnie ponieważ odświeża co chwilę wyświetlacz usuwając to co zostało już wybrane na tym zakresie Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 18, 2019 Udostępnij Lipiec 18, 2019 Robisz to źle Nie ma tu żadmego przejścia z ifa do ifa. Ten if pokazuje aktualne pasmo a nie zmianę - czyli kod będzie wywoływany za każdym obrotem loop. Musisz zapamiętać jakie pasmo było ustawione, a dopiero jeśli aktualne jest inne oznacza to zmianę. Spróbuj zdeklarować sobie jakąś globalną zmienną, niech trzyma sobie jakie pasmo jest wybrane (samo się narzuca 160, 80, 40 i zero na początku jako "nie wiem"). W kodzie za ifem sprawdzaj, czy aktualne pasmo jest takie samo jak poprzednie; jeśli nie - czyścisz wyświetlacz ew. robisz tam jakieś firdymałki związane z wyświetlaniem aktualnego pasma, i ustawiasz ową zmienną. Nie napiszę teraz kodu bo na telefonie mi to słabo wychodzi, ale powinieneś już załapać o co chodzi. 2 Cytuj Link do komentarza Share on other sites More sharing options...
qro9qs Lipiec 18, 2019 Autor tematu Udostępnij Lipiec 18, 2019 #include <Keypad.h> //biblioteka od klawiatury #include <LiquidCrystal_I2C.h> //biblioteka dla LCD z I2C #include <Wire.h> const byte ROWS = 4; // ile wierszy const byte COLS = 4; //ile kolumn byte rowPins[ROWS] = {5, 4, 3, 2}; //piny wierszy byte colPins[COLS] = {6, 7, 8, 9}; //piny kolum int previousMode = -1; //definiowanie zmiennej zapamiętującej pasmo int currentMode = -1; //definiowanie zmiennej zapamiętującej pasmo char keys[ROWS][COLS] = { //mapowanie klawiatury {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; Keypad klawiatura = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //inicjalizacja klawiatury LiquidCrystal_I2C lcd(0x27, 20, 4); //stworzony obiekt LCD o podanych z I2C Scanner parametrach int odczytanaWartosc0; //odczytanie wartości napięcia na wejściu A0 do wyboru pasma /**************************************************/ void setup(){ lcd.begin(); lcd.setCursor(0, 0); //Ustawienie kursora pinMode(13, INPUT); //wejście PTT } /**************************************************/ void loop(){ if(currentMode != previousMode){ lcd.clear(); previousMode = currentMode; }//warunek do czyszczenia wyświetlacza przy zmianie pasma odczytanaWartosc0 = analogRead(A0); Serial.println(odczytanaWartosc0); //odczytanie wartości napięcia na A0 dla wybranego pasma char klawisz; if(digitalRead(13) == HIGH){ klawisz = klawiatura.getKey(); } Serial.println(klawisz); //blokada klawiatury jeśli TX i odczytanie znaku z klawiatury /**************************160M************************/ if (odczytanaWartosc0 >= 0 && odczytanaWartosc0 <= 100) { currentMode = 0; lcd.setCursor(0,0); lcd.print("Band:160M"); lcd.setCursor(2,1); lcd.print("Vertical"); lcd.setCursor(12,0); //K9AY lcd.print("K9AY:"); //K9AY switch(klawisz){ case '1': lcd.setCursor(0,1); lcd.print((char)255); digitalWrite(10,HIGH);break; case '7': lcd.setCursor(17,0);lcd.print("USA");break; //K9AY case '8': lcd.setCursor(17,0);lcd.print("JA ");break; //K9AY case '0': lcd.setCursor(17,0);lcd.print("VK ");break; //K9AY case '*': lcd.setCursor(17,0);lcd.print("PY ");break; //K9AY } } /**************************80M************************/ else if (odczytanaWartosc0 >= 110 && odczytanaWartosc0 <= 160) { currentMode = 1; lcd.setCursor(0,0); lcd.print("Band:80M"); lcd.setCursor(2,1); lcd.print("Spitfire"); lcd.setCursor(2,2); lcd.print("Delta"); lcd.setCursor(12,0); //K9AY lcd.print("K9AY:"); //K9AY switch(klawisz){ case '1': lcd.setCursor(0,1); lcd.print((char)255);lcd.setCursor(0,2); lcd.print(" "); break; case '2': lcd.setCursor(0,2); lcd.print((char)255);lcd.setCursor(0,1); lcd.print(" "); break; case 'A': lcd.setCursor(10,1);lcd.print(":USA ");break; case 'B': lcd.setCursor(10,1);lcd.print(":JA ");break; case 'C': lcd.setCursor(10,1);lcd.print(":VK ");break; case 'D': lcd.setCursor(10,1);lcd.print(":PY ");break; case '#': lcd.setCursor(10,1);lcd.print(":CENT");break; case '7': lcd.setCursor(17,0);lcd.print("USA");break; //K9AY case '8': lcd.setCursor(17,0);lcd.print("JA ");break; //K9AY case '0': lcd.setCursor(17,0);lcd.print("VK ");break; //K9AY case '*': lcd.setCursor(17,0);lcd.print("PY ");break; //K9AY } } /***************************40M***********************/ else if (odczytanaWartosc0 >= 240 && odczytanaWartosc0 <= 300) { currentMode = 2; lcd.setCursor(0,0); lcd.print("Band:40M"); lcd.setCursor(2,1); lcd.print("Yagi"); lcd.setCursor(2,2); lcd.print("Vertical"); lcd.setCursor(12,0); //K9AY lcd.print("K9AY:"); //K9AY switch(klawisz){ case '1': lcd.setCursor(0,1); lcd.print((char)255);lcd.setCursor(0,2); lcd.print(" "); break; case '2': lcd.setCursor(0,2); lcd.print((char)255);lcd.setCursor(0,1); lcd.print(" "); break; case 'A': lcd.setCursor(7,1);lcd.print(":Front ");break; case 'B': lcd.setCursor(7,1);lcd.print(":Back ");break; case 'C': lcd.setCursor(7,1);lcd.print(":Center");break; case '7': lcd.setCursor(17,0);lcd.print("USA");break; //K9AY case '8': lcd.setCursor(17,0);lcd.print("JA ");break; //K9AY case '0': lcd.setCursor(17,0);lcd.print("VK ");break; //K9AY case '*': lcd.setCursor(17,0);lcd.print("PY ");break; //K9AY } } /************************20M**************************/ else if (odczytanaWartosc0 >= 350 && odczytanaWartosc0 <= 450) { currentMode = 3; lcd.setCursor(0,0); lcd.print("Band:20M"); lcd.setCursor(2,1); lcd.print("OB16-3"); lcd.setCursor(2,2); lcd.print("QQ 2el"); switch(klawisz){ case '1': lcd.clear();lcd.setCursor(0,1); lcd.print((char)255); digitalWrite(10,HIGH);break; case '2': lcd.clear();lcd.setCursor(0,2); lcd.print((char)255); digitalWrite(10,HIGH);break; } } /************************15M**************************/ else if (odczytanaWartosc0 >= 500 && odczytanaWartosc0 <= 600) { currentMode = 4; lcd.setCursor(0,0); lcd.print("Band:15M"); lcd.setCursor(2,1); lcd.print("OB16-3"); lcd.setCursor(2,2); lcd.print("QQ 2el"); switch(klawisz){ case '1': lcd.clear();lcd.setCursor(0,1); lcd.print((char)255); digitalWrite(10,HIGH);break; case '2': lcd.clear();lcd.setCursor(0,2); lcd.print((char)255); digitalWrite(10,HIGH);break; } } /************************10M**************************/ else if (odczytanaWartosc0 >= 650 && odczytanaWartosc0 <= 700) { currentMode = 5; lcd.setCursor(0,0); lcd.print("Band:10M"); lcd.setCursor(2,1); lcd.print("OB16-3"); lcd.setCursor(2,2); lcd.print("QQ 2el"); switch(klawisz){ case '1': lcd.clear();lcd.setCursor(0,1); lcd.print((char)255); digitalWrite(10,HIGH);break; case '2': lcd.clear();lcd.setCursor(0,2); lcd.print((char)255); digitalWrite(10,HIGH);break; } } } Udało się poprawić kod i co nieco dodać. Ekran czyści się po zmianie pasma instrukcją if. Dodatkowo dołożona funkcja, która blokuje działanie klawiatury (dzięki której możemy zmienić antenę i jej kierunek) gdy mamy załączony nadajnik aby nie uszkodzić przekaźników wykonawczych łukiem elektrycznym. Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
ethanak Lipiec 19, 2019 Udostępnij Lipiec 19, 2019 (edytowany) No i okazałem się niepotrzebny - świetnie! Jedna uwaga: musisz przypisać wartość początkową do zmiennej klawisz, bo w tej chwili siedzą tam po prostu jakieś śmiecie które przypadkowo mogą przyjąć wartość wciśniętego klawisza i całe zabezpieczenie nadajnika pada. Czyli: char klawisz = 0; Dodatkowo, dzisiaj doskonale wiesz, że "4" to 15m, a za tydzień się będziesz zastanawiał. Narzuca się tu od razu konstrukcja enum, czyli: enum { BAND_UNKNOWN=-1, BAND_160, BAND_80, BAND_40, BAND_20, BAND_15, BAND_10 }; a w programie używać zamiast tajemniczych cyferek po prostu zdefiniowanych przez enum stałych, czyli przykładowo: if (odczytanaWartosc0 <= 100) { currentMode = BAND_160; Aha, i nie musisz sprawdzać czy odczytanaWartosc0 jest większa lub równa zero - bo zawsze jest. Na razie powinno wystarczyć - zobaczymy co będzie później (podejrzewam że to nie jest cały program tylko jego początkowe stadium - w końcu jakieś przekaźniki pewnie będziesz chciał podłączyć). po edycji Właśnie zdałem sobie sprawę z tego, co mnie gryzło w Twoim programie. Mianowicie najpierw sprawdzasz jaka jest pozycja przełącznika, potem coś tam wypisujesz na ekranie a potem dopiero jeśli pozycja była inna niż poprzednia czyścisz ekran. W tej chwili nie widzisz tego efektu bo cały czas nadpisujesz tekst na wyświetlaczu ale później może przeszkadzać. Proponowałbym rozbić to na dwa etapy: Odczyt przełącznika: odczytanaWartosc0 = analogRead(A0); if (odczytanaWartosc0 < 100) currentMode = BAND_160; else if ... /* i tak dalej*/ if (previousMode != currentMode) { lcd.clear(); /* tu jest miejsce na jakieś dodatkowe czynności związane ze zmianą pasma */ previousMode = currentMode; } I teraz dopiero znając już currentMode można dużo ładniej napisać obsługę bieżącego pasma: switch(currentMode) { case BAND_160: /* kod dla 160m */ break; case BAND_80: /* kod dla 80m */ break; /* i tak dalej */ } Przy czym np. wypisywanie bieżącego pasma oraz treści niezmiennych proponowałbym zrobić raz, od razu po zmianie pasma. Edytowano Lipiec 19, 2019 przez ethanak 2 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!