Некорректные показания lcd дисплея

Метод print() возвращает количество символов, поэтому конечно нужен. Или Вы просто прикалываетесь?

В ядре оно выглядит так:

#define A0 14
1 лайк

какие приколы если тут + добавить перед равно, и текущий счетчик будет 9999 а потом станет 99 то на экране будет 99 9 ?

это если мы ии новому не обучаем, а спрашиваем ошибку в коде

Попробовал ваш скетч, результат тот же, считает от 1 до 9 потом опять на 1 переходит. Попробую связаться с продавцом lcd может он что подскажет, явно не в скетче проблема. Пока тут пробовал все это пришла мысль вести подсчет оборотов по простому секундомеру. Обороты вала по тахометру мне известны, путем несложных математических подсчётов можно найти за какое время вал совершит скажем 1000, 800 оборотов, составляем таблицу и работаем. Точность ± 10 оборотов меня устроит

Dima24 это что выходит и мой код не работает ? выходит я не сделал 1 доброе дело в месяц ?

скиньте фото/видео, как эт происходит.

а этот код что выводит?

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); 

void setup()
{
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("  Turn counter ");
}

void loop()
{
  static uint32_t i=0;
  lcd.setCursor (0, 1);
  lcd.print(i++);
  delay(500);
}

Да, я на 99% уверен, что дело в криворукости.

Вас просили вывести на экран число, например “12”. И ничего больше.
Вы сделали?

У меня на работе два таких же дятла.

Если что то у них не пол чается значит в железяке дело…

За два года было уже случаев 15, железо не было виновато ни разу…

2 лайка

Обычно делаю как то так:

char topRow[16]; sprintf(topRow,"My value = %6d",val); lcd.setCursor(0,0); lcd.print(topRow);

Почему то перенос строки (enter), в коде не работает с телефона.

не, ну может второе знакоместо, действительно “битое”
его @MMM вон просит просто вывести 123456…
игнорит, ну пусть игнорит.

1 лайк

Если cnt=9999; то в строке 1 posCursor=4;
Строка 2. Пока posCursor<16, выводим пробелы. Вывели один - posCursor=5;
Вывели 12 - posCursor=16; Выходим из цикла while, все, строка ЛСД очищена.
Если счетчик =99, то выведутся 14 пробелов.

Pyotr вот что говорит**

НЕТ, это НЕ верно!** Вы продолжаете делать ту же ошибку.

Давайте разберем подробно почему ваш анализ ошибочен:

Ошибка в вашем анализе:

Вы пишете:

“Вывели один - posCursor=5”

Неправильно! При использовании += будет не posCursor=5, а совсем другое значение!

Итог:

Ваш анализ неверен, потому что:

  1. lcd.print(' ') возвращает новую позицию курсора, а не 1

  2. += складывает текущую позицию с новой позицией → получается ерунда

  3. Пробелы выводятся не подряд, а с пропусками

Исправьте += на = или используйте posCursor++ в цикле!

1 лайк
=== ТОЧНАЯ СИМУЛЯЦИЯ LCD ===
cnt = 99 (было 9999)
Позиции: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Было:    9 9 9 9                         
[ВАШ КОД: posCursor += lcd.print(' ')]
Вывод '99': 9 9 9 9                          | cursorPos=2
Итер 1: 9 9   9                          | cursorPos=5 (пробел на поз.2)
Итер 2: 9 9   9                          | cursorPos=11 (пробел на поз.5)
Итер 3: 9 9   9                          | cursorPos=23 (пробел на поз.11)
ИТОГ LCD: 9 9   9                         Проблема: старые '9' остались на позициях 3,4,6,7,8...
[ПРАВИЛЬНЫЙ КОД: posCursor = lcd.print(' ')]
Итер 1: 9  9  [_] 9                                       | cursorPos=3
Итер 2: 9  9     [_]                                      | cursorPos=4
Итер 3: 9  9        [_]                                   | cursorPos=5
Итер 4: 9  9           [_]                                | cursorPos=6
Итер 5: 9  9              [_]                             | cursorPos=7
Итер 6: 9  9                 [_]                          | cursorPos=8
Итер 7: 9  9                    [_]                       | cursorPos=9
Итер 8: 9  9                       [_]                    | cursorPos=10
Итер 9: 9  9                          [_]                 | cursorPos=11
Итер 10: 9  9                             [_]              | cursorPos=12
Итер 11: 9  9                                [_]           | cursorPos=13
Итер 12: 9  9                                   [_]        | cursorPos=14
Итер 13: 9  9                                      [_]     | cursorPos=15
Итер 14: 9  9                                         [_]  | cursorPos=16
ИТОГ LCD: 9 9                             Все старые символы затерты!

