Skocz do zawartości

Pomocna odpowiedź

1 minutę temu, prezesedi napisał:

Nie potrafię przejść błędu związanego z BREAK "break statement not within loop or switch".

W którym miejscu?

 

  switch(currentMsg) {
    case 10:
    display.clearDisplay();
    display.setCursor(18,0);
    display.setTextSize(1);
    display.print("KATOWICE BRYNOW");
    display.setTextSize(3);
    display.setCursor(20,15);
    display.print("15:20");
    display.display();
    currentMsg = 11;
    lastLocalMsg = millis();
    }
    break;
    
    case 11:
    if (millis() - lastLocalMsg > 3000UL) { // 3000 = 3 sekundy
    currentMsg = scheduleMsg;
    x = display.width();
    }
    break;

    default:
    display.ssd1306_command(SSD1306_DISPLAYOFF);
    break; //tu!!!!!!!!!!!!!!!!!!!!!!!!!!

 
if (millis() - displayctl < SCROLL_STEP) return;
displayctl = millis();

 

Coś pokręciłeś chyba. Pełny kod po ustaleniu co przylazło z klawiatury powinien wyglądać mniej więcej tak:
 

////
// burst wyświetlania
    if (millis() - displayctl < SCROLL_STEP) return;
    displayctl = millis();
// rozkład jazdy
    if (currentMessage >= 1 && currentMessage <= 9) {
        wyswietl(currentMessage);
        return;
    }
// inne
    switch(currentMsg) {
        case 10:
        display.clearDisplay();
        display.setCursor(18,0);
        display.setTextSize(1);
        display.print("KATOWICE BRYNOW");
        display.setTextSize(3);
        display.setCursor(20,15);
        display.print("15:20");
        display.display();
        currentMsg = 11;
        lastLocalMsg = millis();
        // tu miałeś niepotrzebną klamrę! 
        break;
    
        case 11:
        if (millis() - lastLocalMsg > 3000UL) { // 3000 = 3 sekundy
            currentMsg = scheduleMsg;
            x = display.width();
        }
        break;

        default:
        display.ssd1306_command(SSD1306_DISPLAYOFF);
        break;
    } // koniec switch
} // koniec loop


 


 

Zresztą docelowo i tak to się znajdzie w funkcji show(), ale zanim co musi działać!

A ja to na pewno namieszałem. Bo wiem, że potrafię. Zmieniłem kolejność i "przeszło" jednak nie wyświetla się żaden komunikat. Więc namieszałem GRUBO, ale to u mnie normalne. Trzeba wziąć poprawkę (na mnie) i mieć żelazne nerwy 😕

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

      //ustawienie i2c
#define OLED_SDA 21
#define OLED_SCL 22
#define SCROLL_STEP 10UL

static uint32_t displayctl= millis();

Adafruit_SSD1306 display(128,64,&Wire);



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

char * messages[] = {
    "1 00:05 EC 'SOBIESKI' Wien",
    "2 01:15 EC 'POLONIA' Berlin",
    "3 02:00 EC 'CHOPIN' Graz",
    "4 03:30 EC 'SILESIA' Praha",
    "1 04:05 EIP 'GIBKI CUG' Warszawa Wsch.",
    "2 05:00 TLK 'JASNA G\013RA' Cz\005stochowa",
    "3 05:55 EIC 'KORMORAN' Olsztyn G\025.",
    "4 06:20 IC 'TATRY' Zakopane",
    "1 07:15 IC 'G\013RAL' Bielsko Bia\025a",
    "2 07:30 EIC 'LATARNIK' Ko\025obrzeg",
    "3 08:00 K\006 'SZTYGAR' Tarnowskie G\014ry",
    "4 08:05 IC 'CZANTORIA' Wis\025a G\025\005bce",
    "1 11:55 TLK 'GRANICA' Cha\025upki",
    "2 12:00 IC 'SUDETY' K\025odzko",
    "3 12:10 IC 'LAJKONIK' Krak\014w",
    "4 12:25 K\006 'BESKIDY' \016ywiec",
    "1 14:15 K\006 'G\013RNIK' Gliwice",
    "2 14:40 K\006 'FIAT' Tychy Lodowisko",
    "3 15:00 PR 'WARTA' Wielu\023 D\003browa",
    "4 15:25 TLK 'BOLEK I LOLEK' Wodzis\025aw \006l.",
    "1 17:30 IC 'ODRA' Opole",
    "2 17:40 EIP 'PRZEMY\006LANIN' Przemy\007l G\025.",
    "3 17:55 K\006 'SPODEK' Katowice",
    "4 18:15 EIC 'KARKONOSZE' Jelenia G\014ra",
    "1 19:00 EIP 'NEPTUN' Hel",
    "2 19:20 K\006 'PIRAT' Lubliniec",
    "3 19:45 PR 'SPRINTER' \016ywiec",
    "4 20:00 K\006 'GWAREK' Racib\014rz",
    "1 21:00 EIC 'BA\024TYK' Gdynia G\025.",
    "2 21:30 EIP 'PIAST' Pozna\023 G\025.",
    "3 21:45 PR 'GIBKI CUG' Tarnowskie G\014ry",
    "4 22:00 IC 'CHEMIK' P\025ock",
    "1 22:05 EIC 'WYDMY' Ustka",
    "2 22:40 TLK 'SZYCHTA' Sosnowiec P\025d.",
    "3 23:20 EIC 'WOLIN' \006winouj\007cie",
    "4 23:50 EC 'LW\013W EXPRESS' Kiev"
};
   int x, minX;

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

