Помогите с lcd.cursor

lineyka
Offline
Зарегистрирован: 05.04.2018

объясните, кто знает, почему при установке курсора таким способом lcd.setCursor (8, d); cd.cursor(); он еле заметно бегает по всему 16х2 экрану, а не подсвечивается в в указанном lcd.setCursor (8, d); месте?

while (a < 9) {
    if (present)temperatura();
    lcd.setCursor(14, 0);
    lcd.print(celsius);
    lcd.setCursor(14, 1);
    lcd.print(celsius1);
    lcd.setCursor(5, 0);
    lcd.print(s);
    lcd.setCursor(5, 1);
    lcd.print(s + 1);
    lcd.setCursor(7, 0);
    lcd.print(temp1[g]);
    lcd.setCursor(7, 1);
    lcd.print(temp1[g + 1]);
    lcd.setCursor (8, d);
    lcd.cursor();
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А while для чего?

Как написано, так и работает.

lineyka
Offline
Зарегистрирован: 05.04.2018

я его ставил и до while все равно бегает по всему экрану

while для того, чтоб не выйти из void setuptemp(), по-другому я не знал как сделать

void setuptemp() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Окно.     Ул.");
  lcd.setCursor(0, 1);
  lcd.print("Окно.     Теп");
  d = 0;
  i1 = i;
  g = 0;
  s = 1;
  a = 1;
  for (byte g = 0; g < 4; g++) {
    if (temp1[g] < 26)temp1[g] = 25;
  }
  while (a < 9) {
    if (present)temperatura();
    lcd.setCursor(14, 0);
    lcd.print(celsius);
    lcd.setCursor(14, 1);
    lcd.print(celsius1);
    lcd.setCursor(5, 0);
    lcd.print(s);
    lcd.setCursor(5, 1);
    lcd.print(s + 1);
    lcd.setCursor(7, 0);
    lcd.print(temp1[g]);
    lcd.setCursor(7, 1);
    lcd.print(temp1[g + 1]);
    lcd.setCursor (8, d);
    lcd.cursor();
    int button = detectButton();
    switch (button) {
      case BTN_UP:
        delay (200);
        if (downup != 0) {
          if (d == 0 && s != 1) {
            s--;
          }
          if (d != 0)d--;
          if (downup < 3 && g != 0) g--;
          downup--;
        }
        break;
      case BTN_DOWN:
        delay (200);
        if (downup != 3) {
          if (d == 1 && s != 3) {
            s++;
          }
          if (d != 1)d++;
          if (downup > 0 && g != 2) g++;
          downup++;
        }
        break;
      case BTN_LEFT:
        b1 = g;
        if (g == 0 && downup == 0)g = 0;
        if ((g == 0 && downup == 1) || (g == 1 && downup == 1))g = 1;
        if ((g == 1 && downup == 2) || (g == 2 && downup == 2))g = 2;
        if (g == 2 && downup == 3)g = 3;
        if (temp1[g] > 25)temp1[g]--;
        g = b1;
        delay (200);
        break;
      case BTN_RIGHT:
        b1 = g;
        if (g == 0 && downup == 0)g = 0;
        if ((g == 0 && downup == 1) || (g == 1 && downup == 1))g = 1;
        if ((g == 1 && downup == 2) || (g == 2 && downup == 2))g = 2;
        if (g == 2 && downup == 3)g = 3;
        if (temp1[g] < 50)temp1[g]++;
        g = b1;
        delay (200);
        break;
      case BTN_SELECT:
        if (i1 == 0)
          str1 = 0;
        else {
          a = 10;
          str1 = -1;
        }
        downup = 1;
        lcd.noCursor();
        delay(200);
        temp();
        break;
    }
  }
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lineyka пишет:

я его ставил и до while все равно бегает по всему экрану

В упор не вижу.

 

lineyka, поставьте отладочные печати по коду и посмотрите, как он выполняется.

lineyka
Offline
Зарегистрирован: 05.04.2018

andriano пишет:

В упор не вижу.

делал вот так

void setuptemp() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Окно.     Ул.");
  lcd.setCursor(0, 1);
  lcd.print("Окно.     Теп");
  d = 0;
  i1 = i;
  g = 0;
  s = 1;
  a = 1;
  for (byte g = 0; g < 4; g++) {
    if (temp1[g] < 26)temp1[g] = 25;
  }
  lcd.setCursor (8, d);// перенес сюда
  lcd.cursor();        // перенес сюда
  while (a < 9) {
    if (present)temperatura();
    lcd.setCursor(14, 0);
    lcd.print(celsius);
    lcd.setCursor(14, 1);
    lcd.print(celsius1);
    lcd.setCursor(5, 0);
    lcd.print(s);
    lcd.setCursor(5, 1);
    lcd.print(s + 1);
    lcd.setCursor(7, 0);
    lcd.print(temp1[g]);
    lcd.setCursor(7, 1);
    lcd.print(temp1[g + 1]);
    //lcd.setCursor (8, d);
    //lcd.cursor();
    int button = detectButton();
    switch (button) {
      case BTN_UP:
        delay (200);
        if (downup != 0) {
          if (d == 0 && s != 1) {
            s--;
          }
          if (d != 0)d--;
          if (downup < 3 && g != 0) g--;
          downup--;
        }
        break;
      case BTN_DOWN:
        delay (200);
        if (downup != 3) {
          if (d == 1 && s != 3) {
            s++;
          }
          if (d != 1)d++;
          if (downup > 0 && g != 2) g++;
          downup++;
        }
        break;
      case BTN_LEFT:
        b1 = g;
        if (g == 0 && downup == 0)g = 0;
        if ((g == 0 && downup == 1) || (g == 1 && downup == 1))g = 1;
        if ((g == 1 && downup == 2) || (g == 2 && downup == 2))g = 2;
        if (g == 2 && downup == 3)g = 3;
        if (temp1[g] > 25)temp1[g]--;
        g = b1;
        delay (200);
        break;
      case BTN_RIGHT:
        b1 = g;
        if (g == 0 && downup == 0)g = 0;
        if ((g == 0 && downup == 1) || (g == 1 && downup == 1))g = 1;
        if ((g == 1 && downup == 2) || (g == 2 && downup == 2))g = 2;
        if (g == 2 && downup == 3)g = 3;
        if (temp1[g] < 50)temp1[g]++;
        g = b1;
        delay (200);
        break;
      case BTN_SELECT:
        if (i1 == 0)
          str1 = 0;
        else {
          a = 10;
          str1 = -1;
        }
        downup = 1;
        lcd.noCursor();
        delay(200);
        temp();
        break;
    }
  }
}

 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

