Skocz do zawartości
qro9qs

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

Pomocna odpowiedź

Napisano (edytowany)

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

Udostępnij ten post


Link to post
Share on other sites

@qro9qs witam na forum! Zadanie nie brzmi na zbyt trudne, pokaż swój kod to łatwiej będzie doradzić coś konkretnego 😉

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

Udostępnij ten post


Link to post
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)) { [...]

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

Coś mi tu nie gra...

Co Twoim zdaniem robi przytoczony przez @Treker fragment programu? Bo chyba nie to co chciałeś...

Udostępnij ten post


Link to post
Share on other sites

Gdy na A0 pojawi się sygnał o wartości między 500 a 600 to załącza się wybrany zakres. W tym wypadku 15M

Udostępnij ten post


Link to post
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).

 

Udostępnij ten post


Link to post
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?

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

A co z "dziurami" w wartościach? Bo między zakresami masz przeskoki od 10 do 80.

I podpowiem że wszystko da się zrobić na switchu, bez ifów jakichkolwiek.

Edytowano przez szczawiosław

Udostępnij ten post


Link to post
Share on other sites

Sprawdzając wartości odczytywane przez arduino po wybraniu zakresu ustawiłem te przedziały (z zapasem)

Udostępnij ten post


Link to post
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.

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

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