Большие цифры для дисплея LCD1602 (2004)

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Решил немного помочь начинающим :)

Написал библиотеку отрисовки больших цифр на дисплее LCD1602 (2004). Когда то видел такой способ отображения в буржуйской книжке по Arduino, код не запомнил и за выходные накидал свою версию.

Библиотеку с примером можно скачать по ссылке

https://github.com/roman2712/LCD1602_bigNumbers_Arduino

К особенностям библиотеки относяться:

1) используются только 3 знакоместа из 8 (0 - 2), остальные доступны пользователю.

2) минимальный обьем используемой памяти 

3) простоя работа с библиотекой (Все сводиться к методу printNumber(<цифра>, <позиция в строке>, <номер строки>))

Интересны замечания и предложения от сообщества.

Пример (картинка не моя):

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

у меня поплотнее есть, время на полэкрана, а не на весь. Долго мучался ;)... поищу... возможно завтра найду. Использую все пользовательские.

.... О! Нашел. Что-то тестовое от старых лет... сорри - не комментировано. Кому интересно разберется. Это была заготовка для чего-то с часами и термометром... уже не помню, для чего.

#include <LiquidCrystal_I2C.h>     
#define LCD_ADDR     0x27           

LiquidCrystal_I2C lcd(LCD_ADDR,16,2);

byte BC[8][8] = 
{
  {
    0B11111,
    0B11111,
    0B11011,
    0B11011,
    0B11011,
    0B11011,
    0B11111,
    0B11111
  },
  {
    0B11000,
    0B11000,
    0B11000,
    0B11000,
    0B11000,
    0B11000,
    0B11111,
    0B11111
  },
  {
    0B11111,
    0B11111,
    0B11011,
    0B11011,
    0B11011,
    0B11011,
    0B11011,
    0B11011
  },
  {
    0B00011,
    0B00011,
    0B00011,
    0B00011,
    0B00011,
    0B00011,
    0B11111,
    0B11111
  },
  {
    0B11111,
    0B11111,
    0B11000,
    0B11000,
    0B11000,
    0B11000,
    0B11111,
    0B11111
  },
  {
    0B11111,
    0B11111,
    0B00011,
    0B00011,
    0B00011,
    0B00011,
    0B11111,
    0B11111
  },
  {
    0B00011,
    0B00011,
    0B00011,
    0B00011,
    0B00011,
    0B00011,
    0B00011,
    0B00011
  },
  {
    0B11011,
    0B11011,
    0B11011,
    0B11011,
    0B11011,
    0B11011,
    0B11111,
    0B11111
  }
};

char BD1 [10] = {2,6,5,5,7,4,1,2,0,0};
char BD2 [10] = {7,6,1,3,6,3,7,6,7,3};

uint32_t sm;


void setup() {
 
  lcd.init();                          
  lcd.backlight();                   
  

  for (int i=0;i<8;i++) lcd.createChar(i,BC[i]);

  lcd.setCursor(11,0);
  for (char i=0;i<4;i++) lcd.print(i);
  lcd.setCursor(11,1);
  for (char i=4;i<8;i++) lcd.print(i);

lcd.setCursor(0,0);
lcd.print(__TIME__);
char tt[9];
memcpy(tt,__TIME__,9);
tt[2]=0;tt[5]=0;
byte h = atoi(tt);
byte m = atoi(tt+3);
byte s = atoi(tt+6);

sm = 1000UL*(s + m*60UL + h*3600UL);

lcd.setCursor(0,1);
lcd.print(h);
lcd.print('-');
lcd.print(m);
lcd.print('-');
lcd.print(s);
  
}

