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

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Переделал Скетч от LS020 под Доступный экран  1.8 TFT  160x128  SPI  St7735.

Есть небольшие лажи . А так вроде работает.

[code]
//страничка проекта http://srukami.inf.ua/pultoscop_v2.html
// форум http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783
// скетч и библиотеку изменил под 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    12
//#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 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[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;

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(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(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_RED);
      tft.setCursor(35, 25);
      tft.println("Oscilloscope");
       tft.setCursor(35, 55);
       tft.setTextColor(ST7735_WHITE);
       tft.println("Generator PWM");
       tft.setCursor(35, 85);
        tft.println("Generator DDS");
      tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println("Battery =");
      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(35, 25);
       tft.println("Oscilloscope");
       tft.setCursor(35, 55);
       tft.setTextColor(ST7735_RED);
       tft.println("Generator PWM");
       tft.setCursor(35, 85);
       tft.setTextColor(ST7735_WHITE);
       tft.println("Generator DDS");
      tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println("Battery =");
      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(35, 25);
       tft.println("Oscilloscope");
       tft.setCursor(35, 55); 
       tft.println("Generator PWM");
       tft.setCursor(35, 85);
       tft.setTextColor(ST7735_RED);
       tft.println("Generator DDS");
       tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println("Battery =");
      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){//включен или отключен делитель
  tft.setTextColor(ST7735_WHITE);
   tft.setCursor(100, 120);
    tft.println( "U=");  
    
  if(opornoe==0){
    armcurrent = (Vmax*1.1/255)*10;
    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);  
  }
  if(opornoe==1){
    armcurrent = (Vmax*VCC/255)*10;
    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);

  } 
  }
  else {//включен или отключен делитель
    tft.setTextColor(ST7735_WHITE);
   tft.setCursor(100, 120);
    tft.println( "U=");  

  if(opornoe==0){
    armcurrent = Vmax*1.1/255;
    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);
  }
  if(opornoe==1){
    armcurrent = Vmax*VCC/255;
    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);
      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");
        }
      }
        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;
        }
 
      tft.setCursor(55, 1);
    tft.println( "Razv");
       // lcd.drawText(55, 1,"Razv", 1, WHITE, BLACK);
        sprintf(str, "%d", razv); 
    tft.setCursor(91, 1);
    tft.println( str);
       // lcd.drawText(91, 1,str, 1, WHITE, BLACK);
    tft.setCursor(112, 1);
    tft.println( "PauseOFF");
      }
      //////////////////////////////////////////////////////
      if(menu==1){ // развертка
        tft.fillRect(48, 0, 57, 9, ST7735_RED);
        //lcd.fillRect(48, 0, 108, 9, PINK);
        if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
    tft.setCursor(3, 1);
    tft.println( "11.0V");  
         // lcd.drawText(3, 1,"11.0V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "50.0V");     
          //lcd.drawText(3, 1,"50.0V", 1, WHITE, BLACK);
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
    tft.setCursor(3, 1);
    tft.println( "1.1V"); 
         // lcd.drawText(3, 1,"1.1V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "5.0V"); 
          //lcd.drawText(3, 1,"5.0V", 1, WHITE, BLACK);
        }
      }
        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;
          } 
        } 

    tft.setTextColor(ST7735_WHITE);
    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");       
      }
      ////////////////////////////////////////////////////
      if(menu==2){  // синхронизация
        prokr=0;
        paus=0;
        if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
        tft.setCursor(3, 1);
    tft.println( "11.0V");  
        }
        if(opornoe==1){
        tft.setCursor(3, 1);
    tft.println( "50.0V");       
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
          tft.setCursor(3, 1);
    tft.println( "1.1V"); 
          //lcd.drawText(3, 1,"1.1V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "5.0V");         
         // lcd.drawText(3, 1,"5.0V", 1, WHITE, BLACK);
        }
      }
   tft.setCursor(55, 1);
    tft.println( "Razv");     
        //lcd.drawText(55, 1,"Razv", 1, WHITE, BLACK);
        sprintf(str, "%d", razv); 
  tft.setCursor(91, 1);
    tft.println( str);            
       // lcd.drawText(91, 1,str, 1, WHITE, BLACK);
 tft.setCursor(112, 1);
    tft.println( "PauseOFF");        
        //lcd.drawText(112,1,"PauseOFF", 1, WHITE, BLACK);
        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);
        if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){

       tft.setTextColor(ST7735_WHITE);
       tft.setCursor(3, 1);
       tft.println( "11.0V");     
         // lcd.drawText(3, 1,"11.0V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
        tft.setCursor(3, 1);
    tft.println( "50.0V");            
         // lcd.drawText(3, 1,"50.0V", 1, WHITE, BLACK);
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
    tft.setCursor(3, 1);
    tft.println( "1.1V");        
         // lcd.drawText(3, 1,"1.1V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "5.0V");               
         // lcd.drawText(3, 1,"5.0V", 1, WHITE, BLACK);
        }
      }
    tft.setCursor(55, 1);
    tft.println( "Razv");       
        // lcd.drawText(55, 1,"Razv", 1, WHITE, BLACK);
         sprintf(str, "%d", razv); 
    tft.setCursor(91, 1);
    tft.println( str);            
        // lcd.drawText(91, 1,str, 1, WHITE, BLACK);
    tft.setCursor(112, 1);
    tft.println( "PauseON");      
        // lcd.drawText(112, 1,"PauseON", 1, WHITE, BLACK);
         
        }
      }

      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.fillRect(0, 12, 30, 111, 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); 
           // tft.drawPixel(i,59, ST7735_BLUE);
           // tft.drawPixel(i,76, ST7735_BLUE); 
           // tft.drawPixel(i,93, ST7735_BLUE); 
           // tft.drawPixel(i,110, ST7735_BLUE);
 }
      //шкала напряжения ########################################
      if(opornoe==0){
        ADMUX = 0b11100100;
      }//выбор внутреннего опорного 1,1В
      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, 12, 154, 99, ST7735_BLACK);//стиране поле графика
        tft.fillRect(0,116, 160, 12, 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++){ 
          //for(int y=0;y<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);//график
         // tft.drawLine(x+1,109-mass[y]/3+1, x+2,109-mass[y+1]/3+1, ST7735_GREEN);//график
        }
        sinhMASS=0;  
        MenuT();  
      }
     /////////////////////////////////////////////////////////////////////////// 
    if(paus==1){//режим паузы
        //////////////////////////////////////////////////////////////////////
        if(digitalRead(pravo)==HIGH){//листаем
          prokr=prokr+5;
          if(prokr>554){prokr=554;}
          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);//шкала прокрутки
          //tft.drawLine(prokr/4,15,prokr/4+35,15, 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.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график
          // tft.drawLine(x+1,109-mass[y]/3+1, x+2,109-mass[y+1]/3+1, ST7735_GREEN);//график
          }
        }
      ////////////////////////////////////////////////////////////////////////////////   
      if(digitalRead(levo)==HIGH){//листаем
          prokr=prokr-5;
          if(prokr<0){prokr=0;}
          //tft.fillRect(0, 12, 160, 15, ST7735_BLACK);//стиране поле графика
          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);//шкала прокрутки
         // tft.drawLine(prokr/4,15,prokr/4+35,15, 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>170){
              x=170;
            } // что бы не засирало экран

           tft.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график
          // tft.drawLine(x+1,110-mass[y]/3+1, x+2,110-mass[y+1]/3+1, ST7735_GREEN);//график 
          }
        }        
      }
     // 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-3;
          if(PWM<0){
            PWM=255;
          } 
          delay(3);//защита от дребезга
          tft.fillRect(6, 6, 160, 40, ST7735_BLACK);//стирание поля
          tft.fillRect(100, 100, 129, 125, ST7735_BLACK);//стирание в низу число шим
        }
        if(digitalRead(pravo)==HIGH){
          PWM=PWM+3;
          if(PWM>255){
            PWM=0;
          } 
          delay(3);//защита от дребезга
          tft.fillRect(6, 6, 160, 40, ST7735_BLACK);//стирание поля 
          tft.fillRect(100, 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, 170, 125, ST7735_BLACK);//стирание поля
      }
      ////////////

      tft.setCursor(10, 19);
  tft.setTextColor(ST7735_GREEN);
  tft.setTextSize(2);
  tft.println("PWM =");                                
      
      temp = PWM*100/255;
      sprintf(str,"%d", temp); // %
      tft.setCursor(80, 19);
       tft.println( str);
      
      tft.setCursor(106, 19);
      tft.println( "%");
      

      armcurrent = 162*PWM/255.0+8; // вычисляем длинны линии
     // if(armcurrent >=159){
      //  armcurrent == 159;
       // }
      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;
      //lcd.drawText(10, 60, str, 2, WHITE, BLACK);
      ////////////////////////////////////////////////////////////// 
      // lcd.fillRect(0, 100, 175, 131, BLACK);//стирание поля
      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);          
        //tft.setTextSize(1);

      }
      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);        
      // tft.setTextSize(1);
      }
      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);        
      //  tft.setTextSize(1);
      }
      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);        
       // tft.setTextSize(2);
      } 
      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);        
      //  tft.setTextSize(1);
      } 
      if(hag==5){//выбор  PWM 
        flag=1;
        tft.setTextSize(2);
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);
        //tft.setTextSize(1);
        tft.println("PWM =");               
        temp = PWM*100/255;
        sprintf(str,"%d", temp);
        tft.setCursor(100, 100);
        tft.setTextColor(ST7735_YELLOW);
        //tft.setTextSize(1);
        tft.println(str);                
        tft.setCursor(130, 100);
        tft.setTextColor(ST7735_YELLOW);
        //tft.setTextSize(1);
        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){
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_RED);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);
    tft.setTextColor(ST7735_WHITE);
    tft.println("Treugolnik");
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       
   

    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(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);    
    tft.setTextColor(ST7735_RED);
    tft.println("Treugolnik");
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       

    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(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);        
    tft.println("Treugolnik");
    tft.setTextColor(ST7735_RED);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.setTextColor(ST7735_WHITE);
    tft.println("Pila Obr");       

    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(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);        
    tft.println("Treugolnik");    
    tft.setCursor(35, 70); 
    tft.println("Pila");
    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++;
    //delay(200);
  }
