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

работает ?)))

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

// Попробуйте разные адреса: 0x27, 0x3F, 0x20
LiquidCrystal_I2C lcd(       0x27,             16, 2);  // 16 символов, 2 строки

void setup()
{
  lcd.init();                      // инициализация LCD
  lcd.backlight();                 // включение подсветки
  
  // Первая строка
  lcd.setCursor(0, 0);            // столбец 0, строка 0
  lcd.print("Hello, world!");
  
  // Вторая строка
  lcd.setCursor(0, 1);            // столбец 0, строка 1
  lcd.print("Arduino LCD");
}

void loop()
{
  // пустой цикл
}

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

p.s. двояко получается, вы просто почитайте если интересно, и посмотрите потом на тех кто задает вопросы, или особенно размещает заказы в разделе ищу исполнителя)))

Завтра попробую. Все проверки и так пока на столе происходят, смысла устанавливать на стенд пока нет

Тахометр на ардуино и оптопаре уже есть, работает отлично. Осталось со счётчиком разобраться

что с ним разбираться то?

вообще эти вещи делаются на прерываниях, в вашем случае выход от датчика, чтобы не морочится, надо перекинуть на пин D3.
и залить код.

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

volatile uint32_t cnt = 0;
uint32_t old_cnt = 0;

LiquidCrystal_I2C lcd(0x27, 16, 2); 

void btnIsr() {
  cnt++; 
}

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

  attachInterrupt(1, btnIsr, RISING);

}

void loop()
{
  if (old_cnt != cnt) {
    old_cnt = cnt;
    lcd.setCursor (0, 1);
    lcd.print(cnt);
  }

}

демо тут

это минимум что нужно.

надо хоть раз в неделю, помочь хоть кому то :blush:
шобы в пятницу не стыдно было)

1 лайк

Это, да, надо. Тем более, что мы ведь, в отличие от Фомы Аквинского, отлично знаем, что ни одно доброе дело не останется безнаказанным.

:wink:

2 лайка

лучше бабушку через дорогу…

2 лайка
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

volatile uint32_t cnt = 0;
uint32_t old_cnt = 0;

// Для оптического датчика дребезг меньше, но можно оставить защиту
volatile unsigned long lastInterruptTime = 0;
const unsigned long debounceDelay = 5; 

void sensorIsr() {
unsigned long interruptTime = millis();
if (interruptTime - lastInterruptTime > debounceDelay) {
cnt++;
}
lastInterruptTime = interruptTime;
}

void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("  Optic counter ");
// Настройка пина
pinMode(3, INPUT); // Без подтяжки, если датчик уже имеет подтяжку иначе INPUT_PULLUP
// В зависимости от логики датчика:
// - Если датчик выдает HIGH при препятствии: RISING
// - Если датчик выдает LOW при препятствии: FALLING
attachInterrupt(1, sensorIsr, RISING); // Или FALLING //CHANGE
}

void loop() {
if (old_cnt != cnt) {
old_cnt = cnt;
lcd.setCursor(0, 1);
lcd.print("                ");
lcd.setCursor(0, 1);
lcd.print(cnt);
}
}

только ради 1го дела в месяц!)))

господи, непроходимый…
зачем это?

а это зачем?
неужели не очевидно, что каждый последующий cnt больше предыдущего и по значению и по кол-ву символов?

1 нужно!
второе может и нет)))

а зачем не могу объяснить,))) должны быть на 1000 оборотах ложные срабатывания….

обоснуй :rofl:

если это реально нужно, то Dima24 вам скажет)))
а я считаю что просто нужно))) и объяснить это не могу)))

а я считаю, что тебе хоть кол на голове теши!

прочитай медленно

Причём лучше сразу топором!!! :smiley:

4 лайка

@BABOS , скажи своему ИИ чтоб следующий раз вот так писал на случай если счетчик переполнится

lcd.setCursor(0, 1);
byte posCursor = lcd.print(cnt);
while(posCursor < 16) posCursor += lcd.print(' ');

Pyotr

while(posCursor < 16) posCursor = lcd.print(' '); ??? 

Посмотри внимательней на мой код)

Pyotr
просто так тащить в ии изменения и менять его незя!
а зачем так писать ?
а что будет если было 9999 а стало 99 ?))) 99 пробел 9 ?
для уменьшение мерцания

lcd.setCursor(0, 1);
byte posCursor = lcd.print(cnt);  // Сразу вывод нового значения
while(posCursor < 16) posCursor = lcd.print(' ');  // Правильная очистка хвоста

пока что я в терзаниях… и не думаю что надо вносить правки в его работу))) хотя может вы и докажете что надо))) только хотелось бы поподробнее узнать почему, только не говорите что сообщение выше на все отвечает)))

Вначале строки выводим n символов, а далее 16-n пробелов. Я думаю это правильней чем очищать строку, а затем заново делать вывод.

И да

Pyotr выше сообщение мое отвечает или ваше ?))) вот тянешься тут к знаниям, а тебе не разжевывают…
вы скажите + там нужен или все таки нет ?

Да ладно? Обычно пишу что мне не понравилось в коде ИИ и он исправляется. Либо сам, либо пишу строку и спрашиваю - Так пойдёт?