Пультоскоп на Arduino 27МГц!!!

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

мда...  даже я так не бухаю...

progrik
Offline
Зарегистрирован: 30.12.2018

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

есть вывод быстрее? нет. я первый. до свидания))

я вас всех люблю))

progrik
Offline
Зарегистрирован: 30.12.2018

кстати, да. ты так не бухаешь, и упаси Господь. эти все реанимации до добра не доводят...

бро, я читал все эти ваши условия про дедовщину. дед прав, когда малолетка лепит пургу. тут я сам стану горой. но какого хера?! посмотри всю мою историю - только один раз я ошибся, когда подумал, что в цифровых сервах обязаны стоять более точные датчики, чем резичторы... всё. всё остальное я отстоял и был прав и мои алго стремятся сделать проще/лучше/быстрее

пизнес.

на этом всё.

Hy6yk
Offline
Зарегистрирован: 14.06.2020

progrik пишет:

скажите мне, дорогие,
почему до сих пор никто не сделал подсчет частоты по всем периодам?
по одному - это бред. что делать, когда 10 периодов на 23 точки?


Может потому, что не все это могут?)) А многим тем кто может, это не интересно?))) у них свои задачи и заботы и в этом пожалуй нет ничего страшного. Мне вот тоже не всегда интересно проходя мимо песочницы, какому-нибудь постороннему оборванцу объяснять, что он неправильно песочные куличи делает))

Где-то почитать про Ваш осциллограф можно?

progrik
Offline
Зарегистрирован: 30.12.2018

подмена понятий. я же не говорю "почему _все_ это не сделали"

кому не интересно - мне не понятно, дуня чтобы кодить...

никто из песочницы не выкладывает обос*анную пирамидку на выставку, и не говорит, вот как можно класть в песочнице...
это раздел _готовых_ _изделий_. а на самом деле это ...(берегу слова)...

на счет "не может, не хочет" - 90+ страниц. девяносто умножить на пятьдесят равно.... да ладно. ну могли бы уже подумать... я за 5 страниц сделал 5 улучшений... или больше... или меньше.. и болтовню парировать вот такую еще надо))

из всего этого -  я прикручу твою трубу слива к водопроводу скотчем... ВСЁ... понимаешь? нет..

у меня очень большой опыт в таких делах. последний раз я после "профессионалов" переписывал демонов на серваке со 128 процессорами, вы сами все знаете этих любителей быстрых серверов)))
а меня всё лечат и лееееее-чат)))

еще кто-то думает, что фар... нет, не фар, не волков. NORTON Commander - все остальное потом...

кто не программировал 21-е прерывание - идут спать))))

progrik
Offline
Зарегистрирован: 30.12.2018

Hy6yk пишет:
...осциллограф можно?
я и говорю, наверное заведу топик.
но во мне есть борьба)
всякие, и особенно некоторые)), так и норовят меня обличить в чем-то... хотя я так и не увидел ни одного примера...
и посему у меня вопрос/предложение
поскольку всё слишком просто для некоторых, или они возмущены отсутствием кода - ну, ребят... я эту погремушку делал не для распространения, а для того, чтобы ПОДСТЕГНУТЬ кодеров неверующих в ТФТ...
меня задолбали в ваших интернетах когда на чб нокиа 3 кадра в скунду умники кличут "а, ну ардуино, понятно.."
понятно?
вот вам и видео, чтобы было понятно.
если я тут выложу только хекс, надо? код я не хочу выкладывать, вы все злые, особенно я))...
я помогу, расскажу абсолютно все гвозди по ТФТ, но писать код за вас я не буду... свои иметь надо....
ДУМАЙТЕ!
 

только один человек тут умеет жирно кодить. это dimax. его слушать!

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

DetSimen пишет:

мда...  даже я так не бухаю...


Может этого алкаша прибанить уже - все равно кроме оскорблений и дешёвых понтов он сюда ничего не привносит.

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

sadman41 пишет:
Может этого алкаша прибанить уже

Я за. 

progrik
Offline
Зарегистрирован: 30.12.2018

DetSimen пишет:
Я за.
я тоже. и если внимать, то я уже давно об этом говорил и просил.
но я очень настаиваю на том, чтобы ты, дедуля, потер _ВСЕ_ мои мессаги.
потри. ты смел потереть мои мессаги вот сейчас? посмей и дальше. потри всё.
код я поправил по мере возможности, хотел еще улучшить. но не код, а кодеров. а тут ты такой - та иди ты на хер, поверь. посмотри все мои мессаги -ни разу я помощи не просил. пошел ты НАХЕР, понятно, уёбок?
я ухожу, идите все в жопу.

благодарите, что у вас нет шустрого цветного ослика-спектрографа лично ёбаного  ДЕДА

ЗАЕБАЛИ!
 

progrik
Offline
Зарегистрирован: 30.12.2018

всем здравомыслящим: мой ослик против местного: даже с учетом того, что именно я местный ослик и разогнал раз в 10-20))) ну,, ну сыпьте))

я фигею)))

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

Напишу админам, пожалуй

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

progrik пишет:

DetSimen пишет:
Я за.
пошел ты НАХЕР, понятно, уёбок?

Слушаю и повинуюсь, моя большая белая госпожа. 

progrik
Offline
Зарегистрирован: 30.12.2018

sadman41 пишет:
Напишу админам, пожалуй
да я им три года ору))) вы дебилы без запятых меня только радуете. раньше печалили, а теперь радуететететтете..

на секунду: просто потом почитай. -я забухал после года. пичаль. зло.

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

ты только дерьмо видишь, вали отсюда. или поспорь с тем, что ты сделал...

ЧЁ ТЫ МНЕ ПАРИШЬ?

progrik
Offline
Зарегистрирован: 30.12.2018

DetSimen пишет:
мэн, ну я не хочу зла...

progrik
Offline
Зарегистрирован: 30.12.2018

DetSimen пишет:
если ты приберешь свою спесь.. и я тоже...
объяснишь мне, нужно ли в изделиях выложить мой ослик с разбором каждой долбанной строки, которой не будет... только помоСЧЬ. помогу найти ошибки.... ЧЕМ Б***Ь Я И ЗАНИМАЮСЬ.. 
я только хочу чтобы наконец отсеять кто "собрать прикольно" и кодеров... и дальше в цвете...
СЦЫКУНЫ

progrik
Offline
Зарегистрирован: 30.12.2018

DetSimen пишет:
кстати, ты бы лучше мне звезду какую вручил за то, что я в этом топике опубликовал видео самого быстрого ослика на ардуино нано)))
я с вас фигею)))
ЗЫ: озадачил адвокатов...))

progrik
Offline
Зарегистрирован: 30.12.2018

дед, переноси в базар, удали... извини... но я прав))

 

ААААААА..

тебя зарамсило ибо я dimax назвал лучшим кодером на это форуме.... понял. корона в руки.

он - dimax просто лучший кодер на этом форуме!

...и когда ты начнешь отличать изотропнотсь от однородности...
ТЫ ДАЖЕ НЕ ПОНИМАЕШЬ))) и тут слово "поверь" теряет всякий смысл... поверь))))

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

progrik пишет:

он - dimax просто лучший кодер на этом форуме!

С этим - большей частью согласен, как железячник, dimax просто несравним по уровню с 99% посетителей этого форума. Себя я даже в расчёт не беру, мне до него как до ЕвгенийП пешком.  Но это не отменяет твоего поведения... 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

progrik, не хочется расстраивать, но я тоже чайник, если например с ЕвгениемП сравнить :) 

progrik
Offline
Зарегистрирован: 30.12.2018

братья, и не очень... мое поведение, агрессия и всё такое легко вызвать, поперев логику и здравый смысл. и никакая книжка не станет на пути у истины)) просто достаточно перестать в меня пихать букварь, настроить логику и постараться сделать что-то лучше. а не бл*ть ждать как дегенерат, пока я в одном слове ошибусь, и на те, всё гавно мира можно слить... нет, не можна))
еще раз: каждая моя посылка нах этих кодеров сопровождается если не кодом, то мыслью и объяснениями ПОЧЕМУ.
если бы все так сыпали, как я, уже давно пришли бы к 42....

progrik
Offline
Зарегистрирован: 30.12.2018

DetSimen пишет:
.. как железячник..
ну ты то должен знать, что нынешний уровень предполагает только заряд затвора... чем быстрее... скоро перестанут париться... как уже перестали уважать прямую линию...

progrik
Offline
Зарегистрирован: 30.12.2018

dimax пишет:
progrik, не хочется расстраивать, но я тоже чайник, если например с ЕвгениемП сравнить :) 

не расстроишь. глядя на всеобщую и всеоблемейшую(чушь) неадекватность - нет...
на секунду: все учителя имеют право на славу. но не они это придумали. но они несут. риспект и поклон.
чту. особенно всезначащего _великого_ математика Фурье... это все юзают, но никто не преклоняется... ПРЕКЛОНИТЕСЬ.... он сделал за вас ВСЁ...
и сразу - не надо. я пытаюсь, ищу...

дать код моего ослика, или поучимся?

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Парни харе воевать.Подскажите лучше,вот такой дисп выписал с али https://aliexpress.ru/item/32914468153.html  возможно ли под него скетч переписать или это в корне все перепахивать придется 

progrik
Offline
Зарегистрирован: 30.12.2018

DetSimen пишет:
dimax просто несравним по уровню с 99% посетителей этого форума.
а прикинь процент вне форума))) долбанные дятлы))) хотя и у тех есть слух и чувство ритма)))

я и говорю...
ну давайте я еще накидаю сюда функцию отличнейшего усреднения. в функции есть стат переменная для накопления. если пришло на 1% отличное от предыдущих - сразу выводим. если нет - усредняем сколько пришло...
в этом топике я НИ РАЗУ не видел обсуждения алгоРИТМОВ, понимать? а в ЭТОМ ВЕСЬ КОДИНГ. пока все тупят ты делишь смещением бит.... а они говорят про синапсы....

progrik
Offline
Зарегистрирован: 30.12.2018

dimax пишет:
progrik, не хочется расстраивать, но я тоже чайник, если например с ЕвгениемП сравнить :) 

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

понимаешь?

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

я буду только ЗА, если меня опустят - вперед.

progrik
Offline
Зарегистрирован: 30.12.2018

внимаем: я клянусь, я стану чище и добрее...

я знаю, что 99999 и 99999 не слышали этого текста....

lilik
Offline
Зарегистрирован: 19.10.2017

progrik пишет:

 

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

понимаешь?

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

я буду только ЗА, если меня опустят - вперед.

О город, город, город мой !, все бля...ди в нём, а я Святой!!! (С)

Админы и старожилы не сносить это надо, а создавать раздел - кунсткамера. Много такого я от буруздунов пьяных слышал, но что бы текстом !!!?

 

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Вообщем,пока люди тешат эго,отпишу сам себе.Начал под свой дисп переделывать скетч отсюда http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=46#comment-249516. Может это и извращение ибо экранчик очень мал.Пока получилось изменить меню пультоскопа,но пришлось с кириллицы перейти на латиницу.Фото приложить не могу телефон не может снять меню в виду того,что я не могу пока фон меню в темный перевести,точнее какая то чехарда с цветами получается.Пишу tft.setTextColor(ST7735_YELLOW);  а  у меня цвет надписи красный.Правлю на  tft.setTextColor(ST7735_GREEN); а у меня надпись Batary то ли розовая,то ли бордовая..

seri0shka
seri0shka аватар
Offline
Зарегистрирован: 19.11.2018

Скорей всего инвертированы цвета, сталкивался с таким. BLACK и WHITE работают нормально? И дайте ссылку на дисплей, по первой ссылке у меня вся страница отображается, непонятно, какой коммент имелся ввиду. Лучше найдите где-то сайт продажи, тогда точно будет понятно.

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

seri0shka пишет:

Скорей всего инвертированы цвета, сталкивался с таким. BLACK и WHITE работают нормально? И дайте ссылку на дисплей, по первой ссылке у меня вся страница отображается, непонятно, какой коммент имелся ввиду. Лучше найдите где-то сайт продажи, тогда точно будет понятно.

 