if(menuDDS==4){menuDDS=0;}
}
}
/////////////////////DDS
}

[/code]

 

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Не пойму какфото загрузть

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Вот

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

К стати линии сделал тонкие в 1 пиксель.

Экран еще с пленкой.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

240265 пишет:

К стати линии сделал тонкие в 1 пиксель.

Экран еще с пленкой.

Это какая версия кода?подскажу.

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Не помню с какого поста, не последняя точно, кажется предпоследняя.

1-1Лажа то что график на развертке до 7 не до конца экрана , на предыдущем фото видно. росле 7 все нормально.

2- лажа в генераторе после 78 % ШИМ полоса.

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

240265 пишет:

Не помню с какого поста, не последняя точно, кажется предпоследняя.

1-1Лажа то что график на развертке до 7 не до конца экрана , на предыдущем фото видно. росле 7 все нормально.

2- лажа в генераторе после 78 % ШИМ полоса.

Это не лажа, а просто человек который под этот дисплей подправялял, пару мест не доглядел с размерами.

____

как я вам подскажу по толщине линии если не знаю что за скетч,

выложите тогда просто что заливали.

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Ну  еще в планах перевести напряжение в V/дел и развертку в mS/дел.

Времени мало.

Переделывал Я .Толщину линий специально сделал в 1 пиксель.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

240265 пишет:

К стати линии сделал тонкие в 1 пиксель.

Экран еще с пленкой.

Извините, проглядел что вы уже разобрались с линиями.

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

добавил новые дефайны для цвета в скетч 240265 и поставил свою библиотеку для 1.44 дисплея 128х128, пока как то так=))) 

ElectroMaX
ElectroMaX аватар
Offline
Зарегистрирован: 19.02.2015

Вот и мой пультоскоп.

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

XUMUK

Там нужно по Х Все разнеры подгонять. Блин долго это.

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

240265 пишет:

XUMUK

Там нужно по Х Все разнеры подгонять. Блин долго это.

подогнал размеры всех надписей =)пока только с осликом разобрался, при входе в ддс или шим у меня почемуто сначало загорается как надо а потом тупо экран белым становится

Р.s нашел проблему почему экран становился белым))) выход ДДС генератора сидел на пине ресета экрана=) поменял пион заработало

 

Alex_Mirko
Alex_Mirko аватар
Offline
Зарегистрирован: 16.05.2016

Долго думал над тем, как ускорить скорость отрисовки на моем дисплее 240х320 ili9340, заглянул в библиотеку, оказалось функция drawLine() рисует линию отдельными пиксилями, решил написать свою фукцию которая рисует график вертикальными и горизонтальными линиями, назвал ее просто Line()



void Adafruit_ILI9340::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++) {
        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--) {
        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++) {
        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--) {
        drawFastVLine(x1, y1, h, color);
        y1 = y1 + h;
      }
    }
  }
}

результат превзошол мои ожидания, скорость отрисовки увеличилась в несколько раз) вот видео для сравнения

как было

https://youtu.be/iH_5VHrkASo

как стало

https://youtu.be/uHQI2PCLY5g

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

Alex_Mirko, реально шустрее стало

============

коллеги, киньте пожалуйста, в меня скетчем под такой дисплей - хочу начать мучать АЦП =)

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

karl2233 пишет:

Alex_Mirko, реально шустрее стало

============

коллеги, киньте пожалуйста, в меня скетчем под такой дисплей - хочу начать мучать АЦП =)

вроде внизу на странице автора про пультоскоп была ссылка

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

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

man_200
Offline
Зарегистрирован: 29.04.2016

Xumuk, так ты по горизонтали разверни, может и вместится шкала ШИМа.

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

man_200 пишет:

Xumuk, так ты по горизонтали разверни, может и вместится шкала ШИМа.


Дисплей квадратный смысла разворачивать нет)

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Xumuk пишет:
Дисплей квадратный смысла разворачивать нет)

Формулу просто под свой дисплей подкрути вот и все.

эту

display.drawLine(0,0,83*PWM/255.0,0, BLACK);
display.drawLine(0,1,83*PWM/255.0,1, BLACK);
display.drawLine(0,2,83*PWM/255.0,2, BLACK);
display.drawLine(0,15,83*PWM/255.0,15, BLACK);
display.drawLine(0,16,83*PWM/255.0,16, BLACK);
display.drawLine(0,17,83*PWM/255.0,17, BLACK);

 

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

bodriy2014 пишет:

Xumuk пишет:
Дисплей квадратный смысла разворачивать нет)

Формулу просто под свой дисплей подкрути вот и все.

эту

display.drawLine(0,0,83*PWM/255.0,0, BLACK);
display.drawLine(0,1,83*PWM/255.0,1, BLACK);
display.drawLine(0,2,83*PWM/255.0,2, BLACK);
display.drawLine(0,15,83*PWM/255.0,15, BLACK);
display.drawLine(0,16,83*PWM/255.0,16, BLACK);
display.drawLine(0,17,83*PWM/255.0,17, BLACK);

 


ОК спасибо завтра попробую

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

XUMUK догни ШИМ до  100 и обратно , перестает 99% показывать , после 98 сразу 100.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

ElectroMaX пишет:

Вот и мой пультоскоп

.

Классно получилось!

Создам галерею пультоскопов в корпусах .

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Поправил шкалу ШИМ для 160х128