И в каких строках Вы "ставили до while"?

 

Ну и, что я Вам советовал, - отладочные печати Вы поставили?

lineyka
Offline
Зарегистрирован: 05.04.2018

стояло в строках 31, 32, я поставил в 15,16 строки.

я реально не понимаю как работает set.cursor

у меня в таком коде он гоняет по всему слову чуть заметный

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
  Serial.begin(9600);
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
}

void loop() {
  lcd.setCursor(5, 0);
  lcd.print("second");
  lcd.setCursor(6, 0);
  lcd.cursor();
}

и даже в таком 

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
  Serial.begin(9600);
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  lcd.setCursor(6, 0);
  lcd.cursor();
}

void loop() {
  lcd.setCursor(5, 0);
  lcd.print("second");
}

если есть возможность покажите пожалуйста правильный код для курсора.

если честно, я не понял куда надо поставить отладочные печати, что я должен увидеть

прошу помощи, я не понимаю принцип работы set.cursor

может я неправильно его применяю, мне надо чтобы он подчеркивал (вообще чтоб моргал) под определенным символом в слове или под определенной цифрой (например: second или 56)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lineyka, это не он сам гоняет, это Вы его гоняете почем зря.

Не нужно его теребить на каждом проходе цикла, обращения к нему должны быть тогда и только тогда (!), когда изменяется информация, которую нужно отобразить.

А все остальное время он должен стоять и ждать. 

lineyka
Offline
Зарегистрирован: 05.04.2018

andriano, спасибо, что отвечаете!

но в каком месте я его гоняю? как я понимаю в  setup команды выполняются один раз после включения контроллера, но и там он "гоняет"

lineyka
Offline
Зарегистрирован: 05.04.2018

использовать его хочу для указателя выставления значени, например, времени 00:00:00 далее 00:00:00 при этом он должен еще моргать

если можно покажите пожалуйста пример на коде в 6 посте

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lineyka пишет:

но в каком месте я его гоняю?

А Вы поставьте печать в Serial рядом с каждым обращением к lcd, и сами увидите.

lineyka
Offline
Зарегистрирован: 05.04.2018

поставил в 10 строке и слово отобразилось в порте только один раз, а вот на экране курсор под словом second так и не поймать. Выглядет примерно вот так second _ естественно линия не сплошная и она еле заметна, т.к. курсор гоняет там с бешенной скоростью

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
  Serial.begin(9600);
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  lcd.setCursor(6, 0);
  lcd.cursor();
  Serial.println("привет");
}

void loop() {
  lcd.setCursor(5, 0);
  lcd.print("second");

}

 

lineyka
Offline
Зарегистрирован: 05.04.2018

если сделать вот так

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
  Serial.begin(9600);
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  lcd.setCursor(5, 0);
  lcd.print("second");
  Serial.println("привет");
}

void loop() {
  lcd.setCursor(6, 0);
  lcd.cursor();
  delay (300);
  lcd.setCursor(6, 0);
  lcd.noCursor();
  delay (300);
}

то все моргает под буквой е, это правильный код или есть другой способ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lineyka, у Вас в коде я насчитал 7 строчек, начинающихся с lcd и только одну Serial.println.

И еще, правильно ли я понимаю, что таким образом Вы пытаетесь организовать мигание курсора? А что, библиотекой не поддерживается аппаратное мигание курсора? Что-нибудь типа lcd.blink?

lineyka
Offline
Зарегистрирован: 05.04.2018

про те принты, которые Вы говорите, я знаю, что они выполняются циклом. Я думал, что все принты и курсор работают не зависимо друг от друга, а как я понял, то нет и принты "стирали" курсор поэтому он и бегал по всему слову. Я правильно понял?

lcd.blink это же мигающий квадрат, а мне надо подчеркивание или я опять ошибаюсь?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Честно говоря, курсором ни разу пользоваться не приходилось. Но что-то мне помнится, что его форму можно переключить на подчеркивание. В дэйташит нужно смотреть.

lineyka
Offline
Зарегистрирован: 05.04.2018

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