void loop() {
  static uint8_t j=0;
  static uint8_t f=0;
  static uint32_t om = millis();
  uint32_t nm = millis();
  
if (nm - om > 999) 
  {
  om = nm;
  byte h = (sm+nm)/3600000UL;
  byte m = (sm+nm - h*3600000UL)/60000;
  byte s = (sm+nm - h*3600000UL-m*60000UL)/1000;

  byte h1 = h/10;
  byte h2 = h%10;
  byte m1 = m/10;
  byte m2 = m%10;
  byte s1 = s/10;
  byte s2 = s%10;

  
  lcd.setCursor(0,0);
  lcd.print(BD1[h1]);
  lcd.print(BD1[h2]);
  lcd.print((char)0xa5);
  lcd.print(BD1[m1]);
  lcd.print(BD1[m2]);
  lcd.print((char)(s1+'0'));
  lcd.print((char)(s2+'0'));
    
  lcd.setCursor(0,1);
  lcd.print(BD2[h1]);
  lcd.print(BD2[h2]);
  lcd.print((char)0xa5);
  lcd.print(BD2[m1]);
  lcd.print(BD2[m2]);

  lcd.setCursor(7,0);
  lcd.print(" Al ");
  lcd.print("+03.4");
  
  lcd.setCursor(5,1);
  lcd.print(" 2802 ");
  lcd.print("+23.7");
    
  }

}

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

arduinec
Offline
Зарегистрирован: 01.09.2015

Бегущая строка из больших цифр:
http://arduino.ru/forum/programmirovanie/etyud-2-stroki-po-40-simvolov-n...

Kakmyc
Онлайн
Зарегистрирован: 15.01.2018

Переделал первую библиотеку под
дисплей I2C.
Если кому надо пишите.

ratman
Offline
Зарегистрирован: 11.10.2015

Kakmyc пишет:
Переделал первую библиотеку под дисплей I2C. Если кому надо пишите.
Прошу прощения, а что там надо было переделывать, если и старая работала?

Kakmyc
Онлайн
Зарегистрирован: 15.01.2018

Под I2C не работала старая

ratman
Offline
Зарегистрирован: 11.10.2015

Kakmyc пишет:
Под I2C не работала старая
А у меня тогда как работала?

ratman
Offline
Зарегистрирован: 11.10.2015

Kakmyc пишет:
Под I2C не работала старая
Упс, у меня не либа была. А нечто такое:

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

LiquidCrystal_I2C lcd(0x3F, 16, 2);

uint8_t period = 7;  // длительность периода

const char number[10][2][5] = {
  "\1\2\1 ", "\1\3\1 ",
  "\2\1  ",  "\3\1\3 ",
  "\2\4\1 ", "\1\5\3 ",
  "\2\4\1 ", "\3\5\1 ",
  "\1 \1 ",  "\2\2\1 ",
  "\1\4\2 ", "\3\5\1 ",
  "\1\4\2 ", "\1\5\1 ",
  "\2\4\1 ", " \1  ",
  "\1\4\1 ", "\1\5\1 ",
  "\1\4\1 ", "\3\5\1 "
};


// ----------------------------------------------------------------------------
//  Инициализация LCD_1602
void setup_LCD() {
  uint8_t pillar[8] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F };
  uint8_t upper1[8] = { 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00 };
  uint8_t lower1[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F };
  uint8_t upper2[8] = { 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F };
  uint8_t lower2[8] = { 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F };

  lcd.begin();      //  серем в lcd_1602
//  lcd.noCursor();   //  без курсора
//  lcd.backlight();  //  с подсветкой
  lcd.clear();      //  на чистое

  lcd.createChar(1, pillar);
  lcd.createChar(2, upper1);
  lcd.createChar(3, lower1);
  lcd.createChar(4, upper2);
  lcd.createChar(5, lower2);

  return;
}


void redraw_LCD() {
  static uint32_t cur_period = 0;
  uint32_t now_period = (int)(millis() / (1000 * period));  // вычисляем период

  // засечь смену периода
  if (cur_period != now_period) {
    cur_period = now_period;
    redraw_flag = true;
  }

  // если период 0-й, показать погоду в доме
  // если 1-й или 2-й, то время в доме
  if (redraw_flag == true) {
    if (now_period % 3 == 0) {
      show_Climate();
    }
    else {
      show_Clock();
    }
    redraw_flag = false;
  }
  return;
}


// ----------------------------------------------------------------------------
//  Отображение влажности и температуры
void show_Climate() {

  lcd.setCursor(0, 0);
  lcd.printf(F("Hum ...... %02d %% "), humidity);
  #ifdef DEBUG
    Serial.printf(F("Hum ...... %02d %% \r\n"), humidity);  //--
  #endif

  lcd.setCursor(0, 1);
  lcd.printf(F("Temp ..... %02d C "), temperature);
  #ifdef DEBUG
    Serial.printf(F("Temp ..... %02d C \r\n"), temperature);  //--
  #endif

  return;
}