[code]
//страничка проекта http://srukami.inf.ua/pultoscop_v2.html
// форум http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comm...
// скетч и библиотеку изменил под 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    12
//#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 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[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;

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(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(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_RED);
      tft.setCursor(35, 25);
      tft.println("Oscilloscope");
       tft.setCursor(35, 55);
       tft.setTextColor(ST7735_WHITE);
       tft.println("Generator PWM");
       tft.setCursor(35, 85);
        tft.println("Generator DDS");
      tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println("Battery =");
      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(35, 25);
       tft.println("Oscilloscope");
       tft.setCursor(35, 55);
       tft.setTextColor(ST7735_RED);
       tft.println("Generator PWM");
       tft.setCursor(35, 85);
       tft.setTextColor(ST7735_WHITE);
       tft.println("Generator DDS");
      tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println("Battery =");
      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(35, 25);
       tft.println("Oscilloscope");
       tft.setCursor(35, 55); 
       tft.println("Generator PWM");
       tft.setCursor(35, 85);
       tft.setTextColor(ST7735_RED);
       tft.println("Generator DDS");
       tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println("Battery =");
      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){//включен или отключен делитель
  tft.setTextColor(ST7735_WHITE);
   tft.setCursor(100, 120);
    tft.println( "U=");  
    
  if(opornoe==0){
    armcurrent = (Vmax*1.1/255)*10;
    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);  
  }
  if(opornoe==1){
    armcurrent = (Vmax*VCC/255)*10;
    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);

  } 
  }
  else {//включен или отключен делитель
    tft.setTextColor(ST7735_WHITE);
   tft.setCursor(100, 120);
    tft.println( "U=");  

  if(opornoe==0){
    armcurrent = Vmax*1.1/255;
    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);
  }
  if(opornoe==1){
    armcurrent = Vmax*VCC/255;
    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);
      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");
        }
      }
        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;
        }
 
      tft.setCursor(55, 1);
    tft.println( "Razv");
       // lcd.drawText(55, 1,"Razv", 1, WHITE, BLACK);
        sprintf(str, "%d", razv); 
    tft.setCursor(91, 1);
    tft.println( str);
       // lcd.drawText(91, 1,str, 1, WHITE, BLACK);
    tft.setCursor(112, 1);
    tft.println( "PauseOFF");
      }
      //////////////////////////////////////////////////////
      if(menu==1){ // развертка
        tft.fillRect(48, 0, 57, 9, ST7735_RED);
        //lcd.fillRect(48, 0, 108, 9, PINK);
        if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
    tft.setCursor(3, 1);
    tft.println( "11.0V");  
         // lcd.drawText(3, 1,"11.0V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "50.0V");     
          //lcd.drawText(3, 1,"50.0V", 1, WHITE, BLACK);
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
    tft.setCursor(3, 1);
    tft.println( "1.1V"); 
         // lcd.drawText(3, 1,"1.1V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "5.0V"); 
          //lcd.drawText(3, 1,"5.0V", 1, WHITE, BLACK);
        }
      }
        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;
          } 
        } 

    tft.setTextColor(ST7735_WHITE);
    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");       
      }
      ////////////////////////////////////////////////////
      if(menu==2){  // синхронизация
        prokr=0;
        paus=0;
        if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
        tft.setCursor(3, 1);
    tft.println( "11.0V");  
        }
        if(opornoe==1){
        tft.setCursor(3, 1);
    tft.println( "50.0V");       
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
          tft.setCursor(3, 1);
    tft.println( "1.1V"); 
          //lcd.drawText(3, 1,"1.1V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "5.0V");         
         // lcd.drawText(3, 1,"5.0V", 1, WHITE, BLACK);
        }
      }
   tft.setCursor(55, 1);
    tft.println( "Razv");     
        //lcd.drawText(55, 1,"Razv", 1, WHITE, BLACK);
        sprintf(str, "%d", razv); 
  tft.setCursor(91, 1);
    tft.println( str);            
       // lcd.drawText(91, 1,str, 1, WHITE, BLACK);
 tft.setCursor(112, 1);
    tft.println( "PauseOFF");        
        //lcd.drawText(112,1,"PauseOFF", 1, WHITE, BLACK);
        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);
        if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){

       tft.setTextColor(ST7735_WHITE);
       tft.setCursor(3, 1);
       tft.println( "11.0V");     
         // lcd.drawText(3, 1,"11.0V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
        tft.setCursor(3, 1);
    tft.println( "50.0V");            
         // lcd.drawText(3, 1,"50.0V", 1, WHITE, BLACK);
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
    tft.setCursor(3, 1);
    tft.println( "1.1V");        
         // lcd.drawText(3, 1,"1.1V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "5.0V");               
         // lcd.drawText(3, 1,"5.0V", 1, WHITE, BLACK);
        }
      }
    tft.setCursor(55, 1);
    tft.println( "Razv");       
        // lcd.drawText(55, 1,"Razv", 1, WHITE, BLACK);
         sprintf(str, "%d", razv); 
    tft.setCursor(91, 1);
    tft.println( str);            
        // lcd.drawText(91, 1,str, 1, WHITE, BLACK);
    tft.setCursor(112, 1);
    tft.println( "PauseON");      
        // lcd.drawText(112, 1,"PauseON", 1, WHITE, BLACK);
         
        }
      }

      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.fillRect(0, 12, 30, 111, 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); 
           // tft.drawPixel(i,59, ST7735_BLUE);
           // tft.drawPixel(i,76, ST7735_BLUE); 
           // tft.drawPixel(i,93, ST7735_BLUE); 
           // tft.drawPixel(i,110, ST7735_BLUE);
 }
      //шкала напряжения ########################################
      if(opornoe==0){
        ADMUX = 0b11100100;
      }//выбор внутреннего опорного 1,1В
      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, 12, 154, 99, ST7735_BLACK);//стиране поле графика
        tft.fillRect(0,116, 160, 12, 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++){ 
          //for(int y=0;y<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);//график
         // tft.drawLine(x+1,109-mass[y]/3+1, x+2,109-mass[y+1]/3+1, ST7735_GREEN);//график
        }
        sinhMASS=0;  
        MenuT();  
      }
     /////////////////////////////////////////////////////////////////////////// 
    if(paus==1){//режим паузы
        //////////////////////////////////////////////////////////////////////
        if(digitalRead(pravo)==HIGH){//листаем
          prokr=prokr+5;
          if(prokr>554){prokr=554;}
          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);//шкала прокрутки
          //tft.drawLine(prokr/4,15,prokr/4+35,15, 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.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график
          // tft.drawLine(x+1,109-mass[y]/3+1, x+2,109-mass[y+1]/3+1, ST7735_GREEN);//график
          }
        }
      ////////////////////////////////////////////////////////////////////////////////   
      if(digitalRead(levo)==HIGH){//листаем
          prokr=prokr-5;
          if(prokr<0){prokr=0;}
          //tft.fillRect(0, 12, 160, 15, ST7735_BLACK);//стиране поле графика
          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);//шкала прокрутки
         // tft.drawLine(prokr/4,15,prokr/4+35,15, 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>170){
              x=170;
            } // что бы не засирало экран

           tft.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график
          // tft.drawLine(x+1,110-mass[y]/3+1, x+2,110-mass[y+1]/3+1, ST7735_GREEN);//график 
          }
        }        
      }
     // 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-3;
          if(PWM<0){
            PWM=255;
          } 
          delay(3);//защита от дребезга
          tft.fillRect(6, 6, 160, 40, ST7735_BLACK);//стирание поля
          tft.fillRect(100, 100, 129, 125, ST7735_BLACK);//стирание в низу число шим
        }
        if(digitalRead(pravo)==HIGH){
          PWM=PWM+3;
          if(PWM>255){
            PWM=0;
          } 
          delay(3);//защита от дребезга
          tft.fillRect(6, 6, 160, 40, ST7735_BLACK);//стирание поля 
          tft.fillRect(100, 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;
      sprintf(str,"%d", temp); // %
      tft.setCursor(80, 19);
      tft.println( str);      
      tft.setCursor(118, 19);
      tft.println( "%");
      
armcurrent = (127*PWM/255)+25; // вычисляем длинны линии
      //armcurrent = 162*PWM/255.0+8; // вычисляем длинны линии
     // if(armcurrent >=159){
      //  armcurrent == 159;
       // }
      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;
      //lcd.drawText(10, 60, str, 2, WHITE, BLACK);
      ////////////////////////////////////////////////////////////// 
      // lcd.fillRect(0, 100, 175, 131, BLACK);//стирание поля
        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);          
        //tft.setTextSize(1);

      }
      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);        
      // tft.setTextSize(1);
      }
      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);        
      //  tft.setTextSize(1);
      }
      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);        
       // tft.setTextSize(2);
      } 
      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);        
      //  tft.setTextSize(1);
      } 
      if(hag==5){//выбор  PWM 
        flag=1;
        tft.setTextSize(2);
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);
        //tft.setTextSize(1);
        tft.println("PWM =");               
        temp = PWM*100/255;
        sprintf(str,"%d", temp);
        tft.setCursor(100, 100);
        tft.setTextColor(ST7735_YELLOW);
        //tft.setTextSize(1);
        tft.println(str);                
        tft.setCursor(130, 100);
        tft.setTextColor(ST7735_YELLOW);
        //tft.setTextSize(1);
        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){
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_RED);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);
    tft.setTextColor(ST7735_WHITE);
    tft.println("Treugolnik");
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       
   

    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(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);    
    tft.setTextColor(ST7735_RED);
    tft.println("Treugolnik");
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       

    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(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);        
    tft.println("Treugolnik");
    tft.setTextColor(ST7735_RED);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.setTextColor(ST7735_WHITE);
    tft.println("Pila Obr");       

    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(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);        
    tft.println("Treugolnik");    
    tft.setCursor(35, 70); 
    tft.println("Pila");
    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++;
    //delay(200);
  }
if(menuDDS==4){menuDDS=0;}
}
}
/////////////////////DDS
}

[/code]

 

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Xumuk пишет:

добавил новые дефайны для цвета в скетч 240265 и поставил свою библиотеку для 1.44 дисплея 128х128, пока как то так=))) 

У меня на таком экране часики

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

переделал формулу теперь линии нормально отображаются, вопрос к 240265 не подскажете где вы поменяли шим чтобы после 98 сразу100 не показывало никак не соображу

Joiner
Offline
Зарегистрирован: 04.09.2014

240265 пишет:

У меня на таком экране часики

У меня тоже часики на таком. Экранчик нравится, но убивают массштабируемые шрифты. Например, "22 56" могло бы смотреться гораздо красивее, еслиб шриф не получался масштабированием из самого мелкого. Но это вроде лечится. Видел где-то материал по установке других шрифтов. А так...экранчик хороший, и разрешение приятное 128х128

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

сижу тут кручу верчу и никак не пойму почему так происходит... ДДС генератор работает непонятно либо осцилограф непонятно работает причем 2 ослика...и еще не правильно показывает частоту ШИМ, вот фотки, может кто подскажет

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Xumuk пишет:

