Skocz do zawartości

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


qro9qs

Pomocna odpowiedź

Witam

Mam mały problem z programem w Arduino.

W głównej pętli programu mam kilka pętli if w których wyświetlam dane na wyświetlaczu oraz używam klawiatury załączając wyjścia cyfrowe. Przełączam się z pętli na pętle przy pomocy dzielnika napięcia z przełącznikiem na A0. W jaki sposób przechodząc z pętli if do kolejnej pętli if czyścić LCD oraz wyłączać wszystkie włączone wyjścia cyfrowe?

Edytowano przez qro9qs
Link do komentarza
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
 
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;

 /**************************************************/
void setup(){
    lcd.begin();
  lcd.setCursor(0, 0); //Ustawienie kursora
}
  /**************************************************/ 

void loop(){
       odczytanaWartosc0 = analogRead(A0);
  Serial.println(odczytanaWartosc0);

  /**************************160M************************/ 
     if (odczytanaWartosc0 == random(0, 100)) {
   lcd.setCursor(2,0);
   lcd.print("160m Vertical");   
   lcd.setCursor(2,1);
   lcd.print("160m Dipol"); 
   char klawisz = klawiatura.getKey();
   Serial.println(klawisz);
         switch(klawisz){
         case '1': lcd.clear();lcd.setCursor(0,0); lcd.print("X"); digitalWrite(10,HIGH);break;
         case '2': lcd.clear();lcd.setCursor(0,1); lcd.print("X"); digitalWrite(10,HIGH);break;
          }
     }
  /**************************80M************************/         
   else if (odczytanaWartosc0 == random(110, 160)) {
   lcd.setCursor(2,0);
   lcd.print("80m Spitfire");   
   lcd.setCursor(2,1);
   lcd.print("80m Delta"); 
   char klawisz = klawiatura.getKey();
   Serial.println(klawisz);
         switch(klawisz){
         case '1': lcd.setCursor(0,0); lcd.print("X");lcd.setCursor(0,1); lcd.print(" "); break;
         case '2': lcd.setCursor(0,1); lcd.print("X");lcd.setCursor(0,0); lcd.print(" "); break;
         case 'A': lcd.setCursor(17,0);lcd.print("USA");break;
         case 'B': lcd.setCursor(17,0);lcd.print("JA");break;
         case 'C': lcd.setCursor(17,0);lcd.print("VK");break;
         case 'D': lcd.setCursor(17,0);lcd.print("PY");break;
          }
    }   
  /***************************40M***********************/   
   else if (odczytanaWartosc0 == random(240, 300)) {
   lcd.setCursor(2,0);
   lcd.print("40m Yagi");   
   lcd.setCursor(2,1);
   lcd.print("40m Vertical"); 
   char klawisz = klawiatura.getKey();
   Serial.println(klawisz);
         switch(klawisz){
         case '1': lcd.setCursor(0,0); lcd.print("X");lcd.setCursor(0,1); lcd.print(" "); break;
         case '2': lcd.setCursor(0,1); lcd.print("X");lcd.setCursor(0,0); lcd.print(" "); break;
         case '4': lcd.setCursor(12,0);lcd.print("Front");break;
         case '5': lcd.setCursor(12,0);lcd.print("Back");break;
         case '6': lcd.setCursor(12,0);lcd.print("Center");break;
         }  }

  /************************20M**************************/         
   else if (odczytanaWartosc0 == random(350, 450)) {
   lcd.setCursor(2,0);
   lcd.print("20m OB16-3");   
   lcd.setCursor(2,1);
   lcd.print("20m QQ 2el"); 
   char klawisz = klawiatura.getKey();
   Serial.println(klawisz);
         switch(klawisz){
         case '1': lcd.clear();lcd.setCursor(0,0); lcd.print("X"); digitalWrite(10,HIGH);break;
         case '2': lcd.clear();lcd.setCursor(0,1); lcd.print("X"); digitalWrite(10,HIGH);break;
          }
    }   

  /************************15M**************************/   
 else if (odczytanaWartosc0 == random(500, 600)) {
   lcd.setCursor(2,0);
   lcd.print("15m OB16-3");   
   lcd.setCursor(2,1);
   lcd.print("15m QQ 2el"); 
   char klawisz = klawiatura.getKey();
   Serial.println(klawisz);
         switch(klawisz){
         case '1': lcd.clear();lcd.setCursor(0,0); lcd.print("X"); digitalWrite(10,HIGH);break;
         case '2': lcd.clear();lcd.setCursor(0,1); lcd.print("X"); digitalWrite(10,HIGH);break;
          }
    }   
  /************************10M**************************/ 
 else if (odczytanaWartosc0 == random(650, 700)) {
   lcd.setCursor(2,0);
   lcd.print("10m OB16-3");   
   lcd.setCursor(2,1);
   lcd.print("10m QQ 2el"); 
   char klawisz = klawiatura.getKey();
   Serial.println(klawisz);
         switch(klawisz){
         case '1': lcd.clear();lcd.setCursor(0,0); lcd.print("X"); digitalWrite(10,HIGH);break;
         case '2': lcd.clear();lcd.setCursor(0,1); lcd.print("X"); digitalWrite(10,HIGH);break;
          }
    } } 

