что-же ты не помогаешь страждущим? ты видишь, что местные не юзают 2 в степени... о чем ты? что не так я написал? я сказал: говно - оно и есть.
добавлено: 9 строк на одну поменять? ничего? где был ты?
я сказал мой ослик самый быстрый - так и есть. мне просто обидно смотреть на эту дичь когда всякие вроде тебя ходят мимо..
кстати, да. ты так не бухаешь, и упаси Господь. эти все реанимации до добра не доводят...
бро, я читал все эти ваши условия про дедовщину. дед прав, когда малолетка лепит пургу. тут я сам стану горой. но какого хера?! посмотри всю мою историю - только один раз я ошибся, когда подумал, что в цифровых сервах обязаны стоять более точные датчики, чем резичторы... всё. всё остальное я отстоял и был прав и мои алго стремятся сделать проще/лучше/быстрее
скажите мне, дорогие,
почему до сих пор никто не сделал подсчет частоты по всем периодам?
по одному - это бред. что делать, когда 10 периодов на 23 точки?
Может потому, что не все это могут?)) А многим тем кто может, это не интересно?))) у них свои задачи и заботы и в этом пожалуй нет ничего страшного. Мне вот тоже не всегда интересно проходя мимо песочницы, какому-нибудь постороннему оборванцу объяснять, что он неправильно песочные куличи делает))
подмена понятий. я же не говорю "почему _все_ это не сделали"
кому не интересно - мне не понятно, дуня чтобы кодить...
никто из песочницы не выкладывает обос*анную пирамидку на выставку, и не говорит, вот как можно класть в песочнице...
это раздел _готовых_ _изделий_. а на самом деле это ...(берегу слова)...
на счет "не может, не хочет" - 90+ страниц. девяносто умножить на пятьдесят равно.... да ладно. ну могли бы уже подумать... я за 5 страниц сделал 5 улучшений... или больше... или меньше.. и болтовню парировать вот такую еще надо))
из всего этого - я прикручу твою трубу слива к водопроводу скотчем... ВСЁ... понимаешь? нет..
у меня очень большой опыт в таких делах. последний раз я после "профессионалов" переписывал демонов на серваке со 128 процессорами, вы сами все знаете этих любителей быстрых серверов)))
а меня всё лечат и лееееее-чат)))
еще кто-то думает, что фар... нет, не фар, не волков. NORTON Commander - все остальное потом...
кто не программировал 21-е прерывание - идут спать))))
я и говорю, наверное заведу топик.
но во мне есть борьба)
всякие, и особенно некоторые)), так и норовят меня обличить в чем-то... хотя я так и не увидел ни одного примера...
и посему у меня вопрос/предложение
поскольку всё слишком просто для некоторых, или они возмущены отсутствием кода - ну, ребят... я эту погремушку делал не для распространения, а для того, чтобы ПОДСТЕГНУТЬ кодеров неверующих в ТФТ...
меня задолбали в ваших интернетах когда на чб нокиа 3 кадра в скунду умники кличут "а, ну ардуино, понятно.."
понятно?
вот вам и видео, чтобы было понятно.
если я тут выложу только хекс, надо? код я не хочу выкладывать, вы все злые, особенно я))...
я помогу, расскажу абсолютно все гвозди по ТФТ, но писать код за вас я не буду... свои иметь надо....
ДУМАЙТЕ!
только один человек тут умеет жирно кодить. это dimax. его слушать!
я тоже. и если внимать, то я уже давно об этом говорил и просил.
но я очень настаиваю на том, чтобы ты, дедуля, потер _ВСЕ_ мои мессаги.
потри. ты смел потереть мои мессаги вот сейчас? посмей и дальше. потри всё.
код я поправил по мере возможности, хотел еще улучшить. но не код, а кодеров. а тут ты такой - та иди ты на хер, поверь. посмотри все мои мессаги -ни разу я помощи не просил. пошел ты НАХЕР, понятно, уёбок?
я ухожу, идите все в жопу.
да я им три года ору))) вы дебилы без запятых меня только радуете. раньше печалили, а теперь радуететететтете..
на секунду: просто потом почитай. -я забухал после года. пичаль. зло.
но - логика, - хотя-бы желание понять как работает другое и почему не работает мое..
ты не понял, что я разогнал ослик в 20 раз? ты не понял, чтоя уже дам для ленивых формулу и код, чтобы ровнее и правильнее?
ты только дерьмо видишь, вали отсюда. или поспорь с тем, что ты сделал...
если ты приберешь свою спесь.. и я тоже...
объяснишь мне, нужно ли в изделиях выложить мой ослик с разбором каждой долбанной строки, которой не будет... только помоСЧЬ. помогу найти ошибки.... ЧЕМ Б***Ь Я И ЗАНИМАЮСЬ..
я только хочу чтобы наконец отсеять кто "собрать прикольно" и кодеров... и дальше в цвете...
СЦЫКУНЫ
кстати, ты бы лучше мне звезду какую вручил за то, что я в этом топике опубликовал видео самого быстрого ослика на ардуино нано)))
я с вас фигею)))
ЗЫ: озадачил адвокатов...))
С этим - большей частью согласен, как железячник, dimax просто несравним по уровню с 99% посетителей этого форума. Себя я даже в расчёт не беру, мне до него как до ЕвгенийП пешком. Но это не отменяет твоего поведения...
братья, и не очень... мое поведение, агрессия и всё такое легко вызвать, поперев логику и здравый смысл. и никакая книжка не станет на пути у истины)) просто достаточно перестать в меня пихать букварь, настроить логику и постараться сделать что-то лучше. а не бл*ть ждать как дегенерат, пока я в одном слове ошибусь, и на те, всё гавно мира можно слить... нет, не можна))
еще раз: каждая моя посылка нах этих кодеров сопровождается если не кодом, то мыслью и объяснениями ПОЧЕМУ.
если бы все так сыпали, как я, уже давно пришли бы к 42....
ну ты то должен знать, что нынешний уровень предполагает только заряд затвора... чем быстрее... скоро перестанут париться... как уже перестали уважать прямую линию...
progrik, не хочется расстраивать, но я тоже чайник, если например с ЕвгениемП сравнить :)
не расстроишь. глядя на всеобщую и всеоблемейшую(чушь) неадекватность - нет...
на секунду: все учителя имеют право на славу. но не они это придумали. но они несут. риспект и поклон.
чту. особенно всезначащего _великого_ математика Фурье... это все юзают, но никто не преклоняется... ПРЕКЛОНИТЕСЬ.... он сделал за вас ВСЁ...
и сразу - не надо. я пытаюсь, ищу...
Парни харе воевать.Подскажите лучше,вот такой дисп выписал с али https://aliexpress.ru/item/32914468153.html возможно ли под него скетч переписать или это в корне все перепахивать придется
dimax просто несравним по уровню с 99% посетителей этого форума.
а прикинь процент вне форума))) долбанные дятлы))) хотя и у тех есть слух и чувство ритма)))
я и говорю...
ну давайте я еще накидаю сюда функцию отличнейшего усреднения. в функции есть стат переменная для накопления. если пришло на 1% отличное от предыдущих - сразу выводим. если нет - усредняем сколько пришло...
в этом топике я НИ РАЗУ не видел обсуждения алгоРИТМОВ, понимать? а в ЭТОМ ВЕСЬ КОДИНГ. пока все тупят ты делишь смещением бит.... а они говорят про синапсы....
progrik, не хочется расстраивать, но я тоже чайник, если например с ЕвгениемП сравнить :)
бро, моя училка по истории говорила, что женщина не может быть сверху... это банально физика...
понимаешь?
ты кросавчег, нигде в споре тебя нет, но весь твой код, что я видел - идеален... а я именно против всего хорошего)) понимать?) регистровые переменные видал? не поднял? без них можно, но тут вообще об этом не думают. знаешь, как дураку нежно говоришь, что он дурачёк? я больше не могу, нет времени....
бро, моя училка по истории говорила, что женщина не может быть сверху... это банально физика...
понимаешь?
ты кросавчег, нигде в споре тебя нет, но весь твой код, что я видел - идеален... а я именно против всего хорошего)) понимать?) регистровые переменные видал? не поднял? без них можно, но тут вообще об этом не думают. знаешь, как дураку нежно говоришь, что он дурачёк? я больше не могу, нет времени....
я буду только ЗА, если меня опустят - вперед.
О город, город, город мой !, все бля...ди в нём, а я Святой!!! (С)
Админы и старожилы не сносить это надо, а создавать раздел - кунсткамера. Много такого я от буруздунов пьяных слышал, но что бы текстом !!!?
Вообщем,пока люди тешат эго,отпишу сам себе.Начал под свой дисп переделывать скетч отсюда http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=46#comment-249516. Может это и извращение ибо экранчик очень мал.Пока получилось изменить меню пультоскопа,но пришлось с кириллицы перейти на латиницу.Фото приложить не могу телефон не может снять меню в виду того,что я не могу пока фон меню в темный перевести,точнее какая то чехарда с цветами получается.Пишу tft.setTextColor(ST7735_YELLOW); а у меня цвет надписи красный.Правлю на tft.setTextColor(ST7735_GREEN); а у меня надпись Batary то ли розовая,то ли бордовая..
Скорей всего инвертированы цвета, сталкивался с таким. BLACK и WHITE работают нормально? И дайте ссылку на дисплей, по первой ссылке у меня вся страница отображается, непонятно, какой коммент имелся ввиду. Лучше найдите где-то сайт продажи, тогда точно будет понятно.
Скорей всего инвертированы цвета, сталкивался с таким. BLACK и WHITE работают нормально? И дайте ссылку на дисплей, по первой ссылке у меня вся страница отображается, непонятно, какой коммент имелся ввиду. Лучше найдите где-то сайт продажи, тогда точно будет понятно.
Вроде здесь читал, что на 2560 не будет работать, тоже бы попробовал на 2.4″ 320X240 TFT Touchscreen Shield на st7783, сравнил бы скорости
Подкажите, PULTOSCOPE_TFT v2, как кнопки просто на землю замыкание сделать, без резюков, как сделано в PULTOSCOPE_SSD1306_final2_DDS_Z_EL83_EDITION? Спасибо
P.S. На версию с Oled дисплеем поставил кварц на 25Мг (снял с МП), вроде пашет, на 32Мг - мусор на дисплее
Добрый вечер! Нужна помощь! Не могу найти правку скетча для 25мГц Прошу подсказки! С уважением Александр.
День добрый господа. Если кто на этой ветке есть. Решил повторить,как индикатор(показометр) для другого генератора.Да и как пультоскоп для наглядки сигнала. Генератор включает сигналы разных устройств готовой продукции TV, медицины.....
Не могу справиться с последним скетчем TFT SPFD5408. На 16мГц работает на 27мГц не хочет. Помогите с правкой скетча!!! С уважением Александр.
Библиотека Adafruit-ST7735,файл Adafruit_ST77xx.h заменил
#define ST77XX_MADCTL_RGB 0x00
на #define ST77XX_MADCTL_RGB 0x08
В файле Adafruit_ST7735.h у меня только такой дефайн #define ST7735_MADCTL 0x36 .Поменял ,оказалось отвечает за ориентацию изображения,повернулось влево на 90 градусов
Виноват,у меня либа не обновлена была и не было в ней файла Adafruit_ST77xx.h ,сейчас обновил и появился,поменял на 0,08 -изменений не было,вместо желтого шрифта -синий,вместо зеленого розовый
Скетч пришлось переделать на отображение латиницы ибо не стал править 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
}
Здравствуйте! Судя по переписке у вас хорошие познания в программировании. А я всего лишь в 1975 году паяльник в руки впервые взял. Еле успеваю за изменениями радиотехнической базе. Не будете ли так любезны помочь старому радиолюбителю в правке скетча PULTOSCOPE_TFT_AREF с 16мГц на 27мГц. Заранее благодарен даже если нет
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++;
}
}
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);
Здравствуйте! Судя по переписке у вас хорошие познания в программировании. А я всего лишь в 1975 году паяльник в руки впервые взял. Еле успеваю за изменениями радиотехнической базе. Не будете ли так любезны помочь старому радиолюбителю в правке скетча PULTOSCOPE_TFT_AREF с 16мГц на 27мГц. Заранее благодарен даже если нет
мда... даже я так не бухаю...
что-же ты не помогаешь страждущим? ты видишь, что местные не юзают 2 в степени... о чем ты? что не так я написал? я сказал: говно - оно и есть.
добавлено: 9 строк на одну поменять? ничего? где был ты?
я сказал мой ослик самый быстрый - так и есть. мне просто обидно смотреть на эту дичь когда всякие вроде тебя ходят мимо..
есть вывод быстрее? нет. я первый. до свидания))
я вас всех люблю))
кстати, да. ты так не бухаешь, и упаси Господь. эти все реанимации до добра не доводят...
бро, я читал все эти ваши условия про дедовщину. дед прав, когда малолетка лепит пургу. тут я сам стану горой. но какого хера?! посмотри всю мою историю - только один раз я ошибся, когда подумал, что в цифровых сервах обязаны стоять более точные датчики, чем резичторы... всё. всё остальное я отстоял и был прав и мои алго стремятся сделать проще/лучше/быстрее
пизнес.
на этом всё.
скажите мне, дорогие,
почему до сих пор никто не сделал подсчет частоты по всем периодам?
по одному - это бред. что делать, когда 10 периодов на 23 точки?
Может потому, что не все это могут?)) А многим тем кто может, это не интересно?))) у них свои задачи и заботы и в этом пожалуй нет ничего страшного. Мне вот тоже не всегда интересно проходя мимо песочницы, какому-нибудь постороннему оборванцу объяснять, что он неправильно песочные куличи делает))
Где-то почитать про Ваш осциллограф можно?
подмена понятий. я же не говорю "почему _все_ это не сделали"
кому не интересно - мне не понятно, дуня чтобы кодить...
никто из песочницы не выкладывает обос*анную пирамидку на выставку, и не говорит, вот как можно класть в песочнице...
это раздел _готовых_ _изделий_. а на самом деле это ...(берегу слова)...
на счет "не может, не хочет" - 90+ страниц. девяносто умножить на пятьдесят равно.... да ладно. ну могли бы уже подумать... я за 5 страниц сделал 5 улучшений... или больше... или меньше.. и болтовню парировать вот такую еще надо))
из всего этого - я прикручу твою трубу слива к водопроводу скотчем... ВСЁ... понимаешь? нет..
у меня очень большой опыт в таких делах. последний раз я после "профессионалов" переписывал демонов на серваке со 128 процессорами, вы сами все знаете этих любителей быстрых серверов)))
а меня всё лечат и лееееее-чат)))
еще кто-то думает, что фар... нет, не фар, не волков. NORTON Commander - все остальное потом...
кто не программировал 21-е прерывание - идут спать))))
но во мне есть борьба)
всякие, и особенно некоторые)), так и норовят меня обличить в чем-то... хотя я так и не увидел ни одного примера...
и посему у меня вопрос/предложение
поскольку всё слишком просто для некоторых, или они возмущены отсутствием кода - ну, ребят... я эту погремушку делал не для распространения, а для того, чтобы ПОДСТЕГНУТЬ кодеров неверующих в ТФТ...
меня задолбали в ваших интернетах когда на чб нокиа 3 кадра в скунду умники кличут "а, ну ардуино, понятно.."
понятно?
вот вам и видео, чтобы было понятно.
если я тут выложу только хекс, надо? код я не хочу выкладывать, вы все злые, особенно я))...
я помогу, расскажу абсолютно все гвозди по ТФТ, но писать код за вас я не буду... свои иметь надо....
ДУМАЙТЕ!
только один человек тут умеет жирно кодить. это dimax. его слушать!
мда... даже я так не бухаю...
Может этого алкаша прибанить уже - все равно кроме оскорблений и дешёвых понтов он сюда ничего не привносит.
Я за.
но я очень настаиваю на том, чтобы ты, дедуля, потер _ВСЕ_ мои мессаги.
потри. ты смел потереть мои мессаги вот сейчас? посмей и дальше. потри всё.
код я поправил по мере возможности, хотел еще улучшить. но не код, а кодеров. а тут ты такой - та иди ты на хер, поверь. посмотри все мои мессаги -ни разу я помощи не просил. пошел ты НАХЕР, понятно, уёбок?
я ухожу, идите все в жопу.
благодарите, что у вас нет шустрого цветного ослика-спектрографа лично ёбаного ДЕДА
ЗАЕБАЛИ!
всем здравомыслящим: мой ослик против местного: даже с учетом того, что именно я местный ослик и разогнал раз в 10-20))) ну,, ну сыпьте))
я фигею)))
Напишу админам, пожалуй
Слушаю и повинуюсь, моя большая белая госпожа.
на секунду: просто потом почитай. -я забухал после года. пичаль. зло.
но - логика, - хотя-бы желание понять как работает другое и почему не работает мое..
ты не понял, что я разогнал ослик в 20 раз? ты не понял, чтоя уже дам для ленивых формулу и код, чтобы ровнее и правильнее?
ты только дерьмо видишь, вали отсюда. или поспорь с тем, что ты сделал...
ЧЁ ТЫ МНЕ ПАРИШЬ?
объяснишь мне, нужно ли в изделиях выложить мой ослик с разбором каждой долбанной строки, которой не будет... только помоСЧЬ. помогу найти ошибки.... ЧЕМ Б***Ь Я И ЗАНИМАЮСЬ..
я только хочу чтобы наконец отсеять кто "собрать прикольно" и кодеров... и дальше в цвете...
СЦЫКУНЫ
я с вас фигею)))
ЗЫ: озадачил адвокатов...))
дед, переноси в базар, удали... извини... но я прав))
ААААААА..
тебя зарамсило ибо я dimax назвал лучшим кодером на это форуме.... понял. корона в руки.
он - dimax просто лучший кодер на этом форуме!
...и когда ты начнешь отличать изотропнотсь от однородности...
ТЫ ДАЖЕ НЕ ПОНИМАЕШЬ))) и тут слово "поверь" теряет всякий смысл... поверь))))
он - dimax просто лучший кодер на этом форуме!
С этим - большей частью согласен, как железячник, dimax просто несравним по уровню с 99% посетителей этого форума. Себя я даже в расчёт не беру, мне до него как до ЕвгенийП пешком. Но это не отменяет твоего поведения...
progrik, не хочется расстраивать, но я тоже чайник, если например с ЕвгениемП сравнить :)
братья, и не очень... мое поведение, агрессия и всё такое легко вызвать, поперев логику и здравый смысл. и никакая книжка не станет на пути у истины)) просто достаточно перестать в меня пихать букварь, настроить логику и постараться сделать что-то лучше. а не бл*ть ждать как дегенерат, пока я в одном слове ошибусь, и на те, всё гавно мира можно слить... нет, не можна))
еще раз: каждая моя посылка нах этих кодеров сопровождается если не кодом, то мыслью и объяснениями ПОЧЕМУ.
если бы все так сыпали, как я, уже давно пришли бы к 42....
на секунду: все учителя имеют право на славу. но не они это придумали. но они несут. риспект и поклон.
чту. особенно всезначащего _великого_ математика Фурье... это все юзают, но никто не преклоняется... ПРЕКЛОНИТЕСЬ.... он сделал за вас ВСЁ...
и сразу - не надо. я пытаюсь, ищу...
дать код моего ослика, или поучимся?
Парни харе воевать.Подскажите лучше,вот такой дисп выписал с али https://aliexpress.ru/item/32914468153.html возможно ли под него скетч переписать или это в корне все перепахивать придется
я и говорю...
ну давайте я еще накидаю сюда функцию отличнейшего усреднения. в функции есть стат переменная для накопления. если пришло на 1% отличное от предыдущих - сразу выводим. если нет - усредняем сколько пришло...
в этом топике я НИ РАЗУ не видел обсуждения алгоРИТМОВ, понимать? а в ЭТОМ ВЕСЬ КОДИНГ. пока все тупят ты делишь смещением бит.... а они говорят про синапсы....
понимаешь?
ты кросавчег, нигде в споре тебя нет, но весь твой код, что я видел - идеален... а я именно против всего хорошего)) понимать?) регистровые переменные видал? не поднял? без них можно, но тут вообще об этом не думают. знаешь, как дураку нежно говоришь, что он дурачёк? я больше не могу, нет времени....
я буду только ЗА, если меня опустят - вперед.
внимаем: я клянусь, я стану чище и добрее...
я знаю, что 99999 и 99999 не слышали этого текста....
бро, моя училка по истории говорила, что женщина не может быть сверху... это банально физика...
понимаешь?
ты кросавчег, нигде в споре тебя нет, но весь твой код, что я видел - идеален... а я именно против всего хорошего)) понимать?) регистровые переменные видал? не поднял? без них можно, но тут вообще об этом не думают. знаешь, как дураку нежно говоришь, что он дурачёк? я больше не могу, нет времени....
я буду только ЗА, если меня опустят - вперед.
О город, город, город мой !, все бля...ди в нём, а я Святой!!! (С)
Админы и старожилы не сносить это надо, а создавать раздел - кунсткамера. Много такого я от буруздунов пьяных слышал, но что бы текстом !!!?
Вообщем,пока люди тешат эго,отпишу сам себе.Начал под свой дисп переделывать скетч отсюда http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=46#comment-249516. Может это и извращение ибо экранчик очень мал.Пока получилось изменить меню пультоскопа,но пришлось с кириллицы перейти на латиницу.Фото приложить не могу телефон не может снять меню в виду того,что я не могу пока фон меню в темный перевести,точнее какая то чехарда с цветами получается.Пишу tft.setTextColor(ST7735_YELLOW); а у меня цвет надписи красный.Правлю на tft.setTextColor(ST7735_GREEN); а у меня надпись Batary то ли розовая,то ли бордовая..
Скорей всего инвертированы цвета, сталкивался с таким. BLACK и WHITE работают нормально? И дайте ссылку на дисплей, по первой ссылке у меня вся страница отображается, непонятно, какой коммент имелся ввиду. Лучше найдите где-то сайт продажи, тогда точно будет понятно.
Скорей всего инвертированы цвета, сталкивался с таким. BLACK и WHITE работают нормально? И дайте ссылку на дисплей, по первой ссылке у меня вся страница отображается, непонятно, какой коммент имелся ввиду. Лучше найдите где-то сайт продажи, тогда точно будет понятно.
Виноват,вот скетч на этой страничке http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=46#comment-249516 автора 240265
Дисплей 90х160 ips st7735
Было подобное,проблема была в инициализации,поищу
Благодарю.
Библиотека Adafruit-ST7735,файл Adafruit_ST77xx.h заменил
#define ST77XX_MADCTL_RGB 0x00
на #define ST77XX_MADCTL_RGB 0x08
Вроде здесь читал, что на 2560 не будет работать, тоже бы попробовал на 2.4″ 320X240 TFT Touchscreen Shield на st7783, сравнил бы скорости
Подкажите, PULTOSCOPE_TFT v2, как кнопки просто на землю замыкание сделать, без резюков, как сделано в PULTOSCOPE_SSD1306_final2_DDS_Z_EL83_EDITION? Спасибо
P.S. На версию с Oled дисплеем поставил кварц на 25Мг (снял с МП), вроде пашет, на 32Мг - мусор на дисплее
Добрый вечер! Нужна помощь! Не могу найти правку скетча для 25мГц Прошу подсказки! С уважением Александр.
Вот за что люблю ардуино, так это за то что в разы проще повторить собранные на нем устройства.
Кстати у вас это не последняя версия прошивки.
Здесь последняя.
[/quote]
День добрый господа. Если кто на этой ветке есть. Решил повторить,как индикатор(показометр) для другого генератора.Да и как пультоскоп для наглядки сигнала. Генератор включает сигналы разных устройств готовой продукции TV, медицины.....
Не могу справиться с последним скетчем TFT SPFD5408. На 16мГц работает на 27мГц не хочет. Помогите с правкой скетча!!! С уважением Александр.
Библиотека Adafruit-ST7735,файл Adafruit_ST77xx.h заменил
#define ST77XX_MADCTL_RGB 0x00
на #define ST77XX_MADCTL_RGB 0x08
В файле Adafruit_ST7735.h у меня только такой дефайн #define ST7735_MADCTL 0x36 .Поменял ,оказалось отвечает за ориентацию изображения,повернулось влево на 90 градусов
0x36 это адрес регистра MADCTL,его не надо трогать,надо именно ST77XX_MADCTL_RGB ,и не в adafruit_st7735.h,а в ADAFRUIT_ST77XX.h
Возможно у вас другая библиотека,мало ли...
Виноват,у меня либа не обновлена была и не было в ней файла Adafruit_ST77xx.h ,сейчас обновил и появился,поменял на 0,08 -изменений не было,вместо желтого шрифта -синий,вместо зеленого розовый
Решил еще попробовать TFT экранчик 128х128 1,44 дюйма SPI