Виноват,вот скетч на этой страничке http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=46#comment-249516  автора 240265

Дисплей 90х160 ips st7735

Анатолий89
Offline
Зарегистрирован: 16.03.2021

Было подобное,проблема была в инициализации,поищу

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Анатолий89 пишет:
Было подобное,проблема была в инициализации,поищу

Благодарю.

Анатолий89
Offline
Зарегистрирован: 16.03.2021

 Библиотека Adafruit-ST7735,файл Adafruit_ST77xx.h заменил 

#define ST77XX_MADCTL_RGB 0x00

на #define ST77XX_MADCTL_RGB 0x08

mity-spb1959@mail.ru
Offline
Зарегистрирован: 28.05.2021

sakatgg пишет:

Вроде здесь читал, что на 2560 не будет работать, тоже бы попробовал на 2.4″ 320X240 TFT Touchscreen Shield на st7783, сравнил бы скорости

Подкажите, PULTOSCOPE_TFT v2, как кнопки просто на землю замыкание сделать, без резюков, как сделано в   PULTOSCOPE_SSD1306_final2_DDS_Z_EL83_EDITION? Спасибо

P.S. На версию с Oled дисплеем поставил кварц на 25Мг (снял с МП), вроде пашет, на 32Мг - мусор на дисплее

Добрый вечер! Нужна помощь! Не могу найти правку скетча для 25мГц Прошу подсказки! С уважением Александр.

mity-spb1959@mail.ru
Offline
Зарегистрирован: 28.05.2021

 

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

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

Здесь последняя.

 

[/quote]

День добрый господа. Если кто на этой ветке есть. Решил повторить,как индикатор(показометр) для другого генератора.Да и как пультоскоп для наглядки сигнала. Генератор включает сигналы разных устройств готовой продукции TV, медицины.....

Не могу справиться с последним скетчем TFT SPFD5408. На 16мГц работает на 27мГц не хочет. Помогите с правкой скетча!!! С уважением Александр. 

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Анатолий89 пишет:

 Библиотека Adafruit-ST7735,файл Adafruit_ST77xx.h заменил 

#define ST77XX_MADCTL_RGB 0x00

на #define ST77XX_MADCTL_RGB 0x08

В файле Adafruit_ST7735.h  у меня только такой дефайн #define ST7735_MADCTL  0x36 .Поменял ,оказалось отвечает за ориентацию изображения,повернулось влево на 90 градусов

Анатолий89
Offline
Зарегистрирован: 16.03.2021

0x36 это адрес регистра MADCTL,его не надо трогать,надо именно ST77XX_MADCTL_RGB ,и не в adafruit_st7735.h,а в ADAFRUIT_ST77XX.h

Возможно у вас другая библиотека,мало ли...

 

Анатолий89
Offline
Зарегистрирован: 16.03.2021

Анатолий89
Offline
Зарегистрирован: 16.03.2021

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Анатолий89 пишет:

Виноват,у меня либа не обновлена была и не было в ней файла Adafruit_ST77xx.h  ,сейчас обновил и появился,поменял на 0,08 -изменений не  было,вместо желтого шрифта -синий,вместо зеленого розовый

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Решил еще попробовать TFT  экранчик 128х128 1,44 дюйма SPI 

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Скетч пришлось переделать  на отображение латиницы ибо не стал править adafruit GFX .Не пойму пока почему,но при выборе генератора у меня  в зависание уходит плата ардуино нано.Может потому,что у меня вывод генератора занят на дисплее?


//страничка проекта <a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a>
// форум <a href="http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783" rel="nofollow">http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783</a>
// скетч и библиотеку изменил под LCD_ls020 VetalST
// скетч и библиотеку изменил под LCD 1.8 дюйма 160х128 ST7735 Владимир Иванов ( 240265 )
// LCD_ls020 подключаем: 
// к ардуине на ATmega328
//**********************************************************
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <FreqCount.h>
#include <PWM.h>

// For the breakout, you can use any 2 or 3 pins
// These pins will also work for the 1.8" TFT shield
#define TFT_CS    10
#define TFT_RST   9
#define TFT_DC     8

// Option 1 (recommended): must use the hardware SPI pins
// (for UNO thats sclk = 13 and sid = 11) and pin 10 must be
// an output. This is much faster - also required if you want
// to use the microSD card (see the image drawing example)
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

// Option 2: use any pins but a little slower!
//#define TFT_SCLK 13   // set these to be whatever pins you like!
//#define TFT_MOSI 11   // set these to be whatever pins you like!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

#define Out  9   //пин для генератор сигналов и DSS(не менять)
#define dds  9   //пин для генератора dds (не менять)

//#################№№№№№№####пользовательские настройки!
#define levo 4
#define ok 3
#define pravo 2
#define akb A3 //любой своюодный аналоговый пин для измерения напряжения АКБ
#define delit 6 //включен или отключен делитель на х10
#define overclock 16 //Частота на которой работает Ардуино 
byte SinU=30; // =30;   //уровень синхронизации 0 до 255
int PWM = 128;//стартовое значение ШИМ от 0 до 255        
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC=5.0;  //напряжение питания, меряем мультиметром
byte pultoskop=1; //флаг выбора генератора или осциллографа
//###########################################################

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 massDEL[401];
byte menu=1;//переменная верхнего меню
byte razv=5;//значение развертки
byte x=30; //счетчик оси Х
int Vmax=0;// максимальное напряжение 
unsigned long pause=0;//переменная для замены Delay
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
bool clen_p=0;//флаг чистки паузы
long countX=0;
byte sinhMASS=0;
unsigned long count =0;
int prokr=0;
char str[10]; 
int temp;
float armcurrent;
int d=0;

//********************* ОТРИСОВКА ЛИНИИ *********************************
void Line(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
 uint16_t color) {
  bool vektor = abs(x0 - x1) > abs (y0 - y1);
  if (vektor) {
    if (y1 > y0) {
      int h = x1 - x0 + 1;
      int d = y1 - y0 + 1;
      h = h / d;
      for (; y0 <= y1; y0++) {
       tft. drawFastHLine(x0, y0, h, color);
        x0 = x0 + h;
      }
    }
    else {
      int h = x1 - x0 + 1;
      int d = y0 - y1 + 1;
      h = h / d;
      for (; y0 >= y1; y0--) {
       tft. drawFastHLine(x0, y0, h, color);
        x0 = x0 + h;
      }
    }
  }
  else {
    if (y1 > y0) {
      int h = y1 - y0 + 1;
      int d = x1 - x0 + 1;
      h = h / d;
      for (; x1 >= x0; x0++) {
       tft. drawFastVLine(x0, y0, h, color);
        y0 = y0 + h;
      }
    }
    else {
      int h = y0 - y1 + 1;
      int d = x1 - x0 + 1;
      h = h / d;
      for (; x1 >= x0; x1--) {
        tft.drawFastVLine(x1, y1, h, color);
        y1 = y1 + h;
      }
    }
  }
}

//********************* МЕНЮ DDS *********************
void DDS_Menu () {
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);
    tft.println("Treangle");
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       
}

//***************** ОТРИСОВКА В ПАУЗЕ ОСЦИЛОГРАФА *******************
void Pause(){
        tft.fillRect(0, 12, 160, 3, ST7735_BLACK);//стиране шкалы прокрутки
          tft.fillRect(6, 12, 154, 99, ST7735_BLACK);//стиране поле графика
         // tft.fillRect(0,116, 160, 12, ST7735_BLACK);//стиране НИЖНЕГО МЕНЮ 
          //////////////////////////////////////////////////////////////
          tft.drawLine(prokr/4,12,prokr/4+25,12, ST7735_YELLOW);//шкала прокрутки
          tft.drawLine(prokr/4,13,prokr/4+25,13, ST7735_YELLOW);//шкала прокрутки
          tft.drawLine(prokr/4,14,prokr/4+25,14, ST7735_YELLOW);//шкала прокрутки
          
          //++++++++++++++++ СЕТКА
          for(byte i=110;i>18;i=i-3){
            tft.drawPixel(6,i, ST7735_BLUE);
            tft.drawPixel(25,i, ST7735_BLUE); 
            tft.drawPixel(44,i, ST7735_BLUE); 
            tft.drawPixel(63,i, ST7735_BLUE); 
            tft.drawPixel(82,i, ST7735_BLUE); 
            tft.drawPixel(101,i, ST7735_BLUE);
            tft.drawPixel(120,i, ST7735_BLUE); 
            tft.drawPixel(139,i, ST7735_BLUE); 
            tft.drawPixel(158,i, ST7735_BLUE);
           // tft.drawPixel(159,i, ST7735_BLUE);
          }
          for(byte i=6;i<160;i=i+3){
            tft.drawPixel(i,25, ST7735_BLUE);
            tft.drawPixel(i,42, ST7735_BLUE); 
            tft.drawPixel(i,59, ST7735_BLUE);
            tft.drawPixel(i,76, ST7735_BLUE); 
            tft.drawPixel(i,93, ST7735_BLUE); 
            tft.drawPixel(i,110, ST7735_BLUE);
          }
          //////////////////////////////////////////////////////
          x=5;
          for(int y=prokr;y<prokr+146;y++){
            if(razv<7){ x++;}
            if(razv==7){x=x+2;}
            if(razv==8){ x=x+3; }
            if(razv==9){ x=x+4; }
            if(razv==10){ x=x+5; }
            if(x>160){ x=160; }
          // tft.drawPixel(x,110-mass[y]/3,ST7735_GREEN);
           tft.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график
          }
      }

//************* ОТРИСОВКА ВЕРХНЕГО МЕНЮ ************************      
void PrintVmenu(){
tft.fillRect(0, 0, 50, 9, ST7735_BLACK);
          if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
                    
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
    tft.println( "2.2V/d");
        }
        if(opornoe==1){
                   
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "10V/d");
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "0.22V/d");
        }
        if(opornoe==1){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "1V/d");
        }
      }

       tft.setCursor(55, 1);
    tft.println( "Razv");
        sprintf(str, "%d", razv); 
    tft.setCursor(80, 1);
    tft.println( str);

}

//******************* ОТРИСОВКА ГЛАВНОГО МЕНЮ *****************  

void GlavMenu (){

     tft.setTextSize(1);
      tft.setTextColor(ST7735_YELLOW);
      tft.setCursor(35, 35);
      tft.println("OSCILL");
       tft.setCursor(35, 50);
       tft.println("GENERATOR PWM");
       tft.setCursor(35, 65);
        tft.println("GENERATOR DDS");
      tft.setTextColor(ST7735_GREEN);
       tft.setCursor(30, 80);
       tft.println("Batary =");
      armcurrent = analogRead(akb)*VCC/1023;//проверка напряжения на АКБ
      temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
      sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));      
      tft.fillRect(90,85,24,10,ST7735_BLACK);
       tft.setTextColor(ST7735_GREEN);
       tft.setCursor(90, 80);
       tft.println(str);
  
}
  


