Запись и чтение EEPROM

Liske
Offline
Зарегистрирован: 27.06.2016

ЕвгенийП пишет:

Дык, не я шаман - это же всё описано в документации на домашнем сайте ардуино. RTFM, так cказать :)

Да я шучу конечно на счет магии..))) Но очень приятно что грамотные люди откликнулись :)

В итоге вот как получилось:

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Liske пишет:
интерполяция  между ячейками при считывании данных
А это что?

На всякий случай, напоминаю завет П.П. Шарикова: "Неприличными словами не выражацца!"

Liske
Offline
Зарегистрирован: 27.06.2016

ЕвгенийП пишет:

Liske пишет:
интерполяция  между ячейками при считывании данных
А это что?

На всякий случай, напоминаю завет П.П. Шарикова: "Неприличными словами не выражацца!"

Это фрагмент кода от контроллера управления турбинами, в системе многоступенчатого наддува. Первая версия уже успешно работает, но я хочу ее улучшить. Сделать удобный для настройки интерфейс и некоторые параметры перевести на двухмерные карты. Поскольку разрядность карт будет сравнительно не большой, то так же надо будет внедрить функцию сглаживания (интерполяции), при считывании данных с двухмерных поверхностей. Т.е., что бы данные из карты считывались не ступенчато, а плавно изменяясь от точки к точке. Я так понимаю, что для этого придется их считывать одновременно в двух соседних точках и одновременно по двум осям. И затем уже сравнивать полученное со входным сигналом и вычислять интерполированные значения ??

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, это уже сутевая часть Вашей задачи. Её никто лучше Вас не знает.

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

Liske пишет:

Поскольку разрядность карт будет сравнительно не большой, то так же надо будет внедрить функцию сглаживания (интерполяции), при считывании данных с двухмерных поверхностей. Т.е., что бы данные из карты считывались не ступенчато, а плавно изменяясь от точки к точке. Я так понимаю, что для этого придется их считывать одновременно в двух соседних точках и одновременно по двум осям. И затем уже сравнивать полученное со входным сигналом и вычислять интерполированные значения ??

Liske. линейная интерполяция - математически вещь элементарная, ее в средней школе изучают под названием "правило пропорции". Двумерная  интерполяция по сути не сложнее одномерной. главное только четко представлять. как у вас данные организованы в матрице.

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

Liske пишет:

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

В четырех соседних точках, если подразумевается билинейная интерполяция. Для бикубической, etc. точек нужно больше.

Liske
Offline
Зарегистрирован: 27.06.2016

b707 пишет:

Liske пишет:

Поскольку разрядность карт будет сравнительно не большой, то так же надо будет внедрить функцию сглаживания (интерполяции), при считывании данных с двухмерных поверхностей. Т.е., что бы данные из карты считывались не ступенчато, а плавно изменяясь от точки к точке. Я так понимаю, что для этого придется их считывать одновременно в двух соседних точках и одновременно по двум осям. И затем уже сравнивать полученное со входным сигналом и вычислять интерполированные значения ??

Liske. линейная интерполяция - математически вещь элементарная, ее в средней школе изучают под названием "правило пропорции". Двумерная  интерполяция по сути не сложнее одномерной. главное только четко представлять. как у вас данные организованы в матрице.

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

Liske
Offline
Зарегистрирован: 27.06.2016

andriano пишет:

Liske пишет:

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

В четырех соседних точках, если подразумевается билинейная интерполяция. Для бикубической, etc. точек нужно больше.

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

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

Liske пишет:

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

Ну, то есть в Гугле Вас забанили...

Начните с этого:

https://ru.wikipedia.org/wiki/%D0%91%D0%B8%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9...

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

Liske
Offline
Зарегистрирован: 27.06.2016

Уважаемые знатоки! Прошу помочь мне найти мою ошибку из за которой данные не корректно сохраняются в EERPROM. Проявляется эта ошибка как перемешивание данных массивов при сохранении ( а возможно и при считывании из памяти). Я так подозреваю, что я не корректно назначаю адреса в ЕЕRprom, на которые должны сохраняться данные из массивов.. 