// ----------------------------------------------------------------------------
//  Отображение часов
void show_Clock() {

  numprint(hours / 10, 0);
  numprint(hours % 10, 4);
  numprint(minutes / 10, 9);
  numprint(minutes % 10, 13);

  lcd.setCursor(7, 0);
  lcd.printf("<>");
  lcd.setCursor(7, 1);
  lcd.printf("<>");

  #ifdef DEBUG
    Serial.printf(F("%02d:%02d\r\n"), hours, minutes);  //--
  #endif
    
  return;
}

void numprint(byte num, byte poz) {
  
  lcd.setCursor(poz, 0);
  lcd.printf(number[num][0]);
  lcd.setCursor(poz, 1);
  lcd.printf(number[num][1]);

  return;
}

 

Kakmyc
Онлайн
Зарегистрирован: 15.01.2018

Не, там вообще либа козырная, мало весит памяти не ест, символы оставляет.
Только править надо для работы с i2c

renoshnik
Offline
Зарегистрирован: 11.04.2013

Kakmyc
Онлайн
Зарегистрирован: 15.01.2018

renoshnik пишет:


Сколько пользовательских символов использовал ?

renoshnik
Offline
Зарегистрирован: 11.04.2013

восемь

Kakmyc
Онлайн
Зарегистрирован: 15.01.2018

renoshnik пишет:

восемь

А тут всего 3

renoshnik
Offline
Зарегистрирован: 11.04.2013

Kakmyc пишет:
renoshnik пишет:

восемь

А тут всего 3

А, разве тут соревнование в количестве символов ?

Тогда можно соревноваться и в количестве знакомест на цифру... у меня на одно меньше  :-)

viris42
Offline
Зарегистрирован: 21.08.2013

renoshnik пишет:

Можете написать скетч для Arduino NANO+LCD1602+DS18B20, что бы слева бал тахометр на 4 цифры(2 импульса на один оборот) а справа как у вас два термометра для показания  температуры охлождающей жидкости(с округлением до двух знаков) в авто. Термометры с подключением на разные пины. В программировании я не гуд. Собрать и воплотить в жизнь авто могу.

Kakmyc
Онлайн
Зарегистрирован: 15.01.2018

Напишу на возмездной основе. По вопросам: хххххххх

Модератор: Вас уже вроде предупреждали! Все коммерческие предложения, в ветке "Ищу исполнителя".

Paramon_D
Offline
Зарегистрирован: 14.06.2019

Kakmyc пишет:
Переделал первую библиотеку под
дисплей I2C.
Если кому надо пишите.
мне нужно

viris42
Offline
Зарегистрирован: 21.08.2013

Kakmyc пишет:
Переделал первую библиотеку под дисплей I2C. Если кому надо пишите.

Если можно мне скинь.

Kakmyc
Онлайн
Зарегистрирован: 15.01.2018

На деревню дедушке письмо писать ?

viris42
Offline
Зарегистрирован: 21.08.2013

Kakmyc пишет:
На деревню дедушке письмо писать ?

romanspotar@mail.ru

AndyE
Offline
Зарегистрирован: 30.04.2015

Kakmyc пишет:
Переделал первую библиотеку под дисплей I2C. Если кому надо пишите.

Можно мне тоже библиотеку?

apocrifa@yandex.ru

А что не выложите на github или просто какой-нибудь файлообменник?

Kakmyc
Онлайн
Зарегистрирован: 15.01.2018

Я не автор библиотеки(и не гивер, который плевал на авторские права и все выдает за свое) , чтоб ее выкладывать. Просто интерфейс под свой модуль поправил.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну вот мой код большими буквами и цифрами #198

Kakmyc
Онлайн
Зарегистрирован: 15.01.2018

qwone пишет:

Ну вот мой код большими буквами и цифрами #198

Похвально конечно, но это не совсем библиотека и совместно с LiquidCristal.h работать , вряд ли будет.

