На всякий случай, напоминаю завет П.П. Шарикова: "Неприличными словами не выражацца!"
Это фрагмент кода от контроллера управления турбинами, в системе многоступенчатого наддува. Первая версия уже успешно работает, но я хочу ее улучшить. Сделать удобный для настройки интерфейс и некоторые параметры перевести на двухмерные карты. Поскольку разрядность карт будет сравнительно не большой, то так же надо будет внедрить функцию сглаживания (интерполяции), при считывании данных с двухмерных поверхностей. Т.е., что бы данные из карты считывались не ступенчато, а плавно изменяясь от точки к точке. Я так понимаю, что для этого придется их считывать одновременно в двух соседних точках и одновременно по двум осям. И затем уже сравнивать полученное со входным сигналом и вычислять интерполированные значения ??
Поскольку разрядность карт будет сравнительно не большой, то так же надо будет внедрить функцию сглаживания (интерполяции), при считывании данных с двухмерных поверхностей. Т.е., что бы данные из карты считывались не ступенчато, а плавно изменяясь от точки к точке. Я так понимаю, что для этого придется их считывать одновременно в двух соседних точках и одновременно по двум осям. И затем уже сравнивать полученное со входным сигналом и вычислять интерполированные значения ??
Liske. линейная интерполяция - математически вещь элементарная, ее в средней школе изучают под названием "правило пропорции". Двумерная интерполяция по сути не сложнее одномерной. главное только четко представлять. как у вас данные организованы в матрице.
...считывались не ступенчато, а плавно изменяясь от точки к точке. Я так понимаю, что для этого придется их считывать одновременно в двух соседних точках и одновременно по двум осям. И затем уже сравнивать полученное со входным сигналом и вычислять интерполированные значения ??
В четырех соседних точках, если подразумевается билинейная интерполяция. Для бикубической, etc. точек нужно больше.
Поскольку разрядность карт будет сравнительно не большой, то так же надо будет внедрить функцию сглаживания (интерполяции), при считывании данных с двухмерных поверхностей. Т.е., что бы данные из карты считывались не ступенчато, а плавно изменяясь от точки к точке. Я так понимаю, что для этого придется их считывать одновременно в двух соседних точках и одновременно по двум осям. И затем уже сравнивать полученное со входным сигналом и вычислять интерполированные значения ??
Liske. линейная интерполяция - математически вещь элементарная, ее в средней школе изучают под названием "правило пропорции". Двумерная интерполяция по сути не сложнее одномерной. главное только четко представлять. как у вас данные организованы в матрице.
Да, я тоже так представляю, что теоретически не должна быть сложная. Но вот практически, учитывая мои тройки по математике в школе..)) Если вас не затруднит, могли бы показать на конкретном примере, как с наименьшими танцами с бубном это решается ? Как корректно извлечь точки, между которых в настоящий момент времени считываются данные из массива и как потом эти данные обработать ??
...считывались не ступенчато, а плавно изменяясь от точки к точке. Я так понимаю, что для этого придется их считывать одновременно в двух соседних точках и одновременно по двум осям. И затем уже сравнивать полученное со входным сигналом и вычислять интерполированные значения ??
В четырех соседних точках, если подразумевается билинейная интерполяция. Для бикубической, etc. точек нужно больше.
А какая интерполяция для поставленной задачи нужна ? Насколько я себе представляю, четырех точек вполне должно хватать. Т.е. режимная точка всегда будет находиться только между четырьмя точками на массиве.
Да, я тоже так представляю, что теоретически не должна быть сложная. Но вот практически, учитывая мои тройки по математике в школе..)) Если вас не затруднит, могли бы показать на конкретном примере, как с наименьшими танцами с бубном это решается ? Как корректно извлечь точки, между которых в настоящий момент времени считываются данные из массива и как потом эти данные обработать ??
Уважаемые знатоки! Прошу помочь мне найти мою ошибку из за которой данные не корректно сохраняются в EERPROM. Проявляется эта ошибка как перемешивание данных массивов при сохранении ( а возможно и при считывании из памяти). Я так подозреваю, что я не корректно назначаю адреса в ЕЕRprom, на которые должны сохраняться данные из массивов..
Кажется сам нашел проблему: Данные массивов были объявлены как int, хотя и содежели меньше одного бита. Сейчас изменил на byte и пока вроде ошибок при сохранении не вижу..
Liske, Вы путаетесь в терминологии, из-за чего как путаете других, так и сами, похоже, плохо представляете, что Вам нужно.
Ни у int, ни у byte нет и не может быть знаков. Знаки (в данном контексте) - атрибут текстового (в виде строки символов) представления числа. Само число и его текстовое представление - совершенно разные сущности.
Для того, чтобы прочитать, записать или передать по каналу связи некую сущность, нужно хорошо представлять структуру этой сущности. А структура у строки и числа совершенно различная. Думаю, из-за непонимания этого факта у Вас и не получается сделать то, что Вы хотите.
Liske, Вы путаетесь в терминологии, из-за чего как путаете других, так и сами, похоже, плохо представляете, что Вам нужно.
Ни у int, ни у byte нет и не может быть знаков. Знаки (в данном контексте) - атрибут текстового (в виде строки символов) представления числа. Само число и его текстовое представление - совершенно разные сущности.
Для того, чтобы прочитать, записать или передать по каналу связи некую сущность, нужно хорошо представлять структуру этой сущности. А структура у строки и числа совершенно различная. Думаю, из-за непонимания этого факта у Вас и не получается сделать то, что Вы хотите.
Спасибо за развернутый ответ.. Но к моему счастью я уже сам решил проблему. Теперь все сохраняется и считывается как надо.
Поздравляю. Теперь мы знаем, что бит больше не фундаментальная единица хранения информации. А из чего он состоит, паясни, из битокварков?
Ага. Британские ученые с помощью Большого Битового Коллайдера определили, что бит состоит из двух старших битокварков и одного младшего битокварка. Которые находятся в битоглюонном поле и не могут существовать отдельно друг от друга.
Британские ученые с помощью Большого Битового Коллайдера определили, что бит состоит из двух старших битокварков и одного младшего битокварка. Которые находятся в битоглюонном поле и не могут существовать отдельно друг от друга.
В чём явно проявилось вмешательство русских хакеров, которое теперь уже нельзя отрицать и которое Россия должна объяснить не поднее 1 января прошлого года, иначе британские учёные выскажут серьёзную озабоченность.
Дык, не я шаман - это же всё описано в документации на домашнем сайте ардуино. RTFM, так cказать :)
В итоге вот как получилось:
Следующий пугающий меня этап, это интерполяция между ячейками при считывании данных. Пока даже не представляю, как это может быть реализовано..
На всякий случай, напоминаю завет П.П. Шарикова: "Неприличными словами не выражацца!"
На всякий случай, напоминаю завет П.П. Шарикова: "Неприличными словами не выражацца!"
Ну, это уже сутевая часть Вашей задачи. Её никто лучше Вас не знает.
Поскольку разрядность карт будет сравнительно не большой, то так же надо будет внедрить функцию сглаживания (интерполяции), при считывании данных с двухмерных поверхностей. Т.е., что бы данные из карты считывались не ступенчато, а плавно изменяясь от точки к точке. Я так понимаю, что для этого придется их считывать одновременно в двух соседних точках и одновременно по двум осям. И затем уже сравнивать полученное со входным сигналом и вычислять интерполированные значения ??
Liske. линейная интерполяция - математически вещь элементарная, ее в средней школе изучают под названием "правило пропорции". Двумерная интерполяция по сути не сложнее одномерной. главное только четко представлять. как у вас данные организованы в матрице.
...считывались не ступенчато, а плавно изменяясь от точки к точке. Я так понимаю, что для этого придется их считывать одновременно в двух соседних точках и одновременно по двум осям. И затем уже сравнивать полученное со входным сигналом и вычислять интерполированные значения ??
В четырех соседних точках, если подразумевается билинейная интерполяция. Для бикубической, etc. точек нужно больше.
Поскольку разрядность карт будет сравнительно не большой, то так же надо будет внедрить функцию сглаживания (интерполяции), при считывании данных с двухмерных поверхностей. Т.е., что бы данные из карты считывались не ступенчато, а плавно изменяясь от точки к точке. Я так понимаю, что для этого придется их считывать одновременно в двух соседних точках и одновременно по двум осям. И затем уже сравнивать полученное со входным сигналом и вычислять интерполированные значения ??
Liske. линейная интерполяция - математически вещь элементарная, ее в средней школе изучают под названием "правило пропорции". Двумерная интерполяция по сути не сложнее одномерной. главное только четко представлять. как у вас данные организованы в матрице.
...считывались не ступенчато, а плавно изменяясь от точки к точке. Я так понимаю, что для этого придется их считывать одновременно в двух соседних точках и одновременно по двум осям. И затем уже сравнивать полученное со входным сигналом и вычислять интерполированные значения ??
В четырех соседних точках, если подразумевается билинейная интерполяция. Для бикубической, etc. точек нужно больше.
Да, я тоже так представляю, что теоретически не должна быть сложная. Но вот практически, учитывая мои тройки по математике в школе..)) Если вас не затруднит, могли бы показать на конкретном примере, как с наименьшими танцами с бубном это решается ? Как корректно извлечь точки, между которых в настоящий момент времени считываются данные из массива и как потом эти данные обработать ??
Ну, то есть в Гугле Вас забанили...
Начните с этого:
https://ru.wikipedia.org/wiki/%D0%91%D0%B8%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9...
Там, правда, приводится частный случай, и расписано все довольно примитивно и не всегда верно, но вполне возможно, Вам этого окажется достаточно.
Уважаемые знатоки! Прошу помочь мне найти мою ошибку из за которой данные не корректно сохраняются в 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(); } }Кажется сам нашел проблему: Данные массивов были объявлены как int, хотя и содежели меньше одного бита. Сейчас изменил на byte и пока вроде ошибок при сохранении не вижу..
Данные массивов были объявлены как int, хотя и содежели меньше одного бита.
Поздравляю. Теперь мы знаем, что бит больше не фундаментальная единица хранения информации. А из чего он состоит, паясни, из битокварков?
Данные массивов были объявлены как int, хотя и содежели меньше одного бита.
Поздравляю. Теперь мы знаем, что бит больше не фундаментальная единица хранения информации. А из чего он состоит, паясни, из битокварков?
Liske, Вы путаетесь в терминологии, из-за чего как путаете других, так и сами, похоже, плохо представляете, что Вам нужно.
Ни у int, ни у byte нет и не может быть знаков. Знаки (в данном контексте) - атрибут текстового (в виде строки символов) представления числа. Само число и его текстовое представление - совершенно разные сущности.
Для того, чтобы прочитать, записать или передать по каналу связи некую сущность, нужно хорошо представлять структуру этой сущности. А структура у строки и числа совершенно различная. Думаю, из-за непонимания этого факта у Вас и не получается сделать то, что Вы хотите.
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(); } }Поздравляю. Теперь мы знаем, что бит больше не фундаментальная единица хранения информации. А из чего он состоит, паясни, из битокварков?
Ага. Британские ученые с помощью Большого Битового Коллайдера определили, что бит состоит из двух старших битокварков и одного младшего битокварка. Которые находятся в битоглюонном поле и не могут существовать отдельно друг от друга.