- Вход / Регистрация

Пока я собрался с мыслями сделать новый портативный осциллограф, «Pultoscope» уже был на стадии разработки второй версии. Его автор, bodriy2014, адаптировал код для двух дисплеев: Nokia 3310 (китайский дисплей 5110) и цветного дисплея 240x320 SPFD5408. У меня в корпусе уже стоял дисплей от Nokia 3410, так что пришлось переделывать скетч под него. Общаясь с автором, и делая самостоятельные коррективы, получился результат, который привожу в этой статье.
Все составляющие легко поместились в имеющийся корпус.
Схема осциллографа «Pultoscope v.2» не сложная, проста в сборке. В отличии от стандартной сборки, я добавил в нее встроенный делитель 1:3, под который заточил программный код. При необходимости, можно добавить в нее дополнительные делители, усилители и т.д. Единственное, что хочу отметить, для портативной версии лучше собирать преобразователь питания на микросхеме типа MC34063, т.к. китайский DC-DC повышающий преобразователь показал себя не в лучшем виде. В частности, при разгоне arduino mini и замене кварца до 25Mhz, падала стабильность устройства, уходила нулевая линия отображения сигнала и проявлялись прочие проблемы, которые не наблюдались при включении от стабильного сетевого источника питания. По этим причинам я оставил свою версию прибора без замены кварца, хотя у автора установлен кварц с частотой 27Mhz.
Рассматривая дисплей «пультоскопа» в режиме работы осциллографа, можно выделить информативных 10 полей. 1 – шкала отображения вольтажа, имеет автоматические градации 0-1v, 0-5v, 0-15v, 0-3.3v (при опорном напряжении 1.1v). 2 – поле с сеткой, подстраиваемой под шкалу 1, на котором отображается график сигнала. 3 – максимальное напряжение просматриваемого сигнала. 4 – частота сигнала до 2MHz. Частота сигнала до 1.8 вольт измеряется программным способом, свыше – аппаратным (более точным). 5 – первый пункт меню, выбор опорного напряжения (5 или 1.1v). 6 – второй пункт меню, выбор развертки (0-8). 7 – третий пункт, масштаб (1:1, 2:1, 3:1). 8 – четвертый пункт, позиционирование (1-9). Позиционирование поднимает или опускает график сигнала. 9 – пятый пункт, режим паузы. 10 – шестой пункт, синхронизация.
В режиме генератора 3 информативных поля. 1 – отображение ШИМ в процентах; 2 – отображение генерируемой частоты; 3 – выбор множителя для изменения частоты или переключение изменения ШИМ.
Хочу отметить такой момент, что проект «Пультоскоп» не стоит на месте и планируется разработка новой (третьей) версии. В ней должен присутствовать внешний АЦП, возможно, встроенный ОУ и прочие необходимые доработки.
Файлы печатной платы осциллографа / генератора в формате *.lay6, скетч - *.ino и необходимые библиотеки для работы с дисплеем от Nokia 3410 выкладываю отдельным архивом ЗДЕСЬ.
Щуп готовый использовали?
Каким волновым сопротивлением коаксиал?
sergeyaz, щуп самодельный - швейная игла, кабель - часть AV коаксиального кабеля.
Arthur1993, устройство универсальное, каждый добавляет в него, что считает нужным для себя. Жаль, что автор пропал, у него были наработки по поводу увеличения скорости и точности осциллографического пробника.
Я начинающий радиолюбитель , не принимаю какой пультоскоп можно собирать
Arthur1993, определитесь какими функциями Вы будете пользоваться, и выберите нужную версию. Или пересоберите версию для себя.
Этот версию АС напражнения работает?
Да.
Когда будет третьей версия?
Скорее всего, ее не будет. На данной комбинации "железа", большего сложно выжать.
советую обратиь внимание на http://radioskot.ru/forum/12-14297-1 простой и достаточно мощный осцилограф получился 🙂

apeks1, имеется видео с примером работы? Программный код открытый?
Где третьей версия на АЦП?
Arthur_1993, основной код писал автор, который забросил этот проект. Моя работа заключалась в адаптации его под дисплей от Нокии 3410, который имеет большее разрешение. Если автор возобновит работу над проектом, возможно, я также выполню свою часть.
Вы бы посоветовали собрать эту осциллографию?