AndyE
Offline
Зарегистрирован: 30.04.2015

Kakmyc пишет:
Я не автор библиотеки(и не гивер, который плевал на авторские права и все выдает за свое) , чтоб ее выкладывать. Просто интерфейс под свой модуль поправил.

Ну а почему тогда не закоммитить в github автора?

Код примера для обновленной библиотеки

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

#include "bigNumbers.h"
bigNumbers bigNumbers(&lcd);

void setup() {
  lcd.init();
  lcd.clear();
  bigNumbers.intNumbers();
}

void loop()
{
  bigNumbers.printNumber(0, 0);
  bigNumbers.printNumber(1, 4);
  bigNumbers.printNumber(2, 8);
  bigNumbers.printNumber(3, 12);
  delay(1000);
  bigNumbers.printNumber(4, 0);
  bigNumbers.printNumber(5, 4);
  bigNumbers.printNumber(6, 8);
  bigNumbers.printNumber(7, 12);
  delay(1000);
  bigNumbers.printNumber(10, 0);
  bigNumbers.printNumber(8, 4);
  bigNumbers.printNumber(9, 8);
  bigNumbers.printNumber(10, 12);
  delay(1000);
}

 

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Ух ты))) я же эту библу написал))) интересно, её скока народу скачало)))

I2C добавлю в ближайшее время. Я думаю еще стоит добавить поддержку библиотеки экрана с русскими шрифтами.

Там из всех добавления тока переопрнделить в .h файле используем версию библиотеки экрана.

Paramon_D
Offline
Зарегистрирован: 14.06.2019

Жду с нетерпением , я только начал изучать Ардуино , и как происходит в скетче сложение из символов в единую картинку для меня китайская грамота , а библиотек кроме этой я не смог найти

Kakmyc
Онлайн
Зарегистрирован: 15.01.2018

roman2712@mail.ru пишет:
Ух ты))) я же эту библу написал))) интересно, её скока народу скачало)))

I2C добавлю в ближайшее время. Я думаю еще стоит добавить поддержку библиотеки экрана с русскими шрифтами.

Там из всех добавления тока переопрнделить в .h файле используем версию библиотеки экрана.

Ничего там для русских шрифтов изменять не надо. Вроде корректно работает с LCD_1602_RUS.h
И да, все изменения заключаются в изменении конструктора объекта.

Как вариант сделать два конструктора и для обычного подключения и для I2C

AndyE
Offline
Зарегистрирован: 30.04.2015

roman2712@mail.ru пишет:
Ух ты))) я же эту библу написал))) интересно, её скока народу скачало))

Не, ну если красиво выглядит - что не качнуть.

Я сейчас на сверлилку делаю тахометр. Пока жду 7-сегментные дисплеи от нефиг делать цепляю к скетчу те экраны, какие есть в наличии. 4 здоровых цифири на увеличенном 16*2 экране смотрятся феерично.

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Итак. Добавил поддержку дисплеев, подключенных по i2с

Смотрим :) https://github.com/roman2712/LCD1602_bigNumbers_Arduino/tree/master/bigNumbers

P.S. Если точнее, то через шаблонную магию с++ (template) реализовал шаблонный класс, что позволяет указать любую библиотеку, аналогичную по функциям библиотеке LiquidCrystal.

AndyE
Offline
Зарегистрирован: 30.04.2015

roman2712@mail.ru пишет:

Итак. Добавил поддержку дисплеев, подключенных по i2с


Спасибо, попробую.

AndyE
Offline
Зарегистрирован: 30.04.2015

roman2712@mail.ru пишет:

Итак. Добавил поддержку дисплеев, подключенных по i2с

Работает. Огромное спасибо!

Обнаружил интересную особеность при работе с моим скетчем.

/*Типы экранов:
   Тип  Контроллер    Описание
   1    1602          16x2 LCD (стандартный шрифт)
   2    1602          16x2 LCD (большие цифры)  использована библиотека https://github.com/roman2712/LCD1602_bigNumbers_Arduino.git
   3    1637          4x7 сегментов
   4    TM74HC595     4-значный LED-экран
   5    1331          OLED 0.93"
*/
#define SCREEN_TYPE 2