#include <EEPROM.h>

byte sel = 0,
sel_2 = 0,
inr =1,
map_sw_1,
map_sw_2,
VNT_mod,
WG_mod,
clr,
g,
i,
t,
y,
k,
s,
f,
page = 0,
testbyte = 1;

int vnt_pos_pwm,
vnt_rpm_pwm,
vnt_bar_pwm,
vnt_bar_pwm_2,
wgt,
wgt_2,
rpm,
rpm_1,
rpm_2,
bst,
egp;


//___________________________________________
int vntmap_bar_1 = 0,    
 vntmap_bar_2 = 37,          // EGP kPa
 vntmap_point_1,    
 vntmap_point_2, 
 vntmap_bar_11 = 0,    
 vntmap_bar_22 = 37,          // EGP kPa
 vnt_point_bar2_1,    
 vnt_point_bar2_2, 
///__________________________________________
 vntmap_rpm_1 = 0,
 vntmap_rpm_2 = 1000,     // RPM calibr.
 vntmap_point_11, 
 vntmap_point_22 ;
//___________________________________________
static const unsigned eepromAddress = 0;
int bytes[7][12] ;
static const unsigned eepromAddress_1 = 85;
int bytes_1[7][12] ;
unsigned long lastmillis;

void setup() {

EEPROM.get(eepromAddress, bytes);
VNT_mod = EEPROM.read(86);
EEPROM.get(eepromAddress_1, bytes_1);

WG_mod = EEPROM.read(87);

//egp = 100; //  Exht.press. kPa
//rpm = 1000;

  
Serial.begin(230400);


}
void loop() {
//if (millis() - lastmillis >= 100){   //Slow loop 
//lastmillis = millis();
rpm = constrain(rpm,0,6000);
 egp = constrain(egp,0,550);
/////////////////////////////////////////
wgt = map(egp, -1 , 600, 1 , 13);
wgt_2 = (wgt - 1);

rpm_1 = map(  rpm, 7000 ,-1 , 0 , 7);
rpm_2 = (rpm_1 - 1);

if(map_sw_1 < wgt){vntmap_bar_1 = egp; vntmap_bar_2 = (egp + 50);}
     if(map_sw_1 > wgt){vntmap_bar_1 = (egp - 50);vntmap_bar_2 = egp;}

vntmap_point_2 = bytes[rpm_1][wgt];
   vntmap_point_1 = bytes[rpm_1][wgt_2];
     
        vnt_bar_pwm = map(egp,vntmap_bar_1,vntmap_bar_2,vntmap_point_1,vntmap_point_2);
            vnt_bar_pwm = constrain(vnt_bar_pwm,0,99);
     

if(map_sw_1 < wgt){vntmap_bar_11 = egp; vntmap_bar_22 = (egp + 50);}
     if(map_sw_1 > wgt){vntmap_bar_11 = (egp - 50);vntmap_bar_22 = egp;}
     
    vnt_point_bar2_2 = bytes[rpm_2][wgt];
       vnt_point_bar2_1 = bytes[rpm_2][wgt_2];
     
        vnt_bar_pwm_2 = map(egp,vntmap_bar_11,vntmap_bar_22,vnt_point_bar2_1,vnt_point_bar2_2);
          vnt_bar_pwm_2 = constrain(vnt_bar_pwm_2,0,99);
 

if(map_sw_2 > rpm_1){vntmap_rpm_1 = rpm; vntmap_rpm_2 = (rpm + 1000);}
     if(map_sw_2 < rpm_1 && rpm > 1){vntmap_rpm_1=(vntmap_rpm_1 - 1000); 
     vntmap_rpm_2=(vntmap_rpm_2 - 1000);}     
map_sw_2 = rpm_1;

//////////////////////////////////////////////////
      
vnt_pos_pwm = map(rpm,vntmap_rpm_1,vntmap_rpm_2,vnt_bar_pwm,vnt_bar_pwm_2);
  vnt_pos_pwm = constrain(vnt_pos_pwm,0,99);
 
 

//if (millis() - lastmillis >= 1000){testbyte = 1;
//lastmillis = millis();}
//_____________________Page_0 Main_menu___________________________________
if(page==0 && testbyte != 0){Serial.print("\033[36m_________________\033[37mMENU\033[36m______________");
Serial.println("          ");
Serial.println();
  Serial.print("Turbo-1:   1");Serial.print("           ");
Serial.print("Turbo-2:  2");Serial.println("          ");
Serial.print("Turbo-3:   3");Serial.print("          ");
  Serial.print("Wat/mhet:  4");Serial.println("          ");
Serial.print("Sensors:   5");Serial.print("          ");
//Serial.print("Logger:    6");Serial.println("          ");
  
Serial.println(" \033]2;J-tec boost controller\007");
Serial.print("\033[0;0H"); 

testbyte = 0;

}
//______________________Page_1__VNT_map__________________________________

if(page == 1){
     if(testbyte != 0||map_sw_1 != wgt){  
 Serial.println();
Serial.println("            VNT position %        \033[37m   |\033[36m6000 rpm");

for (i = 0; i < 7; i = i +1) { 
  for (k = 0; k < 12; k = k +1){
 
bytes[i][k] =  constrain(bytes[i][k],0,99);
 Serial.print("\033[36m["); 

if(i == sel && k == sel_2){Serial.print("\033[32m");g = bytes[i][k];
bytes[i][k] = bytes[i][k] + (inr - 1);}
else{Serial.print("\033[37m");}
if( i == rpm_1 && k == wgt_2){Serial.print("\033[31m");}

if(bytes[i][k] < 10){Serial.print(" ");Serial.print(bytes[i][k]);}
else{Serial.print(bytes[i][k]);}
  }
Serial.println("\033[36m]\033[37m|");  
 }
 Serial.println("                                     |\033[36m0");
Serial.println("\033[36m  0     1     2     3     4     5 bar\033[37m|");
Serial.println();

Serial.print("\033[36mUp:     w            ")
;Serial.print("VNT pos.\033[32m  ");Serial.println(vnt_pos_pwm);
Serial.print("\033[36mDown:   s            ");Serial.print("EGP bar   \033[32m");
  Serial.print((egp*0.01),2);
Serial.println("     \033[36m     ");
Serial.print("Left:   a            ");Serial.print("Rpm     \033[32m  ");Serial.print(rpm);
Serial.println("   \033[36m       ");
Serial.print("Right:  d      ");Serial.print("Sensor mode: v  \033[32m");
  if(VNT_mod == 0){Serial.print("EGP");}
     else{Serial.print("MAP");}
Serial.println("   \033[36m       ");

Serial.print("Enrich: +            ");Serial.print("Boost   \033[32m  ");Serial.print(bst);
Serial.println("   \033[36m       ");
Serial.println("Reduct: -");
if(s ==1){Serial.println("\033[31mSave: \033[36m  m ");}
else{Serial.println("Save:   m");}
Serial.println("Back:   1");
Serial.println();

     
Serial.println(" \033]2;J-tec boost controller\007");
Serial.print("\033[0;0H"); 

testbyte = 0;
inr = 1;
}}

//______________________Page 2: Turbo 2____________________________

if(page == 2){
     if(testbyte != 0||map_sw_1 != wgt){  
 Serial.println();
Serial.println("            Turbo 2 WG %        \033[37m   |\033[36m6000 rpm");

for (t = 0; t < 7; t = t +1) { 
  for (y = 0; y < 12; y = y +1){
 
bytes_1[t][y] =  constrain(bytes_1[t][y],0,99);
 Serial.print("\033[36m["); 

if(t == sel && y == sel_2){Serial.print("\033[32m");g = bytes_1[t][y];
bytes_1[t][y] = bytes_1[t][y] + (inr - 1);}
else{Serial.print("\033[37m");}
if( t == rpm_1 && y == wgt_2){Serial.print("\033[31m");}

if(bytes_1[t][y] < 10){Serial.print(" ");Serial.print(bytes_1[t][y]);}
else{Serial.print(bytes_1[t][y]);}
  }
Serial.println("\033[36m]\033[37m|");  
 }
 Serial.println("                                     |\033[36m0");
Serial.println("\033[36m  0     1     2     3     4     5 bar\033[37m|");
Serial.println();

Serial.print("\033[36mUp:     w            ")
;Serial.print("VNT pos.\033[32m  ");Serial.println(vnt_pos_pwm);
Serial.print("\033[36mDown:   s            ");Serial.print("EGP bar   \033[32m");
  Serial.print((egp*0.01),2);
Serial.println("     \033[36m     ");
Serial.print("Left:   a            ");Serial.print("Rpm     \033[32m  ");Serial.print(rpm);
Serial.println("   \033[36m       ");
Serial.print("Right:  d       ");Serial.print("sensor mode: v  \033[32m");
  if(WG_mod == 0){Serial.print("EGP");}
     else{Serial.print("MAP");}
Serial.println("   \033[36m       ");

Serial.print("Enrich: +            ");Serial.print("Boost   \033[32m  ");Serial.print(bst);
Serial.println("   \033[36m       ");
Serial.println("Reduct: -");
if(s ==1){Serial.println("\033[31mSave: \033[36m  m ");}
else{Serial.println("Save:   m");}
Serial.println("Back:   1");
Serial.println();

     
Serial.println(" \033]2;J-tec boost controller\007");
Serial.print("\033[0;0H"); 

testbyte = 0;
inr = 1;
}}

 map_sw_1 = wgt;   

  if (Serial.available() > 0){
  
testbyte = Serial.read();
s = 0;
if(testbyte == 109 && page == 1){EEPROM.put(eepromAddress, bytes); s = 1; }   //Sefe in eerprom 
if(testbyte == 109 && page == 2){EEPROM.put(eepromAddress_1, bytes_1); s = 1;} //Sefe in eerprom     
if(testbyte == 61 && g <98){inr = 2 ;}                   // Enrich.
if(testbyte == 45 && g >1){inr = 0 ;}                   // Reduct. 
if(testbyte == 115 && sel < 6){sel ++;}          // Down
if(testbyte == 119 && sel > 0){sel --; }         // Up
if(testbyte == 100 && sel_2 < 11){sel_2 ++;}   // Left
if(testbyte == 97 && sel_2 > 0){sel_2 --; }    // Right
if(testbyte == 46){egp ++;}                    // Enrich.
if(testbyte == 44){egp --;}
if(testbyte == 111){rpm = rpm + 50 ;}                   
if(testbyte == 112){rpm = rpm - 50 ;}
if(testbyte == 49){page ++;clr++;
         if(page > 1){page =0;}}
if(testbyte == 50 && page==0){page =2; clr++;}
            
     
     if(clr!=0){
       Serial.write(27);       
          Serial.print("[2J");    // clear screen command
               Serial.write(27);
                  Serial.print("[H");
                      clr = 0;}
          

if(testbyte == 118 && page == 1){VNT_mod ++;
  if(VNT_mod > 1){VNT_mod =0;}EEPROM.update(86,VNT_mod);}  
if(testbyte == 118 && page == 2){WG_mod ++;
  if(WG_mod > 1){WG_mod =0;}EEPROM.update(87,WG_mod);}         
         
while (Serial.available()) Serial.read();
  }
  
}

 

