Renkli Osiloskop Yapımı

Merhaba Arkadaşlar uzun bir aradan sonra tekrar yazmak nasip oldu. Bu yazımızda daha önce sizlere paylaştığım osiloskop projesinin daha gelişmişi olan bu projeyi sizlerle paylaşacağım.

Projede daha önce paylaştığım Osiloskop projesinde fazla değişiklik yapmadan kullanılan nokia 5110 lcd modülünü 1,44 inç TFT ekran ile değiştireceğiz. Bu proje için  1,8 inç TFT ekranı kullanabilirsiniz. Projede kullanılan TFT ekranları  st7735 IC kullanmakta ama piyasada ilixxxx IC li TFT bulursanız kütüphaneyi değiştirmeniz yeterli olacaktır.

Bu TFT ekrandan bahsetmekte yarar  var.  8 bitlik bir renk aralığına sahip bu ekran arduino ile SPI üzerinden bağlantı sağlamakta bundan dolayı bu TFT ekranlar diğer ekranlardan daha avantajlı duruma geçtiğinden dolayı arduino ile yaygınca kullanılmaya başladı.

Arkadaşlar bu TFT ekranı internet ortamında 3,3 volt ile çalışır yazıyor ama st7735 modellerinde modülün üzerine eklenen devre elemanları ile bu TFT ekranı 3-5 volt arasında çalışmaktadır.
Projenin küçük bir videosunu paylaşayım.

Projenin Bağlantı Şeması

Projenin Resimleri

Projenin çalıştığını göstermek için devrenin bağlantısını gerçekleştirdim bundan dolayı butonlar görünmüyor ama elimde jumper kabloları ile butonlara basarak tüm projeyi test ettim.

Burada ise projelendirdiğim ve resimlendirdiğim bu projeyi sizlerle paylaşmak istiyorum.

Programımız

Burada önemli bir nokta var eğer kullanılan TFT ekran 1,8 ile 290. satır aktif edilerek 291. satır silinmesi gerekmektedir.


//страничка проекта <a href="http://srukami.inf.ua/pultoscop_v2.html" title="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" title="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#comm...</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    A0
//#define TFT_RST   9  // you can also connect this to the Arduino reset
                      // in which case, set this #define pin to 0!
#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 3
#define ok 4
#define pravo 2
#define akb A5 //любой своюодный аналоговый пин для измерения напряжения АКБ
#define delit A6 //включен или отключен делитель на х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[701];//массив АЦП
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;
//#define Pause 0

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(23,i, ST7735_BLUE); 
            tft.drawPixel(40,i, ST7735_BLUE); 
            tft.drawPixel(57,i, ST7735_BLUE); 
            tft.drawPixel(74,i, ST7735_BLUE); 
            tft.drawPixel(91,i, ST7735_BLUE);
            tft.drawPixel(108,i, ST7735_BLUE); 
            tft.drawPixel(125,i, ST7735_BLUE); 
            tft.drawPixel(142,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=6;
          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(){
          if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
    tft.println( "11.0V");
        }
        if(opornoe==1){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "50.0V");
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "1.1V");
        }
        if(opornoe==1){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "5.0V");
        }
      }

       tft.setCursor(55, 1);
    tft.println( "Razv");
        sprintf(str, "%d", razv); 
    tft.setCursor(91, 1);
    tft.println( str);
    //tft.setCursor(112, 1);
   // tft.println( "PauseOFF"); 
}

  