void setup(){  
  if(opornoe==0){
    ADMUX = 0b11100100;
  }//выбор внутреннего опорного 1,1В
  if(opornoe==1){
    ADMUX = 0b01100100;
  }//Выбор внешнего опорного
SPI.begin;
 SPI.setClockDivider(SPI_CLOCK_DIV2);

  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
 tft.setRotation(3);              //  повернуть по горизонту
  tft.fillScreen(ST7735_BLACK);
  tft.drawRect(0,0,160,128,ST7735_WHITE); // рисуем рамку
  tft.drawRect(2,2,156,125,ST7735_BLUE); // рисуем рамку
  tft.drawRect(4,3,152,121,ST7735_RED); // рисуем рамку
  
 while(digitalRead(ok)==LOW){  
    if(digitalRead(pravo)==HIGH){
     // delay (10);
      while((digitalRead(pravo)==HIGH));
      pultoskop=pultoskop-1;
      if(pultoskop<1)pultoskop=3;
    }
    if(digitalRead(levo)==HIGH){
     // delay (10);
      while((digitalRead(levo)==HIGH));
      pultoskop=pultoskop+1;
      if(pultoskop>3)pultoskop=1;
    }


    if(pultoskop==1){
      GlavMenu ();
 //     tft.setTextSize(1);
      tft.setTextColor(ST7735_RED);
      tft.setCursor(35, 20);
      tft.println("Oscilloscope");

    }
    
    if(pultoskop==2){
     GlavMenu ();
       tft.setCursor(35, 55);
       tft.setTextColor(ST7735_RED);
       tft.println("Generator PWM");
    } 
    
     if(pultoskop==3){
      GlavMenu ();   
       tft.setCursor(35, 85);
       tft.setTextColor(ST7735_RED);
       tft.println("Generator DDS");
    } 
 delay(200); 
  
}  

     tft.fillScreen(ST7735_BLACK);//очистка дисплея
  if(pultoskop==1){
    FreqCount.begin(1000); 
 //   tft.fillScreen(ST7735_BLACK);//очистка дисплея      
  }
  if(pultoskop==2){
    InitTimersSafe(); 
    bool success = SetPinFrequencySafe(Out, frequency);
 //   tft.fillScreen(ST7735_BLACK);//очистка дисплея  
  }
  if(pultoskop==3){
   InitTimersSafe(); 
   bool success = SetPinFrequencySafe(Out,200000);
//   tft.fillScreen(ST7735_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(int i=0;i<255;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          delayMicroseconds(500);
          mass[i]=ADCH;
      }
  }
  if (razv>0){
      for(int i=0;i<255;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          mass[i]=ADCH;
      }
  }
  
}

void MenuT(){//перерисовка нижнего меню    

  if (FreqCount.available()) {count = FreqCount.read();}  //вывод частоты по готовности счетчика
  //#######################################частоты сигнала
  byte Frec1=0;
  long Frec=0;
  bool flagFrec1=0;
  bool flagFrec2=0;
  bool flagFrec3=0;
  for(int y=1;y<255;y++){
    if(flagFrec1==0){
      if(mass[y]<SinU){
        flagFrec2=1;
      }
    }
    if(flagFrec1==0){
      if(flagFrec2==1){
        if(mass[y]>SinU){
          flagFrec1=1;
          Frec1=y;
        }
      }
    }
    if(flagFrec1==1){
      if(mass[y]<SinU){
        flagFrec3=1;
      }
    }
    if(flagFrec3==1){
      if(mass[y]>SinU){
        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)-0.2; }//-0.2 КОРЕКЦИЯ ПОКАЗАНИЙ ЧАСТОТЫ ГЦ //delitel 128
        flagFrec1=0;
        flagFrec3=0;
      }
    }
  }

  //#######################################частоты сигнала

   tft.setTextColor(ST7735_WHITE);
   tft.setCursor(1, 120);
    tft.println( "F=");
    
  if(opornoe==1){
    if((Vmax*VCC/255)>2.8){ countX=count*(overclock/16.0); }
    if((Vmax*VCC/255)<=2.8){ countX=Frec*(overclock/16.0); }
  }
  if(opornoe==0){ countX=Frec*(overclock/16.0); }
  if(countX<1000){
    sprintf(str, "%d Hz", countX);
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(18, 120);
    tft.println( str);  
  }
  if(countX>=1000){
  float countXK=countX/1000.0;
  temp = (countXK - (int)countXK) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д
  sprintf(str, "%d.%03d kHz", (int)countXK, abs(temp));
  tft.setTextColor(ST7735_WHITE);
  tft.setCursor(18, 120);
  tft.println( str);  
  }
  tft.setTextColor(ST7735_WHITE);
   tft.setCursor(18, 120);
    tft.println( str);  
    
    //--------- Напряжение --------------------
  if(digitalRead(delit)==HIGH){//включен или отключен делитель
      if(opornoe==0){ armcurrent = (Vmax*1.1/255)*10; }
     if(opornoe==1){ armcurrent = (Vmax*VCC/255)*10;  }
  }
   else {
     if(opornoe==0){ armcurrent = Vmax*1.1/255; }
     if(opornoe==1){ armcurrent = Vmax*VCC/255;  }
   }
  tft.setTextColor(ST7735_WHITE);
   tft.setCursor(80, 120);
    tft.println( "U =");  
    temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
    sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));
   tft.setTextColor(ST7735_WHITE);
   tft.setCursor(100, 120);
    tft.println( str);  
}

void loop() { 
  if(pultoskop==1){
    while(1){

      //********** ОТРИСОВКА И ПЕРЕБОР ВЕРХНЕГО МЕНЮ ***************************
      
      //***************** опорное  **************************
      if(menu==0){ 
        tft.fillRect(0, 0, 45, 9, ST7735_RED);
       PrintVmenu(); 

        if(digitalRead(pravo)==HIGH){
         tft.fillRect(0, 12, 30, 120, ST7735_BLACK);//стирание напряжения
          opornoe=1;
        }
        if(digitalRead(levo)==HIGH){ 
          tft.fillRect(0, 12, 30, 120, ST7735_BLACK);//стирание напряжения
          opornoe=0;
        }
      }
      /////////////////////////// развертка /////////////////////////////
      if(menu==1){
        tft.fillRect(48, 0, 57, 9, ST7735_RED);
     PrintVmenu();

        if(digitalRead(pravo)==HIGH){//добавть скорость
        delay (30);
        while((digitalRead(pravo)==HIGH));
          razv++;
          if(razv==11){ razv=10;} 
        }
        if(digitalRead(levo)==HIGH){//убавить скорость
        delay (30);
        while((digitalRead(levo)==HIGH));
          razv--;
          if(razv==255){ razv=0; } 
        } 
      }
      ///////////////////// синхронизация /////////////////////////////////
      if(menu==2){  
        prokr=0;
        paus=0;
    PrintVmenu();

  tft.fillRect(105, 0, 174, 9, ST7735_RED); 
  tft.setCursor(95, 1);        
  tft.println( "Sinh");      
        if(digitalRead(levo)==HIGH){
          SinU=SinU-10;
          if(SinU<10){ SinU=10; }
        }
        if(digitalRead(pravo)==HIGH){
          SinU=SinU+10;
          if(SinU>240){ SinU=240; }
        }

        tft.fillCircle(155,110-SinU/3, 3, ST7735_RED);       
        tft.fillCircle(155,110-SinU/3, 1, ST7735_BLACK);
      }      
      ///////////////////// пауза //////////////////////////////////
      if(menu==3){
        paus=1;
        if(clen_p==0){
         clen_p=1; 
         
         tft.fillRect(105, 0, 174, 9, ST7735_RED);
    PrintVmenu();

    tft.setCursor(95, 1);
    tft.println( "Pause");      
      }   
        }    

      if(digitalRead(ok)==HIGH){
        delay (30);
        while((digitalRead(ok)==HIGH));
        menu++;
        tft.fillRect(6, 16, 154, 99, ST7735_BLACK);//стиране поле графика
        tft.fillRect(0,116, 160, 12, ST7735_BLACK);//стиране НИЖНЕГО МЕНЮ 
        if(menu==4){
          menu=0;
          paus=0;
          clen_p=0;
        }
        tft.fillRect(0, 0, 160, 15, ST7735_BLACK);//стиране ВЕРХ МЕНЮ
      }

      //************** ОСЬ НАПРЯЖЕНИЯ ##########################################
      tft.drawLine(2, 20, 2, 114, ST7735_BLUE);
      tft.drawLine(2, 25, 5, 25, ST7735_BLUE); 
      tft.drawLine(2, 42, 5, 42, ST7735_BLUE); 
      tft.drawLine(2, 59, 5, 59, ST7735_BLUE); 
      tft.drawLine(2, 76, 5, 76, ST7735_BLUE); 
      tft.drawLine(2, 93, 5, 93, ST7735_BLUE); 
      tft.drawLine(2, 110,5, 110, ST7735_BLUE); 

      //************ ОСЬ РАЗВЕРТКИ ##########################################
      tft.drawLine(2, 115,158, 115, ST7735_BLUE); 
      //  Черточки ******************     
            for(byte i=6;i<160;i=i+19){
            tft.drawPixel(i,114, ST7735_BLUE); 
            tft.drawPixel(i,113, ST7735_BLUE);
            tft.drawPixel(i,112, ST7735_BLUE); 
 }
      //***************выбор внутреннего опорного 1,1В ########################################
      if(opornoe==0){ ADMUX = 0b11100100; }
      //**************Выбор внешнего опорного ***************************
      if(opornoe==1){ ADMUX = 0b01100100; }
      delay(5);

     if(paus==0){
        Zamer();}
      
      //####################################### определение точки синхронизации
      bool flagSINHRO=0;
      bool flagSINHRnull=0;
      for(int y=1;y<255;y++){
        if(flagSINHRO==0){ if(mass[y]<SinU){ flagSINHRnull=1; }}
        if(flagSINHRO==0){ if(flagSINHRnull==1){ if(mass[y]>SinU){ flagSINHRO=1; sinhMASS=y; } } } }
      //#######################################определение точки синхронизации

      //максимальное значение сигнала ##########################
      Vmax=0; 
      for(int y=1;y<151;y++){ if(Vmax<mass[y]){ Vmax=mass[y]; } }
      //максимальное значение сигнала ##########################
      
      //************************ ОТРИСОВКА ГРАФИКА *************************
      if(paus==0){       
        tft.fillRect(6, 25, 154, 86, ST7735_BLACK);//стиране поле графика        
//***//*************** стиране НИЖНЕГО МЕНЮ **********************
     tft.fillRect(18, 120, 80, 8, ST7735_BLACK);
     tft.fillRect(118, 120, 25, 8, ST7735_BLACK);
//*****************************************************************
        tft.fillCircle(10,110-SinU/3, 2, ST7735_YELLOW);//рисуем уровень синхронизации 
        tft.fillCircle(10,110-SinU/3, 3, ST7735_YELLOW);//рисуем уровень синхронизации        
           x=5;
       for(int y=sinhMASS-1;y<sinhMASS+151;y++){ 

           if(razv<7){ x++; }
          if(razv==7){ x=x+2; }
          if(razv==8){ x=x+3; } 
          if(razv==9){ x=x+4; }
          if(razv==10){ x=x+5; }
          if(x>159){ x=159; } 
   
        Line(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график через Line (быстрее в 2 раза)
        }     
        MenuT();  
      }
     ///////////////////////////// режим паузы //////////////////////////////////////////////// 
     
    if(paus==1){
    
        if(digitalRead(pravo)==HIGH){//листаем
          prokr=prokr+2;
          if(prokr>554){prokr=0; }
      Pause();
        }
      if(digitalRead(levo)==HIGH){//листаем
          prokr=prokr-2;
          if(prokr<0){prokr=554; }
      Pause();
        } 
      }
     // delay(300); // можно удалить или подобрать по скорости обновления экрана
    }
  }
  
  //************************************************************************************************
  //#######################################  режим ренератора от 1 Гц до 2 МГц
  if(pultoskop==2){
    while(1){
      if (flag==0){//флаг выборов режима настройки  Частоты
        if(digitalRead(levo)==HIGH){
          frequency=frequency-mnog;
          if(frequency<0){
            frequency=0;
          }
          bool success = SetPinFrequencySafe(Out, frequency);
          delay(3);//защита от дребезга 
          tft.fillRect(6, 60, 160, 80, ST7735_BLACK);//стирание поля
        }
        if(digitalRead(pravo)==HIGH){
          frequency=frequency+mnog;
          bool success = SetPinFrequencySafe(Out, frequency);
          delay(3);//защита от дребезга 
          tft.fillRect(6, 60, 160, 80, ST7735_BLACK);//стирание поля закрашиваем
        }  
      }
      if (flag==1){//флаг выборов режима настройки ШИМ 
        if(digitalRead(levo)==HIGH){
          PWM=PWM-2;
          if(PWM<0){
            PWM=255;
          } 
          delay(3);//защита от дребезга
          tft.fillRect(6, 6, 160, 40, ST7735_BLACK);//стирание поля
          tft.fillRect(90, 100, 129, 125, ST7735_BLACK);//стирание в низу число шим
        }
        if(digitalRead(pravo)==HIGH){
          PWM=PWM+2;
          if(PWM>255){
            PWM=0;
          } 
          delay(3);//защита от дребезга
          tft.fillRect(6, 6, 160, 40, ST7735_BLACK);//стирание поля 
          tft.fillRect(90, 100, 129, 125, ST7735_BLACK);//стирание в низу число шим
        }  
      }      

      if(digitalRead(ok)==HIGH){//переключение разряда выбора частоты 
        delay (30);
        while((digitalRead(ok)==HIGH));
        hag++;
        if(hag>=6){
          hag=0;
        }
        tft.fillRect(6, 100, 154, 28, ST7735_BLACK);//стирание поля
      }
      ////////////

      tft.setCursor(10, 19);
      tft.setTextColor(ST7735_GREEN);
      tft.setTextSize(2);
      tft.println("PWM =");                                      
     // temp = PWM*100/255;
      tft.setCursor(80, 19);
      tft.println( PWM*100/255,1);      
      tft.setCursor(122, 19);
      tft.println( "%");
      
      armcurrent = (127*PWM/255)+25; // вычисляем длинны линии

      tft.drawLine(6,10,armcurrent,10, ST7735_YELLOW);
      tft.drawLine(6,11,armcurrent,11, ST7735_YELLOW);
      tft.drawLine(6,12,armcurrent,12, ST7735_YELLOW);
      tft.drawLine(6,13,armcurrent,13, ST7735_YELLOW);
      tft.drawLine(6,14,armcurrent,14, ST7735_YELLOW);

      tft.drawLine(6,37,armcurrent,37, ST7735_YELLOW);
      tft.drawLine(6,38,armcurrent,38, ST7735_YELLOW);
      tft.drawLine(6,39,armcurrent,39, ST7735_YELLOW);
      tft.drawLine(6,40,armcurrent,40, ST7735_YELLOW);
      tft.drawLine(6,41,armcurrent,41, ST7735_YELLOW);

      ///////////////////////////////////    
      long frequencyX=frequency*(overclock/16.0);
       tft.setTextSize(2);
      if(frequencyX<1000){
        sprintf(str, "%d Hz", frequencyX);
        tft.setCursor(30, 60);
        tft.setTextColor(ST7735_WHITE);      
        tft.println(str);                  
        tft.setTextSize(1); 
      }
     
      if(frequencyX>=1000&&frequencyX<1000000){
        tft.setTextSize(2);
        armcurrent=frequencyX/1000.0;
        temp = (armcurrent - (int)armcurrent) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%003d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(15, 60);
        tft.setTextColor(ST7735_WHITE);        
        tft.println(str);                
       tft.setTextSize(1);
      }
     
      if(frequencyX>=1000000){
        tft.setTextSize(2);
        armcurrent=frequencyX/1000000.0;
        temp = (armcurrent - (int)armcurrent) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%003d MHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 60);
        tft.setTextColor(ST7735_WHITE);        
        tft.println(str);          
       tft.setTextSize(1);
       
      }  
      if(frequencyX>2000000)frequency=0;

      ////////////////////////////////////////////////////////////// 

        tft.setCursor(5, 100);
        tft.setTextColor(ST7735_BLUE);
        tft.setTextSize(1);
        tft.println(">>");          
    
      if(hag==0){//выбор множителя частоты 
        mnog=1;
        flag=0;
        armcurrent = 1*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);          

      }
      if(hag==1){//выбор множителя частоты
        mnog=10;
        armcurrent = 10*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      }
      if(hag==2){//выбор множителя частоты
        mnog=100;
        armcurrent = 100*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      }
      if(hag==3){//выбор множителя частоты
        mnog=1000;
        armcurrent = 1*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      } 
      if(hag==4){//выбор множителя частоты
        mnog=10000;
        armcurrent = 10*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      } 
      if(hag==5){//выбор  PWM 
        flag=1;
        tft.setTextSize(2);
        tft.setCursor(25, 100);
        tft.setTextColor(ST7735_YELLOW);
        tft.println("PWM =");               
       // temp = PWM*100/255;
        tft.setCursor(95, 100);
        tft.setTextColor(ST7735_YELLOW);      
        tft.println(PWM*100/255,1);                   
        tft.setCursor(132, 100);
        tft.setTextColor(ST7735_YELLOW);
        tft.println("%");               
      }
        tft.setCursor(145, 100);
        tft.setTextColor(ST7735_BLUE);
        tft.setTextSize(1);
        tft.println("<<");         
     

      pwmWrite(Out, PWM);
      delay(50);  
    }
  }
 //************************************************************************************************
  //#######################################  режим DDS ренератор
