Доброго дня, коллеги. Разрабатывал раньше на распбери и ява более сложные штуки, а тут решил попробовать сделать довольно простую вещь в 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;
}
а вот в функции выше упомянутой порой будто состояние одного флага не успевает поменяться. Такое возможно?
То есть это, вроде как , не влияет. Сейчас это выглядит следующим образом:
2-я строка: 12-06-2020, 23:40
в третью выводится подстрока, которую высчитываем, собственно из индексов - нажимаем вверх берется подстрока 0-1, еще раз 3-4.
То есть должен вывести при нажатии вниз 06 в третью строку, а не 2241
Вы что-нибудь слышали о том, что массив символов в Си должен завершатся терминатором? Если вы хотите вывести два символа, нужен массив на три элемента, а не на два.
И при копировании данных
Простите, с какой целью Вы запрашиваете память и тут же присваиваете этому указателю адрес литерала? Чтобы забыть адрес выделенной памяти и уже никогда не освободить её?
А вообще, присваивать указателю char * адрес литерала … и для кого я в прошлую пятницу говнокод выкладывал?
Простите, @Dragomir, Вы сюда пришли потрындеть и потроллить народ?
Вам же сказали:
Вам что-то в этой фразе непонятно? Какое именно слово? Почему в словаре не посмотрите?
А то Вы, блин, пишете, например:
А какого типа этот самый currentDateTime нам догадываться предлагаете?
Код нужен полный (для альтернативно одарённых – ПОЛНЫЙ) Чтобы любой мог загрузить его у себя и увидеть Вашу проблему. (это если Вам помощь нужна, а не трындёжь и троллинг).
Ох, коллеги, коллеги. Форумы не меняются с течением лет. Я накосячил, а не ардуино. Уж сорян - не знаком я с Си, пока он мне кажется недоязыком. Енамы полурабочие строк нет и т.д. Далее сам разберусь. Цель обращения была убедиться, что не я накосячил, но все же я. Всем спасибо. Код и выкладывать не потребовалось.
Да ничего странного. Вы, наверное, этим хотели проверить, можно ли вывести два символа без терминатора? - только не догадываетесь, что при таком обьявлении строки
char str2[] = {str[0],str[1]};
компилятор ноль в конце добавляет автоматически.
Так что ничего вы не проверили, у вас получился массив из трех элементов, а не из двух.