Странный вывод данных на lcd

Доброго дня, коллеги. Разрабатывал раньше на распбери и ява более сложные штуки, а тут решил попробовать сделать довольно простую вещь в Arduino. Скажу я вам…)
В общем, столкнулся с первой проблемой. Есть nano и экран 2004, на который выводятся несколько ЭФ. И вот тут начинается проблемка, так как пытался работать с енам - он странный, на экран выводилась чепуха. Ладно думаю, что-то с самим енамом. Но потом дошел до самого тестового функционала: суть получаю время от часов реального времени, ну или любую другую строку (char) прохожусь по массиву, собираю данные в другой и пытаюсь вывести на экранчик. И выводится какая-то числовая чепуха. Я было думал, что это коды символов, но больно уж они странные) Если же в экран кинуть прямо строку “any string” - то выводит ок. Вот пример:


printOnDisplay("WATCH settings", 0, 0, true);
if (currentDateTime == NULL) {
  currentDateTime = time.gettime("d-m-Y, H:i");
}

printOnDisplay(currentDateTime, 0, 1, false);

char* str = currentSetIndex == 2 ? "____" : "__";
printOnDisplay(str, setLenth[currentSetIndex], 2, false);
        if (upButtonPressed) {
          if (currentSetIndex < 5) {
      currentSetIndex++;
          } else {
            currentSetIndex = 0;
          }
          printOnDisplay("UPBT", 5, 2, false);
          upButtonPressed = false;
    }

    int paramLenth = currentSetIndex == 2 ? 4 : 2;
    if (downButtonPressed) {
      char param[paramLenth];lcd.setCursor(0, 2);
      for (int i = 0; i <  paramLenth; i++) {
        param[i] = currentDateTime[setLenth[currentSetIndex + i]];
          // курсор в начале первой строки
//                     // курсор в начале 4 строки


      }

      downButtonPressed = false;

      printOnDisplay(param, 0, 2, false);
      printOnDisplay("DOWN", 5, 2, false);
    }

      lcd.print(char (233));

    

}```.
Вторая же проблема в том, что объявлены глобальные переменные по кнопкам: 
```  boolean setButtonPressed = false;
  boolean upButtonPressed = false;
  boolean downButtonPressed = false;```
в loop считывается нажатие и меняется значение
```    if (digitalRead(setButtonPin) == LOW && millis() - btnTimer1 > 200) {  
      btnTimer1 = millis();
    setButtonPressed = true;
  }
  
    if (digitalRead(upButtonPin) == LOW && millis() - btnTimer2 > 200) {  
      btnTimer2 = millis(); 
      upButtonPressed = true;
      
  }
    if (digitalRead(downButtonPin) == LOW && millis() - btnTimer3 > 200) {   
      btnTimer3 = millis();
    downButtonPressed = true;
  }

а вот в функции выше упомянутой порой будто состояние одного флага не успевает поменяться. Такое возможно?

Строку 8 переписывать пробовал ?
Хотя бы так:

char* str="1234";
currentSetIndex == 2 ? str="____" : str="__";

Или так:

char *str = malloc(5);
currentSetIndex == 2 ? str="____" : str="__";

код целиком выкладывайте

Может и не успевает - всего кода мы не видели, мало что там у вас наворочено.
Можно как-то четче изложить проблему?

Проблема даже если НЕ использовать все эти изыски логики. Просто убрал тернарную операцию и вывод подчеркивания. И символ тоже убрал.

void drawWatchSettings() {

printOnDisplay("WATCH settings", 0, 0, true);
if (currentDateTime == NULL) {
  currentDateTime = time.gettime("d-m-Y, H:i");
}

printOnDisplay(currentDateTime, 0, 1, false);

//char* str = currentSetIndex == 2 ? "____" : "__";
//printOnDisplay(str, setLenth[currentSetIndex], 2, false);
        if (upButtonPressed) {
          if (currentSetIndex < 5) {
      currentSetIndex++;
          } else {
            currentSetIndex = 0;
          }
          printOnDisplay("UPBT", 5, 2, false);
          upButtonPressed = false;
    }

    int paramLenth = currentSetIndex == 2 ? 4 : 2;
    if (downButtonPressed) {
      char param[paramLenth];
      for (int i = 0; i <  paramLenth; i++) {
        param[i] = currentDateTime[setLenth[currentSetIndex + i]];

      }
      downButtonPressed = false;

      printOnDisplay(param, 0, 2, false);
      printOnDisplay("DOWN", 5, 2, false);
    }


    

}