сижу тут кручу верчу и никак не пойму почему так происходит... ДДС генератор работает непонятно либо осцилограф непонятно работает причем 2 ослика...и еще не правильно показывает частоту ШИМ, вот фотки, может кто подскажет

Все правилоно.

Где ваш RC-фильтр?

Он из отчсетом ШИМ формует сигнал.

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

bodriy2014 пишет:

Xumuk пишет:

сижу тут кручу верчу и никак не пойму почему так происходит... ДДС генератор работает непонятно либо осцилограф непонятно работает причем 2 ослика...и еще не правильно показывает частоту ШИМ, вот фотки, может кто подскажет

Все правилоно.

Где ваш RC-фильтр?

Он из отчсетом ШИМ формует сигнал.

точно)))) увлекся что забыл про него, спасибо)))))

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Xumuk пишет:

переделал формулу теперь линии нормально отображаются, вопрос к 240265 не подскажете где вы поменяли шим чтобы после 98 сразу100 не показывало никак не соображу

Пока 100% не победил . Победил линию.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

240265 пишет:

Пока 100% не победил . Победил линию.

У меня выводит значение эта строка,

display.print(PWM*100.0/255);

вывожу с двумя знаками после запятой.

Напишите сюда какая строка у вас выводит на дисплей, подмогну.

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Разобрался с ШИМ.

Слишком быстрый инкремент и декремент ШИМ. аж на 3 единицы.

if(digitalRead(pravo)==HIGH){
          PWM=PWM+3;

if(digitalRead(levo)==HIGH){
          PWM=PWM-3;

После перехода через 100% значение 98% с десятичными и он округляет вниз.

выяснил когда вывел с двумя знаками после запятой.

Спасибо bodriy2014

Нужно сделать +2 и -2 

Подправить в 2-х местах

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

поробовал скетч для OLED от D.I.M. (взял на страничке автора) скрестить со скетчем Ghost_d (уж больно хороша идея выхода в основное меню по нажатию кнопки "ОК").

но увы - места в памяти не хватает (уже и режим терминала отключил). 

пишет "Global variables use 2 334 bytes (113%) of dynamic memory, leaving -286 bytes for local variables. Maximum is 2 048 bytes."

Подкажите пожалуйста,ч его ещё выкинуть можно? 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233 пишет:

поробовал скетч для OLED от D.I.M. (взял на страничке автора) скрестить со скетчем Ghost_d (уж больно хороша идея выхода в основное меню по нажатию кнопки "ОК").

но увы - места в памяти не хватает (уже и режим терминала отключил). 

пишет "Global variables use 2 334 bytes (113%) of dynamic memory, leaving -286 bytes for local variables. Maximum is 2 048 bytes."

Подкажите пожалуйста,ч его ещё выкинуть можно? 

Оперативки не хватает.

массив в который сохраняет АЦП уменьшите и будет память.

Или удалите одну из пил в ДДС ведь там их две.

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

не, удалял целиком DDS - не помогает(всего 3% добавилось).

думаю что-то с массивами таблиц. видимо куча библиотек занимает много места

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <FreqCount.h> 
#include <PWM.h>
#include <SPI.h>
#include <Wire.h>
#include <CyberLib.h>
#define OLED_RESET 4 
Adafruit_SSD1306 display(OLED_RESET);
byte menu=0;//переменная выбора меню 
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
long countX=0;
float VCC=5.0;  //напряжение питания, меряем мультиметром
#define overclock 16  //Частота на которой работает Ардуино 
byte SinU=30;   //уровень синхронизации 0 до 255 
byte razv=6;  
byte mass[701];
byte sinhMASS=0;
int prokr=0;
int Vmax=0;// максимальное напряжение long countX=0;
byte x=0; 
unsigned long count =0;
byte hag=0;
int mnog=0;
boolean flag=0;
byte PWM = 128;//стартовое значение ШИМ от 0 до 255
int32_t frequency = 500; //стартовое значение частоты в Гц
#define led  9   //пин для генератора сигналов (не менять)
#define dds  10   //пин для генератора dds (не менять)
byte menuDDS=0;

//масивы таблиц перенес во флеш
const byte PROGMEM 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};
const byte PROGMEM 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};
const byte PROGMEM 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};
const byte PROGMEM 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};
int d=0;

long speedTTL=9600; //скорость терминала 

//внутренние определения состояний FSM  обработки кнопок
//статус НИЧЕГО
#define bs_none 0 
//статус АНТИДРЕБЕЗГ
#define bs_deBounce 1
//Статус УДЕРЖАНИЕ
#define bs_hold 2
// флаги, которые нужно ловить в основной программе 
//значение флага НИЧЕГО
#define bf_none 0
//значение флага  КОРТКОЕ НАЖАТИЕ
#define bf_short 1
//значение флага ДЛИННОЕ НАЖАТИЕ
#define bf_long 2


//временные задержки (в мс)
//дл€ антидребезга
#define deBounceTime 40
//длительное удержание (секунда)
#define longTime 1000

// пины подключения кнопок
#define b_ok_pin 12
#define b_inc_pin 13
#define b_dec_pin 11


byte buttonState=0; //внутренняя переменная обработчика клавиш
byte curButton=0;   //текущая нажатая кнопка
long timerButton=0; //время, нажатия текущей кнопки
byte pressBut=0;
byte buttonFlag=0;

// название кнопок
#define ok_press 1
#define inc_press 2
#define dec_press 3 

//=========  
//именовынные режимы работы прибора для FSM
#define Main_menu 0
#define Oscil 1
#define Gen_meandr 2
#define DDS_Gen 3
byte cur_FSM_state = 0;

//---------------- start ReadKey ----------------
// Функция возвращает номер нажатой клавиши 
byte ReadKey() //функция считывает нажатие кнопки
{
  if (digitalRead(b_ok_pin)) return ok_press;
  if (digitalRead(b_inc_pin)) return inc_press;
  if (digitalRead(b_dec_pin)) return dec_press;
  return 0;
}
//---------------- end ReadKey ----------------

//------------------------
// Start checkButton
//------------------------
void checkButton() {

  switch (buttonState) {
    //-----------------------------------------    
    case (bs_none): //если ничего не нажато
    curButton=ReadKey(); //считываем номер нажатой кнопки
    if (curButton!=0) //≈сли кнопка нажата (т.е., значение <>0)
    {
      buttonState=bs_deBounce; //следующий статус антидребезг
      timerButton=millis(); //запоминаем врем€
    }
    break;
    //------------------------------------------
    case (bs_deBounce): //антидребезг
    if ((ReadKey()==curButton))//если кнопка все еще нажата
    {
      if (millis()-timerButton>deBounceTime) //если прошло достаточно времени дл€ обработки антидребезга
      {
        buttonState=bs_hold; //ставим статус удержание
        timerButton=millis(); //опять запоминаем время
        pressBut=curButton; //устанавливаем значение нажатой кнопки
        buttonFlag=bf_short; //флаг сработки ставим  ќ–ќ“ ќ≈ нажатие и  пока еще удержание
      }
    }
    else
    {
      buttonState=bs_none; //а если кнопка уже не нажата или нажата друга€ ставим статус Ќ»„≈√ќ
    }
    break;

    //------------------------------------------
    case (bs_hold): //Удержание

    if ((ReadKey()==curButton)) //если кнопка все еще нажата
    {
      if (millis()-timerButton>longTime)//если кнопка удерживаетс€ более времени дл€ длительного нажати€
      { 
        buttonFlag=bf_long; //флаг сработки = ƒЋ»“≈Ћ№Ќќ≈ нажатие
      }
    }
   
        else
      {
        buttonState=bs_none; //а если кнопка уже не нажата или нажата друга€ ставим статус Ќ»„≈√ќ
      }
    break;
    //------------------------------------------
  } //end switch
} //end checkButton
//------------------------

// указываем количество пунктов меню -1
#define MAX_menu 2
//названия пунктов меню
char *main_menu1="Пультоскоп";
char *main_menu2="Генератор";
char *main_menu3="DDSгенератор";
// Основное меню прибора
char *main_menu[]={main_menu1, main_menu2, main_menu3};
byte cur_menu_item=0;