Keypad keypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS );
byte currentMsg=0;
byte scheduleMsg=0;
uint32_t lastLocalMsg;

  void setup(){

  Wire.begin(OLED_SDA, OLED_SCL);
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setTextWrap(false);
  x = display.width();
  }

  void wyswietl(int n)
{
    display.ssd1306_command(SSD1306_DISPLAYON);
    display.clearDisplay();
    display.setTextSize(2);
    int i;
    for (i=0;i<4; i++) {
        display.setCursor(x,i*16);
        display.print(messages[(n-1) * 4] + i);
    }
    display.display();
    x -= 1;
}

  void loop(){
  char key = keypad.getKey();
      Serial.println(key);

  if (millis() - displayctl < SCROLL_STEP) return;
  displayctl = millis();

  if (currentMsg >= 1 && currentMsg <= 9) {
  wyswietl(currentMsg);
  return;
}

switch(currentMsg) {
        case 10:
        display.clearDisplay();
        display.setCursor(18,0);
        display.setTextSize(1);
        display.print("KATOWICE BRYNOW");
        display.setTextSize(3);
        display.setCursor(20,15);
        display.print("15:20");
        display.display();
        currentMsg = 11;
        lastLocalMsg = millis();
        break;
    
        case 11:
        if (millis() - lastLocalMsg > 3000UL) { // 3000 = 3 sekundy
            currentMsg = scheduleMsg;
            x = display.width();
        }
        break;

        default:
        display.ssd1306_command(SSD1306_DISPLAYOFF);
        break;
    }
}

 

(edytowany)

Coś za dużo wyrzuciłeś z kodu - a gdzie ten kawałek co robi machlojki z currentMsg? Między getKey a burstem do wyświetlania...

if (key == '1') { 
    delay(500);       
   x= display.width();
   y = 1;
   kopia = 1;
} else if (key == '2') { 
  /// i tak dalej

Oczywiście to też pójdzie do przeróbki, ale bez tego nie będzie działać.

Edytowano przez ethanak

Taaaaaaaaaaaaaaaaaak, ktoś mi kiedyś powiedział by uważać z klawiszem DELETE...

Zaraz odzyskam część kodu

Wyświetlanie przywrócone. Jednak ... są różnice

w 3 wierszach pokazuje się 1 linijka komunikatu, każda przesunięta o jeden znak.

Nie wyświetla nazwy stacji z zegarem

20220629_220755[1].jpg

Aj, tym razem to moja wina.

Zamiast

display.print(messages[(n-1) * 4] + i);

trzeba

display.print(messages[(n-1) * 4 + i]);

Niestety - tak to jest jak się programuje na kartce 🙂

Witam.

Dziś wdrażam poprawki od zera, bo wczoraj coś mi nie poszło. Ale i tak wywala błąd przy sprawdzaniu:

"cannot convert 'char**' to 'const char*' for argument '1' to 'size_t strlen(const char*)'"

Przechwytywanie.JPG

(edytowany)

Nic dziwnego -strlen oczekuje napisu, a Ty podajesz tablicę napisów.

Daj tam na razie messages[0] zamiast messages, dzisiaj już chyba nie pomogę 😞

A i przypominam: znak ma 6 pikseli szerokości a nie 8!

Edytowano przez ethanak

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