LCD 1602 и русские символы

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

ssilver2007 пишет:

В линуксе не работал, но вики говорит, что так и есть. Не спорю. В виндовой версии Arduino IDE, насколько мне известно, нет никакой поддержки wchar_t встроенным компилятором. Формат "%S" для вывода wchar_t использовать не получится.

Я заглянул в исходный код библиотек... Насколько я понимаю (и по "...\r\n" окончаниям текстовых строк кода), вы работу своей библиотеки не смотрели (не проверяли)?: в Linux, с его Ardyino IDE, и с повсеместным представлением символьных строк там в UTF-8... Есть некотоые вопросы к коду библиотеки.

 

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

andycat пишет:

по второй ссылке библиотека прекрасно работает без всяких доработок

Цитата:

Никогда не говори: "Никогда"!

;-)

Вот когда я это проверю в Linux Arduino IDE - вот тогда и скажем "прекрасно работает".

 

ssilver2007
Offline
Зарегистрирован: 21.01.2016

Olej пишет:

Я заглянул в исходный код библиотек... Насколько я понимаю (и по "...\r\n" окончаниям текстовых строк кода), вы работу своей библиотеки не смотрели (не проверяли)?: в Linux, с его Ardyino IDE, и с повсеместным представлением символьных строк там в UTF-8... Есть некотоые вопросы к коду библиотеки.

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

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

ssilver2007 пишет:

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

Я посмотрю код ... обязательно - по коду и по работе. И отвечу сюда, когда будет что сказать.

 

 

xRom
Offline
Зарегистрирован: 31.05.2018

Доброго времени суток!

Только начинаю осваивать Arduino и экранчики.

В ходе экспериментов с клоном под оригинал Uno r3 и синим экраном с клавиатурой (предположительно LCD 1602 - картинка очень похожа на пост #51), подозреваю, что русский язык в экранчик не прошит.

получился такой код (частично добыт из примеров) 

и на экранчике не много не так отображаются символы как ожидалось и притом они меняются если выводить их как сделано в loop.

Вопрос: это у меня экранчик такой особенный или поправить что то в коде надо ?

если не затрудни прошу провести эксперимент.

/*  
 The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * LCD VSS pin to ground
 * LCD VCC pin to 5V
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
  */

#include <LiquidCrystal_1602_RUS.h>

//LiquidCrystal_1602_RUS lcd(12, 11, 5, 4, 3, 2);
LiquidCrystal_1602_RUS lcd(8, 9, 4, 5, 6, 7 );//For LCD Keypad Shield

void setup()
{
  
lcd.begin(16, 2);
lcd.clear();

/*
// здесь вывод возможных символов и их кодов десятичных
// при нажатии правой кнопки выход из показа кодов
int x;
    lcd.setCursor(0,1);
    lcd.print ("НажмиRight-ВЫХОД");
 for(x=0; x<255; x = x+1)
  {
  delay(100);    
  int x1;
  x1 = analogRead (0);
  lcd.setCursor(0, 0);
  lcd.write(byte(x));
  lcd.setCursor(6, 0);
  lcd.print("код=");
  lcd.print(x);
  delay(400);
  lcd.setCursor(0, 0);
  lcd.print("               ");
      if (x1 < 60) {
        // была нажата клавиша вправо - досрочное окончание вывода кодов и символов
        lcd.setCursor(0,1);
        lcd.print ("  Конец теста   ");
        x = 255;
        delay(5000);
      }
  }  
// окончание вывода кодов символов
*/


  lcd.clear();  
  // Print a message to the LCD.
  lcd.setCursor(1, 0);
   // выводим сообщение, а на экране немного не то написано что ожидается 
 // lcd.print(L"МожЖжно печатать");
  lcd.print(L"МожЖжно печата");
  lcd.setCursor(3, 1);
  lcd.print(L"на русском 1");
  delay(5000);

  // выводим сообщение, а на экране немного не то написано,что ожидается 
  lcd.setCursor(1, 0);
  lcd.print(L"Можно печатать ");
  lcd.setCursor(3, 1);
  lcd.print(L"на русском 2 ");
  delay(5000);  
}

void loop() {

lcd.clear();  
// выводим сообщение по кругу обратите внимание символы на экране периодически меняются если немного понаблюдать
// хотя непонятно отчего им меняться... ?
lcd.setCursor(1, 0);
lcd.print(L"МожЖжно ЛИ ещё"); // особенное внимание на место где третья "ж"
//   lcd.print("МожЖжно ЛИ ещё"); 
// Вроде бы по моим экспериментам L влияет на вывод текста
lcd.setCursor(3, 1);
lcd.print(L"на русском 1");
delay(2000);

lcd.print("МожЖжно ЛИ ещё"); // особенное внимание на место где третья "ж"
//   lcd.print("МожЖжно ЛИ ещё"); 
// Вроде бы по моим экспериментам L влияет на вывод текста
lcd.setCursor(3, 1);
lcd.print("на русском 2");
delay(2000);

}

 

vanila
Offline
Зарегистрирован: 25.08.2015

Товарищи!

а если вариант сброса символов без lcd.clear();?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

vanila пишет:

Товарищи!

а если вариант сброса символов без lcd.clear();?

Есть: записать во все знакоместа пробелы.

vanila
Offline
Зарегистрирован: 25.08.2015

 

DIYMan пишет:

Есть: записать во все знакоместа пробелы.

не, это не работает, без сброса переполняется и начинает выводить всякую дичь

а с очисткой экрана он каждый раз мерзко мерцает после этого

 
 
 

 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

vanila пишет:

не, это не работает, без сброса переполняется и начинает выводить всякую дичь

а с очисткой экрана он каждый раз мерзко мерцает после этого

 

Должно работать. И что значит - переполняется? Куда переполняется? Зачем через край льёте? Минимальный код, воспроизводящий проблему - давайте, а то непонятно, что там у вас переполняется и какой марки дичь.

vanila
Offline
Зарегистрирован: 25.08.2015

Это я просто вопрос в разрезе темы задал, без уточнений)

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

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

