Пультоскоп v.2 (Pultoscope v.2). Осциллограф + генератор.

Пока собирался с мыслями сделать новый ручной осциллограф, «Пультоскоп» уже находился в стадии разработки второй версии. Его автор, bodriy2014, адаптировал код под два экрана: Nokia 3310 (китайский экран 5110) и цветной экран SPFD5408 240×320. У меня в чехле уже был экран Nokia 3410, поэтому пришлось переделывать скетч. Связавшись с автором, и внеся самостоятельные корректировки, я получил результат, который представляю в этой статье.

Пультоскоп v.2 (Pultoscope v.2). Осциллограф + генератор.
Pultoscope v.2

Все компоненты легко вписываются в существующий корпус.

Схема осциллографа «Пультоскоп v.2» не сложная, легко собирается. В отличие от стандартной сборки, я добавил в нее встроенный делитель 1:3, под который и настроил программный код. При необходимости к нему можно добавить дополнительные делители, усилители и т.п. Китайский повышающий преобразователь постоянного тока показал себя не с лучшей стороны. В частности, при разгоне ардуино мини и замене кварца на 25Mhz упала стабильность работы устройства, исчезла нулевая полоса на индикаторе сигнала и появились другие проблемы, которых не наблюдалось при включении от стабильного источника питания. По этим причинам я оставил свой вариант устройства без замены кварца, хотя у автора стоит кварц с частотой 27Mhz.

С учетом отображения «пультоскопа» в режиме осциллографа можно выделить 10 информационных полей. 1 — шкала отображения напряжения, имеет автоматическую градуировку 0-1В, 0-5В, 0-15В, 0-3,3В (при опорном напряжении 1,1В). 2 — поле с сеткой, настроенной на масштаб 1, на котором отображается график сигнала. 3 — максимальное напряжение видимого сигнала. 4 – частота сигнала до 2МГц. Частота сигнала до 1,8 вольт измеряется программно, выше — аппаратно (более точно). 5 — первый пункт меню, выбор опорного напряжения (5 или 1,1в). 6 — второй пункт меню, выбор развертки (0-8). 7 — третья точка, масштаб (1:1, 2:1, 3:1). 8 — четвертая точка, позиционирование (1-9). Позиционирование перемещает график сигнала вверх или вниз. 9 — пятый элемент, режим паузы. 10 — шестой пункт, хронометраж.

В режиме генератора есть 3 информационных поля. 1 — процентное отображение ШИМ; 2 — отображение генерируемой частоты; 3 — выбор множителя для изменения частоты или изменения изменения ШИМ.

Хочу отметить момент, когда проект Pultoscope не останавливается и планируется разработка новой (третьей) версии. Он должен содержать внешний АЦП, возможно, встроенный операционный усилитель и другие необходимые усовершенствования.

