Skocz do zawartości

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

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

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.

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

 

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?

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

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

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...