vanila пишет:

Это я просто вопрос в разрезе темы задал, без уточнений)

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

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

А что мешает открыть исходники библиотеки и дописать там публичную функцию очистки сгенерированных символов?

vanila
Offline
Зарегистрирован: 25.08.2015

DIYMan пишет:

А что мешает открыть исходники библиотеки и дописать там публичную функцию очистки сгенерированных символов?

я не знаю как это сделать

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

vanila пишет:

DIYMan пишет:

А что мешает открыть исходники библиотеки и дописать там публичную функцию очистки сгенерированных символов?

я не знаю как это сделать

Сгенерированный символ можно переписать во время работы дисплея, и его отображение сразу изменится.
Пример здесь: http://arduino.ru/forum/programmirovanie/etyud-multik-na-lcd-1602

GVS
GVS аватар
Offline
Зарегистрирован: 26.04.2018

Смотрю тема жива и волнительна, автор библиотеки тоже сюда заглядывает... Это радует )))

А теперь естественно вопрос на засыпку...

Есть текстовый файлик на SD карте состоящий из строк длинною до 40 символов, читаю файл построчно и хотелось бы выводить строки на дисплей, можно отбрасывая символы после 16, это не критично...

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

borzov
borzov аватар
Offline
Зарегистрирован: 17.10.2016

ssilver2007

 ssilver2007 спасибо вам за труды.

Сегодня пришел дисплей 20х4 и ваша библиотека очень помогла.
Мне нужно менять тест из массива, и  буква "L" вначале меня сильно испугала.
Но все получилось! массив char *Msg  прекрасно печатает кириллицу!
В массиве по возможности я использовал подмену. Жаль, что дисплей имеет ограничения в 8 символов.
тут приведу маленький скетч. может кому пригодиться.
#include <LCD_1602_RUS.h>
LCD_1602_RUS lcd(0x3F, 20, 4);

char *Msg []= {// массив сообщений
  " STOP", //0//стоп
  "BПEPEД->",//1//вперед
  "<-HAЗAД",//2//назад
  "->",//3 вперед
  "ПAYЗA",//4//пауза
  "ABTO PEЖИM",//5//авто режим
  "PYЧHOЙ PEЖИM",//6// ручной режим
  "ЦИKЛ 1",//7//цикл1
  "ЦИKЛ 2",//8//цикл2
  "ПРОГРАМ ",//9//прогрм
  "max xod",//10//мах ход
  "COXPAH",//11//сохран
  "ALARM xod"  //12//"ALARM xod"
};
unsigned long pauza=0;
byte i =0;

void setup()
{
  lcd.init(); // initialize the lcd
  // Print a message to the LCD.
  lcd.backlight();
 }

void loop()
{if(millis()>pauza){
  pauza=millis()+2000;
  lcd.clear(); 
  lcd.setCursor(2, 0);
 // lcd.print(L"Теперь можно");
  lcd.setCursor(3, 1);
  lcd.print(L"по-русски");
   i>=12 ? i=0: i++;
   lcd.setCursor(0,3);  lcd.print(Msg [i]);
}
}

 

 

leolem
Offline
Зарегистрирован: 22.06.2019
no matching function for call to 'LiquidCrystal_I2C::begin()'
Эта ошибка появляется появляется поятоянно. Подскажите что не правильно
sadman41
Онлайн
Зарегистрирован: 19.10.2016

Всё правильно, так и должно быть. Just keep calm and pray.

leolem
Offline
Зарегистрирован: 22.06.2019

почему?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Такова жизнь. Никто же не спрашивает, почему яблоки падают вниз, а не влево.

b707
Offline
Зарегистрирован: 26.05.2017

leolem пишет:

no matching function for call to 'LiquidCrystal_I2C::begin()'
Эта ошибка появляется появляется поятоянно. Подскажите что не правильно

и из-за этого нужно писать в форум?... откройте библиотеку и посмотрите, есть там функция begin() или нет?

VladimirTsibrov
Offline
Зарегистрирован: 05.03.2019

В древних версиях LiquidCrystal_I2C вместо begin была функция init. Я так понимаю, библиотеку тогда растащили по своим сайтам писатели статей, откуда ее до сих пор многие и качают. Потому либо LiquidCrystal_I2C.init(), либо качайте актуальную версию.

Glead
Offline
Зарегистрирован: 21.11.2019

Добрый день. Помогите новичку. Есть проэкт автоматики для автоклава, проблема в русификации меню с приминением символов. Изначально проэкт скомпилирован в FLprog. Не могу понять как прописать символы в функции progmem.

Сам код

#include <Wire.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
LiquidCrystal_I2C _lcd1(0x27, 16, 2);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;