//====================
//вывод стартового меню с выделением текущего пункта
void print_menu()
{
  display.clearDisplay();
  for(byte i=0;i<=MAX_menu;i++)
  {
    display.setCursor(10,(i*10));
    if (i==cur_menu_item) 
      {
        display.setTextColor(WHITE, BLACK); // 'inverted' text
      }
    else display.setTextColor(BLACK); 
    
    display.println(main_menu[i]);
  }
  display.display();
}
//====================
void start_menu()
{
if ((pressBut == inc_press)&&(buttonFlag == bf_short))
  {
    cur_menu_item++;
    if (cur_menu_item>MAX_menu)
      {
        cur_menu_item = 0;
      }
    buttonFlag=bf_none;
    print_menu();
  }

if ((pressBut == dec_press)&&(buttonFlag == bf_short))
  {
    cur_menu_item--;
    if ((cur_menu_item<0) || (cur_menu_item>MAX_menu))
      {
        cur_menu_item = MAX_menu;
      }
    buttonFlag=bf_none;
    print_menu();
  }

if ((pressBut == ok_press)&&(buttonFlag == bf_short))
  {
    if (cur_menu_item ==0) //если выбран режим осцилограф инициализируем какой-то счетчик
      {
        FreqCount.begin(1000);
      }
      
    if (cur_menu_item ==1) // для генератора меандра
      {
        InitTimersSafe(); 
        bool success = SetPinFrequencySafe(led, frequency);
      }
      
     if (cur_menu_item ==2) //для DDS генератора
      {
        InitTimersSafe(); 
        bool success = SetPinFrequencySafe(led,200000);
      }

   buttonFlag=bf_none;
   cur_FSM_state=cur_menu_item+1; //следующее состояние в которое будет переход ()
  }

} //end main menu 



//========================
void setup()
{
  pinMode(b_ok_pin, INPUT);
  pinMode(b_inc_pin, INPUT);
  pinMode(b_dec_pin, INPUT);
  display.begin();
}
//==== End setup block ==========
void loop()
{
  checkButton(); //опрашиваем кнопки
  if ((pressBut == ok_press)&&(buttonFlag == bf_long)) //длительное удержание ОК - возврат в главное меню
  {
    cur_FSM_state=Main_menu;
    buttonFlag=bf_none; 
    
  }
  
  switch (cur_FSM_state) //а тут ветвимся согласно указанной задаче
  {
    case (Main_menu):
      print_menu();
      start_menu();
    break;

    case(Oscil):
    Oscilloscope();
    break;

    case(Gen_meandr):
    Generator();
    break;
    
   case(DDS_Gen):
   DDSGenerator();
   break;
   
  }//end switch
   

}//end loop
//============================================
//====================
//процедура заполнения буфера считанными значениями   
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 Oscilloscope()
{
if(opornoe==0){ADMUX = 0b11100011;}//выбор внутреннего опорного 1,1В
if(opornoe==1){ADMUX = 0b01100011;}//Выбор внешнего опорного
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){
display.clearDisplay();
display.fillCircle(80,47-SinU/7, 2, BLACK);//рисуем уровень синхронизации    
x=3;
for(int y=sinhMASS;y<sinhMASS+80;y++){
      if(razv<7){x++;}
      if(razv==7){x=x+2;}
      if(razv==8){x=x+3;} 
      display.drawLine(x, 47-mass[y]/7, x+1, 47-mass[y+1]/7, BLACK);
      display.drawLine(x+1, 47-mass[y]/7+1, x+2, 47-mass[y+1]/7+1, BLACK);        
}
sinhMASS=0;}
if(paus==1){
display.clearDisplay();
display.drawLine(prokr/8,8,prokr/8+6,8, BLACK);//шкала прокрутки
display.drawLine(prokr/8,9,prokr/8+6,9, BLACK);//шкала прокрутки
          x=3;
          for(int y=prokr;y<prokr+80;y++){
                if(razv<7){x++;}
                if(razv==7){x=x+2;}
                if(razv==8){x=x+3;} 
                display.drawLine(x, 47-mass[y]/7, x+1, 47-mass[y+1]/7, BLACK);
                display.drawLine(x+1, 47-mass[y]/7+1, x+2, 47-mass[y+1]/7+1, BLACK); 
          }}
//#######################################отрисовка графика
for(byte i=47;i>5;i=i-7){display.drawPixel(0,i, BLACK);display.drawPixel(1,i, BLACK);display.drawPixel(2,i, BLACK);}//разметка экрана  вертикальная
//////////////////////////////////////////////////сетка
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);}
//////////////////////////////////////////////////сетка
//#######################################отрисовка menu
if(menu==0){
    display.setCursor(0,0);
    display.setTextColor(WHITE,BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.setTextColor(BLACK); 
    display.print(" ");
    display.print(razv);
    display.print(" P");
    if((pressBut == dec_press)&&(buttonFlag == bf_short)){opornoe=!opornoe; buttonFlag=bf_none;}
    if((pressBut == inc_press)&&(buttonFlag == bf_short)){opornoe=!opornoe; buttonFlag=bf_none;}    
}
if(menu==1){
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.setTextColor(WHITE, BLACK); // 'inverted' text 
    display.print(" ");
    display.print(razv);
    display.setTextColor( BLACK); // 'inverted' text
    display.print(" P");
    if((pressBut == dec_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; razv=razv-1;if(razv==255){razv=0;}}
    if((pressBut == inc_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; razv=razv+1;if(razv==9){razv=8;}}
}
if(menu==2){
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.print(" ");
    display.print(razv);
    display.setTextColor(WHITE, BLACK); // 'inverted' text 
    display.print(" P");
    paus=1;
    if((pressBut == dec_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; prokr=prokr-10;if(prokr<0){prokr=0;}}
    if((pressBut == inc_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; prokr=prokr+10;if(prokr>620){prokr=620;}}    
}
if(menu==3){
    prokr=0;
    paus=0;
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.print(" ");
    display.print(razv);
    display.setTextColor(BLACK);
    display.print(" P");
    if((pressBut == dec_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; SinU=SinU-20;if(SinU<20){SinU=20;}}
    if((pressBut == inc_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; SinU=SinU+20;if(SinU>230){SinU=230;}}   
    display.fillCircle(80,47-SinU/7, 5, BLACK);
    display.fillCircle(80,47-SinU/7, 2, WHITE); 
}
if((pressBut == ok_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; menu++;if(menu==4){menu=0;paus=0;}}//перебор меню
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);}//delitel 128
  flagFrec1=0;flagFrec3=0;}}}
//#######################################частоты сигнала
display.setTextColor( BLACK);
if(opornoe==1){
if((Vmax*VCC/255)>2.5){countX=count*(overclock/16.0);}
if((Vmax*VCC/255)<2.5){countX=Frec*(overclock/16.0);}}
if(opornoe==0){countX=Frec*(overclock/16.0);}
if(countX<1000){display.print(" ");display.print(countX);display.print("Hz");}
if(countX>1000){float countXK=countX/1000.0;display.print(countXK,1);display.print("KHz");}
if(opornoe==1){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*VCC/255,1);}
if(opornoe==0){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*1.1/255,1);}
display.print("V");
//#######################################отрисовка menu
////delay(200);  
display.display();
}
//------- end oscillograph