Liske
Offline
Зарегистрирован: 27.06.2016

 Кажется сам нашел проблему: Данные массивов были объявлены как int, хотя и содежели меньше одного бита. Сейчас изменил на byte и пока вроде ошибок при сохранении не вижу..

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Liske пишет:

 Данные массивов были объявлены как int, хотя и содежели меньше одного бита. 

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

Liske
Offline
Зарегистрирован: 27.06.2016

DetSimen пишет:

Liske пишет:

 Данные массивов были объявлены как int, хотя и содежели меньше одного бита. 

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

Имел в виду по количеству знаков. У меня используется максимум 2 знака от 0 до 99.

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

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

Ни у int, ни у byte нет и не может быть знаков. Знаки (в данном контексте) - атрибут текстового (в виде строки символов) представления числа. Само число и его текстовое представление - совершенно разные сущности. 

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

Liske
Offline
Зарегистрирован: 27.06.2016

andriano пишет:

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

Ни у int, ни у byte нет и не может быть знаков. Знаки (в данном контексте) - атрибут текстового (в виде строки символов) представления числа. Само число и его текстовое представление - совершенно разные сущности. 

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

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

#include <EEPROM.h>

byte sel = 0,
sel_2 = 0,
inr =1,
map_sw_1,
map_sw_2,
map_sw_3,
VNT_mod,
WG_mod,
clr,
g,
i,
t,
y,
wg1_bar_pwm,
wg1_bar_pwm_2,
vnt_pos_pwm,
wg1_pos_pwm,
vnt_rpm_pwm,
vnt_bar_pwm,
vnt_bar_pwm_2,
wg1_map_point_1,    
wg1_map_point_2,
wg1_point_bar2_1,    
wg1_point_bar2_2,
vntmap_point_1,    
vntmap_point_2, 
vnt_point_bar2_1,    
vnt_point_bar2_2, 
k,
s,
f,
page = 0,
testbyte = 1;