byte _d18x2x1Addr[8]={0x28, 0xFF, 0x46, 0x82, 0x1, 0x17, 0x3, 0x28};

byte bukva_B[8]   = {B11110,B10000,B10000,B11110,B10001,B10001,B11110,B00000,}; // Буква "Б"
byte bukva_G[8]   = {B11111,B10001,B10000,B10000,B10000,B10000,B10000,B00000,}; // Буква "Г"
byte bukva_D[8]   = {B01111,B00101,B00101,B01001,B10001,B11111,B10001,B00000,}; // Буква "Д"
byte bukva_ZH[8]  = {B10101,B10101,B10101,B11111,B10101,B10101,B10101,B00000,}; // Буква "Ж"
byte bukva_Z[8]   = {B01110,B10001,B00001,B00010,B00001,B10001,B01110,B00000,}; // Буква "З"
byte bukva_I[8]   = {B10001,B10011,B10011,B10101,B11001,B11001,B10001,B00000,}; // Буква "И"
byte bukva_IY[8]  = {B01110,B00000,B10001,B10011,B10101,B11001,B10001,B00000,}; // Буква "Й"
byte bukva_L[8]   = {B00011,B00111,B00101,B00101,B01101,B01001,B11001,B00000,}; // Буква "Л"
byte bukva_P[8]   = {B11111,B10001,B10001,B10001,B10001,B10001,B10001,B00000,}; // Буква "П"
byte bukva_Y[8]   = {B10001,B10001,B10001,B01010,B00100,B01000,B10000,B00000,}; // Буква "У"
byte bukva_F[8]   = {B00100,B11111,B10101,B10101,B11111,B00100,B00100,B00000,}; // Буква "Ф"
byte bukva_TS[8]  = {B10010,B10010,B10010,B10010,B10010,B10010,B11111,B00001,}; // Буква "Ц"
byte bukva_CH[8]  = {B10001,B10001,B10001,B01111,B00001,B00001,B00001,B00000,}; // Буква "Ч"
byte bukva_Sh[8]  = {B10101,B10101,B10101,B10101,B10101,B10101,B11111,B00000,}; // Буква "Ш"
byte bukva_Shch[8]= {B10101,B10101,B10101,B10101,B10101,B10101,B11111,B00001,}; // Буква "Щ"
byte bukva_Mz[8]  = {B10000,B10000,B10000,B11110,B10001,B10001,B11110,B00000,}; // Буква "Ь"
byte bukva_IYI[8] = {B10001,B10001,B10001,B11001,B10101,B10101,B11001,B00000,}; // Буква "Ы"
byte bukva_Yu[8]  = {B10010,B10101,B10101,B11101,B10101,B10101,B10010,B00000,}; // Буква "Ю"
byte bukva_Ya[8]  = {B01111,B10001,B10001,B01111,B00101,B01001,B10001,B00000,}; // Буква "Я"

OneWire  _ow10(10);
unsigned long _ow10P=0;
bool _ow10W=0;
const byte _menuParametrsArray[]  PROGMEM =  {1, 3, 1, 0, 0, 0, 2, 5, 1, 4, 1, 0, 2, 3, 2, 0, 0, 0, 3, 5, 1, 4, 2, 0, 3, 3, 3, 0, 0, 0, 4, 5, 1, 4, 3, 0, 4, 3, 4, 0, 0, 0, 5, 5, 1, 4, 4, 0};
int _menuValueArray_int[4];
const int _menuConstantValuesArray_int[]  PROGMEM =  {1, 5, 125, 500, 0};
 const char _flprogMenuNameString1[] PROGMEM = "Select";
 const char _flprogMenuNameString2[] PROGMEM = "Temperatura";
 const char _flprogMenuNameString3[] PROGMEM = "Time";
 const char _flprogMenuNameString4[] PROGMEM = "Start";