Brakuje tylko stanów wyjść dopisanych przy każdej opcji. Lada chwila się pojawią jednak póki co walczę ze zmianą opisów na wyświetlaczu po zmianie pasma.

Link do komentarza
Share on other sites

14 godzin temu, qro9qs napisał:

W głównej pętli programu mam kilka pętli while w których wyświetlam dane na wyświetlaczu oraz używam klawiatury załączając wyjścia cyfrowe.

To na pewno dobry program? W umieszczonym wyżej kodzie nie ma żadnej pętli while 😉

Przy okazji, czy ta dziwna konstrukcja to nie przypadek? Naprawdę chciałeś zrobić to w taki sposób i masz 100% świadomości jak to działa?

[...] if (odczytanaWartosc0 == random(500, 600)) { [...]
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

Przepraszam, pętle zostały zmienione na if. 

Co do dziwnej konstrukcji...

Mam 6 zakresów przełączanych przełącznikiem obrotowym z dzielnika napięcia. Sygnał podany na A0. Po odczytaniu odpowiedniej wartości napięcia (podzielonej przez dzielnik) zostaje wybrany odpowiedni zakres.

Link do komentarza
Share on other sites

Nie, to tak nie działa. Twój kod działa tak, że jeśli pojawi się tam sygnał o wartości równej losowo wybranej z zakresu od 500 do 600 to załączy się wybrany zakres. Czyli jeśli sygnał jest równy 550 to masz jakiś 1% szansy że się włączy (bo random równie dobrze może zwrócić 551).

Wróć do podstaw języka (operatory porównania, funkcja random). Specjalnie nie podaję prawidłowego rozwiązania... dostaniesz dopiero wtedy, gdy sam nie będziesz w stanie sobie poradzić ( to już Ty ocenisz).

 

Link do komentarza
Share on other sites

W porządku, zagłębię się w to. Jednak obecnie po kilkunasto krotnym sprawdzeniu nie było sytuacji aby zakres nie odpalił się po wybraniu zakresu na przełączniku. Za każdym razem wybiera poprawnie. 

Dziękuję. A co z funkcją kasującą wyświetlone znaki na LCD po przejściu na kolejny zakres?

Link do komentarza
Share on other sites

@qro9qs aby rozwiązać poprawnie kwestię zakresów musisz połączyć dwa warunki i sprawdzić czy wartość mieści się w danym przedziale. Obecnie działanie tego układu to czysty przypadek. Całość działa tylko dla tego, że program wykonuje się bardzo szybko i za którymś podejściem trafia w wylosowaną liczbę.

5 minut temu, qro9qs napisał:

A co z funkcją kasującą wyświetlone znaki na LCD po przejściu na kolejny zakres?

Najlepiej będzie, abyś na końcu obiegu pętli zapamiętywał aktualny zakres. Następnie, po wejściu wybrany zakres, sprawdzasz czy poprzednio wykonywał się ten sam fragment programu. Jeśli nie, to wywołujesz funkcję, która wyczyści ekran i odpowiednio ustawi wyjścia. W praktyce potrzebujesz więcej jednej zmiennej, która zapamięta obecnie wybrany zakres.

Link do komentarza
Share on other sites

(edytowany)
1 godzinę temu, Treker napisał:

@qro9qs aby rozwiązać poprawnie kwestię zakresów musisz połączyć dwa warunki i sprawdzić czy wartość mieści się w danym przedziale. Obecnie działanie tego układu to czysty przypadek. Całość działa tylko dla tego, że program wykonuje się bardzo szybko i za którymś podejściem trafia w wylosowaną liczbę.

[...]else if (odczytanaWartosc0 >= 350 && odczytanaWartosc0 <= 450)  [...]

Dziękuję. Dalej działa jak należy.

 

W którym miejscu czyścić ekran po przejściu z warunku if do kolejnego? Za pomocą lcd.clear()? Jeśli tak to odświeża się non stop i ekran miga.

Edytowano przez qro9qs
Link do komentarza
Share on other sites

1 godzinę temu, qro9qs napisał:

W którym miejscu czyścić ekran po przejściu z pętli do pętli?

Jakiej pętli... gdzie tam masz te pętle... pokaż kod po poprawkach bo operator forumowej szklanej kuli akurat na urlopie a dyżurna wróżka zrobiła sobie wolne...

Jeśli chcesz aby napisy zmieniały się po zmianie pasma, rób to wtedy kiedy zmieniasz pasmo. @Treker już Ci o tym pisał, nie chcę dublować porad.

Link do komentarza
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
 
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;

 /**************************************************/
void setup(){
    lcd.begin();
  lcd.setCursor(0, 0); //Ustawienie kursora
}
  /**************************************************/ 

void loop(){
       odczytanaWartosc0 = analogRead(A0);
  Serial.println(odczytanaWartosc0);

  /**************************160M************************/ 
     if (odczytanaWartosc0 >= 0 && odczytanaWartosc0 <= 100)  {
   lcd.setCursor(2,0);
   lcd.print("160m Vertical");   
   lcd.setCursor(2,1);
   lcd.print("160m Dipol"); 
   char klawisz = klawiatura.getKey();
   Serial.println(klawisz);
         switch(klawisz){
         case '1': lcd.clear();lcd.setCursor(0,0); lcd.print((char)255); digitalWrite(10,HIGH);break;
         case '2': lcd.clear();lcd.setCursor(0,1); lcd.print((char)255); digitalWrite(10,HIGH);break;
          }
     }
  /**************************80M************************/         
   else if (odczytanaWartosc0 >= 110 && odczytanaWartosc0 <= 160) {
   lcd.setCursor(2,0);
   lcd.print("80m Spitfire");   
   lcd.setCursor(2,1);
   lcd.print("80m Delta"); 
   lcd.setCursor(2,3);       //K9AY
   lcd.print("K9AY: ");     //K9AY
   char klawisz = klawiatura.getKey();
   Serial.println(klawisz);
         switch(klawisz){
         case '1': lcd.setCursor(0,0); lcd.print((char)255);lcd.setCursor(0,1); lcd.print(" "); break;
         case '2': lcd.setCursor(0,1); lcd.print((char)255);lcd.setCursor(0,0); lcd.print(" "); break;
         case 'A': lcd.setCursor(17,0);lcd.print("USA");break;
         case 'B': lcd.setCursor(17,0);lcd.print("JA");break;
         case 'C': lcd.setCursor(17,0);lcd.print("VK");break;
         case 'D': lcd.setCursor(17,0);lcd.print("PY");break;
         case '7': lcd.clear(); lcd.setCursor(8,3);lcd.print("USA");break; //K9AY
         case '8': lcd.clear(); lcd.setCursor(8,3);lcd.print("JA");break;  //K9AY
         case '0': lcd.clear(); lcd.setCursor(8,3);lcd.print("VK");break;  //K9AY
         case '*': lcd.clear(); lcd.setCursor(8,3);lcd.print("PY");break;  //K9AY
          }
          
    }   
  /***************************40M***********************/   
   else if (odczytanaWartosc0 >= 240 && odczytanaWartosc0 <= 300)  {
   lcd.setCursor(2,0);
   lcd.print("40m Yagi");   
   lcd.setCursor(2,1);
   lcd.print("40m Vertical"); 
   lcd.setCursor(2,3);       //K9AY
   lcd.print("K9AY: ");     //K9AY
   char klawisz = klawiatura.getKey();
   Serial.println(klawisz);
         switch(klawisz){
         case '1': lcd.setCursor(0,0); lcd.print((char)255);lcd.setCursor(0,1); lcd.print(" "); break;
         case '2': lcd.setCursor(0,1); lcd.print((char)255);lcd.setCursor(0,0); lcd.print(" "); break;
         case 'A': lcd.setCursor(12,0);lcd.print("Front");break;
         case 'B': lcd.setCursor(12,0);lcd.print("Back");break;
         case 'C': lcd.setCursor(12,0);lcd.print("Center");break;
         case '7': lcd.clear(); lcd.setCursor(8,3);lcd.print("USA");break; //K9AY
         case '8': lcd.clear(); lcd.setCursor(8,3);lcd.print("JA");break;  //K9AY
         case '0': lcd.clear(); lcd.setCursor(8,3);lcd.print("VK");break;  //K9AY
         case '*': lcd.clear(); lcd.setCursor(8,3);lcd.print("PY");break;  //K9AY
         }  }

  /************************20M**************************/         
   else if (odczytanaWartosc0 >= 350 && odczytanaWartosc0 <= 450)  {
   lcd.setCursor(2,0);
   lcd.print("20m OB16-3");   
   lcd.setCursor(2,1);
   lcd.print("20m QQ 2el"); 
   char klawisz = klawiatura.getKey();
   Serial.println(klawisz);
         switch(klawisz){
         case '1': lcd.clear();lcd.setCursor(0,0); lcd.print((char)255); digitalWrite(10,HIGH);break;
         case '2': lcd.clear();lcd.setCursor(0,1); lcd.print((char)255); digitalWrite(10,HIGH);break;
          }
    }   

  /************************15M**************************/   
 else if (odczytanaWartosc0 >= 500 && odczytanaWartosc0 <= 600)  {
   lcd.setCursor(2,0);
   lcd.print("15m OB16-3");   
   lcd.setCursor(2,1);
   lcd.print("15m QQ 2el"); 
   char klawisz = klawiatura.getKey();
   Serial.println(klawisz);
         switch(klawisz){
         case '1': lcd.clear();lcd.setCursor(0,0); lcd.print((char)255); digitalWrite(10,HIGH);break;
         case '2': lcd.clear();lcd.setCursor(0,1); lcd.print((char)255); digitalWrite(10,HIGH);break;
          }
    }   
  /************************10M**************************/ 
 else if (odczytanaWartosc0 >= 650 && odczytanaWartosc0 <= 700)  {
   lcd.setCursor(2,0);
   lcd.print("10m OB16-3");   
   lcd.setCursor(2,1);
   lcd.print("10m QQ 2el"); 
   char klawisz = klawiatura.getKey();
   Serial.println(klawisz);
         switch(klawisz){
         case '1': lcd.clear();lcd.setCursor(0,0); lcd.print((char)255); digitalWrite(10,HIGH);break;
         case '2': lcd.clear();lcd.setCursor(0,1); lcd.print((char)255); digitalWrite(10,HIGH);break;
          }
    } } 

*po przejściu z warunku do warunku (zmiana pasma)

Link do komentarza
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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.