//#######################################режим ренератора
void Generator(){
display.clearDisplay();  
if (flag==0){//флаг выборов режима настройки ШИМ или Частоты
            if((pressBut == dec_press)&&(buttonFlag == bf_short)){
              frequency=frequency-mnog;
              if(frequency<0){frequency=0;}
              bool success = SetPinFrequencySafe(led, frequency);
              buttonFlag = bf_none;
              //delay(3);//защита от дребезга 
            }
            if((pressBut == inc_press)&&(buttonFlag == bf_short)){
              frequency=frequency+mnog;
              bool success = SetPinFrequencySafe(led, frequency);
              buttonFlag = bf_none;
              //delay(3);//защита от дребезга 
            }  
}
if (flag==1){//флаг выборов режима настройки ШИМ или Частоты
            if((pressBut == dec_press)&&(buttonFlag == bf_short)){
              PWM=PWM-1;
              if(PWM<0){PWM=255;}
              buttonFlag = bf_none; 
              //delay(3);//защита от дребезга
            
            }
            if((pressBut == inc_press)&&(buttonFlag == bf_short)){
              PWM=PWM+1;
              if(PWM>255){PWM=0;}
              buttonFlag =bf_none; 
              //delay(3);//защита от дребезга 
            }  
}      
if((pressBut == ok_press)&&(buttonFlag == bf_short)){//переключение разряда выбора частоты 
  //delay(3);//защита от дребезга
  buttonFlag =bf_none; 
  hag++;
  if(hag>=5){hag=0;}
} 
////////////
display.setTextSize(1);
display.setCursor(0,5);
display.print("PWM=");
display.print(PWM*100.0/255);
display.print(" %");
display.drawLine(0,0,83*PWM/255.0,0, BLACK);
display.drawLine(0,1,83*PWM/255.0,1, BLACK);
display.drawLine(0,2,83*PWM/255.0,2, BLACK);
display.drawLine(0,15,83*PWM/255.0,15, BLACK);
display.drawLine(0,16,83*PWM/255.0,16, BLACK);
display.drawLine(0,17,83*PWM/255.0,17, BLACK);
///////////    
display.setCursor(5,20);
 display.setTextSize(2);
long frequencyX=frequency*(overclock/16.0);
if(frequencyX<1000){display.print(frequencyX);display.setTextSize(1);display.println("Hz");}
if(frequencyX>1000){if(frequencyX<10000){display.print((frequencyX/1000.0),2);display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=10000){if(frequencyX<100000){display.print((frequencyX/1000.0),1);display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=100000){display.print((frequencyX/1000.0),0);display.setTextSize(1);display.println("KHz");}
display.setCursor(0,40);
display.setTextSize(1);
display.print(">>X ");    
      if(hag==0){//выбор множителя частоты
        
          display.print(1*(overclock/16.0),1); 
          mnog=1;
          flag=0;
      }
      if(hag==1){//выбор множителя частоты
          display.print(10*(overclock/16.0),0); 
          mnog=10;
      }
      if(hag==2){//выбор множителя частоты
          display.print(100*(overclock/16.0),0); 
          mnog=100;
      }
      if(hag==3){//выбор множителя частоты
          display.print(1000*(overclock/16.0),0); 
          mnog=1000;
      } 
      if(hag==4){//выбор  PWM
          display.print("PWM ");
          display.print(PWM*100.0/255);
          display.print("%"); 
          flag=1;
      } 
display.print("<<");        
pwmWrite(led, PWM);
//delay(300);  
display.display();
}
//======================

/////////////////////DDS
void DDSGenerator(){
int fr=10;
if(menuDDS==0){
    display.clearDisplay(); 
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setCursor(10,20);
    display.println("Пила");
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    display.setCursor(0,40);
    //display.print("Частота=");
    //display.print(57);
    //display.print("Гц"); 
    delay(100);  
    display.display();
    while(D11_Read==LOW){
      PWM=pgm_read_byte(&sinM[d]);
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
    delay(200);}
if(menuDDS==1){
    display.clearDisplay(); 
    display.setTextColor(BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setTextColor(BLACK);
    display.setCursor(10,20);
    display.println("Пила");
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    //display.setCursor(0,40);
    //display.print("Частота=");
   // display.print(57);
    //display.print("Гц");
    delay(100);  
    display.display();
    while(D11_Read==LOW){
      PWM=pgm_read_byte(&trianglM[d]);
      //PWM=trianglM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
    delay(200);}
if(menuDDS==2){
    display.clearDisplay(); 
    display.setTextColor(BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,20);
    display.println("Пила");
    display.setTextColor(BLACK);
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    //display.setCursor(0,40);
    //display.print("Частота=");
   // display.print(57);
    //display.print("Гц");
    delay(100);  
    display.display();
    while(D11_Read==LOW){
      PWM=pgm_read_byte(&pilaM[d]);
      //PWM=pilaM[d];
      pwmWrite(dds,PWM);
     // delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
    delay(200);}
if(menuDDS==3){
    display.clearDisplay(); 
    display.setTextColor(BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setTextColor(BLACK);
    display.setCursor(10,20);
    display.println("Пила");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    //display.setCursor(0,40);
    //display.print("Частота=");
   // display.print(57);
   // display.print("Гц");
    delay(100);  
    display.display();
    while(D11_Read==LOW){
      PWM=pgm_read_byte(&RpilaM[d]);
      //PWM=RpilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
    delay(200);}
if(menuDDS==4){menuDDS=0;}

}
/////////////////////DDS

 

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

//страничка проекта <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 <TFT_ILI9163C.h>
#include <SPI.h>
#include <FreqCount.h>
#include <PWM.h>
#define __CS 10
#define __DC 8

#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

#define  ST7735_BLACK   0x0000
#define ST7735_BLUE    0x001F
#define ST7735_RED     0xF800
#define ST7735_GREEN   0x07E0
#define ST7735_CYAN    0x07FF
#define ST7735_MAGENTA 0xF81F
#define ST7735_YELLOW  0xFFE0
#define ST7735_WHITE   0xFFFF
TFT_ILI9163C tft = TFT_ILI9163C(__CS, __DC, 7);
// 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    12
//#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 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[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;

void setup(){  
  if(opornoe==0){
    ADMUX = 0b11100100;
  }//выбор внутреннего опорного 1,1В
  if(opornoe==1){
    ADMUX = 0b01100100;
  }//Выбор внешнего опорного
 tft.begin();   // initialize a ST7735S chip, black tab
 tft.setRotation(0);              //  повернуть по горизонту
  tft.fillScreen(BLACK);
  tft.drawRect(0,0,128,128,WHITE); // рисуем рамку
  tft.drawRect(2,2,124,125,BLUE); // рисуем рамку
  tft.drawRect(4,3,120,121,RED); // рисуем рамку
 
  //tft.drawRect(0,0,160,128,WHITE); // рисуем рамку
  //tft.drawRect(2,2,156,125,BLUE); // рисуем рамку
  //tft.drawRect(4,3,152,121,RED); // рисуем рамку
  
 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(RED);
      tft.setCursor(30, 25);
     // tft.setCursor(35, 25);
      tft.println("Oscilloscope");
       tft.setCursor(30, 55);
       tft.setTextColor(WHITE);
       tft.println("Generator PWM");
       tft.setCursor(30, 85);
        tft.println("Generator DDS");
      tft.setTextColor(BLUE);
       tft.setCursor(20, 110);
       tft.println("Battery =");
      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(80,110,24,10,BLACK);
       tft.setTextColor(ST7735_BLUE);
       tft.setCursor(80, 110);
       tft.println(str);

    }
    if(pultoskop==2){
     
       tft.setTextColor(WHITE);
       tft.setCursor(30, 25);
       tft.println("Oscilloscope");
       tft.setCursor(30, 55);
       tft.setTextColor(RED);
       tft.println("Generator PWM");
       tft.setCursor(30, 85);
       tft.setTextColor(WHITE);
       tft.println("Generator DDS");
      tft.setTextColor(BLUE);
       tft.setCursor(20, 110);
       tft.println("Battery =");
      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(80,110,24,10,ST7735_BLACK);
      tft.setTextColor(ST7735_BLUE);
       tft.setCursor(80, 110);
       tft.println(str); 
    } 
     if(pultoskop==3){
         
       tft.setTextColor(WHITE);
       tft.setCursor(30, 25);
       tft.println("Oscilloscope");
       tft.setCursor(30, 55); 
       tft.println("Generator PWM");
       tft.setCursor(30, 85);
       tft.setTextColor(RED);
       tft.println("Generator DDS");
       tft.setTextColor(BLUE);
       tft.setCursor(20, 110);
       tft.println("Battery =");
      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(80,110,24,10,BLACK);
      tft.setCursor(80, 110);
      tft.println(str);      
    } 
 delay(300);  
}  

  if(pultoskop==1){
    FreqCount.begin(1000); 
    tft.fillScreen(BLACK);//очистка дисплея      
  }
  if(pultoskop==2){
    InitTimersSafe(); 
    bool success = SetPinFrequencySafe(Out, frequency);
    tft.fillScreen(BLACK);//очистка дисплея  
  }
  if(pultoskop==3){
   InitTimersSafe(); 
   bool success = SetPinFrequencySafe(Out,200000);
   tft.fillScreen(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, 128, 128, BLACK);
    //tft.fillRect(0, 120, 160, 128, 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(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(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(WHITE);
  tft.setCursor(18, 120);
  tft.println( str);  
  }

tft.setTextColor(WHITE);
   tft.setCursor(18, 120);
    tft.println( str);  
  if(digitalRead(delit)==HIGH){//включен или отключен делитель
  tft.setTextColor(WHITE);
   tft.setCursor(70, 120);
    tft.println( "U=");  
    
  if(opornoe==0){
    armcurrent = (Vmax*1.1/255)*10;
    temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
    sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));
   tft.setTextColor(WHITE);
   tft.setCursor(90, 120);
    tft.println( str);  
  }
  if(opornoe==1){
    armcurrent = (Vmax*VCC/255)*10;
    temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
    sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp)); 
    tft.setTextColor(WHITE);
   tft.setCursor(90, 120);
    tft.println( str);

  } 
  }
  else {//включен или отключен делитель
    tft.setTextColor(WHITE);
   tft.setCursor(70, 120);
    tft.println( "U=");  

  if(opornoe==0){
    armcurrent = Vmax*1.1/255;
    temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
    sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp)); 
     tft.setTextColor(WHITE);
   tft.setCursor(90, 120);
    tft.println( str);
  }
  if(opornoe==1){
    armcurrent = Vmax*VCC/255;
    temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
    sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp)); 
     tft.setTextColor(WHITE);
   tft.setCursor(90, 120);
    tft.println( str);
   
  } 
 }
}

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

      //отрисовка и перебор меню###############################
      if(menu==0){ // опорное
        tft.fillRect(0, 0, 36, 9, RED);
      if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
    tft.setTextColor(WHITE);
    tft.setCursor(3, 1);
    tft.println( "11.0V");
        }
        if(opornoe==1){
          tft.setTextColor(WHITE);
    tft.setCursor(3, 1);
          tft.println( "50.0V");
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
          tft.setTextColor(WHITE);
    tft.setCursor(3, 1);
          tft.println( "1.1V");
        }
        if(opornoe==1){
          tft.setTextColor(WHITE);
    tft.setCursor(3, 1);
          tft.println( "5.0V");
        }
      }
        if(digitalRead(pravo)==HIGH){
         tft.fillRect(0, 12, 30, 120, BLACK);//стирание напряжения
          opornoe=1;
        }
        if(digitalRead(levo)==HIGH){ 
          tft.fillRect(0, 12, 30, 120, BLACK);//стирание напряжения
          opornoe=0;
        }
 /////меняем
 //tft.setCursor(55, 1);
      tft.setCursor(37, 1);
    tft.println( "Razv");
       // lcd.drawText(55, 1,"Razv", 1, WHITE, BLACK);
        sprintf(str, "%d", razv); 
    tft.setCursor(65, 1);
    tft.println( str);
       // lcd.drawText(91, 1,str, 1, WHITE, BLACK);
    tft.setCursor(80, 1);
    tft.println( "PauseOFF");
      }
      //////////////////////////////////////////////////////
      if(menu==1){ // развертка
        tft.fillRect(35, 0, 42, 9, RED);
        //lcd.fillRect(48, 0, 108, 9, PINK);
        if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
    tft.setCursor(3, 1);
    tft.println( "11.0V");  
         // lcd.drawText(3, 1,"11.0V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "50.0V");     
          //lcd.drawText(3, 1,"50.0V", 1, WHITE, BLACK);
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
    tft.setCursor(3, 1);
    tft.println( "1.1V"); 
         // lcd.drawText(3, 1,"1.1V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "5.0V"); 
          //lcd.drawText(3, 1,"5.0V", 1, WHITE, BLACK);
        }
      }
        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;
          } 
        } 

    tft.setTextColor(WHITE);
    tft.setCursor(37, 1);
    tft.println( "Razv");  
        sprintf(str, "%d", razv);
    tft.setCursor(65, 1);
    tft.println( str);      
    tft.setCursor(80, 1);
    tft.println( "PauseOFF");       
      }
      ////////////////////////////////////////////////////
      if(menu==2){  // синхронизация
        prokr=0;
        paus=0;
        if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
        tft.setCursor(3, 1);
    tft.println( "11.0V");  
        }
        if(opornoe==1){
        tft.setCursor(3, 1);
    tft.println( "50.0V");       
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
          tft.setCursor(3, 1);
    tft.println( "1.1V"); 
          //lcd.drawText(3, 1,"1.1V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "5.0V");         
         // lcd.drawText(3, 1,"5.0V", 1, WHITE, BLACK);
        }
      }
   tft.setCursor(37, 1);
    tft.println( "Razv");     
        //lcd.drawText(55, 1,"Razv", 1, WHITE, BLACK);
        sprintf(str, "%d", razv); 
  tft.setCursor(65, 1);
    tft.println( str);            
       // lcd.drawText(91, 1,str, 1, WHITE, BLACK);
 tft.setCursor(80, 1);
    tft.println( "PauseOFF");        
        //lcd.drawText(112,1,"PauseOFF", 1, WHITE, BLACK);
        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, RED);       
        tft.fillCircle(155,110-SinU/3, 1, BLACK);
      }      
      /////////////////////////////////////////////////////
      if(menu==3){//пауза
        paus=1;
        if(clen_p==0){
         clen_p=1; 
         tft.fillRect(78, 0, 174, 9, RED);
        if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){

       tft.setTextColor(WHITE);
       tft.setCursor(3, 1);
       tft.println( "11.0V");     
         // lcd.drawText(3, 1,"11.0V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
        tft.setCursor(3, 1);
    tft.println( "50.0V");            
         // lcd.drawText(3, 1,"50.0V", 1, WHITE, BLACK);
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
    tft.setCursor(3, 1);
    tft.println( "1.1V");        
         // lcd.drawText(3, 1,"1.1V", 1, WHITE, BLACK);
        }
        if(opornoe==1){
    tft.setCursor(3, 1);
    tft.println( "5.0V");               
         // lcd.drawText(3, 1,"5.0V", 1, WHITE, BLACK);
        }
      }
    tft.setCursor(37, 1);
    tft.println( "Razv");       
        // lcd.drawText(55, 1,"Razv", 1, WHITE, BLACK);
         sprintf(str, "%d", razv); 
    tft.setCursor(65, 1);
    tft.println( str);            
        // lcd.drawText(91, 1,str, 1, WHITE, BLACK);
    tft.setCursor(80, 1);
    tft.println( "PauseON");      
        // lcd.drawText(112, 1,"PauseON", 1, WHITE, BLACK);
         
        }
      }

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

      //ось напряжения ##########################################
      tft.drawLine(2, 20, 2, 113, BLUE);
      tft.drawLine(2, 25, 5, 25, BLUE); 
      tft.drawLine(2, 42, 5, 42, BLUE); 
      tft.drawLine(2, 59, 5, 59, BLUE); 
      tft.drawLine(2, 76, 5, 76, BLUE); 
      tft.drawLine(2, 93, 5, 93, BLUE); 
      tft.drawLine(2, 110,5, 110, BLUE); 

      //ось развертки ##########################################
      tft.drawLine(2, 115,158, 115, BLUE); 
      //  Черточки ******************     
            for(byte i=6;i<160;i=i+17){
            tft.drawPixel(i,114,BLUE); 
            tft.drawPixel(i,113,BLUE);
            tft.drawPixel(i,112,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);
 }
      //шкала напряжения ########################################
      if(opornoe==0){
        ADMUX = 0b11100100;
      }//выбор внутреннего опорного 1,1В
      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, BLACK);//стиране /шкалы прокрутки
        tft.fillRect(6, 12, 154, 99, BLACK);//стиране поле графика
        tft.fillRect(0,116, 160, 12, BLACK);//стиране НИЖНЕГО МЕНЮ 
        //////////////////////////////////////////////////сетка

        //////////////////////////////////////////////////////
        tft.fillCircle(10,110-SinU/3, 2, YELLOW);//рисуем уровень синхронизации 
        tft.fillCircle(10,110-SinU/3, 3, YELLOW);//рисуем уровень синхронизации 
        x=6;
        for(int y=sinhMASS;y<sinhMASS+145;y++){ 
          //for(int y=0;y<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);//график
         // tft.drawLine(x+1,109-mass[y]/3+1, x+2,109-mass[y+1]/3+1, ST7735_GREEN);//график
        }
        sinhMASS=0;  
        MenuT();  
      }
     /////////////////////////////////////////////////////////////////////////// 
    if(paus==1){//режим паузы
        //////////////////////////////////////////////////////////////////////
        if(digitalRead(pravo)==HIGH){//листаем
          prokr=prokr+5;
          if(prokr>554){prokr=554;}
          tft.fillRect(0, 12, 160, 3, BLACK);//стиране шкалы прокрутки
          tft.fillRect(6, 12, 154, 99, BLACK);//стиране поле графика
          tft.fillRect(0,116, 160, 12, BLACK);//стиране НИЖНЕГО МЕНЮ 
          //////////////////////////////////////////////////////////////
          tft.drawLine(prokr/4,12,prokr/4+25,12, YELLOW);//шкала прокрутки
          tft.drawLine(prokr/4,13,prokr/4+25,13, YELLOW);//шкала прокрутки
          tft.drawLine(prokr/4,14,prokr/4+25,14, YELLOW);//шкала прокрутки
          //tft.drawLine(prokr/4,15,prokr/4+35,15, ST7735_YELLOW);//шкала прокрутки
          
          //////////////////////////////////////////////////сетка
          for(byte i=110;i>18;i=i-3){
            tft.drawPixel(6,i, BLUE);
            tft.drawPixel(23,i, BLUE); 
            tft.drawPixel(40,i, BLUE); 
            tft.drawPixel(57,i, BLUE); 
            tft.drawPixel(74,i, BLUE); 
            tft.drawPixel(91,i, BLUE);
            tft.drawPixel(108,i, BLUE); 
            tft.drawPixel(125,i, BLUE); 
            tft.drawPixel(142,i, BLUE);
            tft.drawPixel(159,i, BLUE);
          }
          for(byte i=6;i<160;i=i+3){
            tft.drawPixel(i,25, BLUE);
            tft.drawPixel(i,42, BLUE); 
            tft.drawPixel(i,59, BLUE);
            tft.drawPixel(i,76, BLUE); 
            tft.drawPixel(i,93, BLUE); 
            tft.drawPixel(i,110, 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.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график
          // tft.drawLine(x+1,109-mass[y]/3+1, x+2,109-mass[y+1]/3+1, ST7735_GREEN);//график
          }
        }
      ////////////////////////////////////////////////////////////////////////////////   
      if(digitalRead(levo)==HIGH){//листаем
          prokr=prokr-5;
          if(prokr<0){prokr=0;}
          //tft.fillRect(0, 12, 160, 15, ST7735_BLACK);//стиране поле графика
          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);//шкала прокрутки
         // tft.drawLine(prokr/4,15,prokr/4+35,15, 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>170){
              x=170;
            } // что бы не засирало экран

           tft.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график
          // tft.drawLine(x+1,110-mass[y]/3+1, x+2,110-mass[y+1]/3+1, ST7735_GREEN);//график 
          }
        }        
      }
     // 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(4, 60, 120, 25, ST7735_BLACK);//стирание поля
         
        }
        if(digitalRead(pravo)==HIGH){
          frequency=frequency+mnog;
          bool success = SetPinFrequencySafe(Out, frequency);
          delay(3);//защита от дребезга 
          tft.fillRect(4, 60, 120, 25, ST7735_BLACK);//стирание поля закрашиваем
          
        }  
      }
      if (flag==1){//флаг выборов режима настройки ШИМ или Частоты
        if(digitalRead(levo)==HIGH){
          PWM=PWM-3;
          if(PWM<0){
            PWM=255;
          } 
          delay(3);//защита от дребезга
          
          tft.fillRect(4, 4, 160, 40, ST7735_BLACK);//стирание поля
          tft.fillRect(63, 100, 49, 125, ST7735_BLACK);//стирание в низу число шим
        }
        if(digitalRead(pravo)==HIGH){
          PWM=PWM+3;
          if(PWM>255){
            PWM=0;
          } 
          delay(3);//защита от дребезга
         
          tft.fillRect(4, 4, 160, 40, ST7735_BLACK);//стирание поля 
          tft.fillRect(63, 100, 49, 125, ST7735_BLACK);//стирание в низу число шим
        }  
      }      

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

      tft.setCursor(10, 19);
  tft.setTextColor(ST7735_GREEN);
  tft.setTextSize(2);
  tft.println("PWM =");                                
      
      temp = PWM*100/255;
      sprintf(str,"%d", temp); // %
      tft.setCursor(70, 19);//было 80
       tft.println( str);
      
      //tft.setCursor(96, 19);  //закоментил/////////////////
      tft.println( "%");
      

     // armcurrent = 162*PWM/255.0+8; // вычисляем длинны линии
      armcurrent = (110*PWM/255)+7; // вычисляем длинны линии

     // if(armcurrent >=159){
      //  armcurrent == 159;
       // }
      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(5, 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;
      //lcd.drawText(10, 60, str, 2, WHITE, BLACK);
      ////////////////////////////////////////////////////////////// 
      // lcd.fillRect(0, 100, 175, 131, BLACK);//стирание поля
        tft.setCursor(2, 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(25, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);          
        //tft.setTextSize(1);

      }
      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(20, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      // tft.setTextSize(1);
      }
      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(15, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      //  tft.setTextSize(1);
      }
      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(20, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
       // tft.setTextSize(2);
      } 
      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(15, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      //  tft.setTextSize(1);
      } 
      if(hag==5){//выбор  PWM 
        flag=1;
        tft.setTextSize(2);
        tft.setCursor(15, 100);
        tft.setTextColor(ST7735_YELLOW);
        //tft.setTextSize(1);
        tft.println("PWM=");               
        temp = PWM*100/255;
        sprintf(str,"%d", temp);
        tft.setCursor(65, 100);
        tft.setTextColor(ST7735_YELLOW);
        //tft.setTextSize(1);
        tft.println(str);                
        //tft.setCursor(95, 100);
        tft.setTextColor(ST7735_YELLOW);
        //tft.setTextSize(1);
        tft.println("%");        
        
      }
        tft.setCursor(115, 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){
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_RED);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);
    tft.setTextColor(ST7735_WHITE);
    tft.println("Treugolnik");
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       
   

    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(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);    
    tft.setTextColor(ST7735_RED);
    tft.println("Treugolnik");
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       

    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(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);        
    tft.println("Treugolnik");
    tft.setTextColor(ST7735_RED);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.setTextColor(ST7735_WHITE);
    tft.println("Pila Obr");       

    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(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);        
    tft.println("Treugolnik");    
    tft.setCursor(35, 70); 
    tft.println("Pila");
    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++;
    //delay(200);
  }