То есть это, вроде как , не влияет. Сейчас это выглядит следующим образом:
2-я строка: 12-06-2020, 23:40
в третью выводится подстрока, которую высчитываем, собственно из индексов - нажимаем вверх берется подстрока 0-1, еще раз 3-4.
То есть должен вывести при нажатии вниз 06 в третью строку, а не 2241

Вы что-нибудь слышали о том, что массив символов в Си должен завершатся терминатором? Если вы хотите вывести два символа, нужен массив на три элемента, а не на два.
И при копировании данных

не забывайте поставить ноль в последнюю ячейку

Не знал, спасибо - буду знать. Попробовал просто в луп вывести кусок строки так:

//  char str[] = "12-06-2020, 23:40";
//  printOnDisplay(String(str), 0, 2, true);
//  char str2[] = {str[0],str[1]};
//  printOnDisplay(String(str2), 0, 1, false);
//  delay(5000);

вывел, как ни странно, а вот тут :


void drawWatchSettings() {

printOnDisplay("WATCH settings", 0, 0, true);
if (currentDateTime == NULL) {
  currentDateTime = time.gettime("d-m-Y, H:i");
}

printOnDisplay(currentDateTime, 0, 1, false);

//char* str = currentSetIndex == 2 ? "____" : "__";
//printOnDisplay(str, setLenth[currentSetIndex], 2, false);
        if (upButtonPressed) {
          if (currentSetIndex < 5) {
      currentSetIndex++;
          } else {
            currentSetIndex = 0;
          }
//          printOnDisplay("UPBT", 5, 2, false);
          upButtonPressed = false;
    }

    int paramLenth = currentSetIndex == 2 ? 4 : 2;
    if (downButtonPressed) {
      char param[paramLenth + 1];
      for (int i = 0; i <=  paramLenth; i++) {
        if (i == paramLenth) {
          param[i] = 0;
        } else {
        param[i] = currentDateTime[setLenth[currentSetIndex + i]];
        }

      }
      downButtonPressed = false;

      printOnDisplay(param, 0, 2, false);
    }


    

}

пока не хочет даже с 0

Простите, с какой целью Вы запрашиваете память и тут же присваиваете этому указателю адрес литерала? Чтобы забыть адрес выделенной памяти и уже никогда не освободить её?

А вообще, присваивать указателю char * адрес литерала … и для кого я в прошлую пятницу говнокод выкладывал?

Простите, @Dragomir, Вы сюда пришли потрындеть и потроллить народ?

Вам же сказали:

Вам что-то в этой фразе непонятно? Какое именно слово? Почему в словаре не посмотрите?

А то Вы, блин, пишете, например:

А какого типа этот самый currentDateTime нам догадываться предлагаете?

Код нужен полный (для альтернативно одарённых – ПОЛНЫЙ) Чтобы любой мог загрузить его у себя и увидеть Вашу проблему. (это если Вам помощь нужна, а не трындёжь и троллинг).

Ох, коллеги, коллеги. Форумы не меняются с течением лет. Я накосячил, а не ардуино. Уж сорян - не знаком я с Си, пока он мне кажется недоязыком. Енамы полурабочие строк нет и т.д. Далее сам разберусь. Цель обращения была убедиться, что не я накосячил, но все же я. Всем спасибо. Код и выкладывать не потребовалось.

это кто? enum?

1 лайк

Да ничего странного. Вы, наверное, этим хотели проверить, можно ли вывести два символа без терминатора? - только не догадываетесь, что при таком обьявлении строки

char str2[] = {str[0],str[1]};

компилятор ноль в конце добавляет автоматически.
Так что ничего вы не проверили, у вас получился массив из трех элементов, а не из двух.

а вот это должно работать. Попробуйте задать терминатор так

  param[i] = '\0';

А что Вас удивляет. Как только человек

так он на недоязыке и объясняется. Компенсирует отсутствие знаний и полное непонимание “крутым профессиональным сленгом”.

Отсюда же, кстати, все эти “проги” и прочие “серваки”.

4 лайка