const char* const _flprogMenuStringsArray[] PROGMEM = { _flprogMenuNameString1,  _flprogMenuNameString2,  _flprogMenuNameString3,  _flprogMenuNameString4};
struct _menuItemStricture {
 int startInArrayIndex;
};
struct _menuMainStricture {
 byte startIndex;
 byte stopIndex;
 bool isSwitchMenuAroundRing;
_menuItemStricture  currentItem;
};
_menuItemStricture _MenuItems[4];
_menuMainStricture _MainMenus[1];
int _gtv1;
bool _gtv2 = 0;
bool _gtv3 = 0;
bool _gtv4 = 0;
bool _gtv5 = 0;
bool _gtv6 = 0;
bool _gtv7 = 0;
int _gtv8;
unsigned long _d18x2x1Tti = 0UL;
float _d18x2x1O = 0.00;
bool _d18x2x1W = 0;
int _disp1oldLength = 0;
String _mux1;
bool _trgs3 = 0;
int _disp8oldLength = 0;
bool _gen2I = 0;
bool _gen2O = 0;
unsigned long _gen2P = 0UL;
int _disp6oldLength = 0;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
int _mux3;
bool _tim2I = 0;
bool _tim2O = 0;
unsigned long _tim2P = 0UL;
bool _MenuBlock_283847175_AMO_364779288 = 0;
bool _MenuBlock_283847175_AMO_200029256 = 0;
bool _MenuBlock_283847175_AMO_401335196 = 0;
bool _MenuBlock_283847175_AMO_243670111 = 0;
String _MenuBlock_283847175_MNO;
String _MenuBlock_283847175_VNO;
bool _MenuBlock_283847175_OEIS = 0;
bool _MenuBlock_283847175_OMUIS = 0;
bool _MenuBlock_283847175_OMDIS = 0;
bool _MenuBlock_283847175_OVUIS = 0;
bool _MenuBlock_283847175_OVDIS = 0;
unsigned long _MenuBlock_283847175_VUDST = 0UL;
unsigned long _MenuBlock_283847175_VUDSPT = 0UL;
byte _MenuBlock_283847175_VUDSM = 0;
int _MenuBlock_283847175_VUDPT = 0;
bool _bounseInputD6S = 0;
bool _bounseInputD6O = 0;
unsigned long _bounseInputD6P = 0UL;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
bool _trgrt5 = 0;
bool _trgrt5I = 0;
bool _bounseInputD5S = 0;
bool _bounseInputD5O = 0;
unsigned long _bounseInputD5P = 0UL;
bool _bounseInputD7S = 0;
bool _bounseInputD7O = 0;
unsigned long _bounseInputD7P = 0UL;
int _disp7oldLength = 0;
bool _gen3I = 0;
bool _gen3O = 0;
unsigned long _gen3P = 0UL;
bool _trgs1 = 0;
int _disp3oldLength = 0;
int _mux2;
int _disp2oldLength = 0;
int _disp4oldLength = 0;
bool _trgs2 = 0;
bool _bounseInputD8S = 0;
bool _bounseInputD8O = 0;
unsigned long _bounseInputD8P = 0UL;
bool _trgrt3 = 0;
bool _trgrt3I = 0;
bool _tim4I = 0;
bool _tim4O = 0;
unsigned long _tim4P = 0UL;
int _disp9oldLength = 0;
int _disp5oldLength = 0;
String _swi1;
bool _trgrt2 = 0;
bool _trgrt2I = 0;
void setup()
{
Wire.begin();
delay(10);
if(((readByteFromEEPROM(0, 0, 0x0))) != 241) {
(updateByteToEEPROM(0, 0, 0x0, (241)));
(updateIntegerToEEPROM(1, 0, 0x0, (0)));
(updateIntegerToEEPROM(3, 0, 0x0, (100)));
(updateIntegerToEEPROM(5, 0, 0x0, (30)));
}
pinMode(5, INPUT_PULLUP); 
pinMode(6, INPUT_PULLUP); 
pinMode(7, INPUT_PULLUP); 
pinMode(8, INPUT_PULLUP); 
pinMode(13, OUTPUT); 
pinMode(4, OUTPUT); 
pinMode(12, OUTPUT); 
pinMode(0, OUTPUT); 

_lcd1.init();
_lcd1.backlight();
_bounseInputD5O =  digitalRead(5);
_bounseInputD7O =  digitalRead(7);
_bounseInputD6O =  digitalRead(6);
_bounseInputD8O =  digitalRead(8);
 _MenuItems[0].startInArrayIndex = 0;
 _MenuItems[1].startInArrayIndex = 12;
 _MenuItems[2].startInArrayIndex = 24;
 _MenuItems[3].startInArrayIndex = 36;
_MainMenus[0].startIndex = 1;
_MainMenus[0].isSwitchMenuAroundRing = 1;
_MainMenus[0].stopIndex = 4;
_MainMenus[0].currentItem = _MenuItems[0];
_menuValueArray_int[0] = (readIntegerFromEEPROM(1, 0, 0x0));
_menuValueArray_int[1] = (readIntegerFromEEPROM(3, 0, 0x0));
_menuValueArray_int[2] = (readIntegerFromEEPROM(5, 0, 0x0));
}
void loop()
{bool _tempVariable_bool;
byte _tempVariable_byte;
if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;}

bool  _bounceInputTmpD7 =  (digitalRead (7));

if (_bounseInputD7S) 
    {
     if (millis() >= (_bounseInputD7P + 40)) 
         {_bounseInputD7O= _bounceInputTmpD7; _bounseInputD7S=0;}
     }
else
    {
     if (_bounceInputTmpD7 != _bounseInputD7O )
         {_bounseInputD7S=1; _bounseInputD7P = millis();} 
      } 
bool  _bounceInputTmpD5 =  (digitalRead (5));

if (_bounseInputD5S) 
    {
     if (millis() >= (_bounseInputD5P + 40)) 
         {_bounseInputD5O= _bounceInputTmpD5; _bounseInputD5S=0;}
     }
else
    {
     if (_bounceInputTmpD5 != _bounseInputD5O )
         {_bounseInputD5S=1; _bounseInputD5P = millis();} 
      } 
bool  _bounceInputTmpD6 =  (digitalRead (6));

if (_bounseInputD6S) 
    {
     if (millis() >= (_bounseInputD6P + 40)) 
         {_bounseInputD6O= _bounceInputTmpD6; _bounseInputD6S=0;}
     }
else
    {
     if (_bounceInputTmpD6 != _bounseInputD6O )
         {_bounseInputD6S=1; _bounseInputD6P = millis();} 
      } 
bool  _bounceInputTmpD8 =  (digitalRead (8));

if (_bounseInputD8S) 
    {
     if (millis() >= (_bounseInputD8P + 40)) 
         {_bounseInputD8O= _bounceInputTmpD8; _bounseInputD8S=0;}
     }
else
    {
     if (_bounceInputTmpD8 != _bounseInputD8O )
         {_bounseInputD8S=1; _bounseInputD8P = millis();} 
      } 