int sw_1,
wgt,
wgt1,
wgt_2,
wgt1_2,
rpm,
rpm_1,
rpm_2,
bst,                     //  Boost pressure kPa
egp,                    // Exhaust gas pressure kPa
vnt_map_flag,
wg1_map_flag,
vntmap_bar_1 = 0,    
vntmap_bar_2 = 50,           
wg1_map_bar_1 = 0,    
wg1_map_bar_2 = 50,
vntmap_rpm_1 = 0,
vntmap_rpm_2 = 1000;     
//___________________________________________
static const unsigned eepromAddress = 0;
byte bytes[7][12] ;
static const unsigned eepromAddress_1 = 85;
byte bytes_1[7][12] ;
unsigned long lastmillis;

void setup() {

EEPROM.get(eepromAddress, bytes);
VNT_mod = EEPROM.read(170);
EEPROM.get(eepromAddress_1, bytes_1);

WG_mod = EEPROM.read(171);

//egp = 100; //  Exht.press. kPa
//rpm = 1000;

  
Serial.begin(230400);


}
void loop() {
//if (millis() - lastmillis >= 100){   //Slow loop 
//lastmillis = millis();
rpm = constrain(rpm,0,6000);
 egp = constrain(egp,0,550);
/////////////////////////////////////////

rpm_1 = map(  rpm, 7000 ,-1 , 0 , 7);
rpm_2 = (rpm_1 - 1);

//_____________Определение 2-х рабочих точек на поверхностях 12х7 по оборотам двигателя   

if(map_sw_2 > rpm_1){vntmap_rpm_1 = rpm; vntmap_rpm_2 = (rpm + 1000);}
     if(map_sw_2 < rpm_1 && rpm > 1){vntmap_rpm_1=(vntmap_rpm_1 - 1000); 
     vntmap_rpm_2=(vntmap_rpm_2 - 1000);} 
map_sw_2 = rpm_1;

//_______________________________VNT map________________________________________________ 
//_____ Выбор режима egp / bst
if(VNT_mod == 0){ wgt = map(egp, -1 , 600, 1 , 13);  
vnt_map_flag = egp;}
  else{ wgt = map(bst, -1 , 600, 1 , 13); vnt_map_flag = bst;}   
      wgt_2 = (wgt - 1);  
  
//____Определение 4-х рабочих точек на поверхности VNT 12х7 по давлению выхлопа/наддува
if(map_sw_1 < wgt){vntmap_bar_1 = vnt_map_flag; vntmap_bar_2 = (vnt_map_flag + 50);}
     if(map_sw_1 > wgt){vntmap_bar_1 = (vnt_map_flag - 50);vntmap_bar_2 = vnt_map_flag;}   
 map_sw_1 = wgt;

//____Определение рабочей точки по 4-м точкам на поверхности VNT

vntmap_point_2 = bytes[rpm_1][wgt];
   vntmap_point_1 = bytes[rpm_1][wgt_2];

  vnt_bar_pwm = map(vnt_map_flag,vntmap_bar_1,vntmap_bar_2,vntmap_point_1,vntmap_point_2);
       vnt_bar_pwm = constrain(vnt_bar_pwm,0,99);
  
vnt_point_bar2_2 = bytes[rpm_2][wgt];
   vnt_point_bar2_1 = bytes[rpm_2][wgt_2];
     
   vnt_bar_pwm_2 = map(vnt_map_flag,vntmap_bar_1,vntmap_bar_2,vnt_point_bar2_1,vnt_point_bar2_2);
       vnt_bar_pwm_2 = constrain(vnt_bar_pwm_2,0,99);
      
vnt_pos_pwm = map(rpm,vntmap_rpm_1,vntmap_rpm_2,vnt_bar_pwm,vnt_bar_pwm_2);
  vnt_pos_pwm = constrain(vnt_pos_pwm,0,99);
  
//______________________________________________________________________________________
//_______________________________Turbo-2 WG map________________________________________________ 
//_____ Выбор режима egp / bst
if(WG_mod == 0){ wgt1 = map(egp, -1 , 600, 1 , 13);  
wg1_map_flag = egp;}
  else{ wgt1 = map(bst, -1 , 600, 1 , 13); wg1_map_flag = bst;}   
      wgt1_2 = (wgt1 - 1);  
  
//____Определение 4-х рабочих точек на поверхности VNT 12х7 по давлению выхлопа/наддува
if(map_sw_3 < wgt1){wg1_map_bar_1 = wg1_map_flag; wg1_map_bar_2 = (wg1_map_flag + 50);}
     if(map_sw_3 > wgt1 && wg1_map_bar_2 >=50){wg1_map_bar_1 = (wg1_map_flag - 50);wg1_map_bar_2 = wg1_map_flag;}   
 map_sw_3 = wgt1;

wg1_map_point_2 = bytes_1[rpm_1][wgt1];
   wg1_map_point_1 = bytes_1[rpm_1][wgt1_2];

  wg1_bar_pwm = map(wg1_map_flag,wg1_map_bar_1,wg1_map_bar_2,wg1_map_point_1,wg1_map_point_2);
       //wg1_bar_pwm = constrain(wg1_bar_pwm,1,99);
  
wg1_point_bar2_2 = bytes_1[rpm_2][wgt1];
   wg1_point_bar2_1 = bytes_1[rpm_2][wgt1_2];
     
   wg1_bar_pwm_2 = map(wg1_map_flag,wg1_map_bar_1,wg1_map_bar_2,wg1_point_bar2_1,wg1_point_bar2_2);
      // wg1_bar_pwm_2 = constrain(wg1_bar_pwm_2,1,99);
      
wg1_pos_pwm = map(rpm,vntmap_rpm_1,vntmap_rpm_2,wg1_bar_pwm,wg1_bar_pwm_2);
  wg1_pos_pwm = constrain(wg1_pos_pwm,1.0,99);
//_____________________________________________________________________________________________________
  

//if (millis() - lastmillis >= 1000){testbyte = 1;
//lastmillis = millis();}

//_____________________Page_0 Main_menu___________________________________
if(page==0 && testbyte != 0){Serial.print("\033[36m_________________\033[37mMENU\033[36m______________");
Serial.println("          ");
Serial.println();
  Serial.print("Turbo-1:   1");Serial.print("           ");
Serial.print("Turbo-2:  2");Serial.println("          ");
Serial.print("Turbo-3:   3");Serial.print("          ");
  Serial.print("Wat/mhet:  4");Serial.println("          ");
Serial.print("Sensors:   5");Serial.print("          ");
//Serial.print("Logger:    6");Serial.println("          ");
  
Serial.println(" \033]2;J-tec boost controller\007");
Serial.print("\033[0;0H"); 

//testbyte = 0;

}
//______________________Page_1__VNT_map__________________________________

if(page == 1){
     if(testbyte != 0|| sw_1 != vnt_map_flag){  
 Serial.println();
Serial.println("            VNT position %        \033[37m   |\033[36m6000 rpm");

for (i = 0; i < 7; i = i +1) { 
  for (k = 0; k < 12; k = k +1){
 
bytes[i][k] =  constrain(bytes[i][k],0,99);
 Serial.print("\033[36m["); 

if(i == sel && k == sel_2){Serial.print("\033[32m");g = bytes[i][k];
bytes[i][k] = bytes[i][k] + (inr - 1);}
else{Serial.print("\033[37m");}
if( i == rpm_1 && k == wgt_2){Serial.print("\033[31m");}

if(bytes[i][k] < 10){Serial.print(" ");Serial.print(bytes[i][k]);}
else{Serial.print(bytes[i][k]);}
  }
Serial.println("\033[36m]\033[37m|");  
 }
 Serial.println("                                     |\033[36m0");
Serial.println("\033[36m  0     1     2     3     4     5 bar\033[37m|");
Serial.println();

Serial.print("\033[36mUp:     w            ")
;Serial.print("VNT pos.\033[32m  ");
if(vnt_pos_pwm < 10){Serial.print(" ");Serial.println(vnt_pos_pwm);}
 else{Serial.println(vnt_pos_pwm);}
Serial.print("\033[36mDown:   s            ");Serial.print("EGP bar   \033[32m");
  Serial.print((egp*0.01),2);
Serial.println("     \033[36m     ");
Serial.print("Left:   a            ");Serial.print("Rpm     \033[32m  ");Serial.print(rpm);
Serial.println("   \033[36m       ");
Serial.print("Right:  d      ");Serial.print("Sensor mode: v  \033[32m");
  if(VNT_mod == 0){Serial.print("EGP");}
     else{Serial.print("MAP");}
Serial.println("   \033[36m       ");

Serial.print("Enrich: +            ");Serial.print("Boost   \033[32m  ");Serial.print((bst*0.01),2);
Serial.println("   \033[36m       ");
Serial.println("Reduct: -");
if(s ==1){Serial.println("\033[31mSave: \033[36m  m ");}
else{Serial.println("Save:   m");}
Serial.println("Back:   1");
Serial.println();


     
Serial.println(" \033]2;J-tec boost controller\007");
Serial.print("\033[0;0H"); 
sw_1 = (vnt_map_flag + rpm); 

inr = 1;
}}

//______________________Page 2: Turbo 2____________________________

if(page == 2){
     if(testbyte != 0||map_sw_1 != wgt){  
 Serial.println();
Serial.println("            Turbo 2 WG %        \033[37m   |\033[36m6000 rpm");

for (t = 0; t < 7; t = t +1) { 
  for (y = 0; y < 12; y = y +1){
 
bytes_1[t][y] =  constrain(bytes_1[t][y],0,99);
 Serial.print("\033[36m["); 

if(t == sel && y == sel_2){Serial.print("\033[32m");g = bytes_1[t][y];
bytes_1[t][y] = bytes_1[t][y] + (inr - 1);}
else{Serial.print("\033[37m");}
if( t == rpm_1 && y == wgt_2){Serial.print("\033[31m");}

if(bytes_1[t][y] < 10){Serial.print(" ");Serial.print(bytes_1[t][y]);}
else{Serial.print(bytes_1[t][y]);}
  }
Serial.println("\033[36m]\033[37m|");  
 }
 Serial.println("                                     |\033[36m0");
Serial.println("\033[36m  0     1     2     3     4     5 bar\033[37m|");
Serial.println();

Serial.print("\033[36mUp:     w            ");Serial.print("WG-1 pos.\033[32m   ");
if(wg1_pos_pwm < 10){Serial.print(" ");Serial.println(wg1_pos_pwm);}
 else{Serial.println(wg1_pos_pwm);}
Serial.print("\033[36mDown:   s            ");Serial.print("EGP bar   \033[32m");
  Serial.print((egp*0.01),2);
Serial.println("     \033[36m     ");
Serial.print("Left:   a            ");Serial.print("Rpm     \033[32m  ");Serial.print(rpm);
Serial.println("   \033[36m       ");
Serial.print("Right:  d      ");Serial.print("sensor mode: v  \033[32m");
  if(WG_mod == 0){Serial.print("EGP");}
     else{Serial.print("MAP");}
Serial.println("   \033[36m       ");

Serial.print("Enrich: +            ");Serial.print("Boost   \033[32m  ");Serial.print((bst*0.01),2);
Serial.println("   \033[36m       ");
Serial.println("Reduct: -");
if(s ==1){Serial.println("\033[31mSave: \033[36m  m ");}
else{Serial.println("Save:   m");}
Serial.println("Back:   1");
//Serial.print("wg1_bar_pwm_2     ");Serial.println(wg1_bar_pwm_2 );
//Serial.print("wg1_bar_pwm        ");Serial.println(wg1_bar_pwm);
Serial.println();

     
Serial.println(" \033]2;J-tec boost controller\007");
Serial.print("\033[0;0H"); 

inr = 1;
}}

testbyte = 0;    

  if (Serial.available() > 0){
  
testbyte = Serial.read();
s = 0;
if(testbyte == 109 && page == 1){EEPROM.put(eepromAddress, bytes); s = 1; }   //Save in eerprom 
if(testbyte == 109 && page == 2){EEPROM.put(eepromAddress_1, bytes_1); s = 1;} //Save in eerprom     
if(testbyte == 61 && g <98){inr = 2 ;}                   // Enrich.
if(testbyte == 45 && g >1){inr = 0 ;}                   // Reduct. 
if(testbyte == 115 && sel < 6){sel ++;}          // Down
if(testbyte == 119 && sel > 0){sel --; }         // Up
if(testbyte == 100 && sel_2 < 11){sel_2 ++;}   // Left
if(testbyte == 97 && sel_2 > 0){sel_2 --; }    // Right
if(testbyte == 46){egp ++;}                    // Enrich.
if(testbyte == 44){egp --;}
if(testbyte == 111){rpm = rpm + 50 ;}                   
if(testbyte == 112){rpm = rpm - 50 ;}
if(testbyte == 49){page ++;clr++;
         if(page > 1){page =0;}}
if(testbyte == 50 && page==0){page =2; clr++;}
            
     
     if(clr!=0){
       Serial.write(27);       
          Serial.print("[2J");    // clear screen command
               Serial.write(27);
                  Serial.print("[H");
                      clr = 0;}
          

if(testbyte == 118 && page == 1){VNT_mod ++;
  if(VNT_mod > 1){VNT_mod =0;}EEPROM.update(170,VNT_mod);}  
if(testbyte == 118 && page == 2){WG_mod ++;
  if(WG_mod > 1){WG_mod = 0;}EEPROM.update(171,WG_mod);}         
         
while (Serial.available()) Serial.read();
  }
  
}

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

DetSimen пишет:

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

Ага. Британские ученые с помощью Большого Битового Коллайдера определили, что бит состоит из двух старших битокварков и одного младшего битокварка. Которые находятся в битоглюонном поле и не могут существовать отдельно друг от друга.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Jeka_M пишет:
Британские ученые с помощью Большого Битового Коллайдера определили, что бит состоит из двух старших битокварков и одного младшего битокварка. Которые находятся в битоглюонном поле и не могут существовать отдельно друг от друга.
В чём явно проявилось вмешательство русских хакеров, которое теперь уже нельзя отрицать и которое Россия должна объяснить не поднее 1 января прошлого года, иначе британские учёные выскажут серьёзную озабоченность.