Скетч пришлось переделать на отображение латиницы ибо не стал править adafruit GFX .Не пойму пока почему,но при выборе генератора у меня в зависание уходит плата ардуино нано.Может потому,что у меня вывод генератора занят на дисплее?
Здравствуйте! Судя по переписке у вас хорошие познания в программировании. А я всего лишь в 1975 году паяльник в руки впервые взял. Еле успеваю за изменениями радиотехнической базе. Не будете ли так любезны помочь старому радиолюбителю в правке скетча PULTOSCOPE_TFT_AREF с 16мГц на 27мГц. Заранее благодарен даже если нет
С уважением Александр.
Вот за контрастность экрана строчки отвечают
Надо раскоментировать эту строку EEPROM.write(0, 50);
DEL
Здравствуйте! Судя по переписке у вас хорошие познания в программировании. А я всего лишь в 1975 году паяльник в руки впервые взял. Еле успеваю за изменениями радиотехнической базе. Не будете ли так любезны помочь старому радиолюбителю в правке скетча PULTOSCOPE_TFT_AREF с 16мГц на 27мГц. Заранее благодарен даже если нет
С уважением Александр.
Может это видео поможет Вам? https://youtu.be/g6vt7my9g0w
mity-spb1959@mail.ru, какой именно скетч Вы используете. Ссылку, номер поста, автора.