Skocz do zawartości

Plik na karcie SD zawierający program, który wykonuje Arduino.


Szmyterling

Pomocna odpowiedź

Witam ponownie. Postanowiłem trochę zmodyfikować moją "tablicę rozkładów" i chciałem wymienić przyciski typu switch na klawiaturę membranową.

Zmodyfikowałem odpowiednio kod, połączyłem gadżety, wgrałem kod - ale niestety nie działa.

po naciśnięciu przycisku nic się nie dzieje. Po jego dłuższym przytrzymaniu i puszczeniu w monitorze pokazuje cyfrę i potem samoczynnie leci enter aż do przytrzymania innej cyfry - kolejną wyświetla i leci enter. OLED cały czas bez ani jednego znaku.

Prośba o zerknięcie w kod i podpowiedź co robię źle. Dodam, że zarówno OLED jak i klawiatura, z dedykowanymi bibliotekami działają bez zarzutu.

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Keypad.h>

Adafruit_SSD1306 display(4);

// ustawienie klawiatury
const byte ROWS = 4; //cztery rzędy
const byte COLS = 3; //trzy kolumny
char hexaKeys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}};

// ustawienie komunikatów  
   char message1[]="1 7:30 IC GORNIK Gliwice";
   char message2[]="2 7:45 IC LAJKONIK Krakow Gl.";
   char message3[]="3 8:00 PR Wisla Glebce";
   char message4[]="4 8:05 TLK Czestochowa";
   char message5[]="1 11:55 PR Kedzierzyn Kozle";
   char message6[]="2 12:00 PR Zwardon";
   char message7[]="3 12:10 TLK Rybnik";
   char message8[]="4 12:25 IC NEPTUN Gdynia";
   char message9[]="1 19:00 PR Myslowice";
   char message10[]="2 19:20 Os. Katowice";
   char message11[]="3 19:45 TLK Tychy";
   char message12[]="4 20:00 IC Warszawa Wsch.";
   char message13[]="1 21:00 IC Praga";
   char message14[]="2 22:05 IC Wieden";
   char message15[]="3 22:40 IC Berlin";
   char message16[]="4 23:20 IC Poznan Gl";
   int x, minX;

// podłączenie klawiatury do Arduino   
byte rowPins[ROWS] = {8, 7, 6, 5};  //Piny, do których podłączamy wyprowadzenia od rzędów
byte colPins[COLS] = {4, 3, 2}; //Piny, do których podłączamy wyprowadzenia od kolumn

Keypad keypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS );

void setup(){
 Serial.begin(9600);
 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.setTextWrap(false);
 x = display.width();
 minX = -8 * strlen(message1);
}
  
void loop(){

 char key = keypad.getKey();
      Serial.println(key);
delay(1000);
  if(key == '1'){
   display.clearDisplay();
   display.setCursor(x,0);
   display.setTextSize(1);
   display.print(message1);
   display.setTextSize(1);
   display.setCursor(x,8);
   display.print(message2);
   display.setCursor(x,16);
   display.setTextSize(1);
   display.print(message3);
   display.setCursor(x,24);
   display.setTextSize(1);
   display.print(message4); 
   display.display();
  }
 else if(key == '2'){
   display.clearDisplay();
   display.setCursor(x,0);
   display.setTextSize(1);
   display.print(message5);
   display.setTextSize(1);
   display.setCursor(x,8);
   display.print(message6);
   display.setCursor(x,16);
   display.setTextSize(1);
   display.print(message7);
   display.setCursor(x,24);
   display.setTextSize(1);
   display.print(message8);
  display.display();
 }
 else if(key == '3'){
   display.clearDisplay();
   display.setCursor(x,0);
   display.setTextSize(1);
   display.print(message9);
   display.setTextSize(1);
   display.setCursor(x,8);
   display.print(message10);
   display.setCursor(x,16);
   display.setTextSize(1);
   display.print(message11);
   display.setCursor(x,24);
   display.setTextSize(1);
   display.print(message12);
  display.display();
 }
else if(key == '4'){
   display.clearDisplay();
   display.setCursor(x,0);
   display.setTextSize(1);
   display.print(message13);
   display.setTextSize(1);
   display.setCursor(x,8);
   display.print(message14);
   display.setCursor(x,16);
   display.setTextSize(1);
   display.print(message15);
   display.setCursor(x,24);
   display.setTextSize(1);
   display.print(message16);

   display.display();
   
  }
  

}
 

  

 

Wrzucam również link do symulatora (proszę się nie dziwić, że tu klawiatura 3x4 a tu 4x4 - w symulatorze nie ma tej prostszej)

https://wokwi.com/projects/335204861658268244

Pozdrawiam, Adam

Link do komentarza
Share on other sites