//Плата:1
//Наименование:Блок меню
if (!(!(_bounseInputD5O))) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; 
 if (!(!(_bounseInputD6O))) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; 
  if (!(_gtv7)) {
_tempVariable_bool  =  1;
 if ( ! _MenuBlock_283847175_OEIS ) {_MenuBlock_283847175_OEIS = 1;
} 
_tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex)+10]);
_MenuBlock_283847175_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1])));
_MenuBlock_283847175_VNO = _menuOutputValueString (0);
_MenuBlock_283847175_AMO_364779288 = pgm_read_byte(&_menuParametrsArray[(_MainMenus[0].currentItem ).startInArrayIndex]) == 1; 
_MenuBlock_283847175_AMO_200029256 = pgm_read_byte(&_menuParametrsArray[(_MainMenus[0].currentItem ).startInArrayIndex]) == 2; 
_MenuBlock_283847175_AMO_401335196 = pgm_read_byte(&_menuParametrsArray[(_MainMenus[0].currentItem ).startInArrayIndex]) == 3; 
_MenuBlock_283847175_AMO_243670111 = pgm_read_byte(&_menuParametrsArray[(_MainMenus[0].currentItem ).startInArrayIndex]) == 4; 
} else {
_tempVariable_bool  =  0;
if (_MenuBlock_283847175_OEIS){
_MenuBlock_283847175_OEIS = 0;
_menuUpdateToEEpromItems();
}
_MenuBlock_283847175_AMO_364779288 = 0;
_MenuBlock_283847175_AMO_200029256 = 0;
_MenuBlock_283847175_AMO_401335196 = 0;
_MenuBlock_283847175_AMO_243670111 = 0;
_MenuBlock_283847175_MNO = "";
_MenuBlock_283847175_VNO = "";
}
if(_trgrt1) { if ( ! _MenuBlock_283847175_OMUIS) {_MenuBlock_283847175_OMUIS = 1;if (_tempVariable_bool){  _menuUpEvents(0);
_menuUpdateToEEpromItems();
}}} else {_MenuBlock_283847175_OMUIS = 0;}
if(_trgrt2) { if ( ! _MenuBlock_283847175_OMDIS) {_MenuBlock_283847175_OMDIS = 1;if (_tempVariable_bool){   _menuDownEvents(0);
_menuUpdateToEEpromItems();
}}} else {_MenuBlock_283847175_OMDIS = 0;}
if(!(_bounseInputD7O)) { if ( ! _MenuBlock_283847175_OVUIS) {_MenuBlock_283847175_OVUIS = 1; if (_tempVariable_bool){  _valueUpEvents(0); _MenuBlock_283847175_VUDST = millis();} }if (_tempVariable_bool){
if (_MenuBlock_283847175_VUDSM == 0) { if (_isTimer(_MenuBlock_283847175_VUDST , 2000 )) {_MenuBlock_283847175_VUDSM = 1; _MenuBlock_283847175_VUDSPT = millis(); _MenuBlock_283847175_VUDPT  = 500;}}  else { if (_MenuBlock_283847175_VUDSM == 1) { if (_isTimer(_MenuBlock_283847175_VUDST , 4000 )) {_MenuBlock_283847175_VUDSM = 2;_MenuBlock_283847175_VUDPT  = 250; } } if (_isTimer(_MenuBlock_283847175_VUDSPT , _MenuBlock_283847175_VUDPT )) { _valueUpEvents(0);  _MenuBlock_283847175_VUDSPT = millis();}  }
}} else {_MenuBlock_283847175_OVUIS = 0; if( ! ( !(_bounseInputD8O))){_MenuBlock_283847175_VUDSM = 0; }}
if(!(_bounseInputD8O)) { if ( ! _MenuBlock_283847175_OVDIS) {_MenuBlock_283847175_OVDIS = 1; if (_tempVariable_bool){  _valueDownEvents(0); _MenuBlock_283847175_VUDST = millis();}} if (_tempVariable_bool){
if (_MenuBlock_283847175_VUDSM == 0) { if (_isTimer(_MenuBlock_283847175_VUDST , 2000 )) {_MenuBlock_283847175_VUDSM = 1; _MenuBlock_283847175_VUDSPT = millis(); _MenuBlock_283847175_VUDPT  = 500;}}  else { if (_MenuBlock_283847175_VUDSM == 1) { if (_isTimer(_MenuBlock_283847175_VUDST , 4000 )) {_MenuBlock_283847175_VUDSM = 2;_MenuBlock_283847175_VUDPT  = 250; } } if (_isTimer(_MenuBlock_283847175_VUDSPT , _MenuBlock_283847175_VUDPT )) { _valueDownEvents(0);  _MenuBlock_283847175_VUDSPT = millis();}  }
}} else {_MenuBlock_283847175_OVDIS = 0; if( ! ( !(_bounseInputD7O))){_MenuBlock_283847175_VUDSM = 0; }}
_gtv5 = _MenuBlock_283847175_AMO_243670111;
if(((_menuValueArray_int[0])) == 0) {_mux1 = String("Your");}
if(((_menuValueArray_int[0])) == 1) {_mux1 = String("Meat");}
if(((_menuValueArray_int[0])) == 2) {_mux1 = String("Chicken");}
if(((_menuValueArray_int[0])) == 3) {_mux1 = String("Fish");}
if(((_menuValueArray_int[0])) == 4) {_mux1 = String("Vegetables");}
if(((_menuValueArray_int[0])) == 5) {_mux1 = String("Mushrooms");}
if(_MenuBlock_283847175_AMO_364779288)
{_swi1=_mux1;}
else
{_swi1=_MenuBlock_283847175_VNO;}
if (( (!(_gtv7)) && (( (_MenuBlock_283847175_AMO_364779288) || (_MenuBlock_283847175_AMO_200029256) || (_MenuBlock_283847175_AMO_401335196) )) )) {
_dispTempLength1 = ((_swi1)).length();
if (_disp2oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp2oldLength = _dispTempLength1;
_lcd1.setCursor(int((16 - _dispTempLength1)/2), 1);
_lcd1.print((_swi1));
} else {
if (_disp2oldLength > 0) {_isNeedClearDisp1 = 1; _disp2oldLength = 0;} 
}
if (( (!(_gtv7)) && (( (_MenuBlock_283847175_AMO_364779288) || (_MenuBlock_283847175_AMO_200029256) || (_MenuBlock_283847175_AMO_401335196) || (_MenuBlock_283847175_AMO_243670111) )) )) {
_dispTempLength1 = ((_MenuBlock_283847175_MNO)).length();
if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp1oldLength = _dispTempLength1;
_lcd1.setCursor(int((16 - _dispTempLength1)/2), 0);
_lcd1.print((_MenuBlock_283847175_MNO));
} else {
if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;} 
}