//Количество полюсов на оборот
#define POLES 1

//Для руссифицированных LCD экранов поставить 2, надписи на англицком - 1
#define LANG  1

//Пины SPI интерфейса
#if (SCREEN_TYPE == 3||SCREEN_TYPE == 4||SCREEN_TYPE == 5)

#define PIN_DC      5
#define PIN_SCK     6
#define PIN_CS      7
#define PIN_RES     8
#define PIN_DI      9

#endif

#include <Arduino.h>

//Подключение экрана

//16x2 LCD

#if (SCREEN_TYPE == 1||SCREEN_TYPE == 2)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C display(0x27, 16, 2);

#endif

#if (SCREEN_TYPE == 2)

#include "bigNumbers.h"
bigNumbers <LiquidCrystal_I2C> bigNumbersLcd(&display);

byte digit[4] = {0, 0, 0, 0};

#endif

//7-segment displays
#if (SCREEN_TYPE == 3)
#include <TM1637Display.h>

//Display pins
TM1637Display display(PIN_SCK, PIN_DI);

#endif

#if (SCREEN_TYPE == 4)

#include "TM74HC595Display.h"
TM74HC595Display display(PIN_SCK, PIN_DC, PIN_DI);
unsigned char LED_0F[29];

#endif

// OLED
#if (SCREEN_TYPE == 5)

#include <Arduino.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1331.h>
#include <SPI.h>

const uint8_t   OLED_pin_scl_sck        = (int)PIN_SCK;
const uint8_t   OLED_pin_sda_mosi       = (int)PIN_DI;
const uint8_t   OLED_pin_cs_ss          = (int)PIN_CS;
const uint8_t   OLED_pin_res_rst        = (int)PIN_RES;
const uint8_t   OLED_pin_dc_rs          = (int)PIN_DC;

const uint16_t  OLED_Color_Black        = 0x0000;
const uint16_t  OLED_Color_Blue         = 0x001F;
const uint16_t  OLED_Color_Red          = 0xF800;
const uint16_t  OLED_Color_Green        = 0x07E0;
const uint16_t  OLED_Color_Cyan         = 0x07FF;
const uint16_t  OLED_Color_Magenta      = 0xF81F;
const uint16_t  OLED_Color_Yellow       = 0xFFE0;
const uint16_t  OLED_Color_White        = 0xFFFF;

// The colors we actually want to use
uint16_t        OLED_Text_Color         = OLED_Color_Red;
uint16_t        OLED_Backround_Color    = OLED_Color_Black;

Adafruit_SSD1331 display = Adafruit_SSD1331(
                          OLED_pin_cs_ss,
                          OLED_pin_dc_rs,
                          OLED_pin_sda_mosi,
                          OLED_pin_scl_sck,
                          OLED_pin_res_rst
                        );

bool isDisplayVisible = false;
int posX = 40;
int posY = 18;
#endif

#if (SCREEN_TYPE == 1||SCREEN_TYPE == 5)
int offsetX = 0;
#endif


unsigned long lastflash;
int RPM;


void setup() {
  Serial.begin(96010);  //открыть порт
  attachInterrupt(0, sens, RISING); //подключить прерывание на 2 пин при повышении сигнала
  pinMode(3, OUTPUT);   //3 пин как выход
  digitalWrite(3, HIGH);  //подать 5 вольт на 3 пин

#if (SCREEN_TYPE == 1||SCREEN_TYPE == 2)
  display.init();                      // initialize the lcd
  display.backlight();
  display.clear();
#endif

#if (SCREEN_TYPE == 2)

  // библиотека больших цифр

#endif

#if (SCREEN_TYPE == 3)
  display.clear();
  display.setBrightness(0x0f); //задать яркость экрана
#endif

#if (SCREEN_TYPE == 4)
  LED_0F[0] = 0xC0; //0
  LED_0F[1] = 0xF9; //1
  LED_0F[2] = 0xA4; //2
  LED_0F[3] = 0xB0; //3
  LED_0F[4] = 0x99; //4
  LED_0F[5] = 0x92; //5
  LED_0F[6] = 0x82; //6
  LED_0F[7] = 0xF8; //7
  LED_0F[8] = 0x80; //8
  LED_0F[9] = 0x90; //9
#endif

#if (SCREEN_TYPE == 9)

  // initialise the SSD1331
  display.begin();
  display.setFont();
  display.fillScreen(OLED_Backround_Color);
  display.setTextColor(OLED_Text_Color);
  display.setTextSize(3);

  // the display is now on
  isDisplayVisible = true;


#endif
}

