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 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.

 

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="<a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a>" rel="nofollow"><a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a></a>
// форум <a href="<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>" rel="nofollow"><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></a>
// скетч и библиотеку изменил под LCD_ls020 VetalST
// скетч и библиотеку изменил под LCD 1.8 дюйма 160х128 ST7735 Владимир Иванов ( 240265 )
// LCD_ls020 подключаем:
// к ардуине на ATmega328
//**********************************************************
#include <Adafruit_GFX.h>    //<a href="https://github.com/adafruit/Adafruit-GFX-Library" rel="nofollow">https://github.com/adafruit/Adafruit-GFX-Library</a>
#include <Adafruit_ST7735.h> //<a href="https://github.com/adafruit/Adafruit-ST7735-Library" rel="nofollow">https://github.com/adafruit/Adafruit-ST7735-Library</a>
#include <SPI.h>
#include <FreqCount.h> //<a href="http://www.pjrc.com/teensy/td_libs_FreqCount.html" rel="nofollow">http://www.pjrc.com/teensy/td_libs_FreqCount.html</a>
#include <PWM.h> //<a href="https://puzzlebox.io/orbit/development/browser/orbit/arduino/libraries/PWM/PWM.h" rel="nofollow">https://puzzlebox.io/orbit/development/browser/orbit/arduino/libraries/PWM/PWM.h</a>

// 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_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;

String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) { n = source[i]; i++; if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB8; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x70; break; } } } m[0] = n; target = target + String(m); } return target; } //********************* ОТРИСОВКА ЛИНИИ ********************************* 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(utf8rus("СИНУС"));
    tft.setCursor(35, 50);
    tft.println(utf8rus("ТРЕУГОЛЬНИК"));
    tft.setCursor(35, 70);
    tft.println(utf8rus("ПИЛА"));
    tft.setCursor(35, 90);
    tft.println(utf8rus("ПИЛА ОБР"));
}

//***************** ОТРИСОВКА В ПАУЗЕ ОСЦИЛОГРАФА *******************
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, 45, 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( utf8rus("Разв"));
        sprintf(str, "%d", razv);
    tft.setCursor(91, 1);
    tft.println( str);

}

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

void GlavMenu (){

     tft.setTextSize(1);
      tft.setTextColor(ST7735_WHITE);
      tft.setCursor(35, 25);
      tft.println(utf8rus("Осцилограф"));
       tft.setCursor(35, 55);
       tft.println(utf8rus("Генератор PWM"));
       tft.setCursor(35, 85);
        tft.println(utf8rus("Генератор DDS"));
      tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println(utf8rus("Батарея ="));
      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);

}



void setup(){
//  tft.cp437(true);
  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.initR(INITR_144GREENTAB);   // 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, 25);
      tft.println(utf8rus("Осцилограф"));

    }

    if(pultoskop==2){
     GlavMenu ();
       tft.setCursor(35, 55);
       tft.setTextColor(ST7735_RED);
       tft.println(utf8rus("Генератор PWM"));
    }

     if(pultoskop==3){
      GlavMenu ();
       tft.setCursor(35, 85);
       tft.setTextColor(ST7735_RED);
       tft.println(utf8rus("Генератор 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(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( utf8rus("Синх-ция"));
        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(112, 1);
    tft.println( utf8rus("ПАУЗА"));
      }
        }

      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(utf8rus("СИНУС"));

    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(utf8rus("ТРЕУГОЛЬНИК"));

    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(utf8rus("ПИЛА"));

    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(utf8rus("ПИЛА ОБР"));

    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
}


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.