//Плата:2
//Наименование:Терморегулятор
if(_isTimer(_d18x2x1Tti, 1000)) {
_d18x2x1Tti = millis(); 
if ( !_ow10W){_ow10W=1; _d18x2x1W= 1; _ow10P= millis();} else {if( _d18x2x1W) {if(abs(millis()-_ow10P)>1000) { _d18x2x1O=  _readDS18_ow10(_d18x2x1Addr, 0);_d18x2x1W=0; _ow10W=0;}}}}
_gtv1 = (int((_d18x2x1O)));
if(((_menuValueArray_int[0])) == 0) {_mux2 = (_menuValueArray_int[1]);}
if(((_menuValueArray_int[0])) == 1) {_mux2 = 120;}
if(((_menuValueArray_int[0])) == 2) {_mux2 = 120;}
if(((_menuValueArray_int[0])) == 3) {_mux2 = 115;}
if(((_menuValueArray_int[0])) == 4) {_mux2 = 100;}
if(((_menuValueArray_int[0])) == 5) {_mux2 = 115;}
_gtv8 = _mux2;
_gtv3 = (_gtv1) >= ((_mux2)+(5));
if(( (_gtv5) && (!(_bounseInputD7O)) )) _trgs3 = 1;
if(( (_gtv7) && (!(_bounseInputD8O)) )) _trgs3 = 0;
_gtv7 = _trgs3;
_gtv6 = (_gtv1) >= (_mux2);
if(( (_trgs3) && ((_gtv1) <= ((_mux2)-(1.00))) )) _trgs1 = 1;
if(( ((_gtv1) >= (_mux2)) || (( (_gtv7) && (!(_bounseInputD8O)) )) )) _trgs1 = 0;
if (( (_gtv7) && (!(( (!(_gtv2)) && (_trgs1) ))) && (!(_gtv2)) )) {
_dispTempLength1 = (String("Off")).length();
if (_disp6oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp6oldLength = _dispTempLength1;
_lcd1.setCursor(13, 0);
_lcd1.print(String("Off"));
} else {
if (_disp6oldLength > 0) {_isNeedClearDisp1 = 1; _disp6oldLength = 0;} 
}
if (( (( (!(_gtv2)) && (_trgs1) )) && (_gtv7) && (!(_gtv2)) )) {
_dispTempLength1 = (String("On")).length();
if (_disp5oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp5oldLength = _dispTempLength1;
_lcd1.setCursor(13, 0);
_lcd1.print(String("On"));
} else {
if (_disp5oldLength > 0) {_isNeedClearDisp1 = 1; _disp5oldLength = 0;} 
}
digitalWrite(4, ( (!(_gtv2)) && (_trgs1) ));
digitalWrite(13, !(( (!(_gtv2)) && (_trgs1) )));

//Плата:3
//Наименование:Таймер
if (_gtv2) {
_dispTempLength1 = (String("Finish")).length();
if (_disp8oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp8oldLength = _dispTempLength1;
_lcd1.setCursor(int((16 - _dispTempLength1)/2), 0);
_lcd1.print(String("Finish"));
} else {
if (_disp8oldLength > 0) {_isNeedClearDisp1 = 1; _disp8oldLength = 0;} 
}
if(( (_gtv6) && (!(_gtv4)) )) _trgs2 = 1;
if(( (_gtv2) && (!(_bounseInputD8O)) )) _trgs2 = 0;
_gtv4 = _trgs2;
if(((_menuValueArray_int[0])) == 0) {_mux3 = (_menuValueArray_int[2]);}
if(((_menuValueArray_int[0])) == 1) {_mux3 = 60;}
if(((_menuValueArray_int[0])) == 2) {_mux3 = 50;}
if(((_menuValueArray_int[0])) == 3) {_mux3 = 30;}
if(((_menuValueArray_int[0])) == 4) {_mux3 = 20;}
if(((_menuValueArray_int[0])) == 5) {_mux3 = 40;}
if (( (!(_gtv2)) && (_gtv7) )) {
_dispTempLength1 = (((((String(_mux3, DEC))) + (String(" min"))))).length();
if (_disp7oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp7oldLength = _dispTempLength1;
_lcd1.setCursor(int((16 - _dispTempLength1)/2), 1);
_lcd1.print(((((String(_mux3, DEC))) + (String(" min")))));
} else {
if (_disp7oldLength > 0) {_isNeedClearDisp1 = 1; _disp7oldLength = 0;} 
}
if (_trgs2)
{ if (_tim1I) { if (_isTimer(_tim1P, (_mux3)*(60000UL))) {_tim1O = 1;}} else {_tim1I =1; _tim1P = millis();}} else {_tim1O = 0; _tim1I = 0;}
_gtv2 = _tim1O;
if (_gtv2) {
_dispTempLength1 = ((((String("t ")) + ((String(_gtv1, DEC)))))).length();
if (_disp9oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp9oldLength = _dispTempLength1;
_lcd1.setCursor(int((16 - _dispTempLength1)/2), 1);
_lcd1.print((((String("t ")) + ((String(_gtv1, DEC))))));
} else {
if (_disp9oldLength > 0) {_isNeedClearDisp1 = 1; _disp9oldLength = 0;} 
}

//Плата:4
//Наименование:Finish
if (( (_gtv7) && (!(_gtv2)) )) {
_dispTempLength1 = ((((String("t ")) + ((String(_gtv1, DEC)))))).length();
if (_disp3oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp3oldLength = _dispTempLength1;
_lcd1.setCursor(0, 0);
_lcd1.print((((String("t ")) + ((String(_gtv1, DEC))))));
} else {
if (_disp3oldLength > 0) {_isNeedClearDisp1 = 1; _disp3oldLength = 0;} 
}
if (( (_gtv7) && (!(_gtv2)) )) {
_dispTempLength1 = (((String(_gtv8, DEC)))).length();
if (_disp4oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp4oldLength = _dispTempLength1;
_lcd1.setCursor(9, 0);
_lcd1.print(((String(_gtv8, DEC))));
} else {
if (_disp4oldLength > 0) {_isNeedClearDisp1 = 1; _disp4oldLength = 0;} 
}
if (( (_gtv2) && ((_gtv1) <= (60)) )) { if (_trgrt5I) { _trgrt5 = 0;} else {_trgrt5 = 1; _trgrt5I = 1;} } else {_trgrt5 = 0; _trgrt5I = 0;}; 
 if(_trgrt5) {_tim4O = 1; _tim4I = 1;} else { if(_tim4I) {_tim4I = 0; _tim4P = millis();} else { if (_tim4O) {if ( _isTimer(_tim4P, 5000)) _tim4O = 0;}}}
if (_tim4O) { if (! _gen2I) { _gen2I = 1; _gen2O = 1; _gen2P = millis(); } } else { _gen2I = 0 ; _gen2O= 0;}
 if (_gen2I) {  if ( _isTimer ( _gen2P , 200 )) { _gen2P = millis(); _gen2O = ! _gen2O;}}
if (_gtv2) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;}; 
 if(_trgrt3) {_tim2O = 1; _tim2I = 1;} else { if(_tim2I) {_tim2I = 0; _tim2P = millis();} else { if (_tim2O) {if ( _isTimer(_tim2P, 5000)) _tim2O = 0;}}}
if (_tim2O) { if (! _gen1I) { _gen1I = 1; _gen1O = 1; _gen1P = millis(); } } else { _gen1I = 0 ; _gen1O= 0;}
 if (_gen1I) {  if ( _isTimer ( _gen1P , 500 )) { _gen1P = millis(); _gen1O = ! _gen1O;}}
if (( (_gtv4) && ((_gtv1) >= (((_menuValueArray_int[1]))+(5))) )) {if (! _gen3I) { _gen3I = 1; _gen3O = 1; _gen3P =  millis(); } } else { _gen3I = 0 ;  _gen3O= 0;  } if (_gen3I ) { if (_gen3O) { if ( _isTimer( _gen3P , 500 )) { _gen3P = millis(); _gen3O = 0; } } else  { if ( _isTimer( _gen3P , 100 )) {  _gen3P = millis(); _gen3O = 1;  } } }
digitalWrite(12, ( (_gen1O) || (_gen2O) || (_gen3O) ));
digitalWrite(0, ( (!(_gtv2)) && (_gtv4) ));




}
bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }
String _readStringFromProgmem (char *string)
{
String result = String("");
while (pgm_read_byte(string)!='\0')
{
result=result+ char(pgm_read_byte(string));
	string++;
	}
return result;
}
 void _menuUpEvents (byte menuIndex)
{
byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
byte parIndex = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+5]);
byte parentStartIndex;
byte parentStopIndex;
if (parIndex == 0) {parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex;}
else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex)+3]);
 parentStopIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex-1]).startInArrayIndex)+4]); }