void sens() {
  RPM = 60 / ((float)(micros() - lastflash) / 1000000); //расчет
  RPM = RPM / (int)POLES;
  lastflash = micros(); //запомнить время последнего оборота
}

void loop() {
  if ((micros() - lastflash) > 1000000) { //если сигнала нет больше секунды
    RPM = 0; //считаем что RPM 0
  }

  Serial.println(RPM);   //вывод в порт

#if (SCREEN_TYPE == 1)
if (RPM >= 1000) {
  offsetX = 3;
}
else if (RPM >= 100){
  offsetX = 2;
}
else if (RPM >= 10) {
  offsetX = 1;
}
else {
  offsetX = 0;
}
  display.clear();
  display.setCursor(3,0);

#if (LANG == 1)
  display.print("Speed:");
#endif

#if (LANG == 2)  
display.print("Обороты:");
#endif

  display.setCursor(7-offsetX,1);
  display.print(RPM);
  display.setCursor(10,1);

#if (LANG == 1)
  display.print("1/min");
#endif

#if (LANG == 2)  
  display.print("об/мин");
#endif

#endif

#if (SCREEN_TYPE == 2)

  digit[0] = RPM / 1000;
  digit[1] = RPM % 1000 / 100;
  digit[2] = RPM % 100 / 10;
  digit[3] = RPM % 10;

  display.clear();

  bigNumbersLcd.printNumber(digit[0], 0);
  bigNumbersLcd.printNumber(digit[1], 4);
  bigNumbersLcd.printNumber(digit[2], 8);
  bigNumbersLcd.printNumber(digit[3], 12);


#endif

#if (SCREEN_TYPE == 3)
  display.clear();
  display.showNumberDec(RPM, false); //вывод на дисплей
#endif

#if (SCREEN_TYPE == 4)

  display.digit4(RPM, 50);

#endif

#if (SCREEN_TYPE == 5)

if (RPM >= 1000) {
  offsetX = 30;
}
else if (RPM >= 100){
  offsetX = 20;
}
else if (RPM >= 10) {
  offsetX = 10;
}
else {
  offsetX = 0;
}

  display.fillScreen(OLED_Backround_Color);
  display.setCursor(posX-offsetX, posY);
  display.print(RPM);

#endif

  delay(1500);  //задержка для стабильности
}

Плата Arduino Pro MIni клон

При первой загрузке цифры отображаются нормально. Перезапуск платы резетом ничего не меняет, скетч работает. Но стоит снять питание с платы и заново включить, в цифрах появляется мусор. 

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

AndyE пишет:
При первой загрузке цифры отображаются нормально. Перезапуск платы резетом ничего не меняет, скетч работает. Но стоит снять питание с платы и заново включить, в цифрах появляется мусор.

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

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

В вашем случае контролер дисплея отключается раньше чем МК.

С большой долей вероятности когда вы питание обратно включаете, МК все еще продолжает работать по программе, но так как дисплей надо уже инициировать заново, а этого никто не сделал, так как МК работает по программе идет и в setup не заходит, то появляется мусор на дисплее. Для этих дисплеев это нормальная ситуация. 

Подтверждается перезагрузкой по ресету, когда мусор на экране. Если после ресета все хорошо - то значит надо что то решать с питанием. к примеру Brown-Out Detection настроить на 4.3 в. При такой настройке, МК уже точно вырубиться по BOD, а дисплей еще не сброситься. 

 

AndyE
Offline
Зарегистрирован: 30.04.2015

Я не успел отписаться. В setup пропустил генерацию пользовательских символов. Теперь все нормально

CамоделкиН
Offline
Зарегистрирован: 10.02.2020