void setup(){  
  if(opornoe==0){
    ADMUX = 0b11100100;
  }//выбор внутреннего опорного 1,1В
  if(opornoe==1){
    ADMUX = 0b01100100;
  }//Выбор внешнего опорного
  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
 tft.setRotation(1);              //  повернуть по горизонту
  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_GREEN); // рисуем рамку
  
 while(digitalRead(ok)==LOW){  
    if(digitalRead(levo)==HIGH){
      delay (30);
      while((digitalRead(levo)==HIGH));
      pultoskop=pultoskop-1;
      if(pultoskop<1)pultoskop=3;
    }
    if(digitalRead(pravo)==HIGH){
      delay (30);
      while((digitalRead(pravo)==HIGH));
      pultoskop=pultoskop+1;
      if(pultoskop>3)pultoskop=1;
    }
    
   if(pultoskop==1){
      tft.setTextSize(1);
      tft.setTextColor(ST7735_GREEN);
      tft.setCursor(55, 25);
      tft.println("OSILOSKOP");
       tft.setCursor(52, 55);
       tft.setTextColor(ST7735_WHITE);
       tft.println("PWM URETICI");
       tft.setCursor(52, 85);
        tft.println("DDS URETICI");
      tft.setTextColor(ST7735_YELLOW);
       tft.setCursor(30, 110);
       tft.println("Pil =");
      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,110,24,10,ST7735_BLACK);
       
  //     tft.setTextColor(ST7735_BLUE);
       tft.setCursor(90, 110);
       tft.println(str);

    }
    if(pultoskop==2){
     
       tft.setTextColor(ST7735_WHITE);
       tft.setCursor(55, 25);
       tft.println("OSILOSKOP");
       tft.setCursor(52, 55);
       tft.setTextColor(ST7735_GREEN);
       tft.println("PWM URETICI");
       tft.setCursor(52, 85);
       tft.setTextColor(ST7735_WHITE);
       tft.println("DDS URETICI");
      tft.setTextColor(ST7735_YELLOW);
       tft.setCursor(30, 110);
       tft.println("Pil =");
      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,110,24,10,ST7735_BLACK);
 //     tft.setTextColor(ST7735_BLUE);
       tft.setCursor(90, 110);
       tft.println(str); 
    } 
     if(pultoskop==3){
         
       tft.setTextColor(ST7735_WHITE);
       tft.setCursor(55, 25);
       tft.println("OSILOSKOP");
       tft.setCursor(52, 55); 
       tft.println("PWM URETICI");
       tft.setCursor(52, 85);
       tft.setTextColor(ST7735_GREEN);
       tft.println("DDS URETICI");
       tft.setTextColor(ST7735_YELLOW);
       tft.setCursor(30, 110);
       tft.println("Pil =");
      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,110,24,10,ST7735_BLACK);
      tft.setCursor(90, 110);
      tft.println(str);      
    } 
 delay(300);  
}  

  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<700;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          delayMicroseconds(500);
          mass[i]=ADCH;
      }
  }
  if (razv>0){
      for(int i=0;i<700;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          mass[i]=ADCH;
      }
  }
  
}

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

    tft.fillRect(0, 120, 160, 128, ST7735_BLACK);
  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(100, 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(118, 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(112, 1);        
  tft.println( "Sinhron");      
        if(digitalRead(levo)==HIGH){
          SinU=SinU-20;
          if(SinU<20){
            SinU=20;
          }
        }
        if(digitalRead(pravo)==HIGH){
          SinU=SinU+20;
          if(SinU>230){
            SinU=230;
          }
        }

        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(112, 1);
    tft.println( "BEKLET");      
      }   
        }    

      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, 113, 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+17){
            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<255;y++){
        if(Vmax<mass[y]){
          Vmax=mass[y];
        } 
      }
      //максимальное значение сигнала ##########################
      
      //************************ ОТРИСОВКА ГРАФИКА *************************
      if(paus==0){
       // tft.fillRect(0, 12, 160, 3, ST7735_BLACK);//стиране /шкалы прокрутки
        tft.fillRect(6, 25, 153, 86, ST7735_BLACK);//стиране поле графика
        tft.fillRect(0,120, 159, 8, ST7735_BLACK);//стиране НИЖНЕГО МЕНЮ 

        tft.fillCircle(10,110-SinU/3, 2, ST7735_YELLOW);//рисуем уровень синхронизации 
        tft.fillCircle(10,110-SinU/3, 3, ST7735_YELLOW);//рисуем уровень синхронизации 
        x=6;
        for(int y=sinhMASS;y<sinhMASS+145;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.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график
        }
        sinhMASS=0;  
        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);
      //lcd.fillRect(10, 60, 175, 80, BLACK);//стирание поля
      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;

  tft.drawRect(0,0,160,128,ST7735_WHITE); // рисуем рамку
  tft.drawRect(2,2,156,125,ST7735_BLUE); // рисуем рамку
  tft.drawRect(4,3,152,121,ST7735_GREEN); // рисуем рамку
  

if(menuDDS==0){
    tft.setCursor(65, 30);
    tft.setTextColor(ST7735_GREEN);
    tft.setTextSize(1);
    tft.println("SINUS");     
    tft.setCursor(65, 50);
    tft.setTextColor(ST7735_WHITE);
    tft.println("UCGEN");
    tft.setCursor(60, 70); 
    tft.println("TESTERE");
    tft.setCursor(50, 90);
    tft.println("TESTERE V2");       
   

    delay(400); 
    while(!(PIND & (1<<PIND2))){
    PWM=sinM[d];
    pwmWrite(dds,PWM);
    //delayMicroseconds(fr);
    d++;
    if(d==32){d=0;}}
     menuDDS++;
    //delay(200);
  }
if(menuDDS==1){
   tft.setCursor(65, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("SINUS");     
    tft.setCursor(65, 50);    
    tft.setTextColor(ST7735_GREEN);
    tft.println("UCGEN");
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(60, 70); 
    tft.println("TESTERE");
    tft.setCursor(50, 90);
    tft.println("TESTERE V2");       

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=trianglM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
    //delay(400);
  }
if(menuDDS==2){
  tft.setCursor(65, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("SINUS");     
    tft.setCursor(65, 50);        
    tft.println("UCGEN");
    tft.setTextColor(ST7735_GREEN);
    tft.setCursor(60, 70); 
    tft.println("TESTERE");
    tft.setCursor(50, 90);
    tft.setTextColor(ST7735_WHITE);
    tft.println("TESTERE V2");       

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=pilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
      //delay(400);
  }
if(menuDDS==3){
    tft.setCursor(65, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("SINUS");     
    tft.setCursor(65, 50);        
    tft.println("UCGEN");    
    tft.setCursor(60, 70); 
    tft.println("TESTERE");
    tft.setCursor(50, 90);
    tft.setTextColor(ST7735_GREEN);
    tft.println("TESTERE V2");       

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


Alıntıdır

Boş zamanlarda arduino ile uğraşan kendi halinde bir Öğretmen.

  

Bir Cevap Yazın

Time limit is exhausted. Please reload CAPTCHA.