if(pultoskop==3){
  while(1){
int fr=10;

if(menuDDS==0){
  DDS_Menu ();
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_RED);    
 //   tft.setTextSize(1);
    tft.println("Sinus");      

    delay(400); 
    while(!(PIND & (1<<PIND2))){
    PWM=sinM[d];
    pwmWrite(dds,PWM);
    //delayMicroseconds(fr);
    d++;
    if(d==32){d=0;}}
     menuDDS++;
  }
if(menuDDS==1){
  DDS_Menu ();
    tft.setCursor(35, 50);    
    tft.setTextColor(ST7735_RED);
    tft.println("Treangle");

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=trianglM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
  }
if(menuDDS==2){
  DDS_Menu ();

    tft.setTextColor(ST7735_RED);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    
    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=pilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
  }
if(menuDDS==3){
  DDS_Menu ();

    tft.setCursor(35, 90);
    tft.setTextColor(ST7735_RED);
    tft.println("Pila Obr");       

    delay(400);  
    while(!(PIND & (1<<PIND2))){
      PWM=RpilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
  }
if(menuDDS==4){menuDDS=0;}
}
}
/////////////////////DDS
}
fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Так и есть конфликт пинов, повесил Res на пин 7 и заработал генератор. 

mity-spb1959@mail.ru
Offline
Зарегистрирован: 28.05.2021

Здравствуйте! Судя по переписке у вас хорошие познания в программировании. А я всего лишь в 1975 году паяльник в руки впервые взял. Еле успеваю за изменениями радиотехнической базе. Не будете ли так любезны помочь старому радиолюбителю в правке скетча PULTOSCOPE_TFT_AREF с 16мГц на 27мГц. Заранее благодарен даже если нет

С уважением Александр.