Bestchart
Добавить комментарий

  1. sergeyaz

    Щуп готовый использовали? Каким волновым сопротивлением коаксиал?

  2. admin

    sergeyaz, щуп самодельный — швейная игла, кабель — часть AV коаксиального кабеля.

  3. Arthur1993

    https://youtu.be/5tGoBKO_CR8                     MC34063 вариант

  4. admin

    Arthur1993, устройство универсальное, каждый добавляет в него, что считает нужным для себя. Жаль, что автор пропал, у него были наработки по поводу увеличения скорости и точности осциллографического пробника.

  5. Arthur1993

    Я начинающий радиолюбитель , не принимаю какой пультоскоп можно собирать

  6. admin

    Arthur1993, определитесь какими функциями Вы будете пользоваться, и выберите нужную версию. Или пересоберите версию для себя.

  7. Arthur1993

    Этот версию АС напражнения работает?

  8. admin

    Да.

  9. arthur1993

    Когда будет третьей версия?

  10. admin

    Скорее всего, ее не будет. На данной комбинации «железа», большего сложно выжать.

  11. apeks1

    советую обратиь внимание на http://radioskot.ru/forum/12-14297-1   простой и достаточно мощный осцилограф получился ?  

  12. admin

    apeks1, имеется видео с примером работы? Программный код открытый?

  13. Arthur_1993

    Где третьей версия на АЦП?

  14. admin

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

  15. arthur_1993

    Вы бы посоветовали собрать эту осциллографию? Добавленно позже (в 13:46 03.11.2018): /user_files/unverified__mj678d52/59753

  16. admin

    arthur_1993, какие характеристики заявлены?  

  17. arthur_1993

    http://radioskot.ru/publ/oscillograf_impuls/1-1-0-1396

  18. admin

    Да, прибор достойный. Можно собирать.

  19. Arthur_1993

    Как я могу сделать прошивка этот пультоскоп , пожалуйста, напишите последовательность шагов?

  20. admin

    Arthur_1993, покупаете любой ttl программатор и через программу IDE arduino заливаете скомпилированный скетч в МК. Всё стандартно. Ознакомьтесь с принципом работы arduino и Вам станет всё ясно.

  21. tolya10

    Ваша версия пультоскопа информативней чем у автора. Но мне нужно к такому же дисплею и Вашей прошивке прикрутить DDS генератор и терминал, но тк с программированием дела не имел попытка скрестить вашу прошивку и авторскую не получаетс. В меню добавил нужные пункты, разделы скопировал в вашу прошивку, до стрелка не хочет выбирать дальше осцила и генератора, если в коде на DDS напишу Generator то соответственно DDS работает но нет генератора :(. Может глянете всетаки код ваш. Или подскажите как вы запустили прошивку автора на 3410. Пробовал подставить ваши исправленные драйвера от 3310 и скомпилировать прошивку автора не хочет. Вот мой код ↓ SPOILER ↓ //Страница проэкта http://srukami.inf.ua/pultoscop_v25110.html //Переделка под дисплей от Nokia 3410 и оптимизация кода https://best-chart.ru #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(«best-chart.ru»); 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(); } ↑ SPOILER ↑ Добавленно позже (в 12:50 18.01.2019): а что под спойлер не прячет?

  22. admin

    tolya10, прошло уже 3 года, тонкостей не помню. И разбираться времени, на данный момент, нет. Попробуйте вносить изменения поэтапно, проверяя каждый раз результат. Так Вы поймете где идет «нестыковка» и поправите ее.

  23. tolya10

    Добрый день. Побеспокою Вас еще раз. Уже месяц воюю с вашей прошивкой. Добавляю пункт меню но он не выбирается. Меню менял, от кучи прошивок ставил на вашу, ваше, с дополнительными пунктами, ставил на другие на других прошивках все работает могу добавить убрать пункты меню. У Вас в прошивке только 2 пункта, причем это pultoskop0 и pultoskop1, если 1 и 2 ( и далее в прошивке изменю подпрограммы на 1 и 2) то выбирает только 1 тк нет 0, если в коде какую либо подпрограмму не вашу, а например DDS или TTL назову как 0 или 1 то она соответственно запустится. Подскажите от чего зависит количество пунктов меню ( про кол-во строк и размер шрифта я догадываюсь ? и их выбор? И еще Вы изменяли драйвера для 3310 там нет заглушки на меню типа 2 пункта и все ( просмотрел не увидел но вам виднее)? Я понимаю что давно дело было, но глядя на Ваши изделия видно что Вы человек аккуратный и где то должны остаться наработки ну или руки то помнят :)Придайте направление.

  24. admin

    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(). Добавленно позже (в 21:46 12.02.2019): Кстати, добавил функцию «SPOILER» в комментариях. Теперь ей можно пользоваться.

  25. tolya10

    Спасибо за оперативный ответ, но если бы все было так просто…. это я сделал сразу хотя и никогда не программировал ни на чем просто просмотрев другие коды понял что за что примерно отвечает и методом тыка сделал, я же и писал что в других кодах могу добавлять убирать итд пункты меню, в вашем работает только pultoskop==0 и pultoskop==1. и более ничего не выбирает. ? к вашему коду приделываетмя любое меню. но все равно не выбирает. Даже если я ничего не трогая и не добавляя просто переименую в вашем коде например pultoskop==0 на pultoskop==2 и далее в коде где встречаются ссылки на pultoskop==0 переименую на pultoskop==2 то и ваш код не выбирает тоже. Хотя казалось бы что я меняю просто указание в меню на какую подпрограмму ссылаться но ничего не происходит. Кстати тоже самое если оставить pultoskop==0 а переименовать pultoskop==1 на pultoskop==2 или3,4,5….. тоже будет выбирать только 0 а другую цифру не выбирает. Почему именно ваш код- адекватно работающий осциллограф и наличие дисплея 3410. Если не получится прийдется брать 5110 ?

  26. admin

    tolya10, Не выбирает, т.к. в коде идет сравнение и значение «2» никак не получить таким путем: if(digitalRead(levo)==HIGH){delay(200);pultoskop=!pultoskop;} if(digitalRead(pravo)==HIGH){delay(200);pultoskop=!pultoskop;} Пробуйте вставить код из файла: ptscp_3410_new_func.ino. Я здесь «набросал» так, как бы сделал сам, но не проверял. Пины прописывайте свои.

  27. tolya10

    Спасибо огромное!!!! Так как Вы написали не заработало, НО я обратил внимание на выскакивающую ошибку nvalid use of Boolean expression as operand to ‘operator—‘ ну методом тыка начал смотреть почему — не работает. Если я ставил -1 или +1 то меню работало но более 2-х пунктов опять не выбирало. Короче открыл ваш и автора скетчи и начал сравнивать построчно и НАШЕЛ почему меню не идет дальше у Вас прописано bool pultoskop=1; //флаг выбора генератора или осциллографа у автора byte pultoskop=0; //флаг выбора генератора или осциллографа после смены bool на byte меню стало идти дальше ( но не — и ++, а -1 и +1) короче так : 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(«Новая Функция»)); display.setCursor(5,55); display.print(utf8rus(«Батарея «)); display.print(batt); display.println(utf8rus(» в»)); if(pultoskop==0) display.setCursor(5,10); if(pultoskop==1) display.setCursor(5,20); if(pultoskop==2) display.setCursor(5,30); display.print(«>»); display.display(); if(digitalRead(levo)==HIGH){delay(200);pultoskop=pultoskop-1;} if(digitalRead(pravo)==HIGH){delay(200);pultoskop=pultoskop+1;} if(pultoskop>2){pultoskop=0;} Еще раз ОГРОМНОЕ СПАСИБО !!!

  28. admin

    tolya10, поздравляю! Когда получите стабильный результат, поделитесь прошивкой и пришлите пару фото. Думаю, людям будет интересно.

  29. arthur_1993

    tolya10 пожалуйста отправить мне твой версия схема и прошивка

  30. tolya10

    arthur_1993, у меня еще ни схема не прошивка не готова.но однозначно часть для осциллографа будет как здесь у admin, остальное может подтяну диодами к питанию. так сказать защита от дурака. По прошивке не могу прикрутить терминал ( нужен в ремонте) мешает утф8 шрифт надо отказываться, или курить мануалы дальше.