Wywal delay to pogadamy. Poza tym to straszny makaron, jak wykorzystasz 16 klawiszy to 16 razy będziesz powielać ten sam kod? A jak w tym kodzie będzie błąd to 16 razy będziesz go poprawiać?

Aha - nie jestem pewien a nie bardzo mam czas sprawdzać - czy ta biblioteka pokazuje aktualnie wciśnięty klawisz czy reaguje na zmianę stanu? Bo spotkałem się z dwiema takimi

 

Edytowano przez ethanak
Link do komentarza
Share on other sites

Delay wyleciał. Zamierzonych efektów brak. Teraz cyfra przelatuje w monitorze "w moment".

Może i to "makaron" jednak nie jestem w stanie zrobić nic lepszego.

Biblioteka powinna reagować.

Link do komentarza
Share on other sites

Dobra, poteoretyzuję trochę 🙂

void loop()
{
  static char old_key = 0;  // poprzedni odczyt z getKey()
  char key = keypad.getKey();
  if (key == old_key) return; // nic nie robimy
  old_key = key;    // zapamiętujemy
  if (key == NO_KEY) return; // nic nie robimy jeśli klawisz puszczony
  delay(50);        // poor man debouncing :)
  
  /* i dalej na razie jak poprzednio */
  Serial.println(key);
  if (key == '1') {
    /* porcja makaronu */
    

Spróbuj tego. Jak ruszy, będziemy kombinowali z pozbyciem się makaronu i zmniejszeniem zużycia pamięci (bo zaraz się skończy)

Edytowano przez ethanak
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

23 minuty temu, ethanak napisał:

Spróbuj tego. Jak ruszy, będziemy kombinowali z pozbyciem się makaronu i zmniejszeniem zużycia pamięci (bo zaraz się skończy)

W tej chwili monitor zachowuje się tak, jak z użyciem podstawowej bibliotek KEYPAD - wyświetla to co naciskam i przechodzi wiersz niżej. OLED milczy.

 

Co do płytki, to mogę się przesiąść na NODEMCU V2. Ona ma chyba więcej pamięci?

Edytowano przez prezesedi
Link do komentarza
Share on other sites

8 minut temu, prezesedi napisał:

Ona ma chyba więcej pamięci?

Delikatnie mowiac😉 ale to nie o to chodzi zeby zmieniac plytke bo na Ardu nie dziala...musi dzialac, skoro wszystko dziala osobno a razem nie chce to cos sie te biblioteki musza grysc..

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

5 minut temu, prezesedi napisał:

OLED milczy.

No tak, teraz spojrzałem wyżej.

Możesz wyjaśnić, dlaczego chcesz wyświetlać wszystko zaraz za prawą krawędzią wyświetlacza?

Może nie

setCursor(x, cośtam)

ale

setCursor(0, cośtam)

 

 

6 minut temu, prezesedi napisał:

Co do płytki, to mogę się przesiąść na NODEMCU V2. Ona ma chyba więcej pamięci?

Tak, ale tam też się w pewnym momencie skończy. Poza tym zabraknie pinów do obsługi keypada.

Nie lepiej po prostu dowiedzieć się, jak się oszczędza pamięć w Arduino?

 

  • Lubię! 1
Link do komentarza
Share on other sites

7 minut temu, ethanak napisał:

setCursor(x, cośtam)

Tak mam ustawione przy OLED i 4 switch'ach - tekst się przewija od prawej krawędzi do lewej. Zamierzeniem było jedynie wymienić 4 switche na klawiaturę.

zmieniłem iksy na zera - tekst od razu się pokazuje na OLED jednak nie przewija

Edytowano przez prezesedi
Link do komentarza
Share on other sites

9 minut temu, ethanak napisał:

 


 

 


 

 

Nie lepiej po prostu dowiedzieć się, jak się oszczędza pamięć w Arduino?

 

No jasne ze tak, ale narazie to wyswietlanie trzeba rozwiazac (co juz zreszta zrobiles) setCursor jest zle jak wspomniales...tam te napisy mialy sie przewijac, stad ten "x"

Link do komentarza
Share on other sites

Dlatego propopnuję zrobienie po kolei: najpierw wyświetlanie zależnie od klawisza, potem zrobienie z tego uczciwych funkcji, a na końcu śliczne przewijanie (śliczne, tzn. przewijanie tylko tego co trzeba).

Link do komentarza
Share on other sites

MEA CULPA (i biję się w pierś) - wklejałem nie do tego kodu co trzeba. Tak jest jak się robi kilka próbek i ma otwarte kilka kodów 😞

Zrobiłem już porządek z kodami. Przeanalizowałem co jest czym. Efekt - mam komunikat na OLED. Pod danym przyciskiem inny. Każde naciśnięcie przycisku powoduje przewinięcie tekstu o jedną kolumnę i stop.

Dałem powrotnie - display.setCursor(x,0); - dzięki temu tekst "rusza" zza ekranu (zamierzony efekt).

W tej chwili pozostaje dopracowanie automatycznego przewijania tekstu, co próbuję uczynić.

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Keypad.h>

Adafruit_SSD1306 display(4);

// ustawienie klawiatury
const byte ROWS = 4; //cztery rzędy
const byte COLS = 3; //trzy kolumny
char hexaKeys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}};