if (tempIndex == parentStartIndex) {if((_MainMenus[menuIndex]).isSwitchMenuAroundRing) {(_MainMenus[menuIndex]).currentItem = _MenuItems[parentStopIndex -1]; return;} else{return;}}
(_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex - 2];
return;
}
 void _menuDownEvents (byte menuIndex)
{
byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+5]);
byte parentStartIndex;
byte parentStopIndex;
if (parIndex == 0) {parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex;}
else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex-1]).startInArrayIndex)+3]);
 parentStopIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[parIndex-1]).startInArrayIndex)+4]); }
if (tempIndex == parentStopIndex) {if((_MainMenus[menuIndex]).isSwitchMenuAroundRing) {(_MainMenus[menuIndex]).currentItem = _MenuItems[parentStartIndex -1]; return;} else{return;}}
(_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex];
return;
}
 void _valueUpEvents (byte menuIndex)
{
byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+2]);
byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+1]);
byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+6]);
byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+8]);
if (itemType == 3) {if (! indexMax == 0) { if ( ! (int(pgm_read_word(&_menuConstantValuesArray_int[indexMax -1])) > int(_menuValueArray_int[valIndex -1]))) {return;} }
_menuValueArray_int[valIndex -1] = _menuValueArray_int[valIndex -1] + (pgm_read_word(&_menuConstantValuesArray_int[indexStep -1])); }
}
 void _valueDownEvents (byte menuIndex)
{

byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+2]);
byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+1]);
byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+7]);
byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+8]);
if (itemType == 3) { if (! indexMin == 0) { if ( ! ((int(pgm_read_word(&_menuConstantValuesArray_int[indexMin - 1]))) < int(_menuValueArray_int[valIndex - 1]))) {return;}} 
_menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] - (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1])); }
}
 String _menuOutputValueString (byte menuIndex)
{
byte itemType = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+1]);
byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+2]);
byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+7]);
byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+6]);
if( valIndex == 0){ return "";}
byte convFormat = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+9]);
if(itemType == 3) { return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin);}
return "";
}
 void _menuUpdateToEEpromItems()
{
(updateIntegerToEEPROM(1, 0, 0x0, ((_menuValueArray_int[0]))));
(updateIntegerToEEPROM(3, 0, 0x0, ((_menuValueArray_int[1]))));
(updateIntegerToEEPROM(5, 0, 0x0, ((_menuValueArray_int[2]))));
}
String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin)
{
if (itemType== 3) {
if (convFormat == 4) { return String((_menuValueArray_int[valIndex - 1 ]),DEC);}
if (convFormat == 5) { return String((_menuValueArray_int[valIndex - 1]),HEX);}
if (convFormat == 6) { return String((_menuValueArray_int[valIndex -1]),BIN);}
}
}
float _convertDS18x2xData(byte type_s, byte data[12])
{
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) 
  {
  raw = raw << 3; 
  if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; }
  }