if(menuDDS==4){menuDDS=0;}
}
}
/////////////////////DDS
}

вот и мой вклад в развитие=))) вроде все что можно поправил кроме нижнего меню на больших частотах перекрещиваются буквы( пока оставил так... и еще если сравнивать с ls020 пультоскопом то на 1.44 работает медленнее отрисовка ((

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233

этот массив можно уменьшить , занимает 701 байт.

byte mass[701];

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

bodrly2014, а как это сделать? подскажи )

и эта, а щас он сколько занимает? как узнать\посмотреть?

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

karl2233 пишет:

bodrly2014, а как это сделать? подскажи )

и эта, а щас он сколько занимает? как узнать\посмотреть?

Массив из переменных типа байт,

одна переменная занимает в памяти 1 байт,

соответственно 701 займут 701байт.

Нужно изменить там где мы объявляем и везде в коде где есть запись в массив и чтение.

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

не получается так (byte),

byte PROGMEM 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 PROGMEM 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 PROGMEM 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 PROGMEM 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};
int d=0;

пишет 

PULTOSCOPE_128x64_OLED_block.ino:38:21: error: variable 'sinM' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

говорил же, на 128 переходите:)

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

...или изучайте мат.часть =)

дело явно не в МК, дело в оптимизации кода которую надо постичь как Дзен