hakan.1498
Offline
Зарегистрирован: 21.02.2020
Всем привет.
Простите, что плохо говорю по-русски.
У меня 3 проблемы.
1-Я не мог добавить настройки контрастности и подсветки в добавленное мной меню. Дальше белого экрана не выходит. Иногда на осциллографе отклоняется.
2-Я выделю переключатель переменного / постоянного тока, но я хочу видеть его на экране, потому что он предотвращает несчастные случаи и дает информацию. Давал вывод кнопки на пин D8 и только при нажатии появляется принтер dc, все перепробовал "насколько мне известно", чтобы текущий код не выдавал половинную и неполную ошибку.
3- Хотя это не так важно, я хотел добавить это, потому что это функция, которая может понадобиться, но я не мог получить сигнал ЭКГ.
Версия Arduino IDE 1.8.12, которую я использую, - это операционная система Linuz.
Я пробовал много библиотек, чтобы исправить проблемы, но многие усугубили ситуацию.
Я новичок в программировании и иногда не могу делать даже простых вещей, потому что все еще учусь.
Надеюсь, найдется кто-то, кто мне поможет и позаботится обо мне, мне это очень нужно.
Я, конечно, не сижу без дела, пока вы решаете свои проблемы, я все еще пытаюсь, но нельзя сказать, что у меня очень хорошо получается :(
Я читал форум (да, я читал), но google translate отстой и работает с вынужденными предположениями.
Я НАДЕЮСЬ, МОЯ НАПИСАННАЯ БЫЛА ПОНЯТИЯ.
Спасибо всем. Я добавляю код и изображения.
 
 
 
// Proje sayfası http://srukami.inf.ua/pultoscop_v25110.html
// === Benden [Electronik83] === mailTo: gsmkillersevsk@mail.ru
// 1. Optimize edildi, kodu taradı
// 2. Ana menüyü daha güzel yaptı, yeni bir öğe eklendi
// 3. Osilatördeki frekansı ve voltajı 1KHz ve 2.5V'de görüntüleme (yazar tarafından bir hata vardı)
// 4. Yeni mod - yavaş osilatör - tamamlandı ...
// 5. Optimizasyon .....
// 6. Osilatörden yayılan yazılım sinyali kaldırıldı (7 ve 8)
// 7. Osilatördeki sinyalin çizimi değiştirildi (bu sinyal bölmeleri artık yok)
// 8. Lanet olası güç düğmesini ve onunla bağlantılı her şeyi kaldırdım - bir geçiş anahtarı (anahtar) koymak daha kolay ...
// 9. Ana menüyü canlandırdı. Sabit titreme.
// 10. Jeneratör menümü, DDS jeneratörü, terminali ekledim.
// on bir. Bazı yeni animasyonlar eklendi.
//12. Bir DDS üreteci ve frekans kontrolü ile bir deney yapıldı - yapılmadı.
// === ver19 ==
//13. Osilatörde - Sinyal genliğinin ortasında otomatik senkronizasyon yaptım <= harici senkronizasyonu düşünün !!!
//on dört. Osilatörde - sinyal genliğinin maksimum ve minimum değerini sağa doğru göster
// on beş. Kodun bazı bölümlerinin optimizasyonu
//on altı. Atmega artık kendi besleme voltajını ölçüyor, multimetre ile herhangi bir şey ölçmenize gerek yok
// 17. Osilatörde - osilatördeki üst satırın daha uygun bir çıkışını yaptı, frekansın çıkışını "stabilize etti".
// - şimdi Hz'den kHz'e (ve tersi) böyle bir sarsılma yok - sadece MHz'e çıktı verin.
// onsekiz. Bir dijital analizör eklendi (A1, A2, A3, A4, A5 girişleri) - beğenmediğim bir şey

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <FreqCount.h>
#include <EEPROM.h>
#include <math.h>  
#include <PWM.h>

// Kullanıcı ayarları - değiştirilebilir

#define OVERCLOCK 16  // Arduino'nun çalıştığı frekans
float VCC=5.0;        // besleme gerilimi (bir multimetre ile ölçülür - GEREKLİ DEĞİLDİR)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 4, 3, 2); // ekranınızın bağlı olduğu pinler
//byte contrast=52; // kontrastı göster
byte contrast; // контрастность дисплея
byte Set=0; // Настройка экрана
bool BL; // Подсветка
bool flag_key;
byte mainMenu=0;  
#define KEY_L  13 // SOL buton (herhangi bir pini kullanabilirsiniz)
#define KEY_OK 12 // OK butonu (herhangi bir pini kullanabilirsiniz)
#define KEY_R  11 // SAĞ düğme (herhangi bir pini kullanabilirsiniz)
#define Ekran  A7  //Экран///Pin///Подсветka
#define KEY_V  8  // AC/DC Değiştirme Tuşu (Sadece Yazı olarak)
#define VBAT   A6 // akü voltajını ölçmek için herhangi bir serbest analog pin, A5 analizöre gittiği için A6 ile değiştirildi!!!
#define KEY_DELAY 200
#define KEY_PRESSED 1

// Değişkenler, tanımlar ve diğer saçmalıklar - anlamla değişir
#define GEN_PIN  9  // sinyal üreteci için pin (değişmez)
#define DDS_PIN  10 // dds üreteci için pin (değişmez)
byte mode=0; // ana menü öğesi
byte menu=0; // menü seçeneği 

#define BUFSIZE 700
#define LCDX 80
byte adcBuf[BUFSIZE];
byte vSync=30;     // senkronizasyon seviyesi
bool vRef=1;  // referans voltaj bayrağı
bool pause=0; // mod bayrağını duraklat
byte razv=5;  
int grOffset=0; // grafiği çalışma modunda kaydır
byte vMax, vMin;// maksimum ve minimum sinyal voltajı 
int kdel=5;           //bulat  автопредел 1,1/0,2 вольта

// Jeneratör için değişkenler
int PWM = 50;// jeneratör için 0'dan 100'e PWM değeri başlatılıyor
unsigned long freq = 500; // jeneratör için Hz cinsinden başlangıç ​​frekans değeri
unsigned long stepFreq = 0;

int d=0; // bir şeyle değiştirilebilir. mesela say....
unsigned long count =0;
long countX=0;

long speedTTL=9600; // terminal hızı

void ShowMode(char y) { // çalışma modunu göster. y - çizileceği çizgi
const char* const modeStr[] PROGMEM= { "  Osiloskop  ", "PWM-Jenerator", "DDS-Jenerator", "UART-Terminal", "Removing AFC ", "   Analyzer  ", "   Ayarlar  "};
  display.setCursor(3, y);      // ekrandaki konumu ayarla
  display.print(modeStr[mode]); // çalışma modunu göster
  
}

void ShowModeInv(char y) { // çalışma modunu tersten göster. y - çizileceği çizgi
  display.drawLine(0, y, 83, y, BLACK);
  display.setTextColor(WHITE, BLACK);
  display.setCursor(0, y+1); display.println(" "); display.setCursor(78, y+1); display.println(" ");  // sadece güzellik için
  ShowMode(y+1);  
  display.setTextColor(BLACK);
}
double Thermister(int RawADC) {
  double Temp;
  Temp = log(((10240000/RawADC) - 10000)); // 10000=10кОм Для подстройки правим.
  Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
  Temp = Temp - 273.15;   // Kelvin to Celcius
  return Temp;
}
void printTemp(void) { 
  display.setTextColor(BLACK);
  display.setCursor(15,37);
  display.print("Temp");
  display.print(float(Thermister(analogRead(0))), 1); // (0) это аналог выход А0
}
const unsigned char PROGMEM logoDDS[] = { // 48x27'lik bir resim çekin ve buraya dönüştürün http://git.robotclass.ru/tools/bmptobin.html
  0x07, 0x80, 0x01, 0x00, 0x18, 0x00, 0x0c, 0xc0, 0x01, 0x00, 0x3c, 0x00, 0x18, 0x60, 0x00, 0x00, 0x66, 0x00, 0x18, 0x60, 0x01, 0x00, 0xc3, 0x00, 
  0x30, 0x30, 0x01, 0x01, 0x81, 0x80, 0x30, 0x30, 0x10, 0x03, 0x00, 0xc0, 0x20, 0x30, 0x31, 0x06, 0x00, 0x60, 0x00, 0x30, 0x31, 0x0c, 0x00, 0x30, 
  0x00, 0x18, 0x60, 0x18, 0x00, 0x18, 0x00, 0x18, 0x61, 0x30, 0x00, 0x0c, 0x00, 0x0c, 0xc1, 0x60, 0x00, 0x06, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6d, 0xb6, 0xda, 0xb6, 0xdb, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x30, 0x04, 0x40, 0x18, 0x00, 
  0x00, 0x70, 0x0d, 0x60, 0x1c, 0x00, 0x00, 0xd0, 0x19, 0x30, 0x16, 0x00, 0x01, 0x90, 0x30, 0x18, 0x13, 0x00, 0x03, 0x10, 0x61, 0x0c, 0x11, 0x80, 
  0x06, 0x10, 0xc1, 0x06, 0x10, 0xc0, 0x0c, 0x11, 0x80, 0x03, 0x10, 0x60, 0x18, 0x13, 0x01, 0x01, 0x90, 0x30, 0x30, 0x16, 0x01, 0x00, 0xd0, 0x18, 
  0x60, 0x1c, 0x00, 0x00, 0x70, 0x0c, 0xc0, 0x18, 0x01, 0x00, 0x30, 0x06, 0x80, 0x10, 0x01, 0x00, 0x10, 0x03};

const unsigned char PROGMEM logoOSC[] = {
  0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x00, 0x00, 0x00, 
  0x00, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x60, 0x00, 0x00, 0x00, 0x01, 0x80, 0x30, 0x00, 0x00, 0x00, 
  0x01, 0x80, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x30, 
  0x06, 0x00, 0x0c, 0x00, 0x00, 0x18, 0x2e, 0xaa, 0xae, 0xaa, 0xae, 0xfc, 0x00, 0x00, 0x06, 0x00, 0x0c, 0x18, 0x00, 0x00, 0x06, 0x00, 0x0c, 0x30, 
  0x00, 0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x60, 0x00, 0x00, 0x01, 0x80, 0x30, 0x60, 0x00, 0x00, 0x01, 0x80, 0x31, 0xfc, 
  0x00, 0x00, 0x00, 0xc0, 0x60, 0x60, 0x00, 0x00, 0x00, 0xc0, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x60, 0x00, 0x00, 0x00, 0x60, 0xc0, 0x60, 
  0x00, 0x00, 0x00, 0x31, 0x80, 0x66, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00};
  
const unsigned char PROGMEM logoGEN[] = {
  0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 
  0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x5d, 0x5d, 0x00, 0x00, 0x00, 
  0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 
  0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xf0, 0x00, 
  0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x33, 0x00, 0x00, 0x01, 0xf0, 0x03, 0x33};

const unsigned char PROGMEM logoTRM[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc1, 0xc0, 0x00, 0x00, 0x00, 
  0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xe0, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xe0, 0xf8, 0x1f, 0x80, 0x00, 0x03, 0x30, 0xee, 0x73, 0x80, 0x00, 
  0x03, 0x30, 0xc6, 0x60, 0x00, 0x00, 0x03, 0xf0, 0xc6, 0x60, 0x00, 0x00, 0x06, 0x18, 0xc6, 0x60, 0x00, 0x00, 0x06, 0x18, 0xee, 0x73, 0x80, 0x00, 
  0x0f, 0x3d, 0xf8, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

 const unsigned char PROGMEM logoOSS[] = {
  0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 
  0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 0x00, 
  0x01, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfc, 0x00, 0x00, 0x30, 
  0x07, 0xff, 0xfc, 0x00, 0x00, 0x18, 0x2f, 0xff, 0xfe, 0xaa, 0xae, 0xfc, 0x0f, 0xff, 0xfe, 0x00, 0x0c, 0x18, 0x0f, 0xff, 0xfe, 0x00, 0x0c, 0x30, 
  0x0f, 0xff, 0xff, 0x00, 0x1c, 0x00, 0x0f, 0xff, 0xff, 0x00, 0x1c, 0x60, 0x0f, 0xff, 0xff, 0x80, 0x3c, 0x60, 0x0f, 0xff, 0xff, 0x80, 0x3d, 0xfc, 
  0x0f, 0xff, 0xff, 0xc0, 0x7c, 0x60, 0x0f, 0xff, 0xff, 0xc0, 0x7c, 0x60, 0x0f, 0xff, 0xff, 0xe0, 0xfc, 0x60, 0x0f, 0xff, 0xff, 0xe0, 0xfc, 0x60, 
  0x0f, 0xff, 0xff, 0xf1, 0xfc, 0x66, 0x0f, 0xff, 0xff, 0xfb, 0xfc, 0x3c, 0x0f, 0xff, 0xff, 0xff, 0xfc, 0x00};

const unsigned char PROGMEM logoDA[] = {
  0x00, 0x00, 0x00, 0x1d, 0x1d, 0xc2, 0x00, 0x00, 0x00, 0x11, 0x14, 0x49, 0x7f, 0xff, 0xff, 0xd9, 0x1c, 0xc1, 0x40, 0x00, 0x00, 0x51, 0x14, 0x49, 
  0x40, 0x00, 0x00, 0x5d, 0xdd, 0xc2, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xd5, 0x55, 0x55, 0x7f, 0xff, 0xff, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x7f, 0xfc, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 
  0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0x40, 0x04, 0x00, 0xd5, 0x57, 0xff, 0xd5, 0x57, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x7f, 0x07, 0xf0, 0x7f, 0x07, 0xf0, 0x41, 0x04, 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, 0x10, 
  0xd5, 0xfd, 0x5f, 0xd5, 0xfd, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xe7, 0x9e, 0x79, 0xe7, 0x9e, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 
  0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, 0xcf, 0x3c, 0xf3, 0xcf, 0x3c, 0xf3};
//yeni eklenen menü ikonu
  const unsigned char LogoEK [] PROGMEM = {
  0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 
  0x00, 0x00, 0x00, 0x01, 0x87, 0xe3, 0x80, 0x00, 0x00, 0x03, 0xcf, 0xf7, 0xc0, 0x00, 0x00, 0x07, 
  0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xfc, 0x7f, 0xc0, 0x00, 
  0x00, 0x03, 0xf0, 0x0f, 0x80, 0x00, 0x00, 0x03, 0xe0, 0x07, 0x80, 0x00, 0x00, 0x03, 0xc0, 0x07, 
  0xc0, 0x00, 0x00, 0x3f, 0xc0, 0x03, 0xfc, 0x00, 0x00, 0x3f, 0x80, 0x03, 0xfc, 0x00, 0x00, 0x3f, 
  0x80, 0x03, 0xfc, 0x00, 0x00, 0x3f, 0x80, 0x03, 0xfc, 0x00, 0x00, 0x3f, 0x80, 0x03, 0xfc, 0x00, 
  0x00, 0x03, 0xc0, 0x03, 0xc0, 0x00, 0x00, 0x03, 0xc0, 0x07, 0x80, 0x00, 0x00, 0x01, 0xf0, 0x0f, 
  0x80, 0x00, 0x00, 0x03, 0xfc, 0x3f, 0xc0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 
  0xff, 0xff, 0xe0, 0x00, 0x00, 0x03, 0xdf, 0xf7, 0xc0, 0x00, 0x00, 0x01, 0x87, 0xe3, 0x80, 0x00, 
  0x00, 0x00, 0x07, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 
  0x00, 0x00};

 
void myDrawPict() {
  for (char a=0; a<27; a++)
    for (char b=0; b<6; b++)
      for (char c=0; c<8; c++) {
        if(pgm_read_byte(&(logoOSC[b+a*6])) & (0x80 >> c)) display.drawPixel((18+c+b*8+count)%588 , 9+a, BLACK); // burada her şeyi iki boyutlu bir diziye doldurabilir ve optimize edebilirsiniz
        if(pgm_read_byte(&(LogoEK [b+a*6])) & (0x80 >> c)) display.drawPixel(18+c+b*8+count-84    , 9+a, BLACK); //Yeni eklenen başa gelecek ve sayılar ona göre sıralacak yoksa şekiller kayıyor.
        if(pgm_read_byte(&(logoDA [b+a*6])) & (0x80 >> c)) display.drawPixel(18+c+b*8+count-168   , 9+a, BLACK);      // ve gereksiz dizilerin oluşturulmasını kes
        if(pgm_read_byte(&(logoOSS[b+a*6])) & (0x80 >> c)) display.drawPixel(18+c+b*8+count-252   , 9+a, BLACK);
        if(pgm_read_byte(&(logoTRM[b+a*6])) & (0x80 >> c)) display.drawPixel(18+c+b*8+count-336   , 9+a, BLACK);
        if(pgm_read_byte(&(logoDDS[b+a*6])) & (0x80 >> c)) display.drawPixel(18+c+b*8+count-420   , 9+a, BLACK);
        if(pgm_read_byte(&(logoGEN[b+a*6])) & (0x80 >> c)) display.drawPixel(18+c+b*8+count-504   , 9+a, BLACK); 

    }
}
// ==== Arduino besleme geriliminin (Vcc) okunması ====
#define Vref11 1.095 // ölçüm sonucuna ince ayar yapmak için
float ReadVcc() {
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); // ADC girişini VCC'ye ayarla !!!
  delay(1);  // ADC'yi ayarlamak için gecikme. Yukarıdaki satırdaki gibi ADMUX (değişmediyse) bunu önleyebilirsiniz.
  ADCSRA |= _BV(ADSC);                                    // ADC dönüşümünü başlat
  while (bit_is_set(ADCSRA, ADSC));                       // ADC'nin çalışmasını bekleyin (biraz ayarlayın)
  return (Vref11 * 1023.0) / (ADCL | (ADCH<<8));          // volt cinsinden dönüştürme sonucu
}

void setup()  {  
  ////////////////////////////Экран//////////////////////////////
//  Примечание. Экран становится темным,  решение проблемы.///////////////////////////////////////
//  EEPROM.write(0, 50);  //  Записать закрытую строку,  Вгрузить,  и начать использовать.
  contrast = EEPROM.read(0);
  BL       = EEPROM.read(1);
  pinMode(Ekran, OUTPUT);
  digitalWrite(Ekran, BL);
//////////////////////////////////////////////////////
  pinMode(KEY_OK, INPUT); pinMode(KEY_L, INPUT); pinMode(KEY_R, INPUT);// pinMode(KEY_V, INPUT);// giriş için butonları ayarla
  display.begin();
  display.setContrast(contrast);
  VCC = ReadVcc();
  count = 1; countX=-1; // cihaz açıldığında ilk modu görüntülemek için gerekli
  
  while(!digitalRead(KEY_OK)) {  // OK butonuna basılana kadar döngü   
    // anket düğmeleri  
    if (digitalRead(KEY_R)) { countX=-6; if (mode==0) count = 588; mode++; if (mode==7  ) mode = 0; count+=countX;} //Menü sayısı buradan değişiyor
    if (digitalRead(KEY_L)) { countX=+6; if (count ==588) count =   0; mode--; if (mode==255) mode = 6; count+=countX;} //Geri gitme menü sayısı 255 sabit değer

    while (countX!=0) { // canlandırmanız gerekiyorsa (kaydırın)
      display.clearDisplay();  // ekran arabelleğini temizle
      // kaydırmada dinamik grafikler
      #define COUNT 84 // görüntü genişliği, piksel cinsinden
      for (char a=3; a<14; a+=2) {
        //display.drawLine((count+a   )%COUNT, a+4, (count+a   )%COUNT, 40-a, BLACK); // sol taraftaki çizgiler
        //display.drawLine((count-a+83)%COUNT, a+4, (count-a+83)%COUNT, 40-a, BLACK); // sağ taraftaki çizgiler
      }
      myDrawPict(); // 16..20ms. DrawBitmap iki kat daha uzun sürer ...
      display.drawRect(0, 0, 83, 5, BLACK); display.drawLine(83, 1, 83,  3, BLACK); // pil kutusu
      display.drawLine(0, 1, d-2, 1, BLACK); display.drawLine(0, 2, d-1, 2, BLACK); display.drawLine(0, 3, d  , 3, BLACK); // pil değerini çiz
      if(count % 84 == 0) { // artık kaydırmanız gerekmiyorsa
        countX=0; // kaydırmaya gerek yok diyoruz ve statik ile çalışıyoruz...
        ShowModeInv(39);
        display.drawRect(16, 7, 52, 31, BLACK); // resmin etrafını çerçevele
        display.drawRect(0, 0, 83, 5, BLACK); display.drawLine(83, 1, 83,  3, BLACK); // pil kutusu
      }
      count += countX;
      display.display();       
    }
    // dinamik grafikler kaydırmada değil - pilleri çekin
    d = analogRead(VBAT)*84.0/1024; // varsayılan ADC ayarlarıyla akü voltajını oku
    display.drawLine(0, 1,  81, 1, WHITE); display.drawLine(0, 2,  81, 2, WHITE); display.drawLine(0, 3, 81 , 3, WHITE); // eski değeri beyaza boya
    display.drawLine(0, 1, d-2, 1, BLACK); display.drawLine(0, 2, d-1, 2, BLACK); display.drawLine(0, 3, d  , 3, BLACK); // yeni pil değeri çiz
    //delay(50); // şarj seviyesini ve düğmeleri aynı anda görüntülemeyi geciktir    
    display.display();    
  } // Tamam tıklama döngüsü
  // menüden OK butonuna tıkla, başlat ve menüden çık
  count=0; countX=0; // her ihtimale karşı değişkenleri geri yükle
  if (mode==0) FreqCount.begin(1000);
  if (mode==1) { InitTimersSafe(); bool success = SetPinFrequencySafe(GEN_PIN, freq); pwmWrite(GEN_PIN, PWM*2.55); }
  if (mode==2) { InitTimersSafe(); bool success = SetPinFrequencySafe(GEN_PIN, 200000); }
  if (mode==4) razv = 0;
  if (mode==5) { DDRC = 0x00; PORTC=0x00; } // girişte ve pull-up olmadan tüm port C (bu A0 ... A5)
  // Tamam düğmesinin sıçrama önleme
  for (char a=37; a>0; a-=2) { display.clearDisplay(); ShowModeInv(a); display.display(); } // - bunun yerine bu delay(200); 
}
// sonsuz döngü - aslında, alt programlara atlıyoruz
void loop() {
  switch (mode) { // Ana menüden seçilen moda atla
    case 0 : Oscil();        break; // salınım içine "bırak"
    case 1 : Generator();    break; // jeneratöre "bırak" 
    case 2 : DdsGenerator(); break; // DDS oluşturucuya "bırak"
    case 3 : Terminal();     break; // USART alıcısına "bırak"
    case 4 : OscilSlow();    break; // yavaş bir osilatöre "bırakma"
    case 5 : LogAnalyzer();    break; // yavaş bir osilatöre "bırakma"
 
    
    
  }  
}
//  === ADC'den veri okuyun ve arabelleğe koyun === //
void ReadAdc() {
  if (razv%10) { // (razv>0)        // herhangi bir gecikme olmadan süpürme varsa (1'den 7'ye kadar)
    ADCSRA = 0b11100000 | (8-(razv%10)); // böleni ayarla (/ 2 - çalışmıyor, bu yüzden / 4 ile başla)
    for(int i=0; i<BUFSIZE; i++) {  // okuma döngüsü 
      while (!(ADCSRA & 0x10));     // ADC'nin hazır olmasını bekleyin
      ADCSRA|=0x10;                 // sonraki dönüşümü başlat
      adcBuf[i]=ADCH;               // diziye veri yaz
    }
    delay(0.3*BUFSIZE);             // 0'a kıyasla gecikme telafisi ...
  } else {                          // gecikmelerle süpür (delay)
    ADCSRA = 0b11100111;            // bölen / 128
    for(int i=0; i<BUFSIZE; i++) {  // okuma döngüsü
      while (!(ADCSRA & 0x10));     // ADC'nin hazır olmasını bekleyin
      ADCSRA|=0x10;                 // sonraki dönüşümü başlat
      delayMicroseconds(500);       // gecikme yap
      adcBuf[i]=ADCH;               // diziye veri yaz
    }
  }
}

// === Osiloskop === //
void Oscil() {


  // ADC referans voltajının ayarlanması ve ADC girişinin ayarlanması
  ADMUX = vRef ? 0b01100011 : 0b11100011;   
  // === İşlem düğmeleri === //
  if (digitalRead(KEY_L))   switch (menu) { // sol düğme:)
    case 0 : vRef=!vRef;                                                    break; // referans voltajını değiştir
    case 1 : razv--; if(razv==255) razv=6;                                  break; // taramayı değiştir
    case 2 : grOffset-=20; if (grOffset<0) grOffset=0;                      break; // duraklamada grafikte ilerleyin
  }
  if (digitalRead(KEY_R))  switch (menu) { // sağ düğme:)
    case 0 : vRef=!vRef;                                                    break; // referans voltajını değiştir
    case 1 : razv++; if (razv==7) razv=0;                                   break; // taramayı değiştir
    case 2 : grOffset+=20; if(grOffset>BUFSIZE-LCDX) grOffset=BUFSIZE-LCDX; break; // duraklamada grafikte ilerleyin
  }
    if (digitalRead(KEY_V))   switch (menu) { // DC/AC düğme:)                                               
    case 1 :   display.setCursor(0,40);
    display.setTextSize(1);
    display.print("DC");
    display.display();                                  break; // taramayı değiştir
    }
//    case 2 :   display.setCursor(0,40);
//  display.setTextSize(1);
 // display.print("AC");
//  display.display(); 
 // }       
  if (digitalRead(KEY_OK))  switch (++menu) {
    case 2: grOffset=0; pause=1;  break; // duraklatmaya girin - sıçrama önleyici tip
    case 3: menu=0; pause=0;      break; // menü üzerinde yineleme
  }

  // === Hesaplama yapmak === //
  if (!pause) { // duraklama yoksa
    ReadAdc();  // sonra osilogramı kaldırıyoruz
    // == Maksimum ve minimum sinyal değerlerini hesaplayın == //
    vMax=0; vMin = 0xFF; 
    for (int y=1; y<255; y++) { if (vMax<adcBuf[y]) vMax=adcBuf[y]; if (vMin>adcBuf[y]) vMin=adcBuf[y]; } // 255 şimdilik, ama denememiz gerekiyor
    vSync = (vMax-vMin) / 2 + vMin; // sinyal seviyesinin ortasındaki senkronizasyon seviyesi
    // == Eşitleme noktasının belirlenmesi == //
    bool flagZero=0; grOffset = 0; // bayrağı ve senkronizasyon noktasını sıfırla   
    // Daha düşük bir seviyeden daha yüksek bir seviyeye fark aranıyor
    for (int y=1; y<BUFSIZE-LCDX; y++) { // tüm ADC veri dizisine bakın
      if (adcBuf[y]<vSync) flagZero=1;   // senkronizasyondan daha az bulundu (eksi olarak sinyal düşüşü) - bayrağı ayarlayın
      if (flagZero && adcBuf[y]>vSync) { grOffset=y; break; } // synchro'dan fazlasını buldu (artı sinyal düşüşü) - hatırla ve döngüden çık
    }
    // === Sinyal frekansını okuyun === //
    if (vRef && vMax*VCC/255 > 2.7) { // donanımla ölçebiliyorsak - ölçün        
      if (FreqCount.available()) count = FreqCount.read(); // sinyal frekans sayacı hazır olduğunda frekansı çıkar
    } else { // === Sinyal frekansını programlı olarak ölçün === //
      flagZero=0; count = 0; // bayrağı ve sayacı sıfırla
      for(int y=grOffset; y<BUFSIZE-LCDX; y++)  { // diziye senkronizasyon noktasından sonuna kadar bakın
        if (adcBuf[y]<vSync) flagZero=1;   // senkronizasyondan daha az bulundu (eksi olarak sinyal düşüşü) - bayrağı ayarlayın
        if (flagZero && adcBuf[y]>vSync) { // synchra'dan daha fazlasını buldu (artı sinyal düşüşü) - tüm periyodu yakaladı
            switch (razv) { // periyodun frekansını say
              case 6: count=1000000/((y-grOffset-1)*3.25);    break; // bölen 4
              case 5: count=1000000/((y-grOffset)  *3.25)/2;  break; // bölen 8
              case 4: count=1000000/((y-grOffset)  *3.25)/4;  break; // bölen 16
              case 3: count=1000000/((y-grOffset)  *3.25)/8;  break; // bölen 32
              case 2: count=1000000/((y-grOffset)  *3.25)/16; break; // bölen 64
              case 1: count=1000000/((y-grOffset)  *3.25)/32; break; // bölen 128
              case 0: count=1000000/((y-grOffset)  *510);     break; // bölen 128 Ayrıca
            }          
          break; 
        }       
      }
    }
    count = count * OVERCLOCK / 16.0; // frekansın farklı kristallere yeniden hesaplanması
  } // hesaplamaları yapmayı bitirdim

  display.clearDisplay(); // ekranı temizle ...
  // === Osilatör menüsünün çizilmesi ===
  if (menu==0) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
  if (vRef) display.print(VCC,1); else display.print("1.1"); 
  if (menu==1) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
  display.print(" ");  display.print(razv);
  if (menu==2) { display.print(" "); display.setTextColor(WHITE, BLACK); delay(200);  display.print(" Pause "); } else display.setTextColor(BLACK); // geri kalan gecikmeleri telafi etmek için bir gecikme var
  display.setTextColor( BLACK);
  display.print(" ");
  
  if (!pause) display.print (count/1000000.0, 6); // frekans çıkışı
    else { // duraklatma modunda kaydırma çiz
    display.drawLine(grOffset/8,8,grOffset/8+6,8, BLACK); display.drawLine(grOffset/8,9,grOffset/8+6,9, BLACK); } // kaydırma çubuğu
 
  if (vRef && vMax*VCC/255 > 2.7) { display.setCursor(42, 0); display.print("_"); }  // ölçüm donanım ise, noktayı "kök"
  
  display.setCursor(66, 10); display.print(vMax * (vRef ? VCC : 1.1) / 255, 1); // sinyalin maksimum voltajını çizin 
  display.setCursor(66, 40); display.print(vMin * (vRef ? VCC : 1.1) / 255, 1); // minimum sinyal voltajını çiz 
    
  // == Izgarayı oluşturma == //
  for(byte i=47;i>5;i=i-7) { display.drawLine( 0, i, 2, i, BLACK); } // sola çizgiler 
  for(byte i=47;i>5;i=i-3) { display.drawPixel(21,i, BLACK);display.drawPixel(42,i, BLACK);display.drawPixel(63,i, BLACK); }
  for(byte i=3;i<84;i=i+3) { display.drawPixel(i,33, BLACK);display.drawPixel(i,19, BLACK);}    
  // == Grafiğin çizilmesi == // 
  for(int y=0; y<80; y++) display.drawLine(y+4, 47-adcBuf[y+grOffset]/7, y+4, 47-adcBuf[y+grOffset+1]/7, BLACK);
  display.display(); // ekran arabelleğini ekrana boşalt


}

// JENERATÖR MODU
void Generator() {  
  // aynı anda düğmeleri işleme ve çizim
  display.clearDisplay();
  ShowModeInv(0);
  if(digitalRead(KEY_OK)) { if(menu++==7) menu=0; delay(KEY_DELAY); } // rakamların üzerinden geç / PWM'yi değiştir
  if (menu==7) { // PWM'yi değiştir
    if(digitalRead(KEY_L)) { PWM--; if(PWM<0)   PWM=100; delay(KEY_DELAY); }
    if(digitalRead(KEY_R)) { PWM++; if(PWM>100) PWM=0;   delay(KEY_DELAY); }
    pwmWrite(GEN_PIN, PWM*2.55); // PWM'yi ayarla
    display.setTextColor(WHITE, BLACK); // şimi değiştirirsek, tersini çizeriz
    display.drawLine(15, 39, 68+(PWM==100?6:0)+(PWM<10?-6:0), 39, BLACK); // daha fazla ters çevirme için üstte şerit
  } else { // frekansı değiştir
    if(digitalRead(KEY_L)) {
      if (freq>stepFreq)  freq-=stepFreq;              // izin verilen aralığın ötesine geçmeye izin verme
      SetPinFrequencySafe(GEN_PIN, freq/(OVERCLOCK/16.0)); // frekansı ayarla
      delay(KEY_DELAY); // düğmeler için gecikme
    }
    if(digitalRead(KEY_R)) {
      if ((freq+stepFreq)<10000000) freq+=stepFreq;    // izin verilen aralığın ötesine geçmeye izin verme
      SetPinFrequencySafe(GEN_PIN, freq/(OVERCLOCK/16.0)); // frekansı ayarla
      delay(KEY_DELAY); // düğmeler için gecikme
    }  
    display.setTextColor(BLACK); // PWM değiştirilmediyse normal metni seçin
    #define XFREQ 14 // ======== // ve çizgili on yıllık frekansı seçin
    stepFreq=pow(10, (byte)menu); if (menu>1) stepFreq++; // buggy üssü düzelt, neden 10 üzeri 2 = 99?
    byte menu_t = menu; if (menu>2) menu_t++; if (menu==6) menu_t++; // frekans tablosunu yap
    menu_t = 54 - menu_t * 6; // şeritlerin konumunu hesapla
    display.drawLine(menu_t, XFREQ-2, menu_t+4, XFREQ-2, BLACK); // çizgiler çiz
    display.drawLine(menu_t, XFREQ-3, menu_t+4, XFREQ-3, BLACK);
    display.drawLine(menu_t, XFREQ+8, menu_t+4, XFREQ+8, BLACK);          
    display.drawLine(menu_t, XFREQ+9, menu_t+4, XFREQ+9, BLACK);
  }
  // PWM seviyesini çizin (daha önce ayarlanan metin inversiyonu)
  display.setCursor(15, 40); // imleci koy))
  display.print(" PWM=");  display.print(PWM);  display.print("% "); // PWM seviyesini göster
  display.setTextColor(BLACK); // frekansı görüntülerken inversiyonu kaldır
  // sıklığı sekmelerle çizin 
  display.setCursor(6, XFREQ);
  for (unsigned long freq_t = 1000000; freq_t>0; freq_t/=10) {
  if (freq>=freq_t) {
    display.print((freq/freq_t)%10); if (freq_t==1000000 || freq_t==1000) display.print("'"); }  else { 
    display.print("_");              if (freq_t==1000000 || freq_t==1000) display.print(" "); }
  }
  display.print(" Hz");  
  // PWM grafiği çiz
  for (char x=17; x<67; ) {
    if (PWM!=0)             display.drawLine(x, 26, x+PWM/4, 26, BLACK); x+=PWM/4;       // üst 
    if (PWM!=0 && PWM!=100) display.drawLine(x, 26, x, 36, BLACK);                       // durgunluk
    if (PWM!=100)           display.drawLine(x, 36, x+25-PWM/4, 36, BLACK); x+=25-PWM/4; // alt
    if (PWM!=0 && PWM!=100 && x<43) display.drawLine( x, 36, x, 26, BLACK);              // tırmanış
  }
  display.display(); // arabelleği ekrana boşalt
}

// === DDS oluşturucu ===
void DdsGenerator() {
  static const byte ddsWave[][32] PROGMEM = {        
    2,10,21,37,57,79,103,127,152,176,198,218,234,245,253,255,253,245,233,218,198,176,152,128,103,79,57,37,21,10,2,0,   // El83_sinNew    
    16,32,48,64,80,96,112,128,143,159,175,191,207,223,239,255,239,223,207,191,175,159,143,128,112,96,80,64,48,32,16,0, // El83_treugNew    
    8,16,25,33,41,49,58,66,74,82,90,99,107,115,123,132,140,148,156,165,173,181,189,197,206,214,222,230,239,247,255,0,  // El83_pilaNew
    255,247,239,230,222,214,206,197,189,181,173,165,156,148,140,132,123,115,107,99,90,82,74,66,58,49,41,33,25,16,8,0,  // El83_pilaObrNew
    73, 74, 75, 75, 74, 73, 73, 73, 73, 72, 71, 69, 68, 67, 67, 67, 68, 68, 67, 65, 62, 61, 59, 57, 56, 55, 55, 54, 54, 54, 55, 55,
    55, 55, 55, 55, 54, 53, 51, 50, 49, 49, 52, 61, 77, 101, 132, 169, 207, 238, 255, 254, 234, 198, 154, 109, 68, 37, 17, 5, 0, 1, 
    6, 13, 20, 28, 36, 45, 52, 57, 61, 64, 65, 66, 67, 68, 68, 69, 70, 71, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 73, 73, 74, 75, 
    75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 88, 91, 93, 96, 98, 100, 102, 104, 107, 109, 112, 115, 118, 121, 123, 125, 126, 127, 
    127, 127, 127, 127, 126, 125, 124, 121, 119, 116, 113, 109, 105, 102, 98, 95, 92, 89, 87, 84, 81, 79, 77, 76, 75, 74, 73, 72, 70, 
    69, 68, 67, 67, 67, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 70, 71, 72, 73, 73, 74, 74, 75, 75, 75, 75, 75, 75, 74, 74, 73, 73, 
    73, 73, 72, 72, 72, 71, 71, 71, 71, 71, 71, 71, 70, 70, 70, 69, 69, 69, 69, 69, 70, 70, 70, 69, 68, 68, 67, 67, 67, 67, 66, 66, 
    66, 65, 65, 65, 65, 65, 65, 65, 65, 64, 64, 63, 63, 64, 64, 65, 65, 65, 65, 65, 65, 65, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 
    65, 66, 67, 68, 69, 71, 72, 73};
    
    // El83_pilaObrNew
  const char* const ddsStr[] PROGMEM = { "    Sinus", "    Ucgen", "   Testere", "Ters  Testere", "     ECG  "};
  byte ddsCount=0;
  // DDS oluşturucuyu çizin
  display.clearDisplay(); ShowModeInv(0); // işlem modu, başlık
  for (byte i=0; i<84;) display.drawLine(i, 36-pgm_read_byte(&ddsWave[menu][i%32])/10, i, 36-pgm_read_byte(&ddsWave[menu][(i++)%32])/10, BLACK);
  display.setCursor(3, 40);  display.print(ddsStr[menu]);  display.display(); // her şeyi render etti  
  while(!digitalRead(KEY_R)) { // düğmeye basılana kadar seçilen sinyali göster
    pwmWrite(DDS_PIN, pgm_read_byte(&ddsWave[menu][(ddsCount++)&0x1F]));
    //ResetAvrCheck();
  }
  if (++menu==5) menu = 0; // düğmeye basıldı - modu değiştir
  delay(KEY_DELAY); // butonlara normal şekilde basılması için
}

// UART alıcısı
void Terminal() {
  const long speedUart[] = { 1200,2400,4800,9600,19200,38400,57600,115200 };
  display.clearDisplay(); 
  ShowModeInv(0);  
  display.setCursor(15,15); display.println("Hiz:");
  display.setTextColor(WHITE, BLACK); 
  display.setCursor(66, 25); display.println("+");
  display.setCursor(13, 25); display.print("-");
  display.setTextColor(BLACK);
  display.println(" ");      
  display.print(speedUart[menu]);
  display.println(" ");
  display.setCursor(9,40); display.println("OK - Baslat");
  if(digitalRead(KEY_L))  { menu--; if(menu==255) menu=7;   delay(KEY_DELAY);  }
  if(digitalRead(KEY_R))  { menu++; if(menu==8)   menu=0;   delay(KEY_DELAY);  }
  if(digitalRead(KEY_OK)) {
    Serial.begin(speedUart[menu]*(16/OVERCLOCK));
    display.clearDisplay();
    display.print(">"); 
    delay(KEY_DELAY);  
    display.display();
    int x=83;
    while (1) {
      //ResetAvrCheck();     
      if (Serial.available()) { // Arabellekte veri varsa
        if(++x==84) { // ekranı temizleme zamanının gelip gelmediğini kontrol et
          x=0;
          display.clearDisplay();
        }
        display.print((char)(Serial.read())); // görüntülenecek baytı yazdır
        display.display(); // sembolü göster
      } 
    }         
  } 
  display.display();  
}

void SetTextColor(char c) {
  if (c) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
}

void OscilSlow() { 
// ana frenciyi bulmamız gerekiyor !!!!!!!!!
  
  ADMUX = vRef ? 0b01100011 : 0b11100011; // ADC referans voltajını ayarla 
  //ADCSRA = 0b11100110; // ADC frekans bölücü - 64
  //ADCSRA = 0b11100010; //delitel 4 // Conder'ın boşalmak için zamanı yok
  ADCSRA = 0b11100011; //delitel 8
  ADCSRA|=0x10; // ADC dönüşümünü başlat
    
  // === İşlem düğmeleri ===
  if (digitalRead(KEY_L )) { switch (menu) { // fikir şudur - düğmeyi bir kez yoklarız, çünkü bu yavaşça yapılır, sonra davaların üzerinden atlarız.
    case 0 : vRef = !vRef;                      break;   // voltaj referansını seç
    case 1 : razv--; if (razv==255)  razv=2;    break;   // süpürme seçimi: 1000ms 500ms hücre başına 100ms
    case 2 : grOffset-=10; if(grOffset<0)  grOffset=700; break;  // modu duraklat - osilogramı kaydır
    case 3 : for (int y=0; y<700; y++) adcBuf[y] = 0; count=0; grOffset=0;
             display.clearDisplay(); display.setCursor(3, 20); display.print("The buffer is cleared!"); 
             display.display(); delay(1000);    break; 
    } delay(200); } // buton anti-sıçrama
  if (digitalRead(KEY_R )) { switch (menu) {
    case 0 : vRef = !vRef;                      break;   // voltaj referansını seç
    case 1 : razv++; if (razv==3)    razv=0;    break;   // süpürme seçimi: 1000ms 500ms hücre başına 100ms
    case 2 : grOffset+=10; if(grOffset>1402) grOffset=0;  break;   // modu duraklat - osilogramı kaydır
  } delay(200); } // buton anti-sıçrama
  if (digitalRead(KEY_OK)) { menu++; if (menu==4) { menu=0; pause=0; } // menü üzerinde yineleme
                                        if (menu==2) { pause=1; 
    adcBuf[(count++)%701] = 255; adcBuf[(count++)%701] = 0; adcBuf[(count++)%701] = 255; if (count>79) grOffset = count - 80; } // grafikte bir duraklama işaretleyin
    delay(200);    } // buton anti-sıçrama
  // === Çizim menüleri ===
  display.clearDisplay();  display.setCursor(0,0);
  SetTextColor(menu==0); if (vRef) display.print(VCC,1); else display.print("1.1");
  SetTextColor(menu==1); display.print(" ");   display.print(razv);
  SetTextColor(menu==2); display.print(" P");  display.print(" ");
  display.print((grOffset%701)/7.04, 0);  display.print("%");
  SetTextColor(menu==3); display.print(" C");
  display.setTextColor( BLACK);
  // === Izgarayı oluşturma ===
  for(byte i=47;i>5;i=i-7) { display.drawLine( 0, i, 2, i, BLACK); } // sola çizgiler 
  for(byte i=47;i>5;i=i-3) { display.drawPixel(21,i, BLACK);display.drawPixel(42,i, BLACK);display.drawPixel(63,i, BLACK); } // dikey noktalı çizgi
  for(byte i=3;i<84;i=i+3) { display.drawPixel(i,33, BLACK);display.drawPixel(i,19, BLACK);}                                 // yatay noktalı çizgi
  // === Grafiğin çizilmesi ===  
  for (int y=0; y<80; y++) display.drawLine(y+4, 47, y+4, 47-adcBuf[(y + grOffset)%701]/7, BLACK);
  if (pause) { // duraklama varsa kaydırma çubuğunu çizin
    display.drawLine((grOffset%701)/9,8,(grOffset%701)/9+6,8, BLACK); // kaydırma çubuğu
    display.drawLine((grOffset%701)/9,9,(grOffset%701)/9+6,9, BLACK); // kaydırma çubuğu               
  } else { // duraklatılmazsa, okumaları alın
     while (!(ADCSRA & 0x10)); // ADC'nin okumasını bekleyin    
     adcBuf[count%701]=ADCH; // ADC'deki sayıyı bir diziye kaydedin
     if (count>79) grOffset = count - 80;
     count++;
     if (count>1401) count=701; // döngü sayacı
     // 45ms - program çalışıyor
     switch (razv) {
       case 0 : delay(55*(OVERCLOCK/16.0)); break; // hücre başına saniye
       case 1 : delay(05*(OVERCLOCK/16.0)); break; // hücre başına yarım saniye
       case 2 : break; // gecikme yok .......
     }
  }  
  display.display();    
}

// === Tüm C portlarından (A0 ... A5) dijital verileri oku === //
void ReadDig() {
  if (razv==9) {
    for(int i=0; i<BUFSIZE; i++) adcBuf[i]=PINC;  // verileri hızlı bir şekilde oku
  } else {
    for(int i=0; i<BUFSIZE; i++) { adcBuf[i]=PINC; delayMicroseconds((9-razv)*100); } // verileri oku
  } 
}

// ==== Mantıksal analizör ==== //
void LogAnalyzer() {
  // düğmeleri işle
  if (digitalRead(KEY_L))   switch (menu) {
    case 0 : razv--; if(razv==255) razv=9; delay(400);                        break;
    case 1 : grOffset-=20; if (grOffset<0) grOffset=0;                        break;    
  }
  if (digitalRead(KEY_R))  switch (menu) {
    case 0 : razv++; if (razv==10) razv=0; delay(400);                        break;
    case 1 : grOffset+=20; if(grOffset>BUFSIZE-LCDX) grOffset=BUFSIZE-LCDX;   break;
  }       
  if (digitalRead(KEY_OK))  switch (++menu) { 
    case 1: grOffset=0; pause=1; break; // duraklama gir
    case 2: menu=0;     pause=0; break; // menü üzerinde yineleme
  }
  
  if (!pause) ReadDig(); // duraklama yoksa verileri okuyun

  display.clearDisplay(); // ekranı temizle 
  display.print(razv);    // açmayı göster
  display.print(" ");
  if (pause) { 
    display.print(" Pause ");
    // duraklatma modunda kaydırma çiz
    display.drawLine(grOffset/8,8,grOffset/8+6,8, BLACK); // kaydırma çubuğu
    display.drawLine(grOffset/8,9,grOffset/8+6,9, BLACK); // kaydırma çubuğu
    delay(200); 
  }   
  for(byte i=47;i>12;i=i-7) { display.drawLine( 0, i-5, 2, i-5, BLACK); display.drawPixel(0, i, BLACK); display.drawPixel(2, i, BLACK); } // sola çizgiler 
  // yatay noktalı çizgi
  for(byte i=5;i<84;i=i+3) { display.drawPixel(i,47, BLACK); display.drawPixel(i,40, BLACK); display.drawPixel(i,33, BLACK); display.drawPixel(i,26, BLACK); display.drawPixel(i,19, BLACK); } 
  for (int y=0; y<80; y++) {
    for (int x=0; x<5; x++)  {  
      display.drawLine(y+4, 47-(x*7)-(bit_is_set(adcBuf[y+grOffset], 5-x)?5:0), y+4, 47-(x*7)-(bit_is_set(adcBuf[y+1+grOffset], 5-x)?5:0), BLACK);
    }   
  }
  display.display();
}

void Menu_ekrana() {
  Set = 0; delay(200);

  while (digitalRead(KEY_OK) != KEY_PRESSED) {
    display.clearDisplay();
    ShowModeInv(1);
    if (Set == 0) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
    display.setCursor(0 , 12); display.println("Сontr:"); display.setTextColor(BLACK);
    display.setCursor(60 , 12); display.println(contrast);
    display.setCursor(0 , 22); display.println("Light:"); display.setTextColor(BLACK);
    if (BL == 1) { display.setCursor(60 , 22); display.println("ON");} else
                 { display.setCursor(60 , 22); display.println("OFF");} display.display();
    if (digitalRead(KEY_R) == KEY_PRESSED)  contrast++;
    if (digitalRead(KEY_L) == KEY_PRESSED)  contrast--;
    if (contrast < 30) contrast = 30;
    if (contrast > 80) contrast = 80;
    display.setContrast(contrast);
//    print_My_Ver(); //вывод информации о версии
    display.display();
    delay(150);
  }
  Set = 1; delay(200);
  while (digitalRead(KEY_OK) != KEY_PRESSED) {
    display.clearDisplay();
    ShowModeInv(1);
    display.setCursor(0 , 12); display.println("Сontr:");
    display.setCursor(60 , 12); display.println(contrast);
    if (Set == 1) display.setTextColor(WHITE, BLACK); else display.setTextColor(BLACK);
    display.setCursor(0 , 22); display.println("Light:"); display.setTextColor(BLACK);
    if (BL == 1) { display.setCursor(60 , 22); display.println("ON"); digitalWrite(Ekran, BL); } else
                 { display.setCursor(60 , 22); display.println("OFF"); digitalWrite(Ekran, BL);  }
    if (digitalRead(KEY_R) == KEY_PRESSED)  BL=1;
    if (digitalRead(KEY_L) == KEY_PRESSED)  BL=0;
//    print_My_Ver(); //вывод информации о версии
    display.display();
    delay(150);
  }
  display.display();
  display.clearDisplay();  // чистим буфер экранчика
  EEPROM.write(0, contrast);
  EEPROM.write(1, BL);
  void (* reboot)(void) = 0;
  reboot();

}

//***************************************************************************************************************************
void lcd_pgm_string(const char *data) {
  unsigned char cc;
  while(1) {
    cc = pgm_read_byte(data);
    if((cc == 0)) return;
     display.write(cc);
    data++;
  }
}

 

 

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

hakan.1498 пишет:

Всем привет.
Простите, что плохо говорю по-русски.
У меня 3 проблемы.
1-Я не мог добавить настройки контрастности и подсветки в добавленное мной меню. Дальше белого экрана не выходит. Иногда на осциллографе отклоняется.
2-Я выделю переключатель переменного / постоянного тока, но я хочу видеть его на экране, потому что он предотвращает несчастные случаи и дает информацию. Давал вывод кнопки на пин D8 и только при нажатии появляется принтер dc, все перепробовал "насколько мне известно", чтобы текущий код не выдавал половинную и неполную ошибку.
3- Хотя это не так важно, я хотел добавить это, потому что это функция, которая может понадобиться, но я не мог получить сигнал ЭКГ.
Версия Arduino IDE 1.8.12, которую я использую, - это операционная система Linuz.
Я пробовал много библиотек, чтобы исправить проблемы, но многие усугубили ситуацию.
Я новичок в программировании и иногда не могу делать даже простых вещей, потому что все еще учусь.
Надеюсь, найдется кто-то, кто мне поможет и позаботится обо мне, мне это очень нужно.
Я, конечно, не сижу без дела, пока вы решаете свои проблемы, я все еще пытаюсь, но нельзя сказать, что у меня очень хорошо получается :(
Я читал форум (да, я читал), но google translate отстой и работает с вынужденными предположениями.
Я НАДЕЮСЬ, МОЯ НАПИСАННАЯ БЫЛА ПОНЯТИЯ.
Спасибо всем. Я добавляю код и изображения.
 

Вот  за контрастность экрана строчки отвечают 

void setup()  { 

  ////////////////////////////Экран//////////////////////////////

//  Примечание. Экран становится темным,  решение проблемы.///////////////////////////////////////

//  EEPROM.write(0, 50);  //  Записать закрытую строку,  Вгрузить,  и начать использовать.

  contrast = EEPROM.read(0);

  BL       = EEPROM.read(1);

  pinMode(Ekran, OUTPUT);

  digitalWrite(Ekran, BL);

Надо раскоментировать эту строку  EEPROM.write(0, 50);

 

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

DEL

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

mity-spb1959@mail.ru пишет:

Здравствуйте! Судя по переписке у вас хорошие познания в программировании. А я всего лишь в 1975 году паяльник в руки впервые взял. Еле успеваю за изменениями радиотехнической базе. Не будете ли так любезны помочь старому радиолюбителю в правке скетча PULTOSCOPE_TFT_AREF с 16мГц на 27мГц. Заранее благодарен даже если нет

С уважением Александр.

Может это видео поможет Вам?   https://youtu.be/g6vt7my9g0w

seri0shka
seri0shka аватар
Offline
Зарегистрирован: 19.11.2018

mity-spb1959@mail.ru, какой именно скетч Вы используете. Ссылку, номер поста, автора.