void simulateLCD() {
  Serial.println("=== ТОЧНАЯ СИМУЛЯЦИЯ LCD ===");
  Serial.println("cnt = 99 (было 9999)");
  Serial.println("Позиции: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15");
  
  // Имитация памяти LCD (16 символов)
  char lcdMemory[17] = "9999            "; // Изначально "9999"
  
  Serial.print("Было:    ");
  for (int i = 0; i < 16; i++) {
    Serial.print(lcdMemory[i]);
    Serial.print(" ");
  }
  Serial.println();
  
  // ===== ВАШ КОД С += (ОШИБОЧНЫЙ) =====
  Serial.println("[ВАШ КОД: posCursor += lcd.print(' ')]");
  
  // Восстанавливаем исходное состояние
  strcpy(lcdMemory, "9999            ");
  
  // Шаг 1: lcd.print(cnt) где cnt = "99"
  lcdMemory[0] = '9';
  lcdMemory[1] = '9';
  // lcdMemory[2], [3] пока остаются '9', '9' от старого значения
  
  byte cursorPos = 2; // lcd.print("99") вернул позицию курсора 2
  
  Serial.print("Вывод '99': ");
  for (int i = 0; i < 16; i++) {
    Serial.print(lcdMemory[i]);
    Serial.print(" ");
  }
  Serial.print(" | cursorPos=");
  Serial.println(cursorPos);
  
  // Шаг 2: Цикл с +=
  int iteration = 1;
  while(cursorPos < 16) {
    // lcd.print(' ') делает:
    // 1. Записывает пробел в текущую позицию курсора
    // 2. Сдвигает курсор на +1
    // 3. Возвращает новую позицию курсора
    
    byte oldCursor = cursorPos; // Текущая позиция перед выводом
    
    // 1. Записываем пробел
    lcdMemory[oldCursor] = ' ';
    
    // 2. Новая позиция курсора
    byte newCursor = oldCursor + 1;
    
    // 3. ВАША ОШИБКА: cursorPos += newCursor
    cursorPos += newCursor; // Неправильно!
    
    Serial.print("Итер ");
    Serial.print(iteration);
    Serial.print(": ");
    for (int i = 0; i < 16; i++) {
      Serial.print(lcdMemory[i]);
      Serial.print(" ");
    }
    Serial.print(" | cursorPos=");
    Serial.print(cursorPos);
    Serial.print(" (пробел на поз.");
    Serial.print(oldCursor);
    Serial.println(")");
    
    iteration++;
    if (iteration > 8) {
      Serial.println("... (цикл продолжается)");
      break;
    }
  }
  
  Serial.print("ИТОГ LCD: ");
  for (int i = 0; i < 16; i++) {
    Serial.print(lcdMemory[i]);
    Serial.print(" ");
  }
  Serial.println("Проблема: старые '9' остались на позициях 3,4,6,7,8...");
  
  // ===== ПРАВИЛЬНЫЙ КОД =====
  Serial.println("[ПРАВИЛЬНЫЙ КОД: posCursor = lcd.print(' ')]");
  
  // Восстанавливаем
  strcpy(lcdMemory, "9999            ");
  lcdMemory[0] = '9';
  lcdMemory[1] = '9';
  cursorPos = 2;
  
  iteration = 1;
  while(cursorPos < 16) {
    byte oldCursor = cursorPos;
    
    // 1. Записываем пробел
    lcdMemory[oldCursor] = ' ';
    
    // 2. Новая позиция курсора
    byte newCursor = oldCursor + 1;
    
    // 3. ПРАВИЛЬНО: cursorPos = newCursor
    cursorPos = newCursor;
    
    Serial.print("Итер ");
    Serial.print(iteration);
    Serial.print(": ");
    for (int i = 0; i < 16; i++) {
      if (i == oldCursor) {
        Serial.print("[_] "); // Показываем, где пробел
      } else {
        Serial.print(lcdMemory[i]);
        Serial.print("  ");
      }
    }
    Serial.print(" | cursorPos=");
    Serial.println(cursorPos);
    
    iteration++;
  }
  
  Serial.print("ИТОГ LCD: ");
  for (int i = 0; i < 16; i++) {
    Serial.print(lcdMemory[i]);
    Serial.print(" ");
  }
  Serial.println("Все старые символы затерты!");
}

void setup() {
  Serial.begin(9600);
  while (!Serial);
  
  simulateLCD();
}

void loop() {}

xDriver спс это более убедительно, но не факт что так в библиотеки!))) никому незя верить!

Хорошо скину видео, но через пару дней, на работе сейчас сильно занят

Возможно и криворукость, не силен в электронике как хотелось бы

С ардуино действительно второе знакомство. Перед этим только тахометр повторил, но там удачно получилось

Счетчик оборотов нужен в каком режиме?

Например, как я вижу:

- считать пока видит обороты (хотя бы один оборот раз в 10 секунд) и это число не сбрасывать.

  • если дольше 10 секунд не было оборотов, то первый же импульс обнулит счетчик.

счетчик оборотов у него уже есть! нужен просто счетчик, вы что не читали тему ?)))