sirota
Offline
Зарегистрирован: 18.08.2015

karl2233 пишет:

...или изучайте мат.часть =)

дело явно не в МК, дело в оптимизации кода которую надо постичь как Дзен

тогда тока asm.

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

вас ист дас "asm"? о_О

======

в общем, полная версия (с двумя генераторами,с  одним влазит) не влазит при использовании такого дисплея (((

будет значит у меня тока Пультоскоп

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Подправил код , вынес повторяющиеся фрагменты в отдельные подпрограммы.

Выиграл почти 2 Кбайта. 160х128 ST_7735

[code]
//страничка проекта http://srukami.inf.ua/pultoscop_v2.html
// форум http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comm...
// скетч и библиотеку изменил под 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    12
//#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 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[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(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(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_RED);
      tft.setCursor(35, 25);
      tft.println("Oscilloscope");
       tft.setCursor(35, 55);
       tft.setTextColor(ST7735_WHITE);
       tft.println("Generator PWM");
       tft.setCursor(35, 85);
        tft.println("Generator DDS");
      tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println("Battery =");
      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(35, 25);
       tft.println("Oscilloscope");
       tft.setCursor(35, 55);
       tft.setTextColor(ST7735_RED);
       tft.println("Generator PWM");
       tft.setCursor(35, 85);
       tft.setTextColor(ST7735_WHITE);
       tft.println("Generator DDS");
      tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println("Battery =");
      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(35, 25);
       tft.println("Oscilloscope");
       tft.setCursor(35, 55); 
       tft.println("Generator PWM");
       tft.setCursor(35, 85);
       tft.setTextColor(ST7735_RED);
       tft.println("Generator DDS");
       tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println("Battery =");
      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( "PauseON");      
      }   
        }    

      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;
if(menuDDS==0){
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_RED);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);
    tft.setTextColor(ST7735_WHITE);
    tft.println("Treugolnik");
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       
   

    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(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);    
    tft.setTextColor(ST7735_RED);
    tft.println("Treugolnik");
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       

    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(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);        
    tft.println("Treugolnik");
    tft.setTextColor(ST7735_RED);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.setTextColor(ST7735_WHITE);
    tft.println("Pila Obr");       

    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(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);        
    tft.println("Treugolnik");    
    tft.setCursor(35, 70); 
    tft.println("Pila");
    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++;
    //delay(200);
  }
if(menuDDS==4){menuDDS=0;}
}
}
/////////////////////DDS
}

[/code]

 

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

ух ты! возьму на вооружение и скопирую метод))

а что ещё можно оптимизировать? =) и ещё вопрос - какой участок отвечает за циферки слева и снизу от графика? 

и ещё - 34 и 35 строки - это что за хитрость?

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

karl2233 пишет:

ух ты! возьму на вооружение и скопирую метод))

а что ещё можно оптимизировать? =) и ещё вопрос - какой участок отвечает за циферки слева и снизу от графика? 

и ещё - 34 и 35 строки - это что за хитрость?


Начиная с 75 строки и пошло вниз
А 34 и 35 это наверно чтобы не путаться будет-заменять ддс и шим на пин 9

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

karl2233 пишет:

ух ты! возьму на вооружение и скопирую метод))

а что ещё можно оптимизировать? =) и ещё вопрос - какой участок отвечает за циферки слева и снизу от графика? 

и ещё - 34 и 35 строки - это что за хитрость?

Да не хитрость это, а назначение пинов.

А вообще можно CS убрать с 10 пина и назначить его выходом DDS , как на 5110.