Здравствуйте roman2712@mai ,у меня к вам огромная просьба,я новичок в программировании,подскажите пожалуйста ,этот код счётчика с вашей библиотекой,работает отлично,но он написан под экран 1602.Что нужно дописать что бы его можно было вывести на экран 2004 на две нижние строчки.Помогите пожалуйста.

//Счётчик

//Питание безконтактного концевого от 12 вольт,сигнальный провод заводим на Пин 6 или 13
//Остановка и сброс по нажатию кнопки подключеной на Пин А5
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f, 16, 2);
 
#define BUTTON_PIN 6
#define SWITCH_PIN 13
 
#include <bigNumbers.h>
bigNumbers <LiquidCrystal_I2C> bigNumbersLcd(&lcd);
 
void printVar(unsigned int n);
 
void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(SWITCH_PIN, INPUT_PULLUP);
  
  lcd.init();
  lcd.setBacklight(255);
  bigNumbersLcd.intNumbers();
}
 
uint8_t prior_switch = HIGH;
uint8_t prior_button = HIGH;
 
uint8_t update_lcd = true;
 
uint32_t counter = 0;
 
void loop() {
  uint8_t _switch = digitalRead(SWITCH_PIN);
  if ((_switch == LOW) && (prior_switch == HIGH)) {
    counter++;
    update_lcd = true;
  }
  prior_switch = _switch;
  
  uint8_t button = digitalRead(BUTTON_PIN);
  if ((button == LOW) && (prior_button == HIGH)) {
    counter = 0;
    update_lcd = true;
  }
  prior_button = button;
  
  if (update_lcd) {
    update_lcd = false;
    
    printVar(counter);
  }
}
 
void printVar(unsigned int n) {
    if (n >= 10000) {
        bigNumbersLcd.printNumber(9, 0);
        bigNumbersLcd.printNumber(9, 4);
        bigNumbersLcd.printNumber(9, 8);
        bigNumbersLcd.printNumber(9, 12);
    } else if (n >= 1000) {
        bigNumbersLcd.printNumber((n / 1000), 0);
        bigNumbersLcd.printNumber(((n / 100) % 10), 4);
        bigNumbersLcd.printNumber(((n / 10) % 10), 8);
        bigNumbersLcd.printNumber((n % 10), 12);
    } else if (n >= 100) {
        bigNumbersLcd.printNumber(10, 0);
        bigNumbersLcd.printNumber((n / 100), 4);
        bigNumbersLcd.printNumber(((n / 10) % 10), 8);
        bigNumbersLcd.printNumber((n % 10), 12);
    } else if (n >= 10) {
        bigNumbersLcd.printNumber(10, 0);
        bigNumbersLcd.printNumber(10, 4);
        bigNumbersLcd.printNumber((n / 10), 8);
        bigNumbersLcd.printNumber((n % 10), 12);
    } else /* n < 10 */ {
        bigNumbersLcd.printNumber(10, 0);
        bigNumbersLcd.printNumber(10, 4);
        bigNumbersLcd.printNumber(10, 8);
        bigNumbersLcd.printNumber(n, 12);
    }
}

 

 

AndyE
Offline
Зарегистрирован: 30.04.2015

5-я строка:
LiquidCrystal_I2C lcd(0x3f, 20, 4);

А дальше попробуйте выводить цифры в виде (значение, позиция Х, позиция У)

Тоесть :

bigNumbersLcd.printNumber(n, 12, 1);

Это если я правильно понимаю.

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Правильно понимаете...

CамоделкиН
Offline
Зарегистрирован: 10.02.2020

Здравствуйте,сижу пробую.

AndyE
Offline
Зарегистрирован: 30.04.2015

roman2712@mail.ru пишет:

Правильно понимаете...

А библиотека оперирует только 2 строками или можно цифры вывести в центре экрана?

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Библиотека оперирует номером знакоместа и номером строки.

т.е. если указать к примеру bigNumbersLcd.printNumber(5, 8, 1)

то это значит напечатать цифру 5. верхний угол которой будет располагаться на 8 знакоместе 1 строки.

т.е. для 4-х строчного дисплея это будет как раз в середине экрана, так как строки у 4-х строчного дисплея нумеруются 0,1,2,3.