// ustawienie komunikatów  
   char message1[]="1 7:30 IC GORNIK Gliwice";
   char message2[]="2 7:45 IC LAJKONIK Krakow Gl.";
   char message3[]="3 8:00 PR Wisla Glebce";
   char message4[]="4 8:05 TLK Czestochowa";
   char message5[]="1 11:55 PR Kedzierzyn Kozle";
   char message6[]="2 12:00 PR Zwardon";
   char message7[]="3 12:10 TLK Rybnik";
   char message8[]="4 12:25 IC NEPTUN Gdynia";
   char message9[]="1 19:00 PR Myslowice";
   char message10[]="2 19:20 Os. Katowice";
   char message11[]="3 19:45 TLK Tychy";
   char message12[]="4 20:00 IC Warszawa Wsch.";
   char message13[]="1 21:00 IC Praga";
   char message14[]="2 22:05 IC Wieden";
   char message15[]="3 22:40 IC Berlin";
   char message16[]="4 23:20 IC Poznan Gl";
   int x, minX;

// podłączenie klawiatury do Arduino   
byte rowPins[ROWS] = {8, 7, 6, 5};  //Piny, do których podłączamy wyprowadzenia od rzędów
byte colPins[COLS] = {4, 3, 2}; //Piny, do których podłączamy wyprowadzenia od kolumn

Keypad keypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS );

void setup(){
 Serial.begin(9600);
 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.setTextWrap(false);
 x = display.width();
 minX = -8 * strlen(message1);
}
  
void loop(){

static char old_key = 0;  // poprzedni odczyt z getKey()
  char key = keypad.getKey();
  if (key == old_key) return; // nic nie robimy
  old_key = key;    // zapamiętujemy
  if (key == NO_KEY) return; // nic nie robimy jeśli klawisz puszczony
  delay(50);        // poor man debouncing :)
 static byte y = 0;
 static long last = 0;
 static byte kopia = 0;
  
  
Serial.println(key);
  if(key == '1'){
   display.clearDisplay();
   display.setCursor(x,0);
   display.setTextSize(1);
   display.print(message1);
   display.setTextSize(1);
   display.setCursor(x,8);
   display.print(message2);
   display.setCursor(x,16);
   display.setTextSize(1);
   display.print(message3);
   display.setCursor(x,24);
   display.setTextSize(1);
   display.print(message4); 
   display.display();
   x = x-4;
  }
 else if(key == '2'){
   display.clearDisplay();
   display.setCursor(x,0);
   display.setTextSize(1);
   display.print(message5);
   display.setTextSize(1);
   display.setCursor(x,8);
   display.print(message6);
   display.setCursor(x,16);
   display.setTextSize(1);
   display.print(message7);
   display.setCursor(x,24);
   display.setTextSize(1);
   display.print(message8);
   display.display();
   x = x-4;
 }
 else if(key == '3'){
   display.clearDisplay();
   display.setCursor(x,0);
   display.setTextSize(1);
   display.print(message9);
   display.setTextSize(1);
   display.setCursor(x,8);
   display.print(message10);
   display.setCursor(x,16);
   display.setTextSize(1);
   display.print(message11);
   display.setCursor(x,24);
   display.setTextSize(1);
   display.print(message12);
   display.display();
   x = x-4;
 }
else if(key == '4'){
   display.clearDisplay();
   display.setCursor(x,0);
   display.setTextSize(1);
   display.print(message13);
   display.setTextSize(1);
   display.setCursor(x,8);
   display.print(message14);
   display.setCursor(x,16);
   display.setTextSize(1);
   display.print(message15);
   display.setCursor(x,24);
   display.setTextSize(1);
   display.print(message16);
   display.display();
   x = x-4;

   display.clearDisplay();
   display.setCursor(18,0);
   display.setTextSize(1);
   display.print("KATOWICE BRYNOW");
   display.setTextSize(2);
   display.setCursor(35,15);
   display.print("15:20");
   display.display();
   y = 6;
   last = millis();

   if (millis() - last > 3000UL) { // 3000 = 3 sekundy
    y = kopia;
    x = display.width();
    }

  if(x < minX) {
    x = display.width();
    y = 5;
  }
}

}
 

  

 

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.