/user_files/unverified__mj678d52/59753
arthur_1993, какие характеристики заявлены?
Да, прибор достойный. Можно собирать.
Как я могу сделать прошивка этот пультоскоп , пожалуйста, напишите последовательность шагов?
Arthur_1993, покупаете любой ttl программатор и через программу IDE arduino заливаете скомпилированный скетч в МК. Всё стандартно. Ознакомьтесь с принципом работы arduino и Вам станет всё ясно.
Ваша версия пультоскопа информативней чем у автора. Но мне нужно к такому же дисплею и Вашей прошивке прикрутить DDS генератор и терминал, но тк с программированием дела не имел попытка скрестить вашу прошивку и авторскую не получаетс. В меню добавил нужные пункты, разделы скопировал в вашу прошивку, до стрелка не хочет выбирать дальше осцила и генератора, если в коде на DDS напишу Generator то соответственно DDS работает но нет генератора :(. Может глянете всетаки код ваш. Или подскажите как вы запустили прошивку автора на 3410. Пробовал подставить ваши исправленные драйвера от 3310 и скомпилировать прошивку автора не хочет. Вот мой код
//Переделка под дисплей от Nokia 3410 и оптимизация кода //alldiy.top
#include
#include
#include
#include
#include
#define led 9 //пин для генератора сигналов (не менять)
#define dds 10 //пин для генератора dds (не менять)
//#################№№№№№№####пользовательские настройки
#define levo 11 //кнопка ЛЕВО(можно любой пин)
#define ok 8 //кнопка ОК(можно любой пин)
#define pravo 12 //кнопка ПРАВО(можно любой пин)
#define akb A6 //любой свободный аналоговый пин для измерения напряжения АКБ
#define overclock 16 //Частота на которой работает Ардуино
Adafruit_PCD8544 display = Adafruit_PCD8544(2, 3, 4, 6, 7);//пины к которым у вас подключен дисплей
byte cont=75;//контрастность дисплея
byte SinU=5; //уровень синхронизации 0 до 255
int PWM = 100;//стартовое значение ШИМ от 0 до 255
float fiveV = 5.13; //наши 5v, меряем мультиметром
int32_t frequency = 5000; //стартовое значение частоты в Гц
//###########################################################
float maxV = 0.0; // вычисление вольтажа
float printV = 0.0; // вывод вольтажа
float batt =0.00; // для вывода вольтажа батареи
int d=0;
byte menuDDS=0;
byte sinM[32]={1,6,15,29,48,69,92,117,143,168,191,212,229,243,251,255,254,248,237,222,203,181,156,131,106,81,59,39,22,10,3,1};
byte pilaM[32]={1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,129,137,145,153,161,169,177,185,193,201,209,217,225,235,245,255};
byte RpilaM[32]={250,246,238,230,222,214,206,198,190,182,174,166,158,150,142,134,126,118,110,102,94,86,78,70,62,54,41,33,25,17,9,1};
byte trianglM[32]={1,18,35,52,69,86,103,120,137,154,171,188,205,222,239,255,239,223,207,191,175,159,143,127,111,95,79,63,47,31,15,1};
byte hag=0;
int mnog=0;
boolean flag=0;
byte mass[256];
byte x=0;
byte menu=0;//переменная выбора меню
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
bool pultoskop=1; //флаг выбора генератора или осциллографа
byte razv=6;
byte sinhMASS=0;
long countX=0;
long speedTTL=9600; //скорость терминала
byte zoom=1; //Приближение по умолчанию 1:1
byte poz=8; //Позиционирование
int koef=1; //коэффициент для синхронизации
int newpoz=0;
unsigned long count =0;
void setup(){
display.begin();
display.setContrast(cont);
display.clearDisplay();
display.setCursor(5,20);
display.setTextColor(BLACK);
display.print("Pultoscope v.");
display.setCursor(82,13);
display.setTextSize(2);
display.print("2");
display.setTextSize(1);
display.setCursor(3,45);
display.println(utf8rus("Версия для 3410"));
display.setCursor(10,55);
display.print("alldiy.top");
batt=analogRead(akb)*fiveV/1024;
display.display();
delay(2000);
while(digitalRead(ok)==LOW){
display.clearDisplay();
display.setCursor(15,10);
display.println(utf8rus("Осциллограф"));
display.setCursor(15,20);
display.println(utf8rus("Генератор"));
display.setCursor(15,30);
display.println(utf8rus("DDSгенератор"));
display.setCursor(15,40);
display.println(utf8rus("Терминал"));
display.setCursor(5,55);
display.print(utf8rus("Батарея "));
display.print(batt);
display.println(utf8rus(" в"));
if(pultoskop==1) display.setCursor(5,10);
if(pultoskop==0) display.setCursor(5,20);
if(pultoskop==2) display.setCursor(5,30);
if(pultoskop==3) display.setCursor(5,40);
display.print(">");
display.display();
if(digitalRead(levo)==HIGH){delay(200);pultoskop=pultoskop-1;}
if(digitalRead(pravo)==HIGH){delay(200);pultoskop=pultoskop+1;}
if(pultoskop>3){pultoskop=0;}
delay(50);
}
if(pultoskop==1){FreqCount.begin(1000);}
if(pultoskop==0){InitTimersSafe(); bool success = SetPinFrequencySafe(led, frequency);}
display.setTextColor(BLACK);
delay(500);
}
void Zamer(){
if (razv>=6){ADCSRA = 0b11100010;}//delitel 4
if (razv==5){ADCSRA = 0b11100011;}//delitel 8
if (razv==4){ADCSRA = 0b11100100;}//delitel 16
if (razv==3){ADCSRA = 0b11100101;}//delitel 32
if (razv==2){ADCSRA = 0b11100110;}//delitel 64
if (razv<2){ADCSRA = 0b11100111;}//delitel 128
if (razv==0){
for(byte i=0;i0){
for(byte i=0;i<255;i++){
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
mass[i]=ADCH;
}
}
}
void loop() {
if(pultoskop==1){
String text="";
byte test;
if(opornoe==0){ADMUX = 0b11100100;}//выбор внутреннего опорного 1,1В
if(opornoe==1){ADMUX = 0b01100100;}//Выбор внешнего опорного
delay(5);
if(paus==0){Zamer();}
//#######################################определение точки синхронизации
maxV = 0;
for(int y=1;y<85;y++){
if(maxV=85) koef=1;
else {
if(maxV>=17) koef=3;
else koef=15;
}
}
bool flagSINHRO=0;
bool flagSINHRnull=0;
for(int y=1;y<255;y++){
if(flagSINHRO==0){if(mass[y]*koefSinU){flagSINHRO=1;sinhMASS=y;}}
}
}
//if(flagSINHRO==0){if(mass[y]SinU){flagSINHRO=1;sinhMASS=y;}}
//#######################################отрисовка графика
x=10;
if (zoom==2) x=5;
if (zoom==3) x=3;
if(poz==9) newpoz=-14;
if(poz==8) newpoz=0;
if(poz==7) newpoz=7;
if(poz==6) newpoz=14;
if(poz==5) newpoz=21;
if(poz==4) newpoz=28;
if(poz==3) newpoz=35;
if(poz==2) newpoz=42;
if(poz==1) newpoz=49;
display.clearDisplay();
display.fillCircle(91,45-SinU/5.8, 2, BLACK);//рисуем уровень синхронизации
//for(int y=1;y<85;y++){
for(int y=sinhMASS;y<sinhMASS+85;y++){
if(razv<7){x++;}
if(razv==7){x=x+2;}
if(razv==8){x=x+3;}
if(x<=95) {
display.drawLine(x*zoom, (46+newpoz)-(mass[y]/5.6*koef)*zoom, (x+1)*zoom, (46+newpoz)-(mass[y+1]/5.6*koef)*zoom, BLACK);
}
}
sinhMASS=0;
//#######################################отрисовка графика
for(int i=0; i<=45; i+=5) {
display.drawPixel(24,i, BLACK);
display.drawPixel(49,i, BLACK);
display.drawPixel(74,i, BLACK);
}//разметка экрана вертикальная
if(opornoe==0) {
for(int i=9; i=0;i=i-9){display.drawFastHLine(0,i,9, BLACK);}
for(int i=9; i<95; i+=5) {
display.drawPixel(i,18, BLACK);
display.drawPixel(i,36, BLACK);
}
display.drawChar (0, 14, '9', 1, 0, 1);
display.drawChar (0, 33, '3', 1, 0, 1);
if(maxV<85) {
display.drawChar (0, 14, '3', 1, 0, 1);
display.drawChar (0, 33, '1', 1, 0, 1);
}
if(maxV=25){SinU=SinU-20;}}
if(digitalRead(pravo)==HIGH){if(SinU<=225){SinU=SinU+20;}}
display.fillCircle(91,45-SinU/5.8, 3, BLACK);
display.fillCircle(91,45-SinU/5.8, 2, WHITE);
}
if(digitalRead(ok)==HIGH){menu++;if(menu==6){menu=0;paus=0;}}//перебор меню
if (FreqCount.available()) {count = FreqCount.read();}//вывод частоты по готовности счетчика
countX=count*(overclock/16.0);
if(countX==0) {
//#######################################частоты сигнала
byte Frec1=0;
int Frec=0;
bool flagFrec1=0;
bool flagFrec2=0;
bool flagFrec3=0;
for(int y=1;y<255;y++){
if(flagFrec1==0){if(mass[y]*koefSinU){flagFrec1=1;Frec1=y;}}}
if(flagFrec1==1){if(mass[y]*koefSinU){
if (razv>=6){Frec=1000000/((y-Frec1-1)*3.27);}//delitel 4
if (razv==5){Frec=1000000/((y-Frec1)*3.27)/2;}//delitel 8
if (razv==4){Frec=1000000/((y-Frec1)*3.27)/4;}//delitel 16
if (razv==3){Frec=1000000/((y-Frec1)*3.27)/8;}//delitel 32
if (razv==2){Frec=1000000/((y-Frec1)*3.27)/16;}//delitel 64
if (razv==2){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128
if (razv==1){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128
if (razv==0){Frec=1000000/((y-Frec1)*500);}//delitel 128
flagFrec1=0;flagFrec3=0;}}}
//#######################################частоты сигнала
countX=Frec*(overclock/16.0);
}
if(opornoe==0) text="1";
if(opornoe==1) text="5";
text=text+utf8rus(" Р:")+razv+utf8rus(" ")+zoom+utf8rus(":1")+utf8rus(" П:")+poz;
display.setCursor(2, 48);
display.print(text);
if(opornoe==1) printV=maxV*fiveV/255*3,2; //if(opornoe==1) printV=maxV*fiveV/255*3,2;
if(opornoe==0) printV=maxV*1.10/255*3,2; // напряжение на делителе 1.1в
display.setCursor(1, 58);
display.print(printV);display.print("v ");
display.print(countX);display.print("Hz");
display.fillRect(85, 48, 2, 7, 1);
display.fillRect(88, 48, 2, 7, 1);
//display.setCursor(55, 0); display.print(maxV); //градации напряжения
//#######################################отрисовка menu
display.display();
delay(300);
}
if(pultoskop==0){Generator();}
if(pultoskop==2){DDSGenerator();}
if(pultoskop==3){TTL();}
}
//#######################################режим ренератора
void Generator(){
display.clearDisplay();
if (flag==0){//флаг выборов режима настройки ШИМ или Частоты
if(digitalRead(levo)==HIGH){
frequency=frequency-mnog;
if(frequency<0){frequency=0;}
bool success = SetPinFrequencySafe(led, frequency);
delay(3);//защита от дребезга
}
if(digitalRead(pravo)==HIGH){
frequency=frequency+mnog;
bool success = SetPinFrequencySafe(led, frequency);
delay(3);//защита от дребезга
}
}
if (flag==1){//флаг выборов режима настройки ШИМ или Частоты
if(digitalRead(levo)==HIGH){
PWM=PWM-3;
if(PWM255){PWM=0;}
delay(3);//защита от дребезга
}
}
if(digitalRead(ok)==HIGH){//переключение разряда выбора частоты
delay(3);//защита от дребезга
hag++;
if(hag>=5){hag=0;}
}
////////////
display.setTextSize(1);
display.setCursor(20,15);
display.print("PWM = ");
display.print(PWM*100/255);
display.print("%");
display.drawRect(2,2,92,10, BLACK);
display.fillRect(2,2,92*PWM/255.0,10, BLACK);
///////////
display.setCursor(5,30);
display.setTextSize(2);
long frequencyX=frequency*(overclock/16.0);
if(frequencyX=1000){if(frequencyX=10000){if(frequencyX=100000){display.print((frequencyX/1000.0),2);display.setTextSize(1);display.println("KHz");}
display.setCursor(15,55);
display.setTextSize(1);
display.print(">> X ");
if(hag==0){//выбор множителя частоты
display.print(1*(overclock/16.0),1);
mnog=1;
flag=0;
}
if(hag==1){//выбор множителя частоты
display.print(10*(overclock/16.0),0);
mnog=10;
}
if(hag==2){//выбор множителя частоты
display.print(100*(overclock/16.0),0);
mnog=100;
}
if(hag==3){//выбор множителя частоты
display.print(1000*(overclock/16.0),0);
mnog=1000;
}
if(hag==4){//выбор PWM
display.print(utf8rus("ШИМ"));
flag=1;
}
display.print(" <<");
pwmWrite(led, PWM);
display.display();
delay(300);
}
/////////////////////DDS
void DDSGenerator(){
int fr=10;
if(menuDDS==0){
display.clearDisplay();
display.setTextColor(WHITE, BLACK); // 'inverted' text
display.setCursor(10,0);
display.println(utf8rus("Синус"));
display.setTextColor(BLACK);
display.setCursor(10,10);
display.println(utf8rus("Треугольник"));
display.setCursor(10,20);
display.println(utf8rus("Пила"));
display.setCursor(10,30);
display.println(utf8rus("Пила Обр"));
display.setTextColor(BLACK);
display.setCursor(0,40);
//display.print(utf8rus("Частота="));
//display.print(57);
//display.print(utf8rus("Гц"));
delay(100);
display.display();
while(D11_Read==LOW){
PWM=sinM[d];
pwmWrite(dds,PWM);
//delayMicroseconds(fr);
d++;
if(d==32){d=0;}}
menuDDS++;
delay(200);}
if(menuDDS==1){
display.clearDisplay();
display.setTextColor(BLACK); // 'inverted' text
display.setCursor(10,0);
display.println(utf8rus("Синус"));
display.setTextColor(WHITE, BLACK);
display.setCursor(10,10);
display.println(utf8rus("Треугольник"));
display.setTextColor(BLACK);
display.setCursor(10,20);
display.println(utf8rus("Пила"));
display.setCursor(10,30);
display.println(utf8rus("Пила Обр"));
display.setTextColor(BLACK);
//display.setCursor(0,40);
//display.print(utf8rus("Частота="));
// display.print(57);
//display.print(utf8rus("Гц"));
delay(100);
display.display();
while(D11_Read==LOW){
PWM=trianglM[d];
pwmWrite(dds,PWM);
//delayMicroseconds(fr);
d++;
if(d==32){d=0;}}
menuDDS++;
delay(200);}
if(menuDDS==2){
display.clearDisplay();
display.setTextColor(BLACK); // 'inverted' text
display.setCursor(10,0);
display.println(utf8rus("Синус"));
display.setTextColor(BLACK);
display.setCursor(10,10);
display.println(utf8rus("Треугольник"));
display.setTextColor(WHITE, BLACK);
display.setCursor(10,20);
display.println(utf8rus("Пила"));
display.setTextColor(BLACK);
display.setCursor(10,30);
display.println(utf8rus("Пила Обр"));
display.setTextColor(BLACK);
//display.setCursor(0,40);
//display.print(utf8rus("Частота="));
// display.print(57);
//display.print(utf8rus("Гц"));
delay(100);
display.display();
while(D11_Read==LOW){
PWM=pilaM[d];
pwmWrite(dds,PWM);
// delayMicroseconds(fr);
d++;
if(d==32){d=0;}}
menuDDS++;
delay(200);}
if(menuDDS==3){
display.clearDisplay();
display.setTextColor(BLACK); // 'inverted' text
display.setCursor(10,0);
display.println(utf8rus("Синус"));
display.setTextColor(BLACK);
display.setCursor(10,10);
display.println(utf8rus("Треугольник"));
display.setTextColor(BLACK);
display.setCursor(10,20);
display.println(utf8rus("Пила"));
display.setTextColor(WHITE, BLACK);
display.setCursor(10,30);
display.println(utf8rus("Пила Обр"));
display.setTextColor(BLACK);
//display.setCursor(0,40);
//display.print(utf8rus("Частота="));
// display.print(57);
// display.print(utf8rus("Гц"));
delay(100);
display.display();
while(D11_Read==LOW){
PWM=RpilaM[d];
pwmWrite(dds,PWM);
//delayMicroseconds(fr);
d++;
if(d==32){d=0;}}
menuDDS++;
delay(200);}
if(menuDDS==4){menuDDS=0;}
}
/////////////////////TTL
void TTL(){
display.clearDisplay();
display.setTextColor(BLACK);
display.setCursor(10,0);
display.println(utf8rus("Терминал"));
display.setCursor(10,10);
display.println(utf8rus("Скорость"));
display.setCursor(10,20);
display.print("-");
display.print(speedTTL);
display.println("+");
display.setCursor(0,30);
display.println(utf8rus("Нажми ОК-старт"));
if(digitalRead(pravo)==HIGH){speedTTL=speedTTL+100;}
if(digitalRead(levo)==HIGH){speedTTL=speedTTL-100;}
if(speedTTL250000){speedTTL=0;}
if(digitalRead(ok)==HIGH){Serial.begin(speedTTL*(16/overclock));
display.clearDisplay();
delay(100);
display.display();
int x=0;
int y=0;
while(1){
char incomingBytes;
if (Serial.available() > 0) { // Если в буфере есть данные
incomingBytes=Serial.read(); // Считывание байта в переменную incomeByte
display.setCursor(x,y);
display.print(incomingBytes); // Печать строки в буффер дисплея
display.display(); x=x+6;
if(x==84){x=0;y=y+8;}
if(y==48){x=0;y=0;
display.clearDisplay();
delay(100);
display.display();}}
}}
delay(100);
display.display();
}
а что под спойлер не прячет?
tolya10, прошло уже 3 года, тонкостей не помню. И разбираться времени, на данный момент, нет. Попробуйте вносить изменения поэтапно, проверяя каждый раз результат. Так Вы поймете где идет "нестыковка" и поправите ее.
Добрый день. Побеспокою Вас еще раз. Уже месяц воюю с вашей прошивкой. Добавляю пункт меню но он не выбирается. Меню менял, от кучи прошивок ставил на вашу, ваше, с дополнительными пунктами, ставил на другие на других прошивках все работает могу добавить убрать пункты меню. У Вас в прошивке только 2 пункта, причем это pultoskop0 и pultoskop1, если 1 и 2 ( и далее в прошивке изменю подпрограммы на 1 и 2) то выбирает только 1 тк нет 0, если в коде какую либо подпрограмму не вашу, а например DDS или TTL назову как 0 или 1 то она соответственно запустится. Подскажите от чего зависит количество пунктов меню ( про кол-во строк и размер шрифта я догадываюсь 🙂 и их выбор? И еще Вы изменяли драйвера для 3310 там нет заглушки на меню типа 2 пункта и все ( просмотрел не увидел но вам виднее)? Я понимаю что давно дело было, но глядя на Ваши изделия видно что Вы человек аккуратный и где то должны остаться наработки ну или руки то помнят :)Придайте направление.
tolya10, драйвера никакого отношения к коду пультоскопа не имеют.
Расписываю как добавить один пункт меню. По аналогии - и остальные. Пишу без проверки, по памяти, могут быть неточности.
if(pultoskop==1) display.setCursor(5,10);
if(pultoskop==0) display.setCursor(5,20);
Здесь выбирается место курсора ">" относительно пункта. Т.е. можно добавить строку:
if(pultoskop==2) display.setCursor(5,30);
=============
display.setCursor(15,20);
display.println(utf8rus("Генератор"));
Здесь добавляем название новой функуии, например:
display.setCursor(15,30);
display.println(utf8rus("Новая Функция"));
=============
if(digitalRead(levo)==HIGH){delay(200);pultoskop=!pultoskop;}
if(digitalRead(pravo)==HIGH){delay(200);pultoskop=!pultoskop;}
Заменить на следующую конструкцию:
if(digitalRead(levo)==HIGH){
if(pultoskop>1) pultoskop--;
}
if(digitalRead(pravo)==HIGH){
if(pultoskop<2) pultoskop++;
}
Здесь "2" - максимальный номер меню, начиная с "0". Т.е. третий.
=============
if(pultoskop==2){New_function();}
Так вызывается новая функция третьего пункта меню, делается по аналогии с функцией Generator().
Кстати, добавил функцию "SPOILER" в комментариях. Теперь ей можно пользоваться.
Спасибо за оперативный ответ, но если бы все было так просто.... это я сделал сразу хотя и никогда не программировал ни на чем просто просмотрев другие коды понял что за что примерно отвечает и методом тыка сделал, я же и писал что в других кодах могу добавлять убирать итд пункты меню, в вашем работает только pultoskop==0 и pultoskop==1. и более ничего не выбирает. 🙁
к вашему коду приделываетмя любое меню. но все равно не выбирает.
Даже если я ничего не трогая и не добавляя просто переименую в вашем коде например pultoskop==0 на pultoskop==2 и далее в коде где встречаются ссылки на pultoskop==0 переименую на pultoskop==2 то и ваш код не выбирает тоже. Хотя казалось бы что я меняю просто указание в меню на какую подпрограмму ссылаться но ничего не происходит. Кстати тоже самое если оставить pultoskop==0 а переименовать pultoskop==1 на pultoskop==2 или3,4,5..... тоже будет выбирать только 0 а другую цифру не выбирает.
Почему именно ваш код- адекватно работающий осциллограф и наличие дисплея 3410. Если не получится прийдется брать 5110 🙁