else 
  {
   byte cfg = (data[4] & 0x60);
   if (cfg == 0x00) raw = raw & ~7;   else if (cfg == 0x20) raw = raw & ~3;  else if (cfg == 0x40) raw = raw & ~1;
  }
return  (float)raw / 16.0;
}
float _readDS18_ow10(byte addr[8], byte type_s)
{  byte data[12];
byte i;
_ow10.reset();
_ow10.select(addr);
_ow10.write(0xBE);
for ( i = 0; i < 9; i++) {
 data[i] = _ow10.read();}
_ow10.reset();
_ow10.select(addr);
_ow10.write(0x44, 1);
return _convertDS18x2xData(type_s, data);} byte readByteFromEEPROM(int addres, byte bitAddres, byte chipAddres)
{
return EEPROM.read(addres);
}
void updateByteToEEPROM(int addres, byte bitAddres, byte chipAddres, byte value)
{
return EEPROM.update(addres, value);
}
 int readIntegerFromEEPROM(int addres, byte bitAddres, byte chipAddres)
{
byte hight = readByteFromEEPROM( addres,  bitAddres,  chipAddres);
byte low = readByteFromEEPROM( (addres+1),  bitAddres,  chipAddres);
return  word(hight, low);
}
 void updateIntegerToEEPROM(int addres, byte bitAddres, byte chipAddres, int value)
{
updateByteToEEPROM( addres,  bitAddres,  chipAddres, highByte(value));
updateByteToEEPROM( (addres+1),  bitAddres,  chipAddres, lowByte(value));
}

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Вот пусь FLProg в этом и разбирается

b707
Offline
Зарегистрирован: 26.05.2017

Glead пишет:

Добрый день. Помогите новичку. Есть проэкт автоматики для автоклава, проблема в русификации меню

вы уверены. что это самая важная проблема в проекте? Что мешает польховаться меню на латинице? неужели такие слова как "open" "close" "On" "Off"? "Temperature" и тп - нуждаются в переводе?

bwn
Offline
Зарегистрирован: 25.08.2014

b707 пишет:

Glead пишет:

Добрый день. Помогите новичку. Есть проэкт автоматики для автоклава, проблема в русификации меню

вы уверены. что это самая важная проблема в проекте?

Самая, самая, себя помню, сперва надо меню написать, а остальное страшно.))))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

bwn пишет:

Самая, самая, себя помню, сперва надо меню ...

а потом тебю )))

Клапауций 003
Offline
Зарегистрирован: 20.07.2019

b707 пишет:

Glead пишет:

Добрый день. Помогите новичку. Есть проэкт автоматики для автоклава, проблема в русификации меню

вы уверены. что это самая важная проблема в проекте? Что мешает польховаться меню на латинице? неужели такие слова как "open" "close" "On" "Off"? "Temperature" и тп - нуждаются в переводе?

проэкт или проект? - это важно.