Skocz do zawartości
qro9qs

Arduino - czyszczenie LCD i zerowanie napięć po zmianie pętli

Pomocna odpowiedź

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...

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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.

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites
#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.

Udostępnij ten post


Link to post
Share on other sites
(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 